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

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的配置

  1. <package name="mystruts1" extends="struts-default" namespace="/mystruts1">
  2. <!-- 第一个Action -->
  3. <action name="test_*" class="com.action.TestAction" method="{1}">
  4. <result name="text_chain" type="chain">result_resultChain</result>
  5. <result name="text_redirect" type="redirect">result_resultRedirect</result>
  6. </action>
  7. <!-- 第二个Action -->
  8. <action name="result_*" class="com.action.ResultAction" method="{1}"></action>
  9. </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:

  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. }
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:

  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. }
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对象:

  1. <result type= "chain " name="a2">action2</result>
<result type= "chain " name="a2">action2</result> 


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

  1. <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的处理类是 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大写开头的属性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值