看了很多博客,觉得解释的不是很好。尝试自己亲自写一下,看一下区别
- dispacher的效果:用于包含或转发到某一视图JSP页面:
-
规范写法
<package name="default" namespace="/" extends="struts-default"> <action name="login" method="login" class="com.rjxy.struts.login.LoginAction"> <result name="loginSuccess" type="dispatcher"> <param name="location">/WEB-INF/pages/success.jsp</param> </result> <result name="loginFailed" type="dispatcher"> <param name="location">/WEB-INF/pages/failed.jsp</param> </result> </action> </package> </struts>
注:result 中存在 type 属性, 这个属性就是用来: 在 StrutsPrepareAndExecuteFilter 生成对应的 action 实例, 执行对应方法并返回值之后。 在 struts.xml 中找到对应的结果, 那么在访问结果中对应的资源文件的时候, 是采用重定向, 还是请求转发, type 可以规定, 其默认值就是 dispacher 。 另外资源文件默认值也如上述代码所示, 是<param name=“location”>/WEB-INF/pages/success.jsp</param> 。
可以看到地址栏在被 action 实例处理之后, 在访问要显示结果的资源文件就没有变化。 因为默认属性是 dispatcher 。 所以不变化。 -
尝试转发到 action
做如下配置:<struts> <package name="default" namespace="/" extends="struts-default"> <action name="login" method="login" class="com.rjxy.struts.login.LoginAction"> <result name="loginSuccess" type="dispatcher"> <param name="location">show.action</param> </result> <result name="loginFailed" type="dispatcher"> <param name="location">/WEB-INF/pages/failed.jsp</param> </result> </action> <action name="show" method="show" class="com.rjxy.struts.login.LoginAction"> <result name="showThis">/WEB-INF/pages/show.jsp</result> </action> </package> </struts>
在 web.xml 需要做一下配置, 才能转发到另外一个action, 第一点中只是转发到jsp资源文件 。
```
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>FORWARD</dispatcher>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
```
- redirect的效果: 重定向web资源,之前action实例不再被获得,若需传递数据,可通过session、web参数以及OGNL表达式。
- 刚才1中使用dispatcher的时候,没有配置web.xml就出现错误了。但是使用重定向,没有配置web.xml就能够访问。原因就在于重定向action的时候是从客户端重发一次,会被StrutsPrepareAndExecuteFilter 拦截。 而action的请求转发没有配置是不可以的,也就是action实例在执行完方法之后,更具结果,还要请求转发到另一个action,必须配置。
<struts>
<package name="default" namespace="/" extends="struts-default">
<action name="login" method="login" class="com.rjxy.struts.login.LoginAction">
<result name="loginSuccess" type="redirect">
<param name="location">show.action</param>
</result>
<result name="loginFailed" type="redirect">
<param name="location">/WEB-INF/pages/failed.jsp</param>
</result>
</action>
<action name="show" method="show" class="com.rjxy.struts.login.LoginAction">
<result name="showThis">/WEB-INF/pages/show.jsp</result>
</action>
</package>
</struts>
经过新一次重定向之后,地址栏发生了变化。不再是login
- 使用redirect不能重定向到WEB-INF下的资源文件,因为没有权限,但是可以重定向到普通目录下的jsp文件。还可以重定向到一个action,上面已经演示。
- chain 将请求直接转到一个Action,用于action链式操作,调用到另一个完整的action,包括它的拦截器栈和result.
<struts>
<package name="default" namespace="/" extends="struts-default">
<action name="login" method="login" class="com.rjxy.struts.login.LoginAction">
<result name="loginSuccess" type="chain">
<param name="actionName">show</param>
<param name="namespace">/</param>
<param name="method">show</param>
</result>
<result name="loginFailed" type="redirect">
<param name="location">/WEB-INF/pages/failed.jsp</param>
</result>
</action>
<action name="show" method="show" class="com.rjxy.struts.login.LoginAction">
<result name="showThis">/WEB-INF/pages/show.jsp</result>
</action>
</package>
</struts>
如果把类型换成是dispatcher,会报错。说明这几个参数是给chain使用的,而且chain不需要配置web.xml就能够转发。从这一个方面也就说明了,chain是用来转发到另一个action的,而dispatcher是用来转发到jsp文件的,也可以转发到action但需要配置。
- redirect 通过重定向的形式转到一个Action
<struts>
<package name="default" namespace="/" extends="struts-default">
<action name="login" method="login" class="com.rjxy.struts.login.LoginAction">
<result name="loginSuccess" type="redirectAction">show</result>
<result name="loginFailed" type="redirect">
<param name="location">failed.jsp</param>
</result>
</action>
<action name="show" method="show" class="com.rjxy.struts.login.LoginAction">
<result name="showThis">/WEB-INF/pages/show.jsp</result>
</action>
</package>
</struts>
- redirectAction不能重定向jsp文件,因为后缀会带有.action
<struts>
<package name="default" namespace="/" extends="struts-default">
<action name="login" method="login" class="com.rjxy.struts.login.LoginAction">
<result name="loginSuccess" type="redirectAction">show.jsp</result>
<result name="loginFailed" type="redirect">
<param name="location">failed.jsp</param>
</result>
</action>
<action name="show" method="show" class="com.rjxy.struts.login.LoginAction">
<result name="showThis">/WEB-INF/pages/show.jsp</result>
</action>
</package>
</struts>
记得时候很好记忆, dispatcher请求转发,能转发到action,也能转发到jsp,转发action需要配置web.xml。chain与其相对应,有很多参数,只能转发到action,而且不用配置web.xml,天生就是用来请求转发action的。redirect请求重定向, 能重定向action,也能重定向jsp文件,前提是不再web-inf下的jsp文件。redirectAction只能重定向action,因为它后缀会加上.action(如果有了.action就不加了)。