如何开发EJB?

article/2025/9/30 2:46:14

EJB开发分为两部分:开发EJB和使用EJB

本文示例将使用EJB2.0 :1.工作需要;2.EJB3.0相对于2.0变动不大(添加注解,JPA替换实体Bean实现)

开发EJB的流程

以开发stateless SessionBean为栗.

1.编写SessionBean。需要实现SessionBean接口,并额外添加ejbCreate()方法

2.编写Home接口和Remote组件接口。

Remote接口扩展EJBObject接口,添加SessionBean中方法,并抛出异常RemoteException。

Home接口扩展EJBHome接口,添加create()方法,返回Remote组件,抛出异常CreateException、RemoteException。

3.编写ejb-jar.xml

4.打包

5.部署到J2EE服务器

举个栗子

首先你需要个javax.ejb-api.jar

软件环境

开发环境:intellij idea 13

服务器:glassfish 4

目录结构


package com.ejb.bean.sessionbean;import javax.ejb.EJBException;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;
import java.rmi.RemoteException;/*** Created by Tony.Sun on 7/17/2014.*/
public class GreetingBean implements SessionBean{@Overridepublic void setSessionContext(SessionContext sessionContext) throws EJBException, RemoteException {System.out.println("setSessionContext");}@Overridepublic void ejbRemove() throws EJBException, RemoteException {System.out.println("ejbRemove");}@Overridepublic void ejbActivate() throws EJBException, RemoteException {System.out.println("ejbActivate");}@Overridepublic void ejbPassivate() throws EJBException, RemoteException {System.out.println("ejbPassivate");}/*** 额外添加的ejbCreate方法*/public void ejbCreate(){System.out.println("ejbCreate");}/*** 问候,没人规定每次都要say hello啊* @return*/public String greet(){return "f u c k y o u,EJB world!";}
}

package com.ejb.bean.sessionbean;import javax.ejb.EJBObject;
import java.rmi.RemoteException;/*** Created by Tony.Sun on 7/17/2014.*/
public interface GreetingRemote extends EJBObject {String greet() throws RemoteException;
}

package com.ejb.bean.sessionbean;import javax.ejb.CreateException;
import javax.ejb.EJBHome;
import java.rmi.RemoteException;/*** Created by Tony.Sun on 7/17/2014.*/
public interface GreetingHome extends EJBHome {GreetingRemote create() throws CreateException,RemoteException;
}

<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd"version="3.1"><enterprise-beans><session><ejb-name>greetingbean</ejb-name><home>com.ejb.bean.sessionbean.GreetingHome</home><remote>com.ejb.bean.sessionbean.GreetingRemote</remote><ejb-class>com.ejb.bean.sessionbean.GreetingBean</ejb-class><session-type>Stateless</session-type><transaction-type>Bean</transaction-type></session></enterprise-beans>
</ejb-jar>

打包什么的太费事直接用IDE部署了,(我们只是代码的搬运工 ^ _ ^)


使用EJB

Bean已经部署在服务器上了,现在要调用Bean,具体步骤如下

1.引用glassfish/lib下gf-client.jar

2.获取JNDI上下文服务 new InitContext()。在服务器上使用时InitContext不需要参数也可以成功运行,独立程序使用时需要传递参数(详见栗子)。

3.通过上下文服务查找Bean服务

4.使用PortableRemoteObject进行窄化,并转换成Home对象

5.使用Home接口对象create() Remote服务接口

6.通过服务接口调用相关方法

来个栗子

package com.ejb.bean.sessionbean;import javax.ejb.CreateException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.rmi.PortableRemoteObject;
import java.rmi.RemoteException;
import java.util.Properties;/*** Created by Tony.Sun on 7/17/2014.*/
public class GreetingTest {public static void main(String[] args) throws NamingException, RemoteException, CreateException {Properties props = new Properties();//这些参数根据不同服务器设置不同,具体视服务器而定props.put("java.naming.factory.initial", "com.sun.enterprise.naming.impl.SerialInitContextFactory");props.put("java.naming.factory.url.pkgs", "com.sun.enterprise.naming");props.put("java.naming.factory.state", "com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl");//服务器ipprops.put("org.omg.CORBA.ORBInitialHost", "localhost");//EJB服务端口props.put("org.omg.CORBA.ORBInitialPort", "3700");//获取JNDI上下文服务 new InitContext()。//在服务器上使用时InitContext不需要参数也可以成功运行,独立程序使用时需要传递参数(详见栗子)。Context ctx = new InitialContext(props);//通过上下文服务查找Bean服务Object obj = ctx.lookup("java:global/demo_ejb_exploded/greetingbean");//使用PortableRemoteObject进行窄化,并转换成Home对象GreetingHome home = (GreetingHome) PortableRemoteObject.narrow(obj,GreetingHome.class);//使用Home接口对象create() Remote服务接口GreetingRemote remote = home.create();//通过服务接口调用相关方法String greet = remote.greet();System.out.print(greet);}
}


运行结果

f u c k y o u,EJB world!
Process finished with exit code 0


补充:

关于JNDI命名服务语法,这一点比较坑,不同服务器厂商提供的都不一样,以glassfish为栗,JNDI语法为

java:global/[应用名称]/模块名称/Bean名称

关于应用名称什么时候使用:当你的Bean.jar被打包在其他war包中的时候使用

关于如何确定模块名称:localhost:4848下Applications菜单下查看




http://chatgpt.dhexx.cn/article/r8wboYmQ.shtml

相关文章

数据库笔试题及答案

以下为某公司的数据库笔试题及个人整理的答案&#xff0c;小伙伴们有更好的答案欢迎指教&#xff01; 数据表 Student&#xff08;S#,Sname) 10000条记录Cource(C#,Cname,T#) 9条记录SC(S#,C#,Score) 89991条记录Teacher(T#,Tname) 3条记录 题目并没有指定表中有多少数据&am…

MySQL数据库期末考试试题及参考答案(09)

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 一、 填空题 MySQL提供的____命令可以将数据库导出成SQL脚本&#xff0c;以实现数据的备份。mysqldump命令备份多个数据库时&#xff0c;数据库名称之间用____隔开。MySQL中…

数据库题库(一)

第一章 绪论&#xff08;上&#xff09; &#xff08;1&#xff09; &#xff08;2&#xff09;只要有大量数据就可以称之为数据库&#xff08;&#xff09; &#xff08;3&#xff09;数据库管理系统DBMS有多种&#xff0c;比如PostgreSQL、Oracle等&#xff08;√&#xf…

MySQL数据库期末考试试题及参考答案(07)

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 一、 填空题 如果不想提交当前事务&#xff0c;可以使用_____语句回滚事务。每个事务都是完整不可分割的最小单元是事务的_____性。MySQL中&#xff0c;显式开启事务的语句…

数据库面试题(答案)

1、MySQL主键和唯一索引的区别&#xff1f; 1、主键是一种约束&#xff0c;唯一索引是一种索引&#xff0c;两者在本质上是不同的。 2、主键创建后一定包含一个唯一性索引&#xff0c;唯一性索引并不一定就是主键。 3、唯一性索引列允许空值&#xff0c;而主键列不允许为空值…

MySQL数据库期末考试试题及参考答案(06)

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 一、 填空题 普通索引使用KEY或____定义。在MySQL中&#xff0c;DROP VIEW语句用于____。MySQL中常见的索引大致分为普通索引、 ____ 、 ____ 、全文索引、空间索引。只有在…

数据库习题

习题一 数据库系统绪论 一、数据独立性包括数据的 物理独立性 和 逻辑独立性。 二、数据模型的组成三要素是数据结构 、 数据操作、 完整性约束条件。 三、两个实体型之间的联系分为三类&#xff0c;分别是 一对一关系、 一对多关系和 多对多关系 两个以上的实体型之间以及单…

MySQL数据库期末考试试题及参考答案(04)

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 一、填空题 MySQL中提供了____关键字&#xff0c;可以在查询时去除重复的值。使用ORDER BY对查询结果进行排序时&#xff0c;默认是按____排列。SELECT语句中&#xff0c;用…

MySQL数据库题库

一、选择题 第1章 数据库系统概述 1&#xff0e;DBS是&#xff08; A &#xff09;的简写。 A.数据库系统 B.数据库管理系统  C.数据库 D.操作系统 2.DBMS是( B )的简写 A.数据库系统 B.数据库管理系统  C.数据库 D.数据 3.DB、DBMS和DBS之间的关系是 (…

MySQL数据库期末考试试题及参考答案(03)

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 一、填空题 插入数据时&#xff0c;如果不指定____&#xff0c;必须为每个字段添加数据。MySQL中使用____语句来更新表中的记录。MySQL提供____语句用于删除表中的数据。在…

【数据库】数据库选择题练习及详解

练习1 1.允许取空值但不允许出现重复值的约束是______ A、NULL B、PRIMARY KEY C、UNIQUE D、FOREIGN KEY 解&#xff1a;NULL指当前值为空&#xff0c;不做其他约束&#xff0c;PRIMARY KEY为码约束&#xff0c;码必须唯一且不能为空&#xff0c;UNIQUE指的是当前值唯一&…

MySQL数据库期末考试试题及参考答案(05)

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 一、填空题 交叉连接查询返回的结果是被连接的两张数据表中所有数据行的____ 。左连接查询的结果包括LEFT JOIN子句中左表的____&#xff0c;以及右表中满足连接条件的记录…

MySQL数据库期末考试试题及参考答案(02)

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 一、 填空题 创建数据库时&#xff0c;语句中添加____可以防止数据库已存在而引发的程序报错。如果使用非图形化工具操作数据表&#xff0c;操作之前应该先使用____命令指定…

MySQL数据库期末考试试题及参考答案(01)

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 一、 填空题 ___在20世纪80年代被美国国家标准学会和国际标准化组织定义为关系型数据库语言的标准。数据模型所描述的内容包括3个部分&#xff0c;分别是数据结构、数据操作…

数据库原理及应用-期末考试试题及答案

单项选择题 DB、DBMS和DBS三者之间的关系是&#xff08; &#xff09;。 A&#xff0e;DB包括DBMS和DBS B&#xff0e;DBS包括DB和DBMS C&#xff0e;DBMS包括DB和DBS D&#xff0e;不能相互包括 对数据库物理存储方式的描述称为&#xff08; &#xff09; A&#xff0e;外模式…

数据库试题及答案 两套

数据库原理试题(A卷) 一、 填空题&#xff08;每空 1 分&#xff0c;共 20 分&#xff09; 1. 对于一个国家来说&#xff0c;数据库的建设规模、数据库信息量的 _____________ 和 _____________ 已成为这个国家信息化程度的 ________________ 。2. 数据模型通常由&#xff1a;…

经典 SQL 数据库笔试题及答案整理

马上又是金三银四啦&#xff0c;有蛮多小伙伴在跳槽找工作&#xff0c;但对于年限稍短的软件测试工程师&#xff0c;难免会需要进行笔试&#xff0c;而在笔试中&#xff0c;基本都会碰到一道关于数据库的大题&#xff0c;今天这篇文章呢&#xff0c;就收录了下最近学员反馈上来…

AttributeUsage(转载)

System.AttributeUsage声明一个Attribute的使用范围与使用原则。 AllowMultiple 和 Inherited 参数是可选的&#xff0c;所以此代码具有相同的效果&#xff1a; AttributeTarget的值可以参考1。部分可取值如下&#xff1a; 如果 AllowMultiple 参数设置为 true&#xff0c;则返…

[AttributeUsage(AttributeTargets.Class)] 用法例子

首先,创建一个自定义的Attribute,并且事先设定我们的Attribute将施加在class的元素上面以获取一个类代码的检查信息。 using System; using System.Reflection; [AttributeUsage(AttributeTargets.Class)] public class CodeReviewAttribute : System.Attribute //定义一个Co…

介绍属性与自定义属性、AttributeUsage

介绍属性 属性为访问自定义类型的注释信息提供通用的访问方式。注释信息是随意的&#xff0c;换句话说&#xff0c;这种信息不是语言自身固有的&#xff0c;而是由你自己能够想象到的任何信息。你能使用属性&#xff08;attributes&#xff09;定义设计时信息&am…