struts.xml中result type的redirectAction,redirect,chain,dispatcher的区别

看了很多博客,觉得解释的不是很好。尝试自己亲自写一下,看一下区别


  1. 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>
```

在这里插入图片描述


  1. 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,上面已经演示。

  1. 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但需要配置。


  1. 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就不加了)。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值