- 浏览: 702482 次
- 性别:
- 来自: 北京
博客专栏
-
读金庸故事,品程序人生
浏览量:47708
文章分类
最新评论
-
hty881008:
LZ,你的json返回是怎么出来的,我的怎么是No messa ...
使用CXF暴露您的REST服务 -
jxFY:
赞
Apache的对象池化工具commons-pool -
wangyudong:
新版本的Wisdom RESTClient地址https:// ...
使用CXF暴露您的REST服务 -
wangyudong:
由CXF实现的微服务需要有比较好的工具去测试RESTful A ...
使用CXF暴露您的REST服务 -
spring_springdata:
可以参考最新的文档:如何在eclipse jee中检出项目并转 ...
Maven3实战笔记01环境配置与使用入门
BMT就是Bean自己管理事务,这种方式就是以硬编码的方式在Bean中自己通过JTA接口自己维护事务代码,开始事务、提交事务、回滚事务都需要自己以硬编码的方式来维护,这种方式就是一个优点,灵活,不过EJB规范不建议使用此策略来管理事务,而是采用CMT。
代码如下:
package ejb.sessionBean.impl;
/** * bean代码自管理事务 * * @author liuyan * */ @Stateless @TransactionManagement(TransactionManagementType.BEAN) public class BMTServerEAOImpl implements BMTServer {
private DataSource dataSource;
@Resource private UserTransaction userTransaction;
public BMTServerEAOImpl() throws NamingException { Context context = new InitialContext(); dataSource = (DataSource) context.lookup("java:/jbossdemo"); }
@Override public void insert() throws Exception {
Connection connection = null;
Statement statement = null;
try {
// 开始事务 userTransaction.begin();
connection = dataSource.getConnection();
statement = connection.createStatement();
String insert1 = "insert into person values(17,'一线生')";
String insert2 = "insert into person values(16,'冷剑白狐')";
statement.executeUpdate(insert1);
statement.executeUpdate(insert2); // 事务手工提交 userTransaction.commit(); statement.close(); connection.close(); } catch (Exception e) { System.out.println("事务回滚~~"); userTransaction.rollback(); e.printStackTrace(); } } } |
测试代码不再赘述,执行后JBoss控制台如下,数据库也没添加任何数据。
15:18:47,568 INFO [STDOUT] 事务回滚~~ 15:18:47,638 ERROR [STDERR] com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '16' for key 'PRIMARY' |
把代码稍微修改一下,将重复的主键修改一下
String insert2 = "insert into person values(18,'冷剑白狐')"; |
执行后数据库成功插入新的纪录,如下
1. EJB拦截器
EJB也支持简单的自定义AOP类和横切方法,还是直接看例子吧。
AOP类——MyInterceptor
package aop; import java.lang.reflect.Method; import javax.interceptor.AroundInvoke; import javax.interceptor.InvocationContext;
/** * 自定义的拦截器 * * @author liuyan * */ public class MyInterceptor { @AroundInvoke public Object log(InvocationContext ctx) throws Exception { System.out.println("日志开启"); Object object = ctx.getTarget(); System.out.println("拦截的SessionBean实例:" + object); Method method = ctx.getMethod(); System.out.println("拦截的SessionBean方法:" + method.getName()); Object objectReturn = ctx.proceed(); System.out.println("日志记录结束"); return objectReturn; } } |
所谓横切方法,实际上就是代理执行,那么在此AOP类中就需要调用被拦截的方法。Object objectReturn = ctx.proceed();就是执行被拦截目标类的方法。如果没有此行代码,那么目标方法将不会执行。
下面看一下被横切,拦截的目标类——HelloAopServerEAOImpl
package aop.server.impl; import javax.ejb.Stateless; import javax.interceptor.ExcludeClassInterceptors; import javax.interceptor.Interceptors; import aop.MyInterceptor; import aop.server.HelloAopServer;
@Stateless @Interceptors(MyInterceptor.class) public class HelloAopServerEAOImpl implements HelloAopServer {
@Override @ExcludeClassInterceptors public void noAop() { System.out.println("noAop()");
}
@Override public String sayHello() { return "hello AOP"; }
@Override public void sayWelcome() { System.out.println("sayWelcome()"); } } |
在目标类中使用@Interceptors(MyInterceptor.class)注解代表使用此类被作为AOP的目标所拦截。而此类的方法上加上@ExcludeClassInterceptors注解则代表该方法不会被拦截。
客户端测试代码如下:
public void test01() throws Exception { Context context = init(); HelloAopServer helloAopServer = (HelloAopServer) context .lookup("HelloAopServerEAOImpl/remote"); helloAopServer.sayHello(); helloAopServer.sayWelcome(); helloAopServer.noAop(); } |
执行后,服务器控制台信息如下
15:40:16,812 INFO [STDOUT] 日志开启 15:40:16,812 INFO [STDOUT] 拦截的SessionBean实例:aop.server.impl.HelloAopServerEAOImpl@1dc88c7 15:40:16,812 INFO [STDOUT] 拦截的SessionBean方法:sayHello 15:40:16,812 INFO [STDOUT] 日志记录结束 15:40:16,822 INFO [STDOUT] 日志开启 15:40:16,822 INFO [STDOUT] 拦截的SessionBean实例:aop.server.impl.HelloAopServerEAOImpl@1dc88c7 15:40:16,822 INFO [STDOUT] 拦截的SessionBean方法:sayWelcome 15:40:16,822 INFO [STDOUT] sayWelcome() 15:40:16,822 INFO [STDOUT] 日志记录结束 15:40:16,831 INFO [STDOUT] noAop() |
可以证明:预期该拦截的sayHello()和sayWelcome()都被拦截了,而noAop()并没有被拦截到。
发表评论
-
JavaEE5实战笔记05RedHat搭建JBoss、Oracle10g环境
2011-06-01 10:50 1584JavaEE5实战笔记在RedHat上搭建JBoss、Orac ... -
JavaEE5实战笔记02JPA持久层的一些问题
2011-05-30 14:48 16201. JPA关联实体的级联操作问题 在此次联系中 ... -
JavaEE5实战笔记01EJB环境搭建及异常解决
2011-05-30 14:43 50331. 说明 此实战笔记是为了之前的学习笔记做一个 ... -
Spring集成ActiveMQ配置
2011-03-21 20:58 279491. 集成环境 Spring采用2.5.6版本, ... -
JAVA的Mina框架传递对象——一劳永逸(转载)
2011-03-09 11:31 2699接触java的Mina框架已经有很多时间了,在网上也读过了很多 ... -
JavaEE5学习笔记12-JSF验证器使用总结
2011-03-09 00:01 19681. JSF验证器 说完转换器就该说说验证器了, ... -
JavaEE5学习笔记11-JSF转换器使用总结
2011-03-08 23:53 27211. JSF的转换器是在JSF生命周期的第2个阶段 ... -
JSF组件生命周期的讨论
2011-03-08 23:38 17321. JSF生命周期 下面我们来看看JSF组件的 ... -
JavaEE5学习笔记10-JSF基本UI控件使用
2011-03-08 23:34 36631. JSF也是JavaEE5的标准,感觉上sun ... -
JavaEE5学习笔记09-将EJB发布成WebService总结(2)
2011-02-28 09:21 1548以上例子只是简单调用了WebService,参数是简单的Str ... -
JavaEE5学习笔记09-将EJB发布成WebService总结(1)
2011-02-28 09:19 41111. 将EJB发布成,或者说暴露成Web服务(也许 ... -
JavaEE5学习笔记08-JPA与EJB集成总结(4)
2011-02-24 09:36 14921. 在JavaEE容器 ... -
JavaEE5学习笔记08-JPA与EJB集成总结(3)
2011-02-24 09:35 12021. 测试代码 部署成功后,在另一个项目中建立测 ... -
JavaEE5学习笔记08-JPA与EJB集成总结(2)
2011-02-24 09:33 1527下面来看针对此实体操作的sessionBean代码。 接口 ... -
JavaEE5学习笔记08-JPA与EJB集成总结(1)
2011-02-24 09:28 1752JPA是JavaEE5提出的一套标准接口,不同的应用服务器对其 ... -
JavaEE5学习笔记06-EJB之消息驱动Bean(MDB)总结----2
2011-02-21 15:56 1424除了activationConfig之外,如果使用其他Java ... -
JavaEE5学习笔记06-EJB之消息驱动Bean(MDB)总结----1
2011-02-21 15:55 19611. 功能介绍 在EJB的分类中还有一个就是消息驱 ... -
JavaEE5学习笔记05-EJB之会话Bean(sessionBean)总结-----7
2011-02-21 09:49 13401. EJB的容器式依 ... -
JavaEE5学习笔记05-EJB之会话Bean(sessionBean)总结-----5
2011-02-21 09:46 19021. 有状态的会话Bean的本地、远程调用 其实这 ... -
JavaEE5学习笔记05-EJB之会话Bean(sessionBean)总结-----4
2011-02-21 09:43 1322以上好像还看不出什么,那么咱们开发一个web程序作为测试用例 ...
相关推荐
### JavaEE5学习笔记07-Web层与EJB集成总结 #### 一、JavaEE5框架中的Web层与EJB集成概述 在JavaEE5(即Java Platform, Enterprise Edition 5)中,Web层与EJB(Enterprise JavaBeans)的集成是构建企业级应用的...
在JavaEE环境中,RMI经常与EJB结合使用,尤其是无状态SessionBean,因为它们不需要维持客户端的会话状态,适合RMI的轻量级通信模式。 当一个EJB被标记为远程接口时,它可以通过RMI在不同 JVM(Java Virtual ...
"javaee思维导图版笔记-吉林大学" 本笔记主要涵盖了Java EE的基础知识,包括Servlet、JSP、JNDI、JPA等方面的内容。 一、Servlet概述 Servlet是Java EE中的一种服务器端组件,用于处理HTTP请求并返回响应。...
- **会话Bean**:在整个用户会话期间保持,用于跟踪用户状态。 - **应用Bean**:在整个应用程序范围内共享,用于全局数据。 **自定义标签(Custom Tags)**提供了一种扩展JSP语法的方式,通过定义标记库描述符(TLD...
包括会话Bean(Session Beans)负责业务逻辑,实体Bean(Entity Beans)作为持久化对象,以及消息驱动Bean(Message-Driven Beans)处理JMS消息。 6. **JMS (Java Message Service)**:JMS允许应用程序之间异步通信...
Java/JavaEE 学习笔记 作者在杰普学习时的学习笔记,是J2ee初学者必备手册,是大家学习J2EE开发的很好的参考笔记。 Java/JavaEE 学习笔记 内容目录: Unix 学习笔记..........7 一、Unix前言............7 二、...
分为会话Bean(Session Beans)、实体Bean(Entity Beans)和消息驱动Bean(Message-driven Beans),分别处理业务逻辑、持久化数据和消息通信。 5. **JMS(Java Message Service)**:JMS是JavaEE的消息中间件接口...
EJB是JavaEE的核心,提供了三种类型的Bean:会话Bean(Session Beans)处理业务逻辑,实体Bean(Entity Beans)代表持久化数据,消息驱动Bean(Message-Driven Beans)处理消息队列。Spring框架则以其依赖注入和面向...
第四章 Session Bean(会话Bean).....322 第五章 消息驱动Bean(MDB).........327 EJB3.0.....329 第一章 EJB3.0 Foundation...............329 第二章 Session Bean........................330 第三章 消息驱动Bean...
- **EJB(Enterprise JavaBeans)**:分为会话Bean(Session Beans)、实体Bean(Entity Beans)和消息驱动Bean(Message-driven Beans),用于实现业务逻辑和持久化数据。 - **JPA(Java Persistence API)与ORM*...
EJB是Java企业级应用的组件模型,分为会话bean、实体bean和消息驱动bean。它们提供了一种在分布式环境中构建可复用的、事务处理的服务器端组件的方法。虽然现代JavaEE应用更多采用轻量级框架如Spring,但了解EJB的...
EJB分为三种类型:会话bean(Session Beans)处理客户端请求,实体bean(Entity Beans)代表持久化的业务对象,消息驱动bean(Message-Driven Beans)用于处理JMS消息。 4. **JMS**:Java Message Service允许在...