Struts 2.x权威指南
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.6.6 redirect结果类型

redirect结果类型与dispatcher结果类型相对,dispatcher结果类型是将请求Forward(转发)到指定的JSP资源;而redirect结果类型,则意味着将请求Redirect(重定向)到指定的视图资源。

dispatcher结果类型与redirect结果类型的差别主要就是转发和重定向的差别:重定向会丢失所有的请求参数、请求属性——当然也丢失了Action的处理结果。

使用redirect结果类型的效果是,系统将调用HttpServletResponse的sendRedirect(String)方法来重定向指定的视图资源,这种重定向的效果就是重新产生一个请求,因此,所有的请求参数、请求属性、Action实例和Action中封装的属性全部丢失。

对于上面的应用,如果将struts.xml文件修改成如下形式。

程序清单:codes\03\3.6\redirect\WEB-INF\src\struts.xml

<?xml version="1.0" encoding="GBK" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">
<!-- 配置Struts 2配置文件的根元素 -->
<struts>
    <constant name="struts.i18n.encoding" value="GBK"/>
    <!-- Struts 2的Action必须放在指定的包空间下定义 -->
    <package name="crazyit" extends="struts-default">
          <action name="login" class="org.crazyit.struts2.action.LoginAction">
                <result type="redirect">/WEB-INF/content/welcome.jsp</result>
          </action>
          <action name="*">
                <result>/WEB-INF/content/{1}.jsp</result>
          </action>
    </package>
</struts>

上面的Result使用了redirect结果类型,意思是:当Action处理用户请求结束后,系统将重新生成一个请求,直接转入/WEB-INF/content/welcome.jsp页面。

浏览者向该Action发送请求,当该Action处理完用户请求后,重定向到/WEB-INF/content/welcome.jsp页面(该页面使用Struts 2标签输出username属性),将看到如图3.24所示的效果。

图3.24 使用redirect结果类型的结果

在图3.24所示页面的地址栏中看到,地址栏里请求的URL已经不再是login.action,而是/WEB-INF/content/welcome.jsp。可见使用redirect结果类型时,当Action处理完用户请求后,再次向视图资源发送全新的请求。

完整地配置一个redirect的Result,可以指定如下两个参数。

location:该参数指定Action处理完用户请求后跳转的地址。

parse:该参数指定是否允许在location参数值中使用表达式,该参数值默认为true。

与前面类似的是,通常无须指定parse参数值,因此可以简化成上面的情形。