Struts2 result type的redirect,redirectAction,chain的区别

一、引言

本文介绍Struts2配置文件中result的type属性值:redirect,redirectAction,chain的区别。

首先简要介绍这三者的意思。

1)redirect:  action处理完后重定向到一个视图资源(如:jsp页面),请求参数全部丢失,action处理结果也全部丢失。 
2)redirectAction:  action处理完后重定向到一个action,请求参数全部丢失,action处理结果也全部丢失。 
3)chain:  action处理完后转发到一个action,请求参数全部丢失,action处理结果不会丢失。


二、测试

下面我们开始建立测试用例。

这里我们以用户注册为例,分别两个Action来模拟以上三个请求转发的类型的测试。


1.创建User类,由于本例目的在测试三种请求转发方式,所以User类设计得比较简单。

[java]  view plain  copy
  1. package org.xjh.domain;  
  2.   
  3. public class User {  
  4.     private String username;  
  5.     private String password;  
  6.       
  7.     public String getUsername() {  
  8.         return username;  
  9.     }  
  10.     public void setUsername(String username) {  
  11.         this.username = username;  
  12.     }  
  13.     public String getPassword() {  
  14.         return password;  
  15.     }  
  16.     public void setPassword(String password) {  
  17.         this.password = password;  
  18.     }  
  19.       
  20.     @Override  
  21.     public String toString() {  
  22.         return "User [username=" + username + ", password="  
  23.                 + password + "]";  
  24.     }  
  25. }  

2.创建Action1,Action1会先收到用户在注册页面提交过来的注册请求(当然这里只是用作模拟并未操作数据库)

[java]  view plain  copy
  1. package org.xjh.struts.action;  
  2.   
  3. import org.apache.struts2.ServletActionContext;  
  4. import org.xjh.domain.User;  
  5.   
  6. public class Action1 {  
  7.   
  8.     private User user;  
  9.   
  10.     public User getUser() {  
  11.         return user;  
  12.     }  
  13.     public void setUser(User user) {  
  14.         this.user = user;  
  15.     }  
  16.   
  17.     public String execute() {  
  18.         //为了区分,我们在后面多加了_first这个标记,以表明这是由Action1接收到的数据  
  19.         user.setUsername(user.getUsername() + "_first");  
  20.         user.setPassword(user.getPassword() + "_first");  
  21.         System.out.println(user);  
  22.         System.out.println("First User Hashcode = " + user.hashCode());  
  23.         //存入提示信息,用于判断redirect,redirectAction,chain转发请求是否丢失数据  
  24.         ServletActionContext.getRequest().setAttribute("message""注册成功!");  
  25.         return "success";  
  26.     }  
  27.   
  28. }  

3.创建Action2类

[java]  view plain  copy
  1. package org.xjh.struts.action;  
  2.   
  3. import org.apache.struts2.ServletActionContext;  
  4. import org.xjh.domain.User;  
  5.   
  6. public class Action2 {  
  7.   
  8.     private User user;  
  9.   
  10.     public User getUser() {  
  11.         return user;  
  12.     }  
  13.     public void setUser(User user) {  
  14.         this.user = user;  
  15.     }  
  16.   
  17.     public String execute() {  
  18.         //为了区分,我们在后面多加了_second这个标记,以表明这是由Action2接收到的数据  
  19.         user.setUsername(user.getUsername() + "_second");  
  20.         user.setPassword(user.getPassword() + "_second");  
  21.         System.out.println(user);  
  22.         System.out.println("Second User Hashcode = "+ user.hashCode());  
  23.         //存入提示信息,用于判断redirect,redirectAction,chain转发请求是否丢失数据  
  24.         ServletActionContext.getRequest().setAttribute("message""注册成功!");  
  25.         return "success";  
  26.     }  
  27.   
  28. }  

4.创建注册页面register.jsp

[html]  view plain  copy
  1. <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>  
  2. <%  
  3. String path = request.getContextPath();  
  4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
  5. %>  
  6.   
  7. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  8. <html>  
  9.   <head>  
  10.     <title>测试</title>  
  11.   </head>  
  12.     
  13.   <body>  
  14.     <h3>欢迎注册</h3>  
  15.     <form action="<%=path %>/firstAction" method="post">  
  16.         用户名: <input type="text" name="user.username" >   <p/>  
  17.         密码: <input type="password" name="user.password" > <p/>  
  18.         <input type="submit" value="注册" />  
  19.     </form>  
  20.   </body>  
  21. </html>  

5.消息提示页

[html]  view plain  copy
  1. <%@ page import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>  
  2. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  3. <html>  
  4.   <head>  
  5.     <title>提示信息</title>  
  6.   </head>  
  7.     
  8.   <body>  
  9.     ${message}  
  10.   </body>  
  11. </html>  

6.配置处理注册请求的action

这里我们首先测试result type="redirect",即redirect转发请求。

[html]  view plain  copy
  1. <package name="user" namespace="/" extends="struts-default">  
  2.     <action name="firstAction" class="org.xjh.struts.action.Action1" >  
  3.          <result name="success" type="redirect">/message.jsp</result>  
  4.     </action>  
  5.     <action name="secondAction" class="org.xjh.struts.action.Action2" >  
  6.          <result name="success">/message.jsp</result>  
  7.     </action>  
  8. </package>  


7.测试

1)测试redirect转发请求

打开浏览器,在地址栏中输入访问register.jsp页面的url

用户名和密码分别输入:test, 123 。点击注册按钮。


你会发现地址栏的url发生了变化,这表明redirect是客户端重定向的方式跳转的。


同时在MyEclipse的控制台窗口,你会看到如下信息:




2)测试redirectAction转发请求

修改struts的配置文件,如下:

[html]  view plain  copy
  1. <package name="user" namespace="/" extends="struts-default">  
  2.     <action name="firstAction" class="org.xjh.struts.action.Action1" >  
  3.         <result name="success" type="redirectAction">  
  4.             <param name="namespace">/</param>  
  5.             <param name="actionName">secondAction</param>  
  6.             <param name="user.username">${user.username}</param>  
  7.             <param name="user.password">${user.password}</param>  
  8.         </result>   
  9.     </action>  
  10.     <action name="secondAction" class="org.xjh.struts.action.Action2" >  
  11.         <result name="success">/message.jsp</result>  
  12.     </action>  
  13. </package>  

回到注册页面,用户名和密码分别输入:test, 123 。点击注册按钮。


你会发现地址栏的url变成了aciton1请求action2的url,这表明redirectAction是客户端重定向的方式跳转的,并且浏览器页面中得到如下提示信息:


同时在MyEclipse的控制台窗口,你会看到如下信息:


这表明第二个Action(Action2)得到的User信息来自第一个Action(Action1)处理过的User信息,而且这两两个对象的地址是不同的(Hashcode不同)


3)测试chain

修改struts的配置文件,如下:

[html]  view plain  copy
  1. <package name="user" namespace="/" extends="struts-default">  
  2.     <action name="firstAction" class="org.xjh.struts.action.Action1" >      
  3.         <result name="success" type="chain">  
  4.             <param name="namespace">/</param>  
  5.             <param name="actionName">secondAction</param>  
  6.         </result>  
  7.     </action>  
  8.     <action name="secondAction" class="org.xjh.struts.action.Action2" >  
  9.         <result name="success">/message.jsp</result>  
  10.     </action>  
  11. </package>  


回到注册页面,用户名和密码分别输入:test, 123 。点击注册按钮。


你会发现地址栏的url只是变成了请求action1的url,这表明chain是以服务端重定向的方式跳转的,并且浏览器页面中得到如下提示信息:


同时在MyEclipse的控制台窗口,你会看到如下信息:


由上面信息可以看出,Action1处理过的User对象信息并未直接传给Action2,在jsp页面提交的请求数据被重新装到一个User对象中,而这个User对象

被Action1中的User变量引用,同时也被Action2的User变量所引用,这点由它们的Hashcode相同可得出。


三、总结

redirect表示客户端重定向,用于重定向到某个页面。

redirectAction也表示客户端重定向,用于重定向到某个Action

chain表示服务端请求转发,用于多个Action之间数据信息的共享。

redirect和redirecAction类似于response.sendRedirect(url);

chain类似于request.getRequestDispatcher(url).forward(request, response);

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值