Action只负责处理请求,负责生成响应的视图组件,一般是JSP页面,而Action为JSP页面提供显示的数据。Action处理请求结束后,控制器根据<result>元素配置的逻辑视图跟物理视图之间的关系来响应。
浏览器,控制器和视图资源的顺序图如下:
如图所示,Action处理完一个请求后,并未直接把请求转发给任何具体的视图资源,而是返回给一个逻辑视图,struts2框架收到这个逻辑视图后,把请求转发到对应的物理视图资源,试图资源将结果呈现给用户。
1)result基本配置
struts2提供两种result:
1:局部结果:将result标签作为action标签的子元素。
2:全局结果:将result标签作为global-results的子元素。
配置result元素有俩属性:
name:指定逻辑视图名。
type:指定结果类型。
一个比较基本的result可以配置为如下这样的:
<action name="firstAction" class="com.test.action.FirstAction" method="add"> <result name="success" type="dispatcher"> <param name="location">/show.jsp</param> <param name="parse">true</param> </result> </action>
这种result配置使用了最繁琐的方式,既指定了需要映射的逻辑视图名(success),也指定了结果类型(dispatcher),并使用子元素的形式来指定实际视图资源。
对于上面使用param子元素配置结果的形式,其中param元素用于配置一个参数,与所有配置参数的地方类似,配置参数需要指定参数名和参数值。参数名由name属性指定,此处的name属性可以为两种值:
location:指定该逻辑视图对应的实际视图。
parse:指定是否允许在实际视图名中使用ognl表达式,默认为true
通常大家配置的时候都写简化的版本:
<action name="firstAction" class="com.test.action.FirstAction" method="add"> <result name="success" type="dispatcher">/show.jsp</result> </action>
因为struts2默认的结果类型就是dispatcher,所以也可以这样写:
<action name="firstAction" class="com.test.action.FirstAction" method="add"> <result name="success">/show.jsp</result> </action>
其实result的name也可以省略,那时候就是用默认的逻辑视图名success。
2)struts2支持的结果类型
结果类型决定了Action处理完请求后,下一步将要调用哪个视图资源来呈现处理结果。
struts2的结果类型实现了com.opensymphony.xwork2.Result接口,如果我们需要自己写一个结果类型,可以实现该接口,然后再struts.xml配置。
struts-default.xml有如下struts2提供的结果类型,该文件在struts2-core.jar的根目录下:
<result-types> <result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult" default="false" /> <result-type name="dispatcher" class="org.apache.struts2.dispatcher.ServletDispatcherResult" default="true" /> <result-type name="freemarker" class="org.apache.struts2.views.freemarker.FreemarkerResult" default="false" /> <result-type name="httpheader" class="org.apache.struts2.dispatcher.HttpHeaderResult" default="false" /> <result-type name="redirect" class="org.apache.struts2.dispatcher.ServletRedirectResult" default="false" /> <result-type name="redirectAction" class="org.apache.struts2.dispatcher.ServletActionRedirectResult" default="false" /> <result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult" default="false" /> <result-type name="velocity" class="org.apache.struts2.dispatcher.VelocityResult" default="false" /> <result-type name="xslt" class="org.apache.struts2.views.xslt.XSLTResult" default="false" /> <result-type name="plainText" class="org.apache.struts2.dispatcher.PlainTextResult" default="false" /> <result-type name="postback" class="org.apache.struts2.dispatcher.PostbackResult" default="false" /> </result-types>
chain类型:Action链式处理的结果类型。
dispatcher类型:用于指定使用jsp作为视图的结果类型。
freemarker类型:用于指定使用FreeMarker模板作为视图的结果类型。
httpheader类型:用于控制特殊的HTTP行为的结果类型。
redirect类型:用于直接跳转到其他URL的结果类型。
redirectAction类型:用于直接跳转到其他Action的结果类型。
stream类型:用于向浏览器返回一个InputStream(一般用于文件下载)
velocity类型:用于指定使用Velocity模板作为视图的结果类型。
xslt类型:用于与XML/XSLT整合的结果类型。
plainText类型:用于显示某个页面的原始代码的结果类型。
写个plainText和redirect的例子:
1.plainText ,这个结果类型下的param的name有两种类型:
location:指定实际的视图资源
charSet:指定输出页面使用的字符集
在struts.xml中做如下配置:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN" "http://struts.apache.org/dtds/struts-2.1.7.dtd"> <struts> <!-- 这句用来配置动态方法调用 --> <constant name="struts.enable.DynamicMethodInvocation" value="true" /> <!-- 开发者模式 --> <constant name="struts.devMode" value="true" /> <package name="user" extends="struts-default" > <action name="firstAction" class="com.test.action.FirstAction"> <result name="success" type="plainText"> <param name="location">/show.jsp</param> <param name="charSet">GBK</param> </result> </action> </package> </struts>
Action中随便写写:
public class FirstAction extends ActionSupport{ private String uname; public String getUname() { return uname; } public void setUname(String uname) { this.uname = uname; } public String execute(){ return SUCCESS; } }
运行结果如下,输出了页面的源代码:
2:redirect结果类型:顾名思义,重定向,param标签的name有location和parse两种值
与dispatcher相对,dispatcher是请求转发,而redirect是重定向,它们俩的区别就是请求转发跟重定向的区别。。。重定向会丢失所有的请求参数,请求属性以及Action中的处理结果。
使用redirect结果类型的效果是,系统将调用HttpServletResponse的sendRedirect方法来重定向指定视图资源,这种重定向的结果就是重新发送一个请求,因此所有的请求参数,请求属性,Action实例和Action中封装的属性全部丢失。
可以修改struts.xml为如下:
<action name="firstAction" class="com.test.action.FirstAction"> <result name="success" type="redirect"> <param name="location">/show.jsp</param> <param name="parse">true</param> </result> </action>
Action跟上边一样,不变,访问路径的时候加个uname参数例如:http://localhost:8080/test/firstAction?uname=zhangsan
结果并没有在页面显示uname(我在页面上用了这句:<s:property value="uname" />),正好说明了重定向丢失了action的处理结果。
3:redirectAction跟redirect很像,也会丢失前一个Action的处理结果,配置的时候它的param的name属性有两个:
actionName:想要重定向到的action的name
namespace:想要重定向到的action所在的命名空间
3)动态结果
可以在result的物理资源视图名上使用通配符或者OGNL表达式。。。。
4)全局结果
写在<global-results>标签里,该全局结果对所有Action都有效,如果一个Action里包含了与全局结果相同名字的结果,那么局部的结果会覆盖全局的,当Action处理用户请求结束后,它会先去局部result里找,如果没找到才去全局找
全局的result配置如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN" "http://struts.apache.org/dtds/struts-2.1.7.dtd"> <struts> <!-- 这句用来配置动态方法调用 --> <constant name="struts.enable.DynamicMethodInvocation" value="true" /> <!-- 开发者模式 --> <constant name="struts.devMode" value="true" /> <package name="user" extends="struts-default" > <!-- 全局result --> <global-results> <result name="error">/error.jsp</result> </global-results> <action name="*Action" class="com.test.action.LoginAction" method="{1}"> <result name="success">/success.jsp</result> </action> </package> </struts>
struts2学习笔记(5)----------配置result,布布扣,bubuko.com