这一篇呢主要讲一下几个问题:
1、结果视图类型概述
2、dispatcher、chain、redirect、redirectAction实现Action协作
3、结果视图参数设置
了解结果视图类型,掌握常用结果视图的特点与应用领域,掌握常用结果视图类型的应用技巧,了解结果视图的参数设置方法,了解PreResultListener的使用。
result结果类型:
【逻辑视图名与物理视图资源映射】
在Struts2中,Action处理完用户请求后,将返回一个普通字符串,这个字符串就是逻辑的视图名,Struts2通过配置将逻辑视图名与一个物理视图资源进行映射。
如:<result name="input">/login.jsp</result>
【视图类型】
Struts2支持多种类型的视图(在struts-defalut.xml中预定义了11种结果类型),配置<result>时通过type属性指定,默认使用的类型是dispatcher,即服务器端请求转发(在上一章中已经讲过请求转发与重定向的原理以及区别)。
dispatcher:请求转发到JSP
redirect:请求重定向到其它Action、JSP、HTML
chain:请求转发到另一个Action
redirectAction:请求重定向到另一个Action
freemarker:处理FreeMarker模板
httpheader:发一个Http头信息
stream:文件下载
velocity:处理Velocity模板
xslt:处理XML/XSLT模板
plainText:显示原始文件内容,如文件源代码
(在这一章中我们不会讲完,会讲解其中的一部分,剩下的以后可能会讲到。)
从功能来分,以上类型可以分为两部分:
1、对客户端信息进行转发和重定向:
dispacther、chain、redirect、redirectAction
2、定义信息的其他显示方法:
stream、freemarker、velocity、plaintext等
接下来我用一个统一的j简单的例子来说明dispacther、chain、redirect、redirectAction的用法及区别。
主要用到四个文件,两个action:first.java,second.java。和两个jsp: index.jsp suc.jsp
两个action的内容一样:
package action; import com.opensymphony.xwork2.ActionSupport; public class first extends ActionSupport { public String execute() throws Exception { // TODO Auto-generated method stub return SUCCESS; } }
struts.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <!-- <1>result结果试图redirect的用法 注意redirect和dispatcher(默认)的区别 1,地址栏路径不同 2,传值不同,重定向跳转不能传值 <constant name="struts.enable.DynamicMethodInvocation" value="true" /> <constant name="struts.i18n.encoding" value="UTF-8"></constant> <package name="default" namespace="/admin" extends="struts-default" > <action name="first" class="action.first" > <result type="redirect">second</result> </action> <action name="second" class="action.second" > <result >/suc.jsp</result> </action> </package> --> <!-- <2>result结果试图类型redirectAction的用法,注意和redirect的区别 redirectAction注意路径后追名:http://localhost:8888/chp4/admin/second.action 当然,.Action也可以随意更改,但必须设置以下<constant name="struts.action.extension" value="app"></constant> <constant name="struts.enable.DynamicMethodInvocation" value="true" /> <constant name="struts.i18n.encoding" value="UTF-8"></constant> <package name="default" namespace="/admin" extends="struts-default"> <action name="first" class="action.first"> <result type="redirectAction"> <param name="actionName">second</param> <param name="namespace">/user</param> </result> </action> </package> <package name="aa" namespace="/user" extends="struts-default"> <action name="second" class="action.second"> <result type="redirect">/suc.jsp</result>地址栏路径: http://localhost:8080/chp4/suc.jsp 注意两者的路径区别 <result >/suc.jsp</result> 地址栏路径:http://localhost:8080/chp4/user/second.action </action> </package> --> <!--《3》 chain的用法 <constant name="struts.enable.DynamicMethodInvocation" value="true" /> <constant name="struts.i18n.encoding" value="UTF-8"></constant> <package name="default" namespace="/admin" extends="struts-default"> <action name="first" class="action.first"> <result type="chain"> <param name="actionName">second</param> <param name="namespace">/user</param> </result> </action> </package> <package name="aa" namespace="/user" extends="struts-default"> <action name="second" class="action.second"> <result >/suc.jsp</result> 地址栏路径:http://localhost:8080/chp4/admin/first <result type="redirect">/suc.jsp</result> 地址栏路径:http://localhost:8080/chp4/suc.jsp </action> </package> --> <!--《4》 result结果视图类型plainText的用法。显示源文件 --> <constant name="struts.enable.DynamicMethodInvocation" value="true" /> <constant name="struts.i18n.encoding" value="UTF-8"></constant> <package name="default" namespace="/admin" extends="struts-default"> <action name="first" class="action.first"> <result type="chain"> <param name="actionName">second</param> <param name="namespace">/user</param> </result> </action> </package> <package name="aa" namespace="/user" extends="struts-default"> <action name="second" class="action.second"> <result type="plainText"> <param name="location">/suc.jsp</param> <param name="charSet">gbk</param> </result> </action> </package> </struts>
index.jsp
<body> <a href="admin/first">redirect tiao zhuan </a><br> </body>
suc.jsp
<body> success !!!!!!!! <br> </body>
结果视图的参数设置:
1)在配置文件中通过<result>节点定义结果视图,在<result>元素内还可以嵌套<param>元素来向结果视图传递参数,例如:
以上配置等价如下配置:
(2)不同类型的结果视图有不同的参数可以传递,可通过Struts2文档查阅相关参数及用法
Chain Result:
actionName(default):默认为Action名
namespace:Action所在的命名空间
method:调用Action中的哪个业务方法
PlainText Result:
location:将要显示为普通文本的资源
charSet:显示文本使用的字符集,默认为ISO-8859-1
PreResultListener监听器接口:
可以在Action完成控制处理之后,系统转入实际的物理视图之前被回调(框架自动调用,不需要开发人员去调用)
让我们对上面的例子加以修改来说明吧,
只修改first.java 和 second.java
first.java
package action; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.interceptor.PreResultListener; public class first extends ActionSupport { public String execute() throws Exception { // TODO Auto-generated method stub ActionInvocation invocation=ActionContext.getContext().getActionInvocation(); invocation.addPreResultListener( new second()); System.out.print("11111111111111111111111111"); return SUCCESS; } }
second.java
package action; import java.util.Collection; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.interceptor.PreResultListener; public class second extends ActionSupport implements PreResultListener{ public void beforeResult(ActionInvocation arg0, String arg1) { // TODO Auto-generated method stub //arg1是逻辑视图的名字如:input, success System.out.print("返回的逻辑视图的名字为:"+arg1); arg0.getInvocationContext().put("name", "这是来自于result前置监听器的内容!!!"); } }
然后,运行后看一下控制台就知道了~~