首页 > 代码库 > Struts2中Result的配置
Struts2中Result的配置
一个result代表了一个可能的输出。当Action类的方法执行完成时,它返回一个字符串类型的结果码,框架根据这个结果码选择对应的result,向用户输出。
一、结果类型
Struts2提供了很多的结果类型的,这里介绍最常用的四种。
dispatcher:在服务器内跳转到结果页面(视图页面)中去,只可以跳转到视图页面,不能跳转到Action。(默认类型)
redirect:客户端跳转(重定向),URL会发生变化,只可以跳转到视图页面,不能跳转到Action。
chain:在服务器内跳转到Action。
redirectAction:客户端跳转到Action,URL会发生变化。
配置代码如下:
<struts> <constant name="struts.devMode" value="http://www.mamicode.com/true" /> <package name="resultTypes" namespace="/r" extends="struts-default"> <action name="r1"> <result type="dispatcher">/r1.jsp</result> </action> <action name="r2"> <result type="redirect">/r2.jsp</result> </action> <action name="r3"> <result type="chain">r1</result> </action> <action name="r4"> <result type="redirectAction">r2</result> </action> </package> </struts>
(1)dispatcher类型
这是最常用也是Struts2中默认使用的类型,Struts2在后台使用Server API的RequestDispatch来转发请求,因此在用户的整个请求/响应过程中,目标Servlet/JSP接收到的request/response对象,与最初的Servlet/JSP相同。也就是说dispatch是在服务器内完成跳转,其过程如下:
其转跳后URL不会变化,如下:
http://localhost:8080/Struts2_ResultType/r/r1
注意:这种方式的Action共享同一Value Stack(值栈)。
(2)redirect类型
redirect是指客户端跳转(重定向),它在后台使用HttpServletResponse的sendRedirect方法将请求重定向到指定的URL,用户要完成一次与服务器之间的交互,浏览器需要发出两次请求。其过程如下:
使用redirect结果类型,实际上是告诉浏览器目标资源所在的位置,让浏览器重新访问目标资源,其转跳后URL会重定向到指定的结果页面中去,如下:
http://localhost:8080/Struts2_ResultType/r2.jsp
由于在一次用户交互过程中存在着两次请求,因此第一次请求中的数据在第二次请求中是不可用的(其实是因为不能从第一次请求的Value stack(值栈)中取值),这就意味着目标资源是不能访问第一次请求的action实例,action错误以及字段错误等。
(3)chain类型
与dispatcher类型相似,只不过chain类型是转跳到Action。
(4)redirectAction类型
与redirect类型相似,只不过redirectAction类型是转跳到Action。
二、全局结果
全局结果比较简单,当有多个action要使用同一个结果集时,则可以使用全局结果集(GlobalResult),这样就不用在每一个使用同一个结果集的action里面都添加一个result,如下:
<package name="user" namespace="/user" extends="struts-default"> <!-- 全局结果,在这个包内,所以的Action都可以用这个name="mainpage"的result,result可以有多个--> <global-results> <result name="mainpage">/main.jsp</result> </global-results> <action name="user" class="com.chongqing.action.UserAction"> <result>/user_success.jsp</result> <result name="error">/user_error.jsp</result> </action> </package>
当其它不同的package需要使用这个全局的Result时,则需要使用<package>标签中的extends属性来指定继承包含全局的package就可以了。如下:
<package name="admin" namespace="/admin" extends="user"> <action name="admin" class="com.chongqing.action.AdminAction"> <result>/admin.jsp</result> </action> </package>
三、动态结果
所谓动态结果,就是指在配置的时候不知道要执行哪一个结果,要在运行的时刻才能确定执行的结果。简单地说,就是在配置结果时使用了表达式,在运行时刻框架解析并计算表达式,根据表达式的值来确定要执行的结果。
配置如下:
<struts> <constant name="struts.devMode" value="http://www.mamicode.com/true" /> <package name="user" namespace="/user" extends="struts-default"> <action name="user" class="com.chongqing.action.UserAction"> <result>${r}</result> </action> </package> </struts>
注:${}:作用是用于是从Value stack(值栈)中取值。例如:${r} 表示从Value stack(值栈)中取出action的r(成员属性)的值。注意这个成员属性必需具有get/set方法。
Action类如下:
package com.chongqing.action; import com.opensymphony.xwork2.ActionSupport; public class UserAction extends ActionSupport { private int type; private String r; public String getR() { return r; } public void setR(String r) { this.r = r; } public int getType() { return type; } public void setType(int type) { this.type = type; } @Override public String execute() throws Exception { if(type == 1) r="/user_success.jsp"; else if (type == 2) r="/user_error.jsp"; return "success"; } }
四、带参数的结果集
也就是向结果集传参数。正如第一节所介绍,Result的dispatch类型共享同一个Value Stack(值栈),而redirect类型却不共享。所以这节介绍当Result是redirect类型如何传参数。
配置如下:
<struts> <constant name="struts.devMode" value="http://www.mamicode.com/true" /> <package name="user" namespace="/user" extends="struts-default"> <action name="user" class="com.chonqing.action.UserAction"> <result type="redirect">/user_success.jsp?t=${type}</result> </action> </package> </struts>
UserAction类:
package com.chonqing.action; import com.opensymphony.xwork2.ActionSupport; public class UserAction extends ActionSupport { private int type; public int getType() { return type; } public void setType(int type) { this.type = type; } @Override public String execute() throws Exception { return "success"; } }
因为只有Action才具有值堆栈,JSP是没有什么值堆栈的。所以当result重定向到/user_success.jsp?t=${type}后,是不能从值堆栈中取出t的值。但是有ActionContext,可以从中取出t的值。JSP代码如下:
<body> User Success! from valuestack: <s:property value="http://www.mamicode.com/t"/><br/> from actioncontext: <s:property value="http://www.mamicode.com/#parameters.t"/> <s:debug></s:debug> </body>
注:<s:property value="http://www.mamicode.com/t"/>取不到值,因为JSP不是一个Action没有值堆栈。
<s:property value="http://www.mamicode.com/#parameters.t"/>可以取出t的值,因为#方式是从ActionContext中取属性值,ActionContext堆栈中具有parameters这个属性是用于存储传入的参数,可以取出。
Struts2中Result的配置