这就必须使用<result…/>元素进行配置,该元素定义逻辑视图名和物理视图资源之间的映射关系。
浏览者、控制器和视图资源之间的顺序图:
Action处理完用户请求后,并未直接将请求转发给任何具体的视图资源,而是返回一个逻辑视图(普通字符串),Struts2框架收到这个逻辑视图后,把请求转发到对应的视图资源,视图资源将处理结果呈现给用户。
Struts2的Action处理用户请求结束后,返回一个普通字符串---逻辑视图名,必须在struts.xml文件中完成逻辑视图和物理视图的映射,才可让系统转到实际的视图资源。
Struts2的两种配置:
局部结果:将<result…/>作为<action…/>元素的子元素配置。
全局结果:将<result…/>作为<global-results…/>元素的子元素配置。
<result…/>元素需要指定两个属性:
name:该属性指定所配置的逻辑视图名。
type:该属性指定结果类型。
<result…/>片段:
<action name="login" class="org.crazyit.app.action.LoginAction"> <!-- 定义三个逻辑视图和物理资源之间的映射 --> <result name="success" type="dispatcher"> <param name=”location”>/thank_you.jsp</param> </result> </action>
<result…/>最简片段:
<action name="login" class="org.crazyit.app.action.LoginAction"> <!-- 定义三个逻辑视图和物理资源之间的映射 --> <result> /thank_you.jsp</result> </action>
省略默认:
如果我们省略了<result…/>元素的name属性,系统将采用默认的name属性值,默认的name属性值为success。
如果我们省略了<result…/>元素的location参数,系统将会把<result…>…</result>中间的字符串当成实际视图资源;name属性默认值:success;type属性默认值:dispatcher。
Struts2的结果类型要求实现com.opensymphony.xwork2.Result,这个结果是所有结果类型的通用接口。如果我们需要自己的结果类型,我们应该提供一个实现该接口的类,并且在struts.xml文件中配置该结果类型。
struts2-core-2.2.1.jar里的struts-default.xml文件默认提供了一系列的结果类型。
chain:Action链式处理结果类型
dispather: 用于JSP整合的结果类型(默认)
redirect: 用于直接跳转到其他URL的结果类型
redirect-action: 用于直接跳转到其他Action的结果类型
stream: 用于向浏览器返回一个InputStream(一般用于文件下载)
freemarker: 用于FreeMarker整合的结果类型
plaintext: 用于显示某个页面的原始代码的结果类型
chart: 用于整合JFreeChart的结果类型
jsf: 用于JSF整合的结果类型
httpheader: 用于控制特殊的HTTP行为的结果类型
jasper: 用于JasperReports整合的结果类型
tiles: 用于Tiles整合的结果类型
velocity: 用于Velocity整合的结果类型
xslt: 用于XML/XSTL整合的结果类型
用于输出资源视图源代码。
如果结果页面代码中包含了中文字符,使用plainText结果类型必须指定charSet参数,该参数指定输出页面所用的字符集。
使用plainText结果类型时可指定如下两个参数
location:指定实际的视图资源。
charSet:指定输出页面时所用的字符集。
dispatcher是将请求forward到指定的JSP资源;redirect是重定向到指定的视图资源,重定向的话浏览器的URL会刷新,请求参数、请求属性和前一个Action的处理结果全部丢失。
配置一个redirect,可以指定如下两个参数:
location:该参数指定Action处理完用户请求后跳转的地址。
parse:该参数指定是否允许在location参数值中使用表达式,该参数默认true。
redirectAction使用ActionMapperFactory提供的ActionMapper来重定向请求。
当需要让一个Action处理结束后,直接将请求重定向到另一个Action时,我们应该使用这种结果类型。
配置redirectAction,可以指定如下两个参数:
actionName:该参数指定重定向的Action名。
namespace:该参数指定需要重定向的Action所在的命名空间
1.通配符示例:
<action name="crud_*" class="lee.CrudAction" method=”{1}”> <!-- 定义三个逻辑视图和物理资源之间的映射 --> <result name=”input”> /input.jsp</result> <result> /{1}.jsp</result> </action>
例如有一个crud_create.action的请求,系统将调用lee.CrudAction类的create方法来 处理用户请求。当Action处理用户请求结束后,配置了两个结果:当处理结果为input 跳转到/input.jsp;处理结果为success跳转到create.jsp。
2.属性配置结果示例:
<action name="delete" class="org.crazyit.app.action.SkillAction"> <!-- 定义三个逻辑视图和物理资源之间的映射 --> <result name="error">/empmanager/editSkill.jsp</result> <result type=”redirect”>edit.action?skillName=${currentSkill.name}</result> </action>
在上面的配置片段中,使用${currentSkill.name}表达式来指定结果视图资源。对于上面的表达式语法,要求在对应的Action实例里应该包含currentSkill属性且currentSkill属性必须包含name属性---否则,${currentSkill.name}表达式值将为null。
<global-results> <result name="success">/${target}.jsp</result> </ global-results >
优先级:局部>全局
一旦为Action添加了PreResultListener监听器,该监听器就可以在应用转入实际物理视图之前回调该监听器的beforeResult()方法;一旦为拦截器添加了PreResultListener监听器,该监听器会对该拦截器所拦截的所有Action起作用。
Action中的execute方法
public String execute() throws Exception { if (getUsername().equalsIgnoreCase("user")) { throw new MyException("自定义异常"); } if (getUsername().equalsIgnoreCase("sql")) { throw new java.sql.SQLException("用户名不能为SQL"); } if (getUsername().equals("crazyit.org") && getPassword().equals("leegang") ) { setTip("哈哈,服务器提示!"); return SUCCESS; } else { return ERROR; } }
<?xml version="1.0" encoding="GBK"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN" "http://struts.apache.org/dtds/struts-2.1.7.dtd"> <struts> <package name="lee" extends="struts-default"> <!-- 定义全局结果映射 --> <global-results> <!-- 定义当sql、root两个逻辑异常都对应exception.jsp页 --> <result name="sql">/exception.jsp</result> <result name="root">/exception.jsp</result> </global-results> <!-- 定义全局异常映射 --> <global-exception-mappings> <!-- 当Action中遇到SQLException异常时, 系统将转入name为sql的结果中--> <exception-mapping exception="java.sql.SQLException" result="sql"/> <!-- 当Action中遇到Exception异常时, 系统将转入name为root的结果中--> <exception-mapping exception="java.lang.Exception" result="root"/> </global-exception-mappings> <action name="login" class="org.crazyit.app.action.LoginAction"> <!-- 定义局部异常映射, 当Action中遇到MyException异常时, 系统将转入name为my的结果中--> <exception-mapping exception="org.crazyit.app.exception.MyException" result="my"/> <!-- 定义三个结果映射 --> <result name="my">/exception.jsp</result> <result name="error">/error.jsp</result> <result name="success">/welcome.jsp</result> </action> <action name=""> <result>.</result> </action> </package> </struts>
如上述例子,配置中的异常与Action中的异常相同。
原文:http://blog.csdn.net/kakarot5/article/details/44592721