Struts2从一个action转到另一个action的方法 以及reusult的type属性

来源:互联网 发布:雅思口语网络课程 编辑:程序博客网 时间:2024/05/20 16:32

Struts2中,Action处理完用户请求后,将会返回一个字符串对象,这个字符串对象就是一个逻辑视图名。Struts 2通过配置逻辑视图名和物理视图之间的映射关系,一旦系统收到Action返回的某个逻辑视图名,系统就会把相应的物理视图呈现给浏览者。

Struts 2的结果类型决定了Action处理结束后,下一步将会调用那种视图资源来呈现处理结果。默认是dispatcher,该结果类型指定使用JSP作为视图资源。但是我们会有这样的要求:要求从一个Action转到另一个Action中去。

从一个Action直接跳到另一个Action中,Struts提供了两种结果类型可以实现:chainredirect

我们从Servlet中学到重定向是不能保留参数的,也就是说重定向了,request对象就会无效了。同样redirect就像Servlet中的重定向,它也不能够保留request对象保存的参数。但是chain可以。所以两种的区别就在于chain能够保留request对象,而redirect不可以。

struts.xml的配置

[html] view plaincopyprint?
  1. <packagename="mystruts1"extends="struts-default"namespace="/mystruts1">
  2. <!-- 第一个Action -->
  3. <actionname="test_*"class="com.action.TestAction"method="{1}">
  4. <resultname="text_chain"type="chain">result_resultChain</result>
  5. <resultname="text_redirect"type="redirect">result_resultRedirect</result>
  6. </action>
  7. <!-- 第二个Action -->
  8. <actionname="result_*"class="com.action.ResultAction"method="{1}"></action>
  9. </package>



Action1:

[java] view plaincopyprint?
  1. public class TestAction {
  2. public String testChain(){
  3. HttpServletRequest request = (HttpServletRequest) ActionContext.getContext().get(ServletActionContext.HTTP_REQUEST);
  4. request.setAttribute("param", "我是chain结果类型...");
  5. return "text_chain";
  6. }
  7. public String testRedirect(){
  8. HttpServletRequest request = (HttpServletRequest) ActionContext.getContext().get(ServletActionContext.HTTP_REQUEST);
  9. request.setAttribute("param", "我是redirect结果类型...");
  10. return "text_redirect";
  11. }
  12. }


Action2:

[java] view plaincopyprint?
  1. public class ResultAction {
  2. public String resultChain(){
  3. HttpServletRequest request = (HttpServletRequest) ActionContext.getContext().get(ServletActionContext.HTTP_REQUEST);
  4. System.out.println(request.getAttribute("param"));
  5. return null;
  6. }
  7. public String resultRedirect(){
  8. HttpServletRequest request = (HttpServletRequest) ActionContext.getContext().get(ServletActionContext.HTTP_REQUEST);
  9. System.out.println(request.getAttribute("param"));
  10. return null;
  11. }
  12. }


部署项目后,当在浏览器中输入: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对象:

[html] view plaincopyprint?
  1. <resulttype= "chain "name="a2">action2</result>


2. 不保存前一个action的参数可以用这种方法:

[html] view plaincopyprint?
  1. <resulttype= "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的处理类是org.apache.struts2.views.freemarker.FreemarkerResult

httpheader:控制特殊HTTP行为的结果类型。result-type的处理类是org.apache.struts2.dispatcher.HttpHeaderResult

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 ,被跳转的页面中丢失传递的信息,如requestresult-type的处理类是org.apache.struts2.dispatcher.ServletRedirectResult

redirectAction:重定向到一个Action,跳转的页面中丢失传递的信息,如requestresult-type的处理类是org.apache.struts2.dispatcher.ServletActionRedirectResult

redirect-action:重定向到一个Action,跳转的页面中丢失传递的信息,如requestresult-type的处理类是org.apache.struts2.dispatcher.ServletActionRedirectResult

注意:redirect与redirect-action区别

一、使用redirect需要后缀名使用redirect-action不需要后缀名

二、type="redirect" 的值可以转到其它命名空间下的action,redirect-action只能转到同一命名空下的action,因此它可以省略.action的后缀直接写action的名称。

特殊位置:

<global-results>

<result name=""></result>

</global-results>

特殊参数:

<result name="next_opertor" >${var_name}</result>

var_name 必须是action里面的一个私有属性,并且有get/set方法必须符合bean的命名规则:小写开头set/get大写开头的属性