开发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()方法执行前调用。
接口如下
-
public
interface
PreResultListener {
-
void
beforeResult(ActionInvocation invocation, String resultCode);
-
}
在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)
-
public
class
MyAction
extends
ActionSupport {
-
...
-
public
String execute()
throws
Exception {
-
ActionInvocation invocation = ActionContext.getActionInvocation();
-
invocation.addPreResultListener(new
PreResultListener() {
-
public
void
beforeResult(ActionInvocation invocation,
-
String resultCode) {
-
-
}
-
});
-
}
-
...
-
}
分享到:
相关推荐
通常,我们可以通过实现`struts2PreResultListener`接口来自定义拦截器,以便在Action执行结果返回前进行一些特殊处理。例如,你可能希望在用户尝试访问受限资源时,记录登录状态或安全相关的事件。下面是一个简单的...
在这个“Struts2实现文件下载功能”的示例中,我们将深入探讨如何利用Struts2框架来实现在web应用中让用户下载文件的功能。 首先,我们需要理解文件下载的基本原理。在Web应用中,当用户点击一个链接或提交一个表单...
总的来说,Struts2和Ajax的结合使用使得Web应用能够提供更快速、更直观的用户交互,而这个代码和jar包组合可能就是实现这一目标的一个实例。通过阅读提供的文档和使用示例,你可以深入了解并实践这一技术,从而提升...
本项目利用Struts2与MySQL数据库结合,实现了一个简易的学生成绩管理系统,旨在帮助初学者了解如何在实际项目中应用这两个技术。 在Struts2框架中,控制器负责接收用户的请求,通过Action类处理业务逻辑,并将结果...
总的来说,"struts2实现用户登录注册"项目涵盖了Web开发中的多个关键点:前端表单处理、后端业务逻辑、数据库交互以及安全性考虑。通过实践这个项目,开发者可以深入理解Struts2框架的工作原理,以及如何在实际开发...
论坛系统项目(Struts 2+Hibernate+Spring实现)论坛系统项目(Struts 2+Hibernate+Spring实现)论坛系统项目(Struts 2+Hibernate+Spring实现)论坛系统项目(Struts 2+Hibernate+Spring实现)论坛系统项目(Struts...
Struts2是一个强大的Java web应用程序开发框架,它简化了基于MVC(模型-视图-...以上就是使用Struts2框架在Myeclipse中实现用户注册功能的详细步骤,涉及的技术点广泛且实用,对于理解和掌握Java web开发具有重要意义。
《Struts2技术内幕:深入解析Struts2架构设计与实现原理》以Struts2的源代码为依托,通过对Struts2的源代码的全面剖析深入探讨了Struts2的架构设计、实现原理、设计理念与设计哲学,对从宏观上和微观上去了解Struts2...
总的来说,这个“struts2登录注册简单实现”项目涵盖了Struts2框架的基础应用,包括Action的创建、配置文件的编写、视图设计、数据处理以及安全性考虑等多个方面。通过实践,开发者能更深入地理解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图形验证码实现,两个实现类,和你一个action类
《Struts2技术内幕:深入解析Struts2架构设计与实现原理》以Struts2的源代码为依托,通过对Struts2的源代码的全面剖析深入探讨了Struts2的架构设计、实现原理、设计理念与设计哲学,对从宏观上和微观上去了解Struts2...
在数据库层面,这可能通过SQL的LIKE或全文索引来实现,而在Struts2 Action中,需要接收用户的输入,构造合适的查询条件。 以上就是"学生信息查询系统"项目中使用Struts2框架涉及的关键知识点。这个系统通过合理利用...
在这个“struts2实现留言板”的项目中,我们将深入探讨如何利用Struts2框架来创建一个功能完备的留言板系统,包括添加、回复和删除留言等基本操作。 首先,我们要了解Struts2的核心组件和工作原理。Struts2框架通过...
在本教程中,我们将深入探讨如何利用Struts2来实现对Oracle数据库的CRUD(创建、读取、更新和删除)操作。 首先,我们需要在项目中集成Struts2框架。这通常涉及到以下几个步骤: 1. 添加Struts2的核心库到项目的类...
Struts2作为Controller层,通过Action类来实现业务逻辑,并通过配置文件或注解来定义Action与URL的映射关系。 Jquery是一个高效的JavaScript库,简化了HTML文档遍历、事件处理、动画以及Ajax交互。它使得开发者能更...
要深入学习和掌握Struts2,建议阅读官方文档,参与实际项目实践,也可以参考相关的技术书籍和教程,例如《Struts2技术内幕——深入解析Struts2架构设计与实现原理》等资源,来提升对Struts2框架的全面理解。
在"Struts2框架实现图书管理系统"这个项目中,我们将深入探讨如何利用Struts2来设计和实现一个用于管理图书信息的系统,包括对图书的基本信息进行添加、删除、修改和查询等核心功能。同时,项目还涉及到拦截器的使用...
基于javaWeb MVC模式,借助struts2框架编写,实现用户简单的注册与登录功能。 1.本demo严格按照MVC的分层模式采用myeclipse编写,可直接运行,服务器为tomcat,数据库为mysql。 2.数据库操作使用c3p0连接池和dbtuils...