`
wolfandlili
  • 浏览: 77435 次
  • 性别: Icon_minigender_1
  • 来自: 河北
社区版块
存档分类
最新评论

struts2 PreResultListener实现回调

阅读更多


      开发interceptor的时候,了解action已经执行完毕而result还没有开始执行的时间点往往很重要的。譬如在异常处理方面就是如 此:在action处理的过程中,由于后台的处理,出现的异常很可能是系统异常;而在result处理的过程中,异常则可能出现在为用户呈现的页面的时 候,而不是由于系统问题。
下面给出了ExceptionInterceptor的代码,该interceptor会在result开始执行之前与 之后以不同的方式处理异常。在result开始执行之前,可以改变用于从action配置中查询result的返回码,而在webwork应用程序中,使 用Action.ERROR是一个常用的实践技巧:将Action.ERROR映射至向用户提示错误的页面。所以,需要捕获异常并返回 Action.ERROR。在result开始执行之后,来自interceptor的返回码就不再那样重要了,但是仍然可以获得由 beforeResult()方法回传给result code,并且可以返回它。在以下离子中需要注意的一点是:由于interceptor必须是无状态的,因此它为每一个ActionInvocation 创建一个新的ExceptionHandler,可以保存该ActionInvocation的状态。
ExceptionInterceptor:在result前后以不同的方式处理异常

开发interceptor的时候,了解action已经执行完毕而result还没有开始执行的时间点往往很重要的。譬如在异常处理方面就是如此:在action处理的过程中,由于后台的处理,出现的异常很可能是系统异常;而在result处理的过程中,异常则可能出现在为用户呈现的页面的时候,而不是由于系统问题。
下面给出了ExceptionInterceptor的代码,该interceptor会在result开始执行之前与之后以不同的方式处理异常。在result开始执行之前,可以改变用于从action配置中查询result的返回码,而在webwork应用程序中,使用Action.ERROR是一个常用的实践技巧:将Action.ERROR映射至向用户提示错误的页面。所以,需要捕获异常并返回 Action.ERROR。在result开始执行之后,来自interceptor的返回码就不再那样重要了,但是仍然可以获得由 beforeResult()方法回传给result code,并且可以返回它。在以下离子中需要注意的一点是:由于interceptor必须是无状态的,因此它为每一个ActionInvocation 创建一个新的ExceptionHandler,可以保存该ActionInvocation的状态。
ExceptionInterceptor:在result前后以不同的方式处理异常
/**
 * @filename ExceptionInterceptor.java
 * @author Rain_zhou
 * @version ExceptionInterceptor,下午01:05:50
 */
package com.founder.study.forum.interceptor;

import com.opensymphony.xwork.ActionInvocation;
import com.opensymphony.xwork.interceptor.Interceptor;

/**
 * @author Rain_zhou
 *
 */
public class ExceptionInterceptor implements Interceptor {

 /* (non-Javadoc)
  * @see com.opensymphony.xwork.interceptor.Interceptor#destroy()
  */
 public void destroy() {
  // TODO Auto-generated method stub

 }

 /* (non-Javadoc)
  * @see com.opensymphony.xwork.interceptor.Interceptor#init()
  */
 public void init() {
  // TODO Auto-generated method stub

 }

 /* (non-Javadoc)
  * @see com.opensymphony.xwork.interceptor.Interceptor#intercept(com.opensymphony.xwork.ActionInvocation)
  */
 public String intercept(ActionInvocation arg0) throws Exception {
  // TODO Auto-generated method stub
  ExceptionHandler handler=new ExceptionHandler(arg0);
  return handler.invoke();
 }

}

/**
 * @filename ExceptionHandler.java
 * @author Rain_zhou
 * @version ExceptionHandler,下午01:07:04
 */
package com.founder.study.forum.interceptor;

import com.founder.study.forum.helper.NoLimitException;
import com.opensymphony.xwork.Action;
import com.opensymphony.xwork.ActionInvocation;
import com.opensymphony.xwork.interceptor.PreResultListener;

/**
 * @author Rain_zhou
 *
 */
public class ExceptionHandler implements PreResultListener {

 private ActionInvocation invocation;
 private boolean beforeResult=true;
 private String result=Action.ERROR;
 
 public ExceptionHandler(ActionInvocation invocation){
  this.invocation=invocation;
  invocation.addPreResultListener(this);
 }
 
 String invoke(){
  try{
   result=invocation.invoke();
  }catch(Exception e){
   if(beforeResult){
    return Action.ERROR;
   }else{
    return result;
   }
  }
  return result;
 }
 /* (non-Javadoc)
  * @see com.opensymphony.xwork.interceptor.PreResultListener#beforeResult(com.opensymphony.xwork.ActionInvocation, Java.lang.String)
  */
 public void beforeResult(ActionInvocation arg0, String arg1) {
  // TODO Auto-generated method stub

  beforeResult=false;
  result=arg1;
 }

}

 
1.主要功能&触发时间
该监听器主要在action的execute方法执行完以后,result.execute()方法执行前调用。
接口如下

Java代码
  1. public   interface  PreResultListener {  
  2.     void  beforeResult(ActionInvocation invocation, String resultCode);  
  3. }

在DefaultActionInvocation对应的调用如下


   1. //判断是否还有拦截器未执行,如果还有则继续执行拦截器链  
   2. //这里通过把DefaultActionInvocation对象本身往后续拦截器中传递来实现interceptors这个interceptor的迭代。  
   3. if (interceptors.hasNext()) {  
   4.                 final InterceptorMapping interceptor = (InterceptorMapping) interceptors.next();  
   5.                 UtilTimerStack.profile("interceptor: "+interceptor.getName(),   
   6.                         new UtilTimerStack.ProfilingBlock<String>() {  
   7.                             public String doProfiling() throws Exception {  
   8.                                 resultCode = interceptor.getInterceptor().intercept(DefaultActionInvocation.this);  
   9.                                 return null;  
  10.                             }  
  11.                 });  
  12.             } else {  
  13.                            //所有拦截器执行完成调用action的执行方法。  
  14.                 resultCode = invokeActionOnly();  
  15.             }  
  16.   
  17.             // this is needed because the result will be executed, then control will return to the Interceptor, which will  
  18.             // return above and flow through again  
  19.                   //调用preResultListeners的内容  
  20.             if (!executed) {  
  21.                 if (preResultListeners != null) {  
  22.                     for (Iterator iterator = preResultListeners.iterator();  
  23.                         iterator.hasNext();) {  
  24.                         PreResultListener listener = (PreResultListener) iterator.next();  
  25.                           
  26.                         String _profileKey="preResultListener: ";  
  27.                         try {  
  28.                             UtilTimerStack.push(_profileKey);  
  29.                             listener.beforeResult(this, resultCode);  
  30.                         }  
  31.                         finally {  
  32.                             UtilTimerStack.pop(_profileKey);  
  33.                         }  
  34.                     }  
  35.                 }  
  36.   
  37.                 // now execute the result, if we're supposed to  
  38. //调用result.execute方法.  
  39.                 if (proxy.getExecuteResult()) {  
  40.                     executeResult();  
  41.                 }  
  42.   
  43.                 executed = true;  
  44.             }  

 


2.注册方法
通过调用 invocation.addPreResultListener具体代码如下(摘自struts2 docs)

Java代码
  1. public   class  MyAction  extends  ActionSupport {  
  2.      ...  
  3.      public  String execute()  throws  Exception {  
  4.          ActionInvocation invocation = ActionContext.getActionInvocation();  
  5.          invocation.addPreResultListener(new  PreResultListener() {  
  6.               public   void  beforeResult(ActionInvocation invocation,   
  7.                                        String resultCode) {  
  8.                   // perform operation necessary before Result execution   
  9.               }  
  10.          });  
  11.      }  
  12.      ...  
  13.   } 

分享到:
评论

相关推荐

    struts2PreResultListener接口

    通常,我们可以通过实现`struts2PreResultListener`接口来自定义拦截器,以便在Action执行结果返回前进行一些特殊处理。例如,你可能希望在用户尝试访问受限资源时,记录登录状态或安全相关的事件。下面是一个简单的...

    struts2实现文件下载功能

    在这个“Struts2实现文件下载功能”的示例中,我们将深入探讨如何利用Struts2框架来实现在web应用中让用户下载文件的功能。 首先,我们需要理解文件下载的基本原理。在Web应用中,当用户点击一个链接或提交一个表单...

    struts2的Ajax实现注册验证

    总的来说,Struts2和Ajax的结合使用使得Web应用能够提供更快速、更直观的用户交互,而这个代码和jar包组合可能就是实现这一目标的一个实例。通过阅读提供的文档和使用示例,你可以深入了解并实践这一技术,从而提升...

    struts2 mysql实现简单学生成绩管理代码

    本项目利用Struts2与MySQL数据库结合,实现了一个简易的学生成绩管理系统,旨在帮助初学者了解如何在实际项目中应用这两个技术。 在Struts2框架中,控制器负责接收用户的请求,通过Action类处理业务逻辑,并将结果...

    struts2实现用户登录注册

    总的来说,"struts2实现用户登录注册"项目涵盖了Web开发中的多个关键点:前端表单处理、后端业务逻辑、数据库交互以及安全性考虑。通过实践这个项目,开发者可以深入理解Struts2框架的工作原理,以及如何在实际开发...

    论坛系统项目(Struts 2+Hibernate+Spring实现)

    论坛系统项目(Struts 2+Hibernate+Spring实现)论坛系统项目(Struts 2+Hibernate+Spring实现)论坛系统项目(Struts 2+Hibernate+Spring实现)论坛系统项目(Struts 2+Hibernate+Spring实现)论坛系统项目(Struts...

    Struts2实现的注册

    Struts2是一个强大的Java web应用程序开发框架,它简化了基于MVC(模型-视图-...以上就是使用Struts2框架在Myeclipse中实现用户注册功能的详细步骤,涉及的技术点广泛且实用,对于理解和掌握Java web开发具有重要意义。

    Struts2 技术内幕——深入解析Struts2架构设计与实现原理.pdf

    《Struts2技术内幕:深入解析Struts2架构设计与实现原理》以Struts2的源代码为依托,通过对Struts2的源代码的全面剖析深入探讨了Struts2的架构设计、实现原理、设计理念与设计哲学,对从宏观上和微观上去了解Struts2...

    struts2登录注册简单实现

    总的来说,这个“struts2登录注册简单实现”项目涵盖了Struts2框架的基础应用,包括Action的创建、配置文件的编写、视图设计、数据处理以及安全性考虑等多个方面。通过实践,开发者能更深入地理解Struts2的架构和...

    struts2帮助文档

    struts2实现表单数据校验 struts2的基石-拦截器 struts2中实现IOC struts2中实现文件上传 struts2中实现CRUD struts2中的OGNL struts2的新表单标志的使用 struts2与AJAX一 struts2与AJAX二 struts2与AJAX三 struts2...

    STRUTS2+HIBERNATE详细的分页实现代码详细的分页实现代码

    根据提供的标题、描述、标签及部分内容,我们可以了解到这篇文章主要探讨的是如何在Struts2与Hibernate框架结合下实现分页功能。接下来将详细解析Struts2与Hibernate如何协作完成这一任务。 ### Struts2与Hibernate...

    STRUTS2验证码实现

    struts2图形验证码实现,两个实现类,和你一个action类

    Struts2 技术内幕-深入解析Struts2架构设计与实现原理

    《Struts2技术内幕:深入解析Struts2架构设计与实现原理》以Struts2的源代码为依托,通过对Struts2的源代码的全面剖析深入探讨了Struts2的架构设计、实现原理、设计理念与设计哲学,对从宏观上和微观上去了解Struts2...

    struts2框架做的学生信息查询系统

    在数据库层面,这可能通过SQL的LIKE或全文索引来实现,而在Struts2 Action中,需要接收用户的输入,构造合适的查询条件。 以上就是"学生信息查询系统"项目中使用Struts2框架涉及的关键知识点。这个系统通过合理利用...

    struts2实现留言板

    在这个“struts2实现留言板”的项目中,我们将深入探讨如何利用Struts2框架来创建一个功能完备的留言板系统,包括添加、回复和删除留言等基本操作。 首先,我们要了解Struts2的核心组件和工作原理。Struts2框架通过...

    struts2 实现oracle数据库的增删改查

    在本教程中,我们将深入探讨如何利用Struts2来实现对Oracle数据库的CRUD(创建、读取、更新和删除)操作。 首先,我们需要在项目中集成Struts2框架。这通常涉及到以下几个步骤: 1. 添加Struts2的核心库到项目的类...

    Struts2+Jquery+Ajax

    Struts2作为Controller层,通过Action类来实现业务逻辑,并通过配置文件或注解来定义Action与URL的映射关系。 Jquery是一个高效的JavaScript库,简化了HTML文档遍历、事件处理、动画以及Ajax交互。它使得开发者能更...

    Struts2 技术内幕——深入解析Struts2架构设计与实现原理

    要深入学习和掌握Struts2,建议阅读官方文档,参与实际项目实践,也可以参考相关的技术书籍和教程,例如《Struts2技术内幕——深入解析Struts2架构设计与实现原理》等资源,来提升对Struts2框架的全面理解。

    Struts2框架实现图书管理系统

    在"Struts2框架实现图书管理系统"这个项目中,我们将深入探讨如何利用Struts2来设计和实现一个用于管理图书信息的系统,包括对图书的基本信息进行添加、删除、修改和查询等核心功能。同时,项目还涉及到拦截器的使用...

    javaWeb_struts2框架实现简单用户注册登录

    基于javaWeb MVC模式,借助struts2框架编写,实现用户简单的注册与登录功能。 1.本demo严格按照MVC的分层模式采用myeclipse编写,可直接运行,服务器为tomcat,数据库为mysql。 2.数据库操作使用c3p0连接池和dbtuils...

Global site tag (gtag.js) - Google Analytics