JavaEE(9) - Session EJB的生命周期、事务及拦截器
1. SessionBean的生命周期
无状态Session Bean: 不存在状态-->待命状态-->被销毁状态
不存在状态-->待命状态:
1)通过构造器创建EJB实例
2)执行依赖注入
3)执行@PostConstruct回调方法
待命状态-->被销毁状态
1)执行@PreDestroy回调方法
有状态Session Bean: 不存在状态-->待命状态(<-->去活状态-->被销毁状态)-->被销毁状态
不存在状态-->待命状态:
1)通过构造器创建EJB实例
2)执行依赖注入
3)执行@PostConstruct回调方法
待命状态-->去活状态
1)执行@PrePassive回调方法
去活状态-->待命状态
1)执行@PostActivate回调方法
待命状态-->被销毁状态
1)客户端调用@Remove方法
2)执行@PreDestroy回调方法
#1. 开发EJB(Net Beans创建EJB Module, 项目名称:Lifecycle)
ShopService.java
package org.crazyit.service; import javax.ejb.*;
import java.util.*; @Remote
public interface ShopService {
void addItem(String item);
Map<String, Integer> showDetail();
void remove();
}
ShopServiceBean.java
package org.crazyit.service; import java.util.*;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.ejb.*; @Stateful(mappedName = "ShopService")
public class ShopServiceBean implements ShopService { private Map<String, Integer> buyInfo = new HashMap<String, Integer>(); public void addItem(String item) {
//该物品已经购买过
if (buyInfo.containsKey(item)) {
buyInfo.put(item, buyInfo.get(item) + 1);
} else {
buyInfo.put(item, 1);
}
} public Map<String, Integer> showDetail() {
return buyInfo;
} @Remove
public void remove() {
System.out.println("执行@Remove修饰的方法!");
} //下面定义了5个简单的生命周期方法
@Init
public void init() {
System.out.println("执行@Init修饰的方法!");
} @PostConstruct
public void postConstruct() {
System.out.println("执行@PostConstruct修饰的方法!");
} @PrePassivate
public void prePassivate() {
System.out.println("执行@PrePassivate修饰的方法!");
} @PostActivate
public void postActivate() {
System.out.println("执行@PostActivate修饰的方法!");
} @PreDestroy
public void preDestroy() {
System.out.println("执行@PreDestroy修饰的方法!");
}
}
#2. 客户端调用EJB (参见8.5)
2. 容器管理事务
#1. EJB开发(Net Beans创建EJB Module, 项目名称:CMT)
Cmt.java
package org.crazyit.service; import javax.ejb.Remote; @Remote
public interface Cmt {
void insert();
}
CmtBean.java
package org.crazyit.service; import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import javax.annotation.Resource;
import javax.ejb.*;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource; @Stateless(mappedName = "cmt")
@TransactionManagement(TransactionManagementType.CONTAINER)
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class CmtBean implements Cmt { private DataSource ds = null; @Resource
private SessionContext sessCtx; public CmtBean() throws NamingException {
Context ctx = new InitialContext();
ds = (DataSource) ctx.lookup("javaee");
} public void insert() {
try {
Connection conn = ds.getConnection();
Statement stmt = conn.createStatement();
int result = stmt.executeUpdate("insert into user_table values(null, '新用户' , 'bbb')");
System.out.println(result);
//下面这条语句将引起失败
stmt.executeUpdate("insert into user_table values(1, 'aaa' , 'bbb')");
stmt.close();
conn.close();
}
catch (SQLException ex) {
ex.printStackTrace();
sessCtx.setRollbackOnly();
}
}
}
#2. 客户端调用EJB (Net Beans创建Java Project: CmtTest)
Cmt.java
package org.crazyit.service; public interface Cmt {
void insert();
}
EjbClient.java
package lee; import javax.rmi.*;
import javax.naming.*;
import java.util.Properties; import org.crazyit.service.*; public class EjbClient { public void test() throws NamingException {
//获取WebLogic中JNDI服务的Context
Context ctx = getInitialContext();
Cmt cmt = (Cmt) ctx.lookup("Cmt#org.crazyit.service.Cmt");
cmt.insert();
} //工具方法,用来获取WebLogic中JNDI服务的Context
private Context getInitialContext() {
// 参见(4)
} public static void main(String[] args) throws Exception {
EjbClient client = new EjbClient();
client.test();
}
}
3. Bean管理事务
#1. EJB开发(Net Beans创建EJB Module, 项目名称:BMT)
Bmt.java
package org.crazyit.service; import javax.ejb.Remote; @Remote
public interface Bmt {
void insert() throws Exception;
}
BmtBean.java
package org.crazyit.service; import java.util.*;
import javax.ejb.*;
import javax.annotation.*;
import javax.naming.*; import java.sql.*;
import javax.sql.*;
import javax.transaction.*; @Stateless(mappedName = "bmt")
@TransactionManagement(TransactionManagementType.BEAN)
public class BmtBean implements Bmt { private DataSource ds = null; @Resource
private UserTransaction trans; public BmtBean() throws NamingException {
Context ctx = new InitialContext();
ds = (DataSource) ctx.lookup("javaee");
} public void insert() throws Exception {
try {
//开始事务
trans.begin();
Connection conn = ds.getConnection();
Statement stmt = conn.createStatement();
int result = stmt.executeUpdate("insert into user_table values(null, 'BMT插入的记录' , 'bbb')");
System.out.println(result);
//下面这条语句将引起失败
stmt.executeUpdate("insert into user_table values(1, 'aaa' , 'bbb')");
//提交事务
trans.commit();
stmt.close();
conn.close();
}
catch (SQLException ex) {
ex.printStackTrace();
//回滚事务
trans.rollback();
}
}
}
#2. 客户端调用EJB (Net Beans创建Java Project: BmtTest)
Bmt.java
package org.crazyit.service; public interface Bmt {
void insert() throws Exception;
}
EjbClient.java
package lee; import javax.rmi.*;
import javax.naming.*;
import java.util.Properties; import org.crazyit.service.*; public class EjbClient { public void test() throws Exception {
//获取WebLogic中JNDI服务的Context
Context ctx = getInitialContext();
Bmt bmt = (Bmt) ctx.lookup("Bmt#org.crazyit.service.Bmt");
bmt.insert();
} //工具方法,用来获取WebLogic中JNDI服务的Context
private Context getInitialContext() {
// 参见(4)
} public static void main(String[] args) throws Exception {
EjbClient client = new EjbClient();
client.test();
}
}
4. 拦截器
#1. EJB开发(Net Beans创建EJB Module, 项目名称:Interceptor)
MyInterceptor.java
package org.crazyit.interceptor; import javax.interceptor.AroundInvoke;
import javax.interceptor.InvocationContext; public class MyInterceptor { @AroundInvoke
public Object log(InvocationContext ctx) throws Exception {
System.out.println("------拦截器开始运行------");
//让目标方法执行
Object rvt = ctx.proceed();
if (rvt != null) {
rvt = "拦截器改变了返回值:" + rvt;
}
System.out.println("------拦截器执行结束------");
return rvt;
}
}
HelloCrazyit.java
package org.crazyit.service; import javax.ejb.*; @Remote
public interface HelloCrazyit{
String hello(String name);
void crazyit();
void exclude();
}
HelloCrazyitBean.java
package org.crazyit.service; import java.util.*;
import javax.ejb.*;
import javax.annotation.*;
import javax.interceptor.*;
import org.crazyit.interceptor.*; @Stateless(mappedName = "HelloCrazyit")
@Interceptors(MyInterceptor.class)
public class HelloCrazyitBean implements HelloCrazyit { public String hello(String name) {
System.out.println(name + ", 您好!现在时间是:" + new java.util.Date());
return "crazyit.org";
} public void crazyit() {
System.out.println("疯狂Java联盟!");
System.out.println("最受欢迎的Java论坛!");
} @ExcludeClassInterceptors
public void exclude() {
System.out.println("被排除在拦截器机制之外的方法!");
}
}
#2. 客户端调用EJB (Net Beans创建Java Project: InterceptorTest)
HelloCrazyit.java
package org.crazyit.service; public interface HelloCrazyit {
String hello(String name);
void crazyit();
void exclude();
}
EjbClient.java
package lee; import javax.rmi.*;
import javax.naming.*;
import java.util.Properties; import org.crazyit.service.*; public class EjbClient { public void test()
throws Exception {
//获取WebLogic中JNDI服务的Context
Context ctx = getInitialContext();
HelloCrazyit bmt = (HelloCrazyit) ctx.lookup("HelloCrazyit#org.crazyit.service.HelloCrazyit");
System.out.println(bmt.hello("yeeku"));
bmt.crazyit();
bmt.exclude();
} //工具方法,用来获取WebLogic中JNDI服务的Context private Context getInitialContext() {
// 参见(4)
} public static void main(String[] args) throws Exception {
EjbClient client = new EjbClient();
client.test();
}
}
JavaEE(9) - Session EJB的生命周期、事务及拦截器的更多相关文章
- [原创]java WEB学习笔记94:Hibernate学习之路---session 的管理,Session 对象的生命周期与本地线程绑定
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- 配置Session变量的生命周期
在Web.config文件中配置Session变量的生命周期是在<sessionState></sessionState>节中完成的,在配置Session的生命周期时,可以设置 ...
- session简介与生命周期
session简介 在计算机专业术语中,Session是指一个终端用户与交互系统进行通信的时间间隔,通常指从注册进入系统到注销退出系统之间所经过的时间以及如果需要的话,可能还有一定的操作空间. 具体到 ...
- 如何在web.config文件中配置Session变量的生命周期
实例说明:在网上购物商城中,为了维护在线购物环境,一般只有注册会员才可以购买商品.实现购物功能时,先通过Session变量记录会员的登录名,然后在购买商品页面通过判断会员是否登录确定其能否购买商品. ...
- Fragment 生命周期 事务 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- Session原理、生命周期及购物车功能的实现
在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下).因此,在需要保存用户数据(保存该浏览器(会话)的相关信息)时 ...
- JavaEE Servlet 核心方法及生命周期
做JavaWeb开发,免不了要和Servlet打交道.Servlet是Sun(Oracle)官方定义的一个Web开发规范,所有Servlet开发都必须遵守.自己以前也没有从头做过Web开发,所以这方面 ...
- spring---transaction(1)---源代码分析(事务的拦截器TransactionInterceptor)
写在前面: 先了解一下spring的事务.分为分明式事务管理和注解式事务管理,对于前期的事务,spring会通过扫描拦截对于事务的方法进行增强(以后讲解). 若果目标方法存在事务,spring产出的b ...
- Ejb in action(六)——拦截器
Ejb拦截器可以监听程序中的一个或全部方法.与Struts2中拦截器同名,并且他们都可以实现切面式服务.同一时候也与Spring中的AOP技术类似. 不同的是struts2的拦截器的实现原理是一层一层 ...
随机推荐
- iOS执行时与method swizzling
C语言是静态语言,它的工作方式是通过函数调用,这样在编译时我们就已经确定程序怎样执行的.而Objective-C是动态语言,它并不是通过调用类的方法来执行功能,而是给对象发送消息,对象在接收到消息之后 ...
- 【甘道夫】Hive 0.13.1 on Hadoop2.2.0 + Oracle10g部署详细解释
环境: hadoop2.2.0 hive0.13.1 Ubuntu 14.04 LTS java version "1.7.0_60" Oracle10g ***欢迎转载.请注明来 ...
- hdu3530Subsequence rmq
//使用rmq办,ma[i][j],同i作为一个起点2^j阵列的最大长度值 //启动枚举问最长的子列 //枚举的最大长度2^(j-1)和2^(j)z之间 //然后在该范围内找到 #include< ...
- 7、Cocos2dx 3.0游戏开发找小三之3.0版本号的代码风格
重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27691337 Cocos2d-x代码风格 前面我们已 ...
- Android 混淆proguard的实现(图文)
1. 在Eclipse中的project编译执行后,在文件夹bin以下有生成一些文件,当中classes.dex是未经过混淆生成的.而我们要混淆的话,就要又一次生成一个混淆过的classes.dex ...
- java反编译
反编译工具下载地址 http://download.csdn.net/detail/u011110110/8621653 反编译方法: 第一步:你先把下载的包的后缀名改成.zip第二步:到网上搜索de ...
- Ognl底层使用
今天,在得知ognl采用.在这里和大家分享一下.我希望能帮助. package com.hcj.test; import java.util.ArrayList; import java.util.L ...
- Myeclipse它显示了一个目录的结构,而不是包
今天Myeclipse新project,编写代码,查找workspace空间展示project在包装和class所有平行结构,看的很不顺,有两个原因,第一,您可能无法切换到Package worksp ...
- NGUI判断是否点击到UI控件
注意:UI应加上Box Collider 1.射线检测 UICamera发一条射线,射线碰到了东西就说明点击到了UI Ray ray=UICamera.mainCamera.ScreenPointTo ...
- hdu 4876 ZCC loves cards(暴力)
题目链接:hdu 4876 ZCC loves cards 题目大意:给出n,k,l,表示有n张牌,每张牌有值.选取当中k张排列成圈,然后在该圈上进行游戏,每次选取m(1≤m≤k)张连续的牌,取牌上值 ...