`
wolfandlili
  • 浏览: 77357 次
  • 性别: 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框架的全面理解。

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

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

    jsp项目开发实录 Struts 实现 程序完整Struts 实现 程序完整

    jsp项目开发实录 jsp项目开发实录 Struts 实现 程序完整 Struts 实现 程序完整 Struts 实现 程序完整 Struts 实现 程序完整Struts 实现 程序完整Struts 实现 程序完整Struts 实现 程序完整Struts 实现 程序完整...

Global site tag (gtag.js) - Google Analytics