struts2中的利用结果类型实现Action协作(七)

这一篇呢主要讲一下几个问题:

 

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前置监听器的内容!!!");
		
		
	}
	
	
	
	
	

}


然后,运行后看一下控制台就知道了~~




 

 

 

 

 

你可能感兴趣的:(struts,result)