一、Struts2概述

1、Struts2是什么?

Struts2是一个M(模型—域–范围模型)V(View视图)C(控制器)框架(模型2)。框架都是一个半成品。

提高开发效率。

Struts1是一个MVC框架。非常流行。

有非常大的缺点。

此时一个webwork的框架设计超前,名气不是非常大。

Struts1+webworkd=struts2。用的是struts1的名字,可是与sruts1没啥关系,struts2的核心是webwork框架。

2、Struts2能干什么?

web开发Strust2 核心功能

  • 获取请求參数
  • 封装到JavaBean
  • 验证和转换
  • 调用业务代码存数据
  • 转向某个页面展示结果

是表现层的开发技术。

(背景色为蓝色区域)

3、Struts2入门简单原理图

Filter VS Servlet

过滤器要比Servlet要强大,开发中常常常使用Servlet作为控制器,Filter也能够作为控制器来使用。

二、搭建struts2的开发环境

1、下载地址:http://struts.apache.org

2、解压后的文件夹结构:

a) apps:框架本身提供一些案例(学习)

b) docs:框架本身提供的文档(指南和API)。不保证100%正确

c) lib:框架须要的jar包及第三方的jar包(不要全拷贝)

d) src:源代码

搭建步骤:

a、新建一个JavaWebproject

b、拷贝struts2运行所需的必要jar包。(方便办法:struts2发行包\apps\struts-blank.war,拷贝当中的lib下的全部jar)

  • struts2-core-2.3.1.1.jar:Struts 2框架的核心类库
  • xwork-core-2.3.1.1.jar:Command模式框架,WebWork和Struts2都基于xwork
  • ognl-3.0.3.jar:对象图导航语言(Object Graph Navigation Language),

    struts2框架通过其读写对象的属性
  • freemarker-2.3.18.jar:Struts 2的UI标签的模板使用FreeMarker编写
  • commons-logging-1.1.x.jar:ASF出品的日志包。Struts 2框架使用这个日志

    包来支持Log4J和JDK 1.4+的日志记录。
  • commons-fileupload-1.2.2.jar: 文件上传组件,2.1.6版本号后须要增加此文件
  • commons-io-2.0.1.jar:传文件依赖的jar包
  • commons-lang-2.5.jar:对java.lang包的增强,比方以下程序
if(str!=null&&!str.equals("")){

}
//增强的
if(StringUtils.isEmpty(str)){ }
  • javassist-3.11.0.GA.jar:动态代理的开发包。日本鬼子弄的(Jboss)。Hibernate也会用到

3、在web.xml中配置核心过滤器:StrutsPrepareAndExcuteFilter(框架提供)

  <filter>
<filter-name>struct01</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struct01</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

4、在WEB-INF\classes文件夹下建立一个名称为struts.xml的配置文件。内容例如以下:(能够从struts2发行包\apps\struts-blank.war中拷贝)。抄头超屁股。。。。。。

。。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> </struts>

5、把应用部署到Tomcat中,启动Tomcat,假设没有报错,说明搭建成功

三、第一个Struts2应用案例(编码步骤)

1、编写2个jsp

hello.jsp

  <body>
<a href="${pageContext.request.contextPath}/hello.action">訪问第一个Struts2案例</a>
</body>

success.jsp

  <body>
Struts2訪问成功
</body>

2、编写一个动作类(POJO,之前所谓的依照JavaBean规范编写的一个普通的类)

package xgp.struts.actions;

public class HelloAction {
public String sayHello(){
System.out.println("动作方法sayHello运行了,訪问成功。");
return "success";
}
}

3、在struts.xml配置。告知控制器该实例化那个类,调用该类的那个方法,依据方法的返回值转向哪个页面

<?xml version="1.0" encoding="UTF-8" ?

>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd"> <struts>
<constant name="struts.devMode" value="true" />
<package name="default" extends="struts-default">
<action name="hello" class="xgp.struts.actions.HelloAction"
method="sayHello">
<result name="success" type="dispatcher">/success.jsp</result>
</action>
</package>
</struts>

4、訪问測试:

http://localhost:8080/xgp.struts/hello.jsp

运行步骤例如以下

四、运行过程和原理(可能面试题)

学习目标:熟知struts2的运行过程(下图记住)。源代码能够不看

a、过滤器的初始化

1、StrutsPrepareAndExecuteFilter是一个过滤器。过滤器就有初始化方法

关键代码:57:dispatcher = init.initDispatcher(config);//初始化请求分发器。

2、InitOperations:

public Dispatcher initDispatcher( HostConfig filterConfig ) {
Dispatcher dispatcher = createDispatcher(filterConfig);
dispatcher.init();
return dispatcher;
}
  • init_FileManager();
  • init_DefaultProperties(); // [1]
  • init_TraditionalXmlConfigurations(); // [2]
  • init_LegacyStrutsProperties(); // [3]
  • init_CustomConfigurationProviders(); // [5]
  • init_FilterInitParameters() ; // [6]
  • init_AliasStandardObjects() ; // [7]

Dispatcher:分发器

private void init_TraditionalXmlConfigurations() {
String configPaths = initParams.get("config");
if (configPaths == null) {
configPaths = DEFAULT_CONFIGURATION_PATHS;
}
String[] files = configPaths.split("\\s*[,]\\s*");
for (String file : files) {
if (file.endsWith(".xml")) {
if ("xwork.xml".equals(file)) {
configurationManager.addContainerProvider(createXmlConfigurationProvider(file, false));
} else {
configurationManager.addContainerProvider(createStrutsXmlConfigurationProvider(file, false, servletContext));
}
} else {
throw new IllegalArgumentException("Invalid configuration file name");
}
}
}

(重要)结论:

初始化过滤器时,会按顺序载入以下配置文件:

———-struts-default.xml,

———–struts-plugin.xml,

———-struts.xml这几个配置文件

———-struts-default.xml: struts2-core-**.jar包内部(框架内部的配置文件)

当中定义了一些Bean对象;有一个抽象的package。内部有一些结果类型。一些拦截器的定义。还有拦截器小组的定义。

默认的拦截器小组名字是defaultStack。

———struts-plugin.xml:struts2提供的插件中(插件内部提供)

———struts-xml:程序猿自定义的(开发中常常搞)

b、过滤器的doFilter方法:用户的每次訪问

1、ActionMapping mapping = prepare.findActionMapping(request, response, true);依据你的动作请求,从已经初始化好的配置文件里找相应的动作名称。

2、Dispatcher:

ActionProxy proxy = config.getContainer().getInstance(ActionProxyFactory.class).createActionProxy(
namespace, name, method, extraContext, true, false);

五、Eclipse编写struts.xml没有提示的问题

原因:找不到约束文件

解决:

1、联网

2、手工配

a、eclipse的菜单:window\preferences

六、Struts2的配置文件

1、default.properties:在struts2-core-**.jar的org.apache.struts包中

关于Struts2一些常量配置(框架内部)

2、struts-default.xml:在struts2-core-**.jar中。(框架内部)

定义了一些bean;
定义了一个抽象的包:struts-default
定义了一些结果视图
定义了一些拦截器和拦截器小组

3、struts-plugin.xml :在struts2的第三方插件中(插件内部。给插件用的)Struts2-**-plugin.jar中

4、struts.xml:用户自己编写的(重点)

5、struts.properties :用户自己编写的(类路径中,不须要)key和value的形式

6、web.xml :struts2的一些配置能够写在这(Web应用中,不建议)

结论:1~6:后面的配置文件内容,会覆盖前面的。

比方:在struts.xml中覆盖default.properties中的内容,能够这么办:

<constant name="struts.action.extension" value="do"></constant> 

比方:在web.xml中把訪问的扩展名改为xgp

<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
<init-param>
<param-name>struts.action.extension</param-name>
<param-value>xgp</param-value>
</init-param>
</filter>
<constant name="struts.devMode" value="true" />
<! -- Struts2中的一个常量,表示开发模式。当其值为true,假设配置文件内容改变,框架会又一次载入而不需又一次启动服务器!-->

6.1struts.xml中的package元素:

Struts-default.xml—–中有这么个包——<package name="struts-default" abstract="true"></package>

package:方便管理动作。作用:相应用中的动作进行模块化管理,就如同把类放在不同包中管理一样。

属性:

  • name:配置文件里保证package的唯一
  • namespace:取值一般以”/”开头,它与动作名称组成完毕的訪问路径。

    默认值是””。

    http://域名+动作名称.action

假设配置了namespace那么訪问资源时就要加上namespace:http://域名+namespace+动作名称.action

  • extends:父包名称。把父包中定义的内容全然集成下来。普通情况下,在struts2开发中须要继承(直接或间接)struts-default(struts-default.xml)
  • abstract:抽象包。

    抽象的东西就是设计被别人继承的。没有不论什么action子元素的packkage就能够定义为抽象的。

    package的namespace和动作訪问专题:(小难点)

区分:namespace=”/”,实实在在的一个名称空间。绝对不是默认的:namespace=””或者不写,以下是详细的訪问流程图

6.2 struts.xml中action元素的配置

作用:定义动作类

属性:

  • name:动作的名称,同一个包中的name必须唯一。
  • class:动作类的全名。

    可选属性。

    假设没有配置,则使用默认的class;默认值是ActionSupport Crtl+Shift+H搜索可得:com.opensymphony.xwork2.ActionSupport(可在源代码中找到)

    由于struts-default.xml有指定。

<default-class-ref class="com.opensymphony.xwork2.ActionSupport" />
  • method:指定动作类中的哪个方法,可选的。

    默认值是execute

小知识:

能够在自己的package中通过以下标签,指定默认的动作类

<default-class-ref class="com.itheima.action.HelloAction"></default-class-ref>

6.3strutx.xml中的result元素的默认配置

作用:定义动作类运行完毕后转向的结果视图

属性:

  • name:结果视图的名称。与当前的动作类的动作方法返回值相应。默认值是success
  • type:结果视图的类型。默认是dispatcher(转发)

来自:struts-default.xml中的结果视图的定义。

6.4 struts2的一些常量含义及配置

假设你要改变这些常量,则在外面的配置文件struts.xml(或者别的配置文件里)改动,覆盖这些框架的默认值:

比方框架中

struts.action.extension=action, 框架要处理的后缀名称。

假设须要改成以*.do或者*.doo结尾,则能够在Struts.xml中配置:

<constant name="struts.action.extension" value="do,doo"></constant>

在struts.properties中配置例如以下

struts.action.extension=do

在web.xml中配置例如以下

<filter>
<filter-name>struct01</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
<init-param>
<param-name>struts.action.extension</param-name>
<param-value>do</param-value>
</init-param>
</filter>

这里要注意配置文件的优先级.

常量

  • struts.i18n.encoding=UTF-8 框架使用的编码

  • struts.action.extension=action, 动作的訪问后缀。多个能够使用逗号分隔

  • struts.serve.static.browserCache=true 指示浏览器是否缓存资源

    (原理:三个响应消息头:response.setHeader():Expires Cache-Control Pragma)

  • struts.configuration.xml.reload = true 是否在更改了struts.xml后自己主动又一次载入。开发阶段实用。

  • struts.devMode = false 是否是开发模式。开发阶段建议为true。

    假设为true,struts.configuration.xml.reload就会为true

  • struts.ui.theme=xhtml 指定页面用的主题(struts标签时介绍)

  • struts.objectFactory = spring 默认情况。Action都是struts2框架给我们创建的(ObjectFactory,实例工厂)。与Spring框架整合时用。

  • struts.enable.DynamicMethodInvocation = false 是否同意DMI(动态方法调用:Dynamic Method Invocation)。

  • struts.multipart.maxSize=2097152 指定文件上传时的限制大小。2M

6.4配置文件分模块化

在项目开发中,为了更好的进行版本号控制,常常引入外部的配置文件(比方在struts.xml同级文件夹下建立一个user.xml。则仅仅需在

<include file="user.xml"></include>

深入分析JavaWeb Item43 -- Struts2开发入门的更多相关文章

  1. 深入分析JavaWeb Item47 -- Struts2拦截器与文件上传下载

    一.struts2中的拦截器(框架功能核心) 1.过滤器VS拦截器 过滤器VS拦截器功能是一回事. 过滤器是Servlet规范中的技术,能够对请求和响应进行过滤. 拦截器是Struts2框架中的技术. ...

  2. JavaWeb学习总结(一)——JavaWeb开发入门

    http://www.cnblogs.com/xdp-gacl/p/3729033.html 只为成功找方法,不为失败找借口! JavaWeb学习总结(一)--JavaWeb开发入门 一.基本概念 1 ...

  3. JavaWeb学习总结(一)JavaWeb开发入门

    静态网页和动态网页 静态网页:在服务器上没有经过服务器解释执行的网页. 动态网页:在服务器上经过服务器解释执行的网页. 无论是静态网页还是动态网页,客户端看到的网页都是由HTML所构成的,所以Java ...

  4. javaweb学习总结二十一(servlet开发入门、servlet生命周期以及调用过程)

    一:servlet开发入门 servlet是sun公司一门开发动态web资源的技术,下面编写一个servlet入门程序: 1:在tomcat服务器webapps目录下新建firstServlet目录, ...

  5. struts2系列(一):struts2入门(struts2的产生、struts2的工作流程、搭建struts2开发环境)

    一. struts2的产生 struts1的缺点:                         1. ActionForm过多,而且这个ActionForm在很大程度上又和VO(POJO)重复  ...

  6. Struts2 第二讲 -- Struts2的入门

    搭建struts2环境时,我们一般需要做以下几个步骤的工作: 第一步:创建javaweb工程(这个很废话有木有) 第二步:找到开发Struts2应用需要使用到的jar文件.(这个很白痴有没有) 到ht ...

  7. java WEB开发入门

    WEB开发入门 1 进入web JAVASE:标准- standard   JAVA桌面程序 GUI    SOCKET JAVAEE:企业-浏览器控制  web 2 软件结构 C/S :client ...

  8. struts2之入门login

    1.struts 最小开发需要的jar有: struts2-core-2.2.3.jar :Struts 2框架的核心类库 xwork-core-2.2.3.jar :XWork类库,Struts 2 ...

  9. struts2 之 【struts2简介,struts2开发步骤,struts2详细配置,struts2执行流程】

    入门框架学习避免不了的问题: 1. 什么是框架? 简单的说,框架就是模板,模子,模型.就是一个可重用的半成品. 2. 如何学习框架? 学习框架其实就是学习规则,使用框架就是遵循框架的规则,框架是可变的 ...

随机推荐

  1. python(33)多进程和多线程的区别

    多线程可以共享全局变量,多进程不能.多线程中,所有子线程的进程号相同:多进程中,不同的子进程进程号不同. #!/usr/bin/python # -*- coding:utf-8 -*- import ...

  2. centos 手动编译 fcitx 各种问题大全

    yum install ncurses-devel   tinyxml-devel sqlite-devel wget http://downloads.sourceforge.net/project ...

  3. hud1700(计算几何——求等边三角形)

    题意:圆心在原点,一个坐标(x,y)在圆上,通过这个点画一个三角形在圆内,三角形其顶点都在圆上,要求三角形的周长最大,输出满足这样条件的三角形的另两个坐标..... 思路:有一个公式是把一个向量平移多 ...

  4. 基于CSS3自定义发光radiobox单选框

    之前我们分享过一些CSS3和HTML5实现的自定义checkbox和Radiobox,比如纯CSS3美化Checkbox和Radiobox按钮,不仅外观唯美,而且Radiobox选中时还有动画效果.今 ...

  5. java获取当月的第一天和最后一天,获取本周的第一天和最后一天

    /** * 获取指定日期所在周的第一天和最后一天,用下划线连接 * @param dataStr * @return * @throws ParseException */ public static ...

  6. 使用C#创建windows 服务

    创建项目选择Windows Service 创建好项目之后,在生成的Service1.cs的设计页面右键选择Add Installer,会生成一个ProjectInstaller.cs.这个文件中有两 ...

  7. 透明遮罩图层VS高斯模糊滤镜 效果分析

    前端流行布局中最常见的弹出图层有popup, 对话框, tooltip等, 他们都使用了新的图层,但是实现办法各不相同, 有 的是通过半通明的黑白图层实现的, 有的是通过滤镜实现的, 我们来研究一下两 ...

  8. 简单又好用的聊天室技术——WebSocket

    现在,很多网站为了实现推送技术,所用的技术都是轮询.轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP request,然后由服务器返回最新的数据给客户端的浏览器.这种传统的模式带来很 ...

  9. 在网页中使用SVG

    SVG可以作为一个独立的文件存在.但更多的时候,我们希望他能集成在某个更大的文档中,比如HTML.将SVG插入到HTML中主要有以下几种方式: 将 SVG 作为图像导入 将 SVG放入 iframe ...

  10. Firefox 在LR录制过程中添加例外的问题解决方法

    用lr调火狐打开网页  会报证书安全问题 证书安全提示目的是告诉你这个服务器使用的证书可能不安全,要不要信任,你自己决定,不信任就不能访问.为什么会报证书安全,因为浏览器没添加该证书.或者由于性能工具 ...