zoukankan      html  css  js  c++  java
  • JavaEE(9)

    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();
        }
    }
  • 相关阅读:
    智慧养老民政监管平台建设方案
    CF600E Lomsat gelral dsu on tree
    dsu on tree详解
    【Spring 从0开始】Spring5 新功能,整合日志框架 Log4j2
    【Spring 从0开始】JdbcTemplate 数据库事务管理
    【Spring 从0开始】JdbcTemplate 数据库事务参数
    【Spring 从0开始】JdbcTemplate 数据库事务管理
    【Spring 从0开始】JdbcTemplate 操作数据库
    【Spring 从0开始】AOP 操作
    【Spring 从0开始】AOP 操作中的相关术语、环境准备
  • 原文地址:https://www.cnblogs.com/thlzhf/p/4249375.html
Copyright © 2011-2022 走看看