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参数值,因此可以简化成上面的情形。