跟我学EJB 分布式编程技术——利用J2eeSdk13实现EJB编程和部署
- 格式:pdf
- 大小:902.35 KB
- 文档页数:33
ejb技术的工作原理EJB(Enterprise Java Beans)是一种用于构建分布式企业级应用程序的Java技术。
它是一种服务器端组件模型,用于在Java应用程序中实现业务逻辑和持久化数据。
EJB的工作原理可以分为以下几个步骤:1. 定义EJB接口:首先,开发人员需要定义EJB接口,该接口定义了EJB的方法和行为。
这些接口通常使用Java接口来定义,其中包含了业务逻辑的方法。
2. 实现EJB:接下来,开发人员需要实现EJB接口。
实现类通常称为EJB Bean,它包含了实际的业务逻辑和数据访问代码。
EJB Bean可以是无状态(Stateless)或有状态(Stateful)的。
3. 配置EJB容器:在将EJB部署到应用服务器之前,需要对EJB进行配置。
配置包括指定EJB的访问权限、事务管理、安全性等方面的设置。
这些配置信息通常包含在EJB的部署描述符文件中,如ejb-jar.xml。
4. 部署EJB:一旦EJB被配置好,就可以将其部署到应用服务器上。
应用服务器会负责管理EJB的生命周期,包括创建、激活、销毁等操作。
5. 客户端访问EJB:一旦EJB被部署到应用服务器上,客户端可以通过远程调用或本地调用的方式访问EJB。
远程调用使用RMI (Remote Method Invocation)或Web服务技术,而本地调用则直接在同一个JVM中进行。
6. EJB容器处理请求:当客户端调用EJB的方法时,请求会被EJB容器接收并处理。
EJB容器负责管理EJB的生命周期、事务管理、安全性等方面的功能。
它会根据配置信息执行相应的操作,并确保EJB的正确运行。
7. 返回结果给客户端:一旦EJB方法执行完毕,容器会将结果返回给客户端。
结果可以是一个返回值、一个对象或者一个异常。
总结起来,EJB的工作原理是通过定义EJB接口、实现EJB、配置EJB容器、部署EJB、客户端访问EJB、EJB容器处理请求和返回结果给客户端等步骤来实现分布式企业级应用程序的开发和运行。
J2EE——J2EE的⼗三种技术引⾔J2EE的⼗三种技术在⽹上⼀搜多的是,⽐如附录中的那篇⽂档就已经涵盖的很全了,但是作为应⽤级开发者并不⼀定要对这⼗三种技术都掌握,⽽且这⼗三种技术中哪些重要哪些不重要也存在⼀定的区别,所以我对⼀些重要的技术提炼出来放在概要⾥,⽅便读者快速掌握,⽽且学习也好有偏重概要这个也可以作为学习Java的路线,其实Java主要的技术包括Java基础部分,也就是⾯向对象,集合,界⾯,线程,⽂件以及⽹络;以及往⽹页⽅⾯⾛的JSP,Servlet,JS,其实如果读者接触过JSP和Servlet,就知道他们俩其实是⼀个东西,jsp其实最终也是会翻译成servlet,⼀个jsp会对应⼀个class;与数据库打交道的JDBC,Oracle;最后可以加上⼀个SSH,三⼤框架,⽤的还⽐较多除了上⾯说的常⽤的之后还有⼀些不常⽤的,⽐如JNDI,Java命名和⽬录接⼝,这个我们实际上⼀般只是⽤它,往往都不会⾃⼰去开发,感觉并不算重点另外EJB,企业级Java Bean,跟Hibernate很像,但有逐渐被Hibernate淘汰的趋势,其实这些技术都是存在⼀个演化过程,在原有的技术基础上改良⽽得,后⾯的SSH框架以及其他框架都是如此,针对某⼀⽅⾯的改良。
Java事务这块的技术,JTA和JTS,JTA是事务体系,JTS是事务服务,这个也是很底层的东西,应⽤级开发⽤的⽐较少,应⽤开发者⼀般只管⽤就⾏了附录J2EE的⼗三种技术(规范)Java数据库连接(JDBC) JDBC API以⼀个统⼀的⽅式访问各种数据库。
与ODBC类似,JDBC将开发者和私有数据库之间的问题隔离开来。
由于它建⽴在Java上,因此JDBC可以提供平台⽆关的数据库访问。
JDBC定义了4种不同的驱动,具体来说,包括有: 类型1:JDBC-ODBC桥 在JDBC刚产⽣时,JDBC-ODBC桥是⾮常有⽤的。
通过它,开发者可以使⽤JDBC来访问⼀个ODBC数据源。
菜鸟学EJB(⼀)——第⼀个实例EJB⽤了那么长时间了,从来没写过关于它的东西,挺对不住它的。
今天先写⼀个简单的⼩实例,虽然⼩但是却能体现出EJB的核⼼——分布式。
我们可以将业务逻辑的接⼝跟实现部署到⼀台机器上,将调⽤它们的客户端部署到另⼀台机器上。
⾄于为什么要⽤分布式,今天不做讨论,以后再细说。
先来看接⼝:package com.tjb.ejb;public interface MyEjb {String helloEjb ();}接下来是对接⼝的具体实现:package com.tjb.ejb;import javax.ejb.Remote;import javax.ejb.Stateless;import javax.jws.WebMethod;import javax.jws.WebService;@Stateless@Remote@WebServicepublic class MyEjbBean implements MyEjb {public String helloEjb() {return "Hello EJB";}}然后编写⼀个客户端来通过接⼝调⽤我们的实现:package com.tgb.ejb;import javax.naming.InitialContext;import javax.naming.NamingException;import com.tjb.ejb.MyEjb;public class MyEjbClient {public static void main(String[] args) throws NamingException {InitialContext ctx = new InitialContext();MyEjb ejb = (MyEjb) ctx.lookup("MyEjbBean/remote");String hello = ejb.helloEjb();System.out.println(hello);}}客户端实例化⼀个上下⽂对象,然后通过其lookup⽅法查找远程实现,最后调⽤具体的⽅法。
Ejb技术1、weblogic的热发布将ear、jar、war拷到C:\bea\user_projects\domains\mydomain\applications 目录weblogic会自动发布通过jbuilder将ear或jar或war部署到服务器上。
2、在ejb中实现one-to-many1、在many中的将外键字段属性删除2、在删除many中的值时要将Collection转化为ArrayList,并反向遍历ArrayList,先删除ArrayList中值,根据ArrayList删除反回的对象转化为many的远程接口,通过远程接口将many删除3、ejb所用的技术:Jndi:java naming directory inferfaceRmi:remote method invoke4、实现ejb几个接口,几个类?两个接口一个类extends EJBHome通过jndi得到home接口create方法调用服务端的ejbCreate方法,在服务端产生一个EntityBean或SessionBean实例,向客户端返回一个远程接口。
通过find方法在从服务端找到一个EntityBean实例,向客户端返回一个远程接口。
extends EJBObject在客户端通过rmi调用远程服务端方法。
通过remove方法调用服务端的ejbRemove方法,将EnityBean删除implements SessionBean在服务端实现真正的处理,实现核心业务5、实现ejb相关的配置文件是什么?ejb-jar.xml:说明ejb的两个接口一个类的。
weblogic-ejb-jar.xml:说明ejb的JNDI名weblogic-rdbms-ejb.xml:o-rMapping实现数据库表、字段与ejb属性对应的关系。
ejb2.0的开发1、用jbuilder集成环境2、可以用eclipse开发,用源代码注释说明,用ant执行xdoclet,xdoclet通过源代码注释自动生相关的配置、两个接口一个类。
EJB3.0开发平台安装 and开发原理(1). 《EJB3.0开发平台配置》第一步:开发平台的搭建1、下载与安装JDK2、下载与安装Eclipse3、下载与安装JBoss第二步:运行Eclipse,新建一个普通的Java项目:4、菜单操作路径:File-New-Projcet;5、进入新建项目向导窗口,选择Java-Java Project;6、点击next,输入Project name:HelloStudy(名字可以任意取),再按Finish;7、在项目名称上面按右建选择Properties;8、单击左窗格中的Java Build Path;文件,再点击打开;择javaee.jar,再点击打开,再点击OK;11、菜单操作路径:File-New-Class12、分别输入package:com.foshanshop.ejb3,以及Name:HelloWorld后,点击Finish;的HelloWorld.java,打开该文件,按照书上的内容输入代码;14、菜单操作路径:File-New-Class15、分别输入package:com.foshanshop.ejb3.impl,以及Name:HelloWorldBean后,点击Finish;16、双击左侧框HelloStudy项目下的com.foshanshop.ejb3.impl,再双击com.foshanshop.ejb3.impl下面的HelloWorldBean.java,打开该文件,按照书上的内容输入代码;17、在HelloStudy项目上右击,选择Export,在弹出的Export对话框中选择JAR file;18、单击Next按钮,在弹出的JAR Export对话框的select the resources to export(选择要导出的资源)列表框中展开你的项目并选择需要打包的文件。
然后选择一个存放目录及文件夹名,单击Finish按钮结束打包;第七步:当项目打包成jar文件后,将它发布到Jboss:19、发布前先检查JBoss是否已经启动,如果没有启动,打开DOS命令符窗口,进入“JBoss安装目录/bin”,运行run.bat启动JBoss。
J2EE EJB入门一、状态(Session)EJB的应用1、状态EJB的分类状态EJB分为非会话状态EJB和会话状态两种(1)非会话状态EJB,不保存用户状态,不为用户建立独立的线程.(2)会话状态EJB,保存用户状态,为用户建立独立的线程.会话状态EJB与非会话状态EJB的互相转换很简单,在Jbuilder的EJB设计器中将Session Type设为Stateless或者Stateful便可.2、状态EJB的生命周期(1)非会话状态EJB的生命周期当客户端访问非会话状态EJB时,非会话状态EJB的setSessionContext()方法和ejbCreate()方法被激活,然后非会话状态EJB保留在EJB容器内,等待用户的访问。
EJB一但被用户创建便保留在服务器内,它的生命周期一直到服务器发出关闭指令才结束。
(2)会话状态EJB生命周期当一个客户端的程序EJB时,EJB的生命开始,SetSessionContex方法和ejbjCreate方法被激活,会话状态EJB的方法可以被事务处理方法和非事务处理方法访问,当客户端结束运行时,该EJB也结束运行。
会话状态EJB比非会话状态EJB多了一个状态,EJB可以处在不激活状态,并且会话状态EJB使用ejbPassivate方法和ejbActivate方法3、两种状态EJB的比较非会话状态EJB不会为客户创建独立的进程,它一旦创建便保留在服务器内,每个客户都是使用一个EJB对象;会话状态EJB为客户创建独立的进程,每个客户使用不同的EJB对象,需要使用remove方法删除服务器上的EJB对象.在实际项目中利用不同状态EJB实现不同的效果,如电子商城的公布板的信息对每个用户都是相同的,可以使用非会话状态EJB;如电子商城的购物车对每个用户是不同的,可以使用会话状态EJB。
我们也可以将一些耗时的处理过程放入非会话状态EJB共享。
二、全局(Entity)EJB的应用1、全居EJB的作用(1)可以和数据库的数据结合操作,全局EJB提供各种数据操作的方法。
目录1.1通过代码示例跟我学J2EE JSP组件技术及应用实例(第1部分) (2)1.1.1构建本实例的开发环境——安装JDK和Tomcat服务器 (2)1.1.2构建本实例的开发环境——安装MyEclipse开发工具 (8)1.1通过代码示例跟我学J2EE JSP组件技术及应用实例(第1部分)1.1.1构建本实例的开发环境——安装JDK和Tomcat服务器1、安装JDK和配置JDK——如果已经安装过,则不再需要重复。
2、安装Tomcat服务器和熟悉了解Tomcat的各种工作目录Tomcat是一款开源免费的JSP服务器,可以在 / 下载并安装Tomcat 6 或者7。
建议下载压缩包版本而不是Windows Service Installer 的EXE 安装文件。
解压缩到磁盘目录, 并记下安装的目录路径。
(1)安装Tomcat服务器(2)bin目录进入Tomcat 安装目录下的bin 子目录,可以看到startup.bat 和shutdown.bat。
(3)webapps(4)work目录3、配置Tomcat服务器对于设置Windows的系统环境变量,可以打开控制面板中的“系统”程序;在“系统环境变量”中增加两个环境变量项目JAVA_HOME(最好为大写)指向JDK的目录和TOMCAT_HOME (最好为大写)指向所安装的tomcat的目录。
(1)JAVA_HOME值注意不要以“;”结束。
(2)TOMCAT_HOME(或者:CATALINA_HOME)值注意不要以“;”结束。
(3)Path路径的设置4、启动Tomcat服务器(1)启动Tomcat服务器:执行在Bin目录下的名为startup.bat的脚本文件可以启动Tomcat 服务器现在可以运行TOMCAT并作为一个独立的Servlet容器。
当看到出现信息: Server startup in XXXX ms 的输出后,Tomcat 就启动完毕了。
目录1.1利用J2sdkee1.3进行EJB的开发 (2)1.1.1EJB开发过程概述 (2)1.1.2打包生成*.ear文件的准备工作 (11)1.1.3设计和编写EJB部署文件 (22)1.1.4发布部署示例项目中相关的*.ear文件 (25)1.1.5执行EJB的客户程序 (27)1.1.6如何取消所部署的EJB组件 (30)1.1.7如何打开或者关闭J2EEApp应用程序 (31)1.1利用J2sdkee1.3进行EJB的开发1.1.1EJB开发过程概述1、EJB开发过程EJB开发基本上都遵循如下的六个步骤:1)编写构成Bean的各个类与接口的.java文件。
2)将.java文件编译为.class文件。
3)编写部署描述文件。
4)用Jar工具生成Ejb-jar(或者ear)文件。
5)配置EJB服务器,并启动EJB容器。
将Ejb-jar文件部署到容器中。
6)编程客户端的测试程序代码以访问EJB组件中所提供的业务方法每个步骤使用的工具不同,都会生成相应的阶段产品。
关于对开发过程的理解和掌握,大家会随着后面讨论的深入而逐渐加深。
2、启动Sun J2EE服务器:如果在前面已经启动了则不需要(1)设置环境变量set J2EE_HOME=C:\j2sdkee1.3;set JAVA_HOME=C:\j2sdk1.4.0;(2)启动J2EE 服务器J2ee -verbose 重定向所有日志输出到当前命令窗口J2ee -version 显示版本号J2ee -stop 停止j2ee服务器3、编程各个java文件并在JCreator中进行编译它们(1)为了能够在JCreate中能够编译EJB 组件的Java程序,应该首先在JCreator中引用j2sdkee1.3\lib下j2ee.jar包文件到JCreator的classpath设置中,这样才能够在JCreator中对EJB的各个接口和类的程序进行编译。
(2)分别编程EJB组件的各个类程序:下面以一个“美元”和“人民币”相互转换的实例来说明●编程设计REMOTE接口REMOTE接口主要负责定制商业方法(或者业务逻辑方法),并且必须从EJBObject 接口进行继承,在该接口中声明出各个业务方法,这些商业方法是由服务器端的企业组件实现的。
客户端通过该接口与EJB对象相互作用,EJB容器供应商实现该接口(由EJB容器生成的、实现了Remote接口的EJB对象将包含javax.ejb. EJBObject接口定义的所有方法)。
根据 Java接口的特性,在REMOTE接口中定义了的业务方法,则必须在BEAN的实现类中都实现它们。
//本接口需要引入的类或接口import javax.ejb.EJBObject;import java.rmi.RemoteException;public interface Converter extends EJBObject //(1)必须继承EJBObject { //(2)以下为定义业务逻辑方法,每种方法都应该声明RemoteException的异常抛出public double dollarToYen(double dollars) throws RemoteException;public double yenToEuro(double yen) throws RemoteException;}●编程设计Home接口HOME接口主要是用来规范容器相关的操作方法,它定义了允许远程客户创建、查找和删除EJB对象的各种方法(HOME接口对象是制造EJB对象的工厂),其中最主要的是定义创建方法(create())并且必须从EJBHome接口进行继承。
HOME接口允许客户端进行如下操作。
·创建一个EJB对象·删除一个EJB对象·为EJB Bean获取javax.ejb.EJBMetaData接口HOME主接口定义一个或多个初始化功能的create(...)方法,每个方法定义了一种创建会话对象的方式,并且与Bean的实现类中的ejbCreate ()方法右对应的关系(参数列表相同,但create ()方法返回为void,而在Home接口中的ejbCreate ()方法则返回为Remote接口类型的对象)。
create方法的参数用来初始化创建的会话对象的状态。
对于带参数的create方法主要是用来初始化创建的会话对象的状态,一般适用于有状态的会话Bean。
对于无状态的会话Bean,它本身不需维持自身的状态,所以不需要个性化的创建方法,即create方法是不带有参数的。
另外,无状态的SessionBean不能声明实例变量,每个方法只能操作方法传来的参数,如果需要在引用期间维持一些数据状态,以在其它方法中可以引用,则可以把Bean设计成有状态会话Bean。
//本接口需要引入的类或接口import java.io.Serializable;import java.rmi.RemoteException;import javax.ejb.CreateException;import javax.ejb.EJBHome;//(1)只需要开发人员给出一个主接口的定义,接口中方法的实现由容器来完成。
一般情况下,习惯将主接口的命名规则规定为<BeanName>Homepublic interface ConverterHome extends EJBHome{//(2)定义一个create()方法,用来获得一个实例Bean的引用,返回的对象类型是组件接口类Converter create() throws RemoteException, CreateException;}编程设计该EJB的Bean 程序:本例为一个Session Bean并且为无状态类型。
一个Session Bean代表了与客户的一个对话, 一旦服务器或客户崩溃, Session Beans 就不存在了。
在该Session Bean中实现自己的业务逻辑方法,并且必须实现SessionBean 接口。
//本类需要引入的类或接口import java.rmi.RemoteException;import javax.ejb.SessionBean;import javax.ejb.SessionContext;public class ConverterBean implements SessionBean //(1)必须实现SessionBean 接口{private SessionContext sessionContext; //由于是个会话EJB,因此声明会话上下文//(2)以下为供客户端调用的业务逻辑方法public double dollarToYen(double dollars){return dollars * 121.6000;}public double yenToEuro(double yen){return yen * 0.0077;}public ConverterBean(){}//(3)以下为接口SessionBean中定义的各个生命周期方法,在本程序中必须实现public void ejbCreate() // HOME中声明的create方法的影射实现{}public void ejbRemove(){}public void ejbActivate(){ejbActivate()方法不适用于无状态会话Bean,因此,这个方法是空的。
}public void ejbPassivate(){ejbPassivate()方法不适用于无状态会话Bean,因此,这个方法是空的。
}public void setSessionContext(SessionContext sc){ sessionContext =sc;//保存上下文环境,以便与容器进行交互。
EJB容器将所有的状态信息存放在一个对象中,这个对象称为//EJB Context对象。
容器通过调用setSessionContext将Bean和Context关联。
}}(3)编程使用该EJB组件的客户端程序,其主要步骤为:●定位本地接口Context initial = new InitialContext(); //创建JNDI命名上下文Object objref = initial.lookup("MyConverter"); //查找与JNDI命名为MyConverter绑定的对象//造型指向ConverterHome对象的引用为目标类型ConverterHome home = (ConverterHome) PortableRemoteObject.narrow(objref, ConverterHome.class);●创建企业组件(EJB)客户端通过调用本地接口ConverterHome对象的create方法创建ConverterBean类对象,create 方法返回组件Converter类型的对象。
然后,远程方法定义的在ConverterBean实现的商业方法可以被客户端调用。
当客户端调用create 方法时,EJB容器将实例化ConverterBean对象,然后调用ConverterBean.ejbCreate 方法。
Converter currencyConverter = home.create();●调用商业方法客户调用Converter对象的方法,EJB容器将相应的调用运行在J2EE服务器中的ConverterBean类对象实例中的对应的方法。
double amount = currencyConverter.dollarToYen(100.00);(4)编程使用该EJB组件的客户端程序所应该注意的问题●在下面的客户程序中的InitialContext类的对象主要用来获取当前客户应用程序的上下文环境,而方法lookup从组件池中根据部署组件时的JNDI名来查找一个JNDI对象,并取得一个EJB Home主接口的对象的引用。
然后通过Home主接口对象中的create()方法创建出远程的EJB对象并获得对它的引用。
要注意的是:lookup()方法返回的是一个Object类型的远程主接口对象的存根,为此需要使用javax.rmi.PortableRemoteObject的narrow()方法来获取一个具体的对象引用。
●narrow()方法:第一个参数是lookup()方法返回的对象,第二个参数是要得到的引用类型。
我们通过narrow()方法并经过造型得到了一个具体的对象实例引用,然后再调用create()方法获取一个具体组件接口的实例引用,然后就可以与本地一样去引用这个实例。