结果类型中redirect和redirectAction的区别:
redirect是在处理完当前Action之后,重定向到另外一个实际的物理资源。redirectAction也是重定向,但它重定向到的是另外一个Action,或者另外Action类中的方法。 下面这个方法是重定向到index.jsp页面。
<result name="logout" type="redirect">/index.jsp</result>
重定向本Action的query方法
<result name="" type="redirect">*Action!query.action</result>
下面的例子是访问不同命名空间下的Action,执行其execute方法
<package name="test" extends="struts-default" namespace="/">
<action name="test" class="">
<result name="success" type="redirectAction">
<param name="actionName">test1</param>
<param name="namespace">/xx</param>
</result>
</action>
</package>
<package name="test1" extends="struts-default" namespace="/xx">
<action name="test1" class="*.Test1Action">
<result name="success" type="redirect">/test1Suc.jsp?name=${name}</result>
</action>
</package>
只要是重定向,那么之前凡是保存在request里面的东西就全都消失了,因为重定向实际是发送第二个请求,故请求中的东西也就不会出现在第二个请求里面了,也就是说重定向是不共享request的东西,重定向后的页面中无法接收request里的东西。那么我们怎样传递参数那?
<action name="test" class="*.TestAction">
<result name="success" type="redirectAction">
<param name="actionName">test1</param>
</result>
</action>
<action name="test1" class="*.Test1Action">
<result name="success" type="redirect">/test1Suc.jsp?name=${username}</result>
</action>
注意
若第二个Action使用type="redirect",那么在页面中将无法接收Action中所共享的数据,
但在客户端跳转中,我们可以在链接上传参。比如result写成/test1Suc.jsp?name=${username},在Struts2的XML文件中可以使用${}表达式,它会自动的取出Action中所有可用的属性,作为参数传递到下一页面,这里${}不是EL表达式,实际上它的本质上是OGNL表达式,由于从链接中取值,故用<%=request.getParameter("name")%>或者${param.name},这里param相当于request.getParameter(""),注意也不能使用${name},因为它是用来从page、request、session、application中取值的,并且页面中也不能使用<s:property
value="name"/>接收参数值,因为它是从ValueStack中取值的。
另外dispatcher结果类型的default属性为TRUE,故<result-type/>缺省为dispatcher,所以如果没有设置type属性的话,那么默认的是请求转发,即浏览器显示的是*.action,但是在设置type=”redirect”属性后,就可以重定向了,即浏览器显示的是/*.jsp。