学习路线:
1.Struts2基本配置:
<struts>
<!--导入配置文件,通过这种方式可以将Struts2的Action按模块配置到多个配置文件中。-->
<include file=“product.xml"/>
<!--常量配置,指定是否开发模式。-->
<constant name="struts.devMode" value="true" />
<!-- Action配置放在package下, name定义包名, extends定义继承包空间struts-default.-->
<package name="user" namespace="/user" extends="struts-default">
<!--对Action的配置,可以有多对;name是对业务控制器命名,在表单中指定的地址(action属性值);
class指定类的位置。-->
<action name="login" class="action.LoginAction">
<!-- 定义两个逻辑视图和物理资源之间的映射 , name值是Action中返回的结果-->
<result name="error">/WEB-INF/content/error.jsp</result>
<result name="success">/WEB-INF/content/success.jsp</result>
</action>
</package>
</struts>
1.1 配置常量
Struts 2有三种方式配置常量:
1)在struts.xml中配置:便于集中管理(推荐)
2)在struts.properties中配置:保持与WebWork的向后兼容
3)在web.xml中配置:需要更多的代码量,会降低可读性
在struts.xml中配置常量:
<constant name="属性名" value="属性值"/>
name:指定常量(属性)的名字。
value:指定常量的值。
<!--常量配置,指定需要Struts2处理的请求后缀。-->
<constant name="struts.action.extension" value="action"/>
<!--常量配置,指定是否支持动态方法调用。-->
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<!--常量配置,指定是否开发模式。-->
<constant name="struts.devMode" value="true" />
<!--指定是否每次HTTP请求到达时,系统都重新加载资源文件(允许国际化文件重载) -->
<constant name="struts.i18n.reload" value="false" />
web.xml中配置常量:
用于配置Web应用的相关信息,如:监听器(listener)、过滤器(filter)、Servlet、相关参数、会话超时时间、安全验证方式、错误页面等。
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter
</filter-class>
<init-param>
<!--指定国际化资源文件-->
<param-name>struts.custom.i18n.resources</param-name>
<param-value>myMess</param-value>
</init-param>
</filter>
2.实现Action
- Struts 2实现Action类有以下三种方式:
- 普通的POJO类,该类包含一个无参数的execute()方法,返回值为字符串类型;
- 实现Action接口;
- 继承ActionSupport类。
2.1 POJO实现方式(1)
public class XXXAction {
/*属性定义*/
/*属性的getter和setter*/
/*调用业务逻辑方法,控制业务流程*/
public String execute(){
/*具体的业务处理逻辑*/
/*return字符串返回值*/
}
}
2.2 Action接口实现方式(2)
Action类:
public interface Action {
//定义Action接口中包含的一些结果字符串
public static final String ERROR = "error";
public static final String INPUT = "input";
public static final String LOGIN = "login";
public static final String NONE = "none";
public static final String SUCCESS = "success";
//处理方法
public String execute() throws Exception;
}
XXX类实现Acton接口:
import com.opensymphony.xwork2.Action;
public class XXXAction implements Action{
/*属性定义以及属性的getter和setter*/
/*重写execute()方法*/
public String execute() throws Exception {
/*具体的业务处理逻辑*/
/*return字符串返回值*/
}
}
2.3 继承ActionSupport类方式
- 动作类处理客户端请求后会返回一个字符串,每个字符串对应一个逻辑视图;
- 当动作类继承了ActionSupport后,通常使用以下一些常量作为动作执行后的返回值: INPUT 、SUCCESS、LOGIN、NONE和ERROR。
import com.opensymphony.xwork2.ActionSupport;
public class XXXAction extends ActionSupport{
/*属性定义以及属性的getter和setter*/
/*重写execute()方法*/
public String execute() throws Exception {
/*具体的业务处理逻辑*/
/*return字符串返回值*/
}
}
3 配置Action--3.1 定义动作包
- 在Struts 2配置文件中使用“包”来组织Action。
- Struts 2配置文件中的每个包是由多个Action、多个拦截器、多个拦截器引用组成的集合。
属性 | 说明 |
name | 定义动作包的名字,唯一性 |
namespace | 定义动作包的(部分)访问路径,默认为“/” |
extends | 定义继承的父动作包 |
abstract | 指定包是否是抽象的(抽象包中不能包含Action定义) |
包的配置:
<package name="default" namespace="/" extends="struts-default">
<!-- 定义一个名为user的Action,class指定实现类 -->
<action name=“Action名称" class="指定类>
<!-- 配置execute()方法返回值与视图资源之间的映射关系 -->
<result name="error">/WEB-INF/content/error.jsp</result>
<result>/WEB-INF/content/welcome.jsp</result>
</action>
</package>
tip:struts-default包是struts已经定义好的一个抽象包,该包下包括大量结果类型定义、拦截器定义以及拦截器引用定义
3.2 命名空间:
- Struts 2以命名空间的方式来管理Action。
- Struts 2的命名空间提供了一个类似于文件目录的管理方式,可以在不同的命名空间中定义相同的Action,提高应用的灵活性。
- 如果配置package包时没有指定namespace属性,则该包下的所有Action属于默认的命名空间。
3.2.1 struts.xml中配置命名空间的示例:
<!-- 配置第一个包,包名为mydefault,继承struts-default-->
<package name="mydefault" extends="struts-default">
<!-- 定义mydefault包没有指定namespace,该包中的所有Action属于默认命名空间-->
<action name="add" class="action.AddAction">
<result>/WEB-INF/add.jsp</result>
</action>
</package>
因mydefault包没有指定命名空间,所以命名空间是默认的命名空间,其访问请求的URL如下:
http://ip地址:端口号/web应用路径名称/add.action
3.2.2 在struts.xml中配置命名空间的示例:
<package name="mypackage" extends="struts-default" namespace="/admin">
<!--mypackage包下的所有Action都属于"/admin"命名空间-->
<action name="login" class="caction.LoginAction">
<result name="error">/WEB-INF/error.jsp</result>
<result>/WEB-INF//success.jsp</result>
</action>
</package>
当用户请求包下的Action时,请求的URL应该符合“namespace+Action”的规则。
访问mypackage包下的Action: http://ip地址:端口号/web应用路径名称/admin/login.action
3.3 Action基本配置
3.3.1在配置Action时,需要指定action以下属性:
- name属性:指定Action的名字,即指明该Action所处理的请求的URL;
- class属性:指定Action的实现类,该属性不是必需的,
如果没有指定class属性的值,则默认使用ActionSupport类; Action处理完用户请求后,需要将指定的视图资源呈现给用户。 <result>元素用来定义配置逻辑视图和物理视图之间的映射关系。
代码示例:
<package name="default" namespace="/" extends="struts-default">
<action name="login" class="action.LoginAction">
<!-- 配置execute()方法返回值与视图资源之间的映射关系 -->
<result name="success">/ok.jsp</result>
<result name="error">/error.jsp</result>
</action>
</package>
3.3.2 Action类方法的执行--动态方法调用:
Struts 2中请求一个Action中的不同处理逻辑方法,这种方式称为DMI(Dynamic Method Invocation,动态方法调用)。
动态方法请求格式:actionName!methodName.action
- actionName是struts.xml中配置的Action的name属性值;
- methodName是Action实现类中处理逻辑的方法名。
- 示例如下:product!edit.action //访问product中的edit()方法
使用动态方法调用之前必须设置Struts2 允许动态方法调用 <constant name="struts.enable.DynamicMethodInvocation" value="true"/>
3.3.3 Action类方法的执行--使用method属性:
<action>元素使用method属性可以让Action调用指定方法处理用户请求。
示例如下,分别请求ProductAction的edit()和del()方法:
<action name="editproduct" class="ProductAction“ method="edit">
<result name="edit">/edit.jsp</result>
</action>
<action name="delproduct" class="ProductAction“ method="del">
<result name="del">/del.jsp</result>
</action>
3.3.4 Action类方法的执行--使用*通配符:
- 使用*通配符定义Action,示例如下:
<action name="*product" class="ProductAction” method="{1}">
<result name="edit">/edit.jsp</result>
<result name="del">/del.jsp</result>
</action>
name属性使用了通配符“*product”,匹配所有符合“*product.action”格式的请求,通过ProductAction处理;
“{1}”表示name属性值中第一个“*”指代的值。
- Struts 2允许在class属性和method属性中同时使用表达式
<action name="*_*" class=" action.{1}Action" method="{2}">
class属性中的“{1}”,匹配模式“*_*”中的第1个“*”;
method属性中的“{2}”匹配模式“*_*”中的第2个“*”。