Struts2的常用结果类型分析

Struts2的结果类型

struts2的结果类型如下图所示


chain  Action链式处理结果类型 ,表示的是一个转发的关系,是在一个请求里面。一般情况下,当处理完一个action 之后会直接返回页面,输出结果。但也会存在当一个action处理完后,会直接跳到下一个action进行处理,这时候就会用到chain。

dispatcher  默认的请求转发的结果类型

redirect   重定向,重定向到一个路径信息,路径信息没有限制(不在一个请求中)

redirectAction  重定向到某个action上面

首先,我们对常用的redirect和dispactcher进行实验。
我们用登陆界面login.jsp和LoginAction进行测试
1、在struts.xml中配置文件中,配置结果类型为dispatcher
<action name="login2" class="cn.sict.struts.LoginAction2">
<result name="success" type="dispatcher">/result.jsp</result>
</action>
跳转页面结果如下:


2、配置结果类型为redirect,跳转的页面如下:

由上面可以分析得到:
1)地址栏的显示区别:dispatcher,请求转发,其显示结果非常像get方法,会将提交的参数附带在action的后面。而重定向会直接显示结果页面的资源地址。
2)请求转发,是在同一个request对象中,所以结果页面会取到request对象中的值。而重定向不是,它会重新发起一个request请求,这时候的request对象的值为空,所以显示为空。

2、在对chain和redirectAction进行测试
我们定义两个action类,分别是Action1和Action2。仍然是对登陆页面login.jsp进行测试。
我定义从login.jsp跳转到Action1再跳转到Action2最后到result.jsp,输出登陆名和密码。
1)测试结果类型为chain
struts.xml配置内容如下:
<action name="action1" class="cn.sict.action.Action1">
	<result name="success" type="chain">action2</result>
	</action>
	<action name="action2" class="cn.sict.action.Action2">
	<result name="success">/result.jsp</result>
	</action>
Action1内容如下:
public class Action1 extends ActionSupport{
private String username;
private String password;
public String getUsername() {
	return username;
}
public void setUsername(String username) {
	this.username = username;
}
public String getPassword() {
	return password;
}
public void setPassword(String password) {
	this.password = password;
}
@Override
	public String execute() throws Exception {
		// TODO Auto-generated method stub
		return SUCCESS;
	}
}
Action2内容如下:
public class Action2 extends ActionSupport {
	@Override
	public String execute() throws Exception {
		// TODO Auto-generated method stub
		return SUCCESS;
	}
}
测试结果如下:


2)测试结果类型为redirectAction


从上图测试结果分析出,
1)chain是在同一个请求中的,而且它在URL中只显示第一个action的地址。
2)redirectAction是请求重定向,所以第一次在request中的数据会在第二次重定向之后失去,页面中得不到username和password的数据。

3、那redirect和redirectAction又有什么区别呢。
从表象上看,好像就能知道redirectAction是重定向到Action了,那redirect自然就是重定向到页面了,例如jsp页面。
我们先来做一个例子吧。
在上面的实例中,我想通过重定向把username和password的值显示在result.jsp页面中,可以办到吗?当然可以。
我们这样配置就可以了。在Action2中写上set/get方法,然后在struts.xml文件中配置如下:
<action name="action1" class="cn.sict.action.Action1">
	<result name="success" type="redirectAction">
	<param name="actionName">action2</param>
	<param name="username">${username}</param>//name所对应的属性值是action2中所对应的属性名
	<param name="password">${password}</param>
	</result>
	</action>
这样我们就可以通过重定向将值传过去。结果页面如下所示:



如果把结果类型该程redirect呢?struts2.xml文档内容如下://还有一种配置参数的方法进行参数传递,这里面省略了。
<action name="action1" class="cn.sict.action.Action1">
	<result name="success" type="redirect">
	action2?username=${username}&amp;password=${password}//action2也可以写成action2.action
	</result>
	</action>
&amp;相当于&,进行了转义。


redirect对应的ServletRedirectResult的文档中的解释如下;
调用{@link HttpServletResponse#sendRedirect(String) sendRedirect}方法来转到指定的位置. HTTP响应被告知使浏览器直接跳转到指定的位置(产生客户端的一个新请求). 这样做的结果会使刚刚执行的action(包括action实例,action中的错误消息等)丢失, 不再可用. 这是因为action是建立在单线程模型基础上的. 传递数据的唯一方式就是通过Session或者可以为Ognl表达式的web参数(url?name=value)
location (默认) - action执行后跳转的地址.
parse - 默认为true. 如果设置为false, location参数不会被当作Ognl表达式解析.

通过以上的测试发现:redirect同样也是可以跳转到action的。通过分析源代码发现ServletRedirectActionResult是继承了ServletRedirectResult的特性。但是通过redirectAction和redirect的区分使用,我们可以很清楚的知道重定向的目标是什么。也有利于我们对程序的理解。


  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值