论坛首页 综合技术论坛

《研磨struts2》第五章 Result 之 5.6 PreResultListener

浏览 1401 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-05-02  

5.6  PreResultListener

5.6.1  什么是PreResultListener

在实际开发当中,常常需要在Action执行完毕后,而Result还没有开始执行的时候,做一些功能处理,比如异常处理,那么该怎么做呢?

       这就需要使用PreResultListener了。看名字就知道,这是一个“Listener”,也就是一个监听器,用来执行事件监听的。那么它监听的到底是什么事件呢?

       PreResultListener监听的事件就是Action执行完毕,马上要开始Result的处理了,这么一个事件。监听到这个事件后,由谁来进行处理呢?

       跟Java里面其他的事件机制一样,需要由我们去实现一个实现PreResultListener的类,在这个类里面去实现相应的事件回调方法,就是在这些方法里面,去实现事件的处理。

       另外一个问题,当我们自己写了一个实现PreResultListener的类,可是Struts2怎么知道呢?跟Java里面其他的事件机制一样,需要注册监听器,而且要在事件触发之前注册才有效。好了,一起来看看示例。

5.6.2  PreResultListener实现示例

(1)先要写一个类来实现PreResultListener,示例如下:

 

java代码:
  1. package cn.javass.action.action;  
  2.   
  3. import com.opensymphony.xwork2.ActionInvocation;  
  4. import com.opensymphony.xwork2.interceptor.PreResultListener;  
  5.   
  6. public class MyPreResult implements PreResultListener{    
  7.     public void beforeResult(ActionInvocation actionInvocation, String result) {  
  8.         System.out.println("现在处理Result执行前的功能,result="+result);  
  9.     }  
  10. }  

这个类中出现了ActionInvocation对象,这个对象封装了Action运行所需要的东西,包括数据、代理对象等,甚至可以通过它来执行Action。这里只是简单的示例一下,更多的功能,请参见相应的API文档。

(2)然后在Action的execute方法里面,注册这个监听器对象,示例如下:

 

java代码:
  1. package cn.javass.action.action;  
  2. import com.opensymphony.xwork2.ActionContext;  
  3. import com.opensymphony.xwork2.ActionSupport;  
  4. import com.opensymphony.xwork2.interceptor.PreResultListener;  
  5. public class HelloWorldAction extends ActionSupport {  
  6.     private String account;  
  7.     private String password;  
  8.     private String submitFlag;  
  9.       
  10.     public String execute() throws Exception {  
  11.         this.businessExecute();  
  12.         PreResultListener pr = new MyPreResult();       ActionContext.getContext().getActionInvocation().addPreResultListener(pr);  
  13.         return this.SUCCESS;  
  14.     }  
  15.     /** 
  16.      * 示例方法,表示可以执行业务逻辑处理的方法, 
  17.      */  
  18.     public void businessExecute(){  
  19.         System.out.println("用户输入的参数为==="+"account="+account+",password="+password+",submitFlag="+submitFlag);  
  20.     }  
  21.     //属性对应的getter/setter方法,省略了  
  22. }  

(3)struts.xml没有什么变化,就是最简单的配置,如下:

 

java代码:
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE struts PUBLIC  
  3.     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  
  4.     "http://struts.apache.org/dtds/struts-2.0.dtd">  
  5.   
  6. <struts>  
  7.     <constant name="struts.devMode" value="true" />  
  8.     <constant name="struts.locale" value="zh_CN"/>  
  9.     <constant name="struts.i18n.encoding" value="gb2312"/>  
  10.   
  11.     <package name="helloworld"  extends="struts-default">  
  12.         <action name="helloworldAction" class="cn.javass.action.action.HelloWorldAction">  
  13.             <result>/s2impl/welcome.jsp</result>  
  14.         </action>  
  15.     </package>  
  16. </struts>  

(4)为了看出PreResult确实是在Result之前运行的,可以在welcome.jsp里面简单的输出一句话,如下所示:

 

java代码:
  1. <%@ page language="java" contentType="text/html; charset=gb2312"  
  2.     pageEncoding="gb2312"%>  
  3. <html>  
  4. <head>  
  5. <meta http-equiv="Content-Type" content="text/html; charset=gb2312">  
  6. <title>Insert title here</title>  
  7. </head>  
  8. <body>  
  9. <%  
  10.     System.out.println("现在输出Result页面");  
  11. %>  
  12. </body>  
  13. </html>  

(5)运行一下,看看效果,界面上没有什么特殊之处,看看后台,输出如下:

 

java代码:
  1. 用户输入的参数为===account=null,password=null,submitFlag=null  
  2. 现在处理Result执行前的功能,result=success  
  3. 现在输出Result页面  

表示当Action运行后,这个事件监听器监听到了相应的事件,并执行了相应的功能处理,处理完后才运行了Result的功能。

 

私塾在线网站原创《研磨struts2》系列

转自请注明出处:【http://sishuok.com/forum/blogPost/list/0/4055.html

欢迎访问http://sishuok.com获取更多内容

论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics