Struts -返回结果
结果类型
结果类型中常用的有四种:dispatcher、redirect、redirectAction和chain。
dispatcher 转发到某一个页面
redirect 重定向到某一个页面
redirectAction 重定向到某一个Action (主要用于Action的链式处理)
chain 转发到某一个Action
第1种:dispatcher
dispatcher也是框架默认的结果类型,其实现类是org.apache.struts2.dispatcher.ServletDispatcherResult,该类中有两个属性:location和parse。它们也可以在struts.xml文件中直接配置:
<result type="dispatcher"> <!-- param的location用于指示资源的位置,标签的内容是参数的值 --> <param name="location">/success.jsp</param> <param name="parse">true</param> </result>
其中的location参数用于指定资源的实际位置,该参数也是框架默认添加的;parse属性是一个布尔类型的值,如果为true,则解析location参数中的OGNL表达式;如果为false,则不解析。parse属性的默认值就是true.
第2种:redirect
当使用该结果类型的时候,框架后台会使用response对象的sendRedirect方法进行重定向
转发和重定向的区别:
1.重定向会发生两次请求,转发只会发生一次请求
2.重定向的时候,浏览器的地址栏会发生变化,而转发地址栏是无变化的
3.重定向的实质是服务器告诉浏览器去另外的地方寻找资源,所以地址栏会发生变化,而转发是在服务器内部发生的,所以地址栏不会发生变化
4.由于重定向是两次请求,所以第二次请求会话保存的信息是无效的,而转发的时候,会话仍然有效,因为仍然是原来的请求。
如果需要在重定向的时候把原来的有关信息发送到重定向后的页面中,则需要使用OGNL表达式${username}(比如在登录成功后重定向到欢迎页面,在欢迎页面就可以使用OGNL表达式把用户名传递过去)
比如下面的配置:
<!-- 登录Action --> <action name="login" class="action.LoginAction"> <result type="redirect">/success.jsp?user.username=${user.username}</result> <result name="error">/error.jsp</result> </action>
在登录成功之后重定向到success.jsp页面的时候,可以观察到浏览器的地址栏把用户名作为参数传递到success.jsp页面。
第3种:redirectAction
此种结果类型与redirect一样,底层都是调用Response对象的sendRedirect方法进行重定向的
这两者的区别是redirect结果类型一般是针对视图的,而redirectAction则是重定向到某个action,所以如果在action处理之后还要交给另一个action继续处理,那么使用redirecAction结果类型。
redirecAction结果类型有两个参数:actionName(指定需要重定向的action)和namespace(指定action所在的命名空间,如果没有指定该参数,框架会从默认的namespace中去寻找)。比如下面的配置:
<!-- HelloWorld演示程序 --> <action name="hello" class="example.HelloWorld"> <!-- 重定向到/user命名空间下的UserAction --> <result type="redirectAction"> <!-- 指定需要重定向的action的name属性 --> <param name="actionName">userAction</param> <!-- 指定重定向的action所在的namespace --> <param name="namespace">/user</param> </result> </action> <!-- 登录Action --> <action name="login" class="action.LoginAction"> <result type="redirect">/success.jsp?user.username=${user.username}</result> <!-- 重定向到同一namespace下的name属性为error的action --> <result type="redirectAction"> <!-- 同一namespace下的action不需要指定namespace参数 --> <param name="actionName">error</param> </result> </action> <action name="error"> <result>/error.jsp</result> </action>
第4种:Chain
将请求转发到某一个Action中,参数如DispatcherAction
全局结果
全局结果的的主要作用是,在有多个action都需要返回到某个页面的时候,就可以全局结果。比如在电商网站购物的时候,查看订单,添加商品到购物车都需要先登录,那么就可以把登录作为一个全局结果。全局结果是在包中定义的,这样该包下的所有action都可以共享该全局结果了。
配置全局结果的方式与在action中直接配置result不太一样,全局结果是在global-results标签中定义的。比如下面的配置:
<!-- 全局结果配置 --> <global-results> <result name="error">/error.jsp</result> <result name="login" type="redirectAction">login!login</result> </global-results>
转载自:https://blog.csdn.net/u011116672/article/details/50256353