import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
//要作为参数传递的实体类(要实现remote调用,必须序列化)
public class Person implements Serializable{
@Id
@GeneratedValue
private int id;
private String name;
public int getId() {
return id;
}
public String getName() {
return name;
}
public void setId(int id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
}
//接口
public interface PersonService {
public void add(Person p);
}
//实现类
import javax.ejb.Local;
import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.interceptor.Interceptors;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
@Stateless
@Remote
@Local
//加入拦截器的定义,如果定义了多个拦截器,会按照定义的顺序先后执行,除了可以在外部定义拦截器之外,还可以将Session Bean中的一个或多个方法定义为拦截器,但是注意定义在外部的拦截器优先级高于定义在bean类中的优先级。
@Interceptors({SecurityInterceptor.class, OtherSomethingInterceptor.class})
public class PersonServiceImpl implements PersonService {
@PersistenceContext(unitName="test")
private EntityManager entityManager;
public void add(Person p) {
entityManager.persist(p);
System.out.println("User对象已经被存储 name:" + p.getName() +"其Id是" + p.getId());
}
//如下是我自己定义的拦截器
@AroundInvoke
public Object myBeanInterceptor(InvocationContext context) {
}
}
//第一个拦截器
import javax.interceptor.AroundInvoke;
import javax.interceptor.InvocationContext;
public class SecurityInterceptor {
@AroundInvoke
public Object doit(InvocationContext context) throws Exception {
System.out.println("要执行的方法是--->" + context.getMethod().getName());
System.out.println("ContextDate--->" + context.getContextData());
System.out.println("Target--->" + context.getTarget());
System.out.println("Parameters--->");
Object parameters[] = context.getParameters();
for(int i=0; i<parameters.length; i++) {
System.out.println(parameters[i]);
System.out.println("\n");
}
context.getContextData().put("hello", "世界你好");
//继续向下执行,相当于Filter中的doFilter()
Object object = context.proceed();
System.out.println("====方法" + context.getMethod().getName() + "已经执行完成");
return object;
}
}
//第二个拦截器
import javax.interceptor.AroundInvoke;
import javax.interceptor.InvocationContext;
public class OtherSomethingInterceptor {
@AroundInvoke
public Object doSomething(InvocationContext context) throws Exception {
System.out.println("第二个拦截器接收到的数据:" + context.getContextData());
Object object = context.proceed();
System.out.println("第二个拦截器的内容执行 完了");
return object;
}
}
//客户端的测试
import javax.naming.InitialContext;
import com.bjsxt.jpa.Person;
import com.bjsxt.jpa.PersonService;
public class Client {
public static void main(String[] args) throws Exception{
InitialContext ctx = new InitialContext();
PersonService ps = (PersonService)ctx.lookup("PersonServiceImpl/remote");
Person p = new Person();
p.setName("张三");
ps.add(p);
}
}
运行结果:
09:57:13,875 INFO [STDOUT] 要执行的方法是--->add
09:57:13,875 INFO [STDOUT] ContextDate--->{}
09:57:13,875 INFO [STDOUT] Target--->com.bjsxt.jpa.PersonServiceImpl@e9f6ef
09:57:13,875 INFO [STDOUT] Parameters--->
09:57:13,875 INFO [STDOUT] com.bjsxt.jpa.Person@1ffb7d4
09:57:13,875 INFO [STDOUT] 第二个拦截器接收到的数据:{hello=世界你好}
09:57:13,937 INFO [STDOUT] Hibernate: insert into Person (name) values (?)
09:57:13,937 INFO [STDOUT] User对象已经被存储 name:张三其Id是11
09:57:13,937 INFO [STDOUT] 第二个拦截器的内容执行 完了
09:57:13,937 INFO [STDOUT] ====方法add已经执行完成
注意:通过控制台的打印结果可以看出 Interceptor的执行流程与"责任链设计模式"中的执行流程式一样的。有了拦截器我们可以在要执行的方法前后加入自己的一些其他的业务逻辑。
关于拦截器的命名规范以及优先级,包括拦截器有父类等情况,请参照附件中文档
分享到:
相关推荐
##### 4.6 拦截器(INTERCEPTOR) - 用于在方法调用前后执行特定的代码,例如事务管理和安全验证。 ##### 4.7 依赖注入(DEPENDENCY INJECTION) - 通过注解或XML配置来实现依赖对象的自动注入,减少了硬编码依赖的...
- 介绍了EJB3中拦截器的功能和用途。 - 包括如何编写和使用自定义拦截器来增强会话Bean的行为。 - **依赖注入**: - 解释了依赖注入的概念及其在EJB3中的实现方式。 - 通过示例演示了如何利用依赖注入简化应用...
- **作用**:配置客户端拦截器,用于处理客户端调用。 - **示例**:例如配置客户端的安全性过滤器,确保客户端调用的安全性。 ##### 3.1.2 sprouter-configurations服务端配置 - **作用**:配置服务端的容器,即EJB...
- **拦截器**:Struts2提供了一套完善的拦截器机制,可以自定义拦截器实现特定的功能。 - **OGNL表达式语言**:用于访问JavaBean对象的一种简洁、强大的表达式语言。 - **类型转换与验证**:Struts2内置了类型转换器...
8. **过滤器和监听器**:在J2EE应用中,过滤器(Filter)可以用来拦截和修改请求或响应,监听器(Listener)用于监听特定事件,如会话的创建和销毁。这些组件可以用来实现功能,如登录验证、权限控制和会话超时提醒...
- 拦截器机制:通过拦截器来处理业务逻辑,增加了框架的灵活性和可扩展性。 #### Struts2与Struts1的区别 尽管名称相似,但Struts2和Struts1在架构上有着本质的不同。 - **架构差异**: - Struts2使用了更少的...
- **拦截SessionBean的方法调用**:通过AOP(面向切面编程)技术,可以定义拦截器来拦截EJB Session Bean的方法调用。 综上所述,JPA提供了一套强大的API用于管理实体对象的生命周期和进行数据库交互。通过深入理解...
- **配置struts.xml**:定义Action映射和拦截器等。 - **创建视图**:使用JSP页面作为视图。 **9.4 测试Struts应用** - **部署到服务器**:将Struts应用部署到应用服务器。 - **测试应用**:通过浏览器测试Struts...
- **配置Struts框架的行为**:定义Action映射、拦截器、结果视图等。 - **简化开发流程**:通过配置文件而非硬编码的方式管理项目逻辑。 #### 3.2 主要元素 - ****:用于定义每个Action及其相关的路径、方法、拦截...
- 高级主题如拦截器与模块化开发 #### 6. Java编程思想.第3版 - **书籍简介**:本书由Bruce Eckel撰写,是一部深受程序员喜爱的经典之作。第三版对前两版进行了全面修订,加入了更多现代Java编程的相关内容。 - *...
Struts2的核心功能包括动作调度、拦截器、结果类型、插件扩展等。在提供的jar包中,可能包含以下关键组件: 1. `struts2-core.jar`:框架核心,包含Action、Interceptor和Result等核心类。 2. `xwork-core.jar`:...
- **拦截器配置**: 描述如何配置拦截器来增强应用程序的功能。 - **Struts2控制器**: 如何定义和使用Action来处理用户请求。 - **Struts2会话跟踪**: 介绍如何在Struts 2中实现会话跟踪。 - **Struts2文件上传和下载...
- **拦截器配置**:定义拦截器及其参数。 **Struts 2控制器** - **实现dispather功能**:Struts 2的前端过滤器实现了请求分发的功能。 - **Action接口**:所有Action类都需要实现的接口。 - **Struts 2会话跟踪**...
本书系统全面地介绍了Java中的各项主流技术,以及基于这些技术的商业化应用程序的开发技巧,在讲解过程中以目前最为流行的开发工具MyEclipse为载体,全面系统地介绍了如何在MyEclipse中开发基于Struts、Hibernate、...
Spring的Web MVC框架提供了一个灵活的MVC模型,支持自定义视图解析、拦截器和多视图技术,易于构建RESTful风格的应用。 5. 企业服务支持 Spring集成了多种企业服务,如JMS、JMX、EJB等,提供了方便的使用方式。 ...