首页 > 代码库 > 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的配置