一、Struts 2.x 简介
1、Struts 2 简介
Struts 2 框架并不是起源于Struts 1.x 框架,而是起源于WebWork框架—另一个MVC框架。
Struts 2 有很多新特性,例如支持主题、集成DOJO框架、内置AJAX等。
2、Struts 2与WebWork 2的关系
Struts 2就是 WebWork 2,WebWork 2就是Struts 2。
二、第一个Struts 2实例
1、下载Struts 2类库
Struts 2采用热部署的方式注册插件。
2、登录功能Action
Struts 2会自动把输入框的内容通过getter、setter方法设置进来。
execute()方法是Struts 2 Action的主方法,提交数据后Struts 2会调用该方法,返回值代表结果页面的名称。
3、Struts 2配置文件
Struts 2配置文件中引入package的概念。
所有的result、action等必须配置到package中。
package具有集成的特性,子package里的Action能使用父package里的资源
4、JSP登录界面
<struts:head theme=”ajax”/>
<struts:property value=”account”/>
<struts:form action=”loginPerson”>
<struts:label value=”登录系统”></struts:label>
<struts:textfield name=”account” label=”账号”/>
<struts:textfield name=”password” label=”密码”/>
<struts:submit value=”登录”></struts:submit>
</struts:form>
注:标签库“/struts-tags”位于Struts 2 的 struts2-core-2.0.6.jar包中。
Struts 2 标签支持主题。
Struts 2 的表单标签是会输出<table>、<tr>、<td>等HTML标签的。
5、配置 web.xml
Struts 2 使用 Filter 作为分发器
<filter>
<filter-name>struts</filter-name>
<filter-class>
org.apache.sturts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
6、更改 .action 后缀
如果要更改 Struts 2 的默认后缀,只需要修改web.xml中Filter配置中的struts.action.extension参数,或者在/WEB-INF/classes下添加
struts.properties,在struts.properties里修改Struts 2的后缀:struts.action.extension=action
三、Struts 2工作流程
1、Struts 2工作流程
访问JSP页面 /struts2/login.jsp
↓
提交表单后数据提交给 /struts2/loginPerson.action
↓
Struts2截取所有请求,包括 *.action的请求
↓
查找 struts.xml,loginPerson.action对应LoginAction
↓
生成一个LoginAction实例,将提交的数据设置到该实例中
↓
调用LoginAction实例的execute()主方法
↓
跳转到JSP中现实结果,丢弃该LoginAction实例
2、Struts 2的线程安全
Struts 2的Action是线程安全的。
3、程序入口FilterDispatcher
如果URI以.action结尾,Struts 2会查找对应的Action或者JSP。如果URI中包含“/struts”,Struts 2会返回它集成的资源。配置Filter时要把所有的URI都转到Filter中,而不仅仅是.action结尾的URI。
四、Struts 2配置文件
1、struts.properties
struts.properties配置Struts 2的一些参数。
2、struts.xml
要有<!DOCUTYPE>,也要有<struts>根元素。
<constant>配置struts2的属性,
<include>配置多个sturts2文件,
<bean>配置常用的POJO类,
<package>里面配置<action>等。
3、配置package
<package>类似于对象,具有可继承的特性。
4、配置命名空间
<package>还可以配置namespace属性。如果配置了namespace=”namespace1”,那么访问时需要加上namespace。例如
namespace1/loginPerson.action
五、Action详解
1、Action接口
Action接口只定义了一个execute()主方法,以及几个常用的结果名称(success、none、error、input、login等)。
实现:直接实现该接口以及execute()方法即可。
2、ActionSupport类
实现自Action接口。
继承ActionSupport类可以直接使用数据校验等Struts2集成的方法。
继承:覆盖execute()方法,并定义变量。
execute()方法的返回值为配置在struts.xml中的<result>配置,
变量的值会被Struts2通过setter方法自动赋值。
3、不继承任何类的Action
只要这个Action具有public String execute()方法。
如果Struts2发现Action类没有实现Action接口,会通过反射来调用execute()方法。
不实现Action接口的好处是不与Struts2发生耦合,代码不依赖于Struts2的类库。
4、Action的可执行方法
Struts2还可以执行Action的其他方法,只要这些方法没有参数,并返回String类型。
Struts2会在运行时根据方法的特征判断是否是可执行方法(参数、返回值),并通过发射执行。
5、通过URL执行Action的方法
可以使用action!method.action的URL形式访问。
例如http://localhost:8080/struts2/loginPerson!logout.action
6、将执行方法配置到Action
<action name=”loginPerson” class=”” method=”login”>
<result name=”login”>/login.jsp</result>
</action>
用通配符配置:
<action name=”*Person” class=”” method=”{1}”>
<result name=”{1}”>/{1}.jsp</result>
</action>
六、Struts2的零配置
1、通过@注解实现Action零配置
@Namespace定义命名空间,一般不常用。
@Results定义结果集,可以包括多个@Reuslt。@Result定义一个结果集。
@Namespace(value=”/test”)
@Result({
@Result(name=”success”,value=”/success.jsp”),
@Result(name=”redirect”,value=”/redirect.jsp”,type=ServletRedirectResult.class)
@Result(name=”login”,value=”/login.jsp”)
})
该Action可以用默认的名称/struts2/annotated.action访问,即去掉类名中的Action,同时首字母小写。如果访问其中的add()方法,可以用/struts2/annotated!add.action。如果配置了namespace=”/test”,则必须以/struts2/test/annotated.action访问。
2、web.xml中指定Action目录
零配置时必须在web.xml的Filter中指定Action包的位置。
参数actionPackages指定被@注解标注的Action所在的Package。
<init-param>
<param-name>actionPackages</param-name>
<param-value>com.helloweenvsfei.struts2.action</param-value>
</init-param>
七、Action中使用POJO
1、通配符配置Action
Struts2.x支持通配符配置Action。例如在action名称中使用“*“配置action名称,
可以使用多个“*”。“*”代表的内容也可以在本Action配置内部使用{1}、{2}等引用,
其中{1}表示第一个“*”内容,{2}表示第二个“*”的内容。
2、图书实体Book类
定义图书实体Book类以及属性和getter、setter方法。
其他:Struts2.x也能自动转化Date类型数据。
3、图书管理Action
定义属性book及getter、setter方法,定义属性title及getter方法,定义属性bookList及getter方法。
4、JSP添加、列表页面
显示URL时使用的是<struts:url/>标签,该标签会在运行时将“.action”自动添加在后面。如果struts.properties中修改了“.action”后缀,该标签页会自动添加为新的后缀。
可以使用<struts:url action=”initAddBook” includeParams=”none”/>将禁止本标签的自动追加参数特性。或者在struts.properties中禁止所有的<struts:url/>的自动追加参数特性。Struts.url.includeParams=none