在Struts2中,Action处理完用户请求后,将会返回一个字符串对象,这个字符串对象就是一个逻辑视图名。Struts 2通过配置逻辑视图名和物理视图之间的映射关系,一旦系统收到Action返回的某个逻辑视图名,系统就会把相应的物理视图呈现给浏览者。
Struts 2的结果类型决定了Action处理结束后,下一步将会调用那种视图资源来呈现处理结果。默认是dispatcher,该结果类型指定使用JSP作为视图资源。但是我们会有这样的要求:要求从一个Action转到另一个Action中去。
从一个Action直接跳到另一个Action中,Struts提供了两种结果类型可以实现:chain、redirect。
我们从Servlet中学到重定向是不能保留参数的,也就是说重定向了,request对象就会无效了。同样redirect就像Servlet中的重定向,它也不能够保留request对象保存的参数。但是chain可以。所以两种的区别就在于chain能够保留request对象,而redirect不可以。
struts.xml的配置
- <package name="mystruts1" extends="struts-default" namespace="/mystruts1">
- <!-- 第一个Action -->
- <action name="test_*" class="com.action.TestAction" method="{1}">
- <result name="text_chain" type="chain">result_resultChain</result>
- <result name="text_redirect" type="redirect">result_resultRedirect</result>
- </action>
- <!-- 第二个Action -->
- <action name="result_*" class="com.action.ResultAction" method="{1}"></action>
- </package>
<package name="mystruts1" extends="struts-default" namespace="/mystruts1">
<!-- 第一个Action -->
<action name="test_*" class="com.action.TestAction" method="{1}">
<result name="text_chain" type="chain">result_resultChain</result>
<result name="text_redirect" type="redirect">result_resultRedirect</result>
</action>
<!-- 第二个Action -->
<action name="result_*" class="com.action.ResultAction" method="{1}"></action>
</package>
Action1:
- public class TestAction {
- public String testChain(){
- HttpServletRequest request = (HttpServletRequest) ActionContext.getContext().get(ServletActionContext.HTTP_REQUEST);
- request.setAttribute("param", "我是chain结果类型...");
- return "text_chain";
- }
- public String testRedirect(){
- HttpServletRequest request = (HttpServletRequest) ActionContext.getContext().get(ServletActionContext.HTTP_REQUEST);
- request.setAttribute("param", "我是redirect结果类型...");
- return "text_redirect";
- }
- }
public class TestAction {
public String testChain(){
HttpServletRequest request = (HttpServletRequest) ActionContext.getContext().get(ServletActionContext.HTTP_REQUEST);
request.setAttribute("param", "我是chain结果类型...");
return "text_chain";
}
public String testRedirect(){
HttpServletRequest request = (HttpServletRequest) ActionContext.getContext().get(ServletActionContext.HTTP_REQUEST);
request.setAttribute("param", "我是redirect结果类型...");
return "text_redirect";
}
}
Action2:
- public class ResultAction {
- public String resultChain(){
- HttpServletRequest request = (HttpServletRequest) ActionContext.getContext().get(ServletActionContext.HTTP_REQUEST);
- System.out.println(request.getAttribute("param"));
- return null;
- }
- public String resultRedirect(){
- HttpServletRequest request = (HttpServletRequest) ActionContext.getContext().get(ServletActionContext.HTTP_REQUEST);
- System.out.println(request.getAttribute("param"));
- return null;
- }
- }
public class ResultAction {
public String resultChain(){
HttpServletRequest request = (HttpServletRequest) ActionContext.getContext().get(ServletActionContext.HTTP_REQUEST);
System.out.println(request.getAttribute("param"));
return null;
}
public String resultRedirect(){
HttpServletRequest request = (HttpServletRequest) ActionContext.getContext().get(ServletActionContext.HTTP_REQUEST);
System.out.println(request.getAttribute("param"));
return null;
}
}
部署项目后,当在浏览器中输入:http://localhost:8080/struts2_01/mystruts1/result_resultRedirect.action。结果如下
得到为null。由此可见Redirect并不能获取request对象保存的参数。
当输入http://localhost:8080/struts2_01/mystruts1/result_testChain.action,得到如下结果:
得到了正确的结果,所有chain可以获得Request对象保存的参数。
所以:
1. 需要保存前一个action的属性信息时使用,保存住action1的request对象:
- <result type= "chain " name="a2">action2</result>
<result type= "chain " name="a2">action2</result>
2. 不保存前一个action的参数可以用这种方法:
- <result type= "redirectAction "> action2</result>
reusult 是返回页面结果的
1. name
用来匹配action的返回值,如果没有为默认result。
2. type
result类型值来自extends XML文件配置中的result-type,也就是说要result类型值是通过result-type 进行预定义的/自定义的。struts-default.xml中的默认为dispatcher。
Char: 用来处理Action链,被跳转的action中仍能获取上个页面的值,如request信息。result-type的处理类是com.opensymphony.xwork2.ActionChainResult
dispatcher:用来转向页面,通常处理。result-type的处理类是JSPorg.apache.struts2.dispatcher.ServletDispatcherResult
freemaker: 处理FreeMarker模板。result-type的处理类是
httpheader:控制特殊HTTP行为的结果类型。result-type的处理类是
stream 向浏览器发送InputSream对象,通常用来处理文件下载,还可用于返回AJAX数据。result-type的处理类是org.apache.struts2.dispatcher.StreamResult
velocity:处理Velocity模板 。result-type的处理类是org.apache.struts2.dispatcher.VelocityResult
xslt:处理XML/XLST模板。result-type的处理类是org.apache.struts2.views.xslt.XSLTResult
plainText:显示原始文件内容,例如文件源代码。result-type的处理类是org.apache.struts2.dispatcher.PlainTextResult
plaintext:显示原始文件内容,例如文件源代码。result-type的处理类是org.apache.struts2.dispatcher.PlainTextResult
redirect: 重定向到一个URL ,被跳转的页面中丢失传递的信息,如request。result-type的处理类是org.apache.struts2.dispatcher.ServletRedirectResult
redirectAction: 重定向到一个Action ,跳转的页面中丢失传递的信息,如request。result-type的处理类是org.apache.struts2.dispatcher.ServletActionRedirectRes
redirect-action: 重定向到一个Action ,跳转的页面中丢失传递的信息,如request。result-type的处理类是org.apache.struts2.dispatcher.ServletActionRedirectRes
注意:redirect与redirect-action区别
一、使用redirect需要后缀名 使用redirect-action不需要后缀名
二、type="redirect" 的值可以转到其它命名空间下的action,而redirect-action只能转到同一命名空下的 action,因此它可以省略.action的后缀直接写action的名称。
特殊位置:
<global-results>
</global-results>
特殊参数:
<result name="next_opertor" >${var_name}</result>
var_name 必须是action里面的一个私有属性,并且有get/set方法必须符合bean的命名规则: 小写开头set/get大写开头的属性