这一篇呢主要讲一下几个问题:
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前置监听器的内容!!!");
}
}
然后,运行后看一下控制台就知道了~~