本文主要是介绍EJB3.0初步学习,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
今天简单学习了传说中的EJB,首先总的感觉,就是他的最重要的一个特点吧,就是能够使远程用户访问到本地或是服务器上的资源服务器。打个比方吧,传统的,还记得我们的第一个JAVA项目吧,那是个简单的对数据库增删改查的操作,用简单的界面来显示数据。那么当我们把这个项目打包发布之后,事必要把你自己的数据库也贡献出去,你做的软件在进行增删改查时也就只能对你机子上的一个数据库,别人如果想要对你这个数据库进行访问,那必须到你数据库所在的终端设备上才可以。而传说中EJB结合JBOSS正好可以克服这个问题,关于JBOSS是一个EJB容器,但似乎也有WEB服务器的作用,关于这点,我自己也不是很清楚,我使用过tomcat那个我知道是WEB服务器,这里我想可以是JBOSS是EJB容器,但同时也集成了WEB服务器的功能吧。好,从官网上下载到JBOSS,该设置的都设置了,JBOSS服务器成功运行,关于JBOSS的设置,网上很多资料,这里不在重复。但在这里讲我设置时遇到的一个上错误吧,当我在正确设置JBOSS-HOME后,但在以后的配置文件中调用系统这个属性时,经常是把JBOSS-HOME的变量在最后加上一个分号,从而使自己程序在访问这些配置时经常出错,当时我是用全路径名称。后来才发现不知道为什么,在我的JBOSS-HOME所在的路径中自动生成了一个带有分号的文件夹,我想可能是我的JBOSS-HOME指到那个地方去了吧。把这个文件夹删除后就可以正常使用了。
好慢慢来,首先是我的第一个EJB的例子,HelloWorld.首先要说明的是Bean,关于这个Bean有很多,会话,实例等等。那么究竟什么是Bean呢在字典中查的意思也都不对。在这里暂且把Bean当作是一个包吧,把一些应用封装,毕竟是人为规定的,不用太计较了。
让我先来看看会话Bean(session bean)session bean是实现业务逻辑的地方,简单来说,像我们要实现两数相加或是从数据库中读取数据,都江堰市是通过Session Bean来实现的。这样说来很像三层开发模式中的逻辑层,也像MAC中的C层。根据是否可以维护会话状态,Session Bean分为有状态bean和无状态bean.有状态bean可以维护会话状态,无状态bean不维护会话状态。要维护会话状态,意味EJB窗口要为每个用户创建一个bean实例,并通过该实例保存着与用户的会话状态。不维护会话状态,意味着一个bean实例不需要保存与某个用户的会话状态,这时一个bean实例可以为多个用户服务。可能说了这么多大家还是不太懂,怎么说呢,当我们把这个会话bean提交给JBOSS服务器后,客户端会请求调用这些bean来处理信息数据等,当客户端发送请求时,服务器端要生成bean对象给这个用户。无状态bean的意思就是这些创建之后都会放在一个bean池中,客户调用时池中有就从池中取,池中没有就创建,而有状态会对每个不同的用户创建一个bean实例。而要开发一个Session Bean,我们按面向对象的思维,要给这个bean定义接口和相应的实现类。从而这个接口分为了远程(remote)和本地(local)接口,在这里先说明一下,不强制要求你实现remote和local接口,但实现两者是一个比较好的方法。
远程接口(remote interface),定义了session bean的业务方法,而这些方法可以被来自EJB容器之外的其它应用使用。他通过的是Socket通信原理。
本地接口(local interface),定义了session bean的业务方法,而这些方法可以被同处于EJB容器内的其它应用使用。因为local接口允许bean之间直接通过内在交互,没有分布式对象协议的开销,从而发送了性能。
Bean类(bean class) bean class 包含了业务逻辑,它是实现接口所有的方法。
下面用一个简单的图来表示bean的运行流程:
浏览器 http://localhost:8080/Helloworld/index.jsp |
JSP Engineer |
index.jsp HelloWord helloword=(Helloword)ctx.lookUp(); |
Session bean EJB container |
Jndi.properties
|
HelloWorldBean.class |
浏览器请求index.jsp |
编译JSP文件 |
查找存根对象 |
好下面开始编写bean了,在这之前首先要把JBOSS的一些JAR文件导入到项目中去,首先是bean接口,很简单根普通接口一样,方要是用来定义方法,和在调用时返回实现这个接口的存根。
然后是实现这个接口方法的实现类,当然这里叫session bean,建议类名后面加上bean表示这是一个实现类。在这个类上有几个标签要注意,第一组是@Stateless,@Stateful.第一个指定这个bean是无状态的.第二个当然是用状态的了。在这里面还可以指定这个bean的名字,为什么要指定呢,我打个比方,如果不指定名字那一个接口类有两bean实现,那我们调用的时候,究竟是调用哪个呢,这时编译器会报错的。当然我只是打个比方,其实在这里我们是可以不指定名字的,那肯定有默认的了,那这个默认的名字是什么呢,其实就是这个实现类的类名(不包含包结构),所以只要我们的类名不同,那我们完全可以不指定每个bean的名字。也可以很好的控制了。当然在这里还是要告诉大家指定bean名字的方法:@Staeless(name=”xxx”),还有一组是@Remote(接口的class文件名), @Local(接口的class文件名),这组是用来指定接口是远程还是本地的。当然我们也可以指定多个接口。方法是:@Local({接口1的class文件名,接口2的class文件名。。。。。})或分开有的是远程,有的本地。
好了这两步完成之后一个简单的EJB就完成了,接下来就是把它布暑到JBOSS中去了。关于布暑也有两种方法一种是利用开发工具自带的jar导出功能。这个很简单点next就行。还有一种方法也是在真正开发过程中常用的Ant打包方法。这种打包方法十分的方便。首先在当前项目的根目录下新建一个XML文件,如build.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--.表示同一目录 ..表示在上一目录-->
<project name="HelloWorld" basedir="."> //basedir是指定该项目的目录,点表示为当前目录,也就是build.xml所在的目录
<!--指定项目的源文件夹 -->
<property name="src.dir" value="${basedir}/src"/>
<!--指定系统中的变量因为我们要从系统变量中得到值参考以下,简单的说就是引用系统的环境变量 -->
<property environment="env"/>
<property name="jboss.home" value="${env.JBOSS_HOME}"/>
<!-- 指定目前Jboss的配置项 -->
<property name="jboss.server.config" value="default"/>
<!-- 指定后面编译类时存储的路径 -->
<property name="build.dir" value="${basedir}/build"/>
<!-- 指定我们要用到jboss的jar文件 -->
<path id="build.classpath">
<fileset dir="${jboss.home}/client">
<include name="*.jar"/>
</fileset>
<pathelement location="${build.dir}"/>
</path>
<!-- 是用来创建文件夹的 -->
<target name="prepare" >
<delete dir="${build.dir}"/>
<mkdir dir="${build.dir}"/>
</target>
<target name="compile" depends="prepare" description="编译">
<javac srcdir="${src.dir}" destdir="${build.dir}">
<classpath refid="build.classpath"/>
</javac>
</target>
<!-- 打包 -->
<target name="ejbjar" depends="compile" description="创建ejb发布包">
<jar jarfile="${basedir}/${ant.project.name}.jar">
<fileset dir="${build.dir}">
<include name="**/*.class"/>
</fileset>
</jar>
</target>
<target name="deploy" depends="ejbjar" description="ejb发布">
<copy file="${basedir}/${ant.project.name}.jar" todir="F:/DirectRunSoft/jboss-5.1.0.GA-jdk6/jboss-5.1.0.GA/server/${jboss.server.config}/deploy"/>
</target>
<target name="undeploy" description="卸载ejb">
<delete file="F:/DirectRunSoft/jboss-5.1.0.GA-jdk6/jboss-5.1.0.GA/server/${jboss.server.config}/deploy/${ant.project.name}.jar"/>
</target>
</project>
当这个Bean发布成功后,我们可以到http://localhost:8080/jmx-console中去查看是否发布成功。(发布时要启动JBOSS服务器)
发布成功后就会生成一个jndi.
什么叫jndi呢,其实不用管他,只要记着你发布之后,那JBOSS会给你一个号。而别人调用时,也是查这个号。差不多就是这意思了。
那么接下来我们就要创建一个客户端来访问这个bean服务了。说白了就是那个实现类中提供的方法。那如上文所说,首先是查找这个jndi号了。在查之前还有一个工作就是我们必须设置应用服务器(JBOSS)的上下文信息。主要是jndi的驱动类名(java.naming.factory.initial)和命名服务器提供者URL(java.naming.provider.url).
那这两个是什么东东呢,呵呵,第一个,你可以作为jndi的驱动,上文不是讲你把session bean发布到了应用服务器之后,服务器会生成jndi吗,你查找的时候也是查找 这个所谓的jndi,那么我们肯定需要驱动吧,打个比方吧,你查找数据库时,也是要Class.Form(driver),呵呵,对不。这个驱动在JBOSS中是有的,只要加载一下(org.jnp.interface.NamingContextFactory)。
第二个,url根数据库操作提供的url有点像吧,那么我们加快一下数据库中的url是用来做什么的呢(url=jdbc:sqlserver://localhost:8080;Datebase=Student)一他指定这个数据库所在的主机和访问时的端口,然后数据库名字等等信息,那么类比而来,我先把这个jndi的url写出来(127.0.0.1:1099)似乎比数据库的url更为简单,他其实是用来指定全程服务器的主机地址和端口号,你要查jndi,但你去哪查啊,从哪个端口去查。
除了以上两个属性还有两个属性也常用到,分别是(java.naming.security.principal或Context.SECURITY_PRINCIPAL)和(java.naming.security.credentials或Context.SECURITY_CREDENTIALS),他们类似于数据库的用户名和密码。
Properties props=new Properties();
props.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
props.setProperty("java.naming.provider.url", "127.0.0.1:1099");
//上面是将配置信息注册进系统属性
try {
//这是实现一个jndi的对象。
InitialContext ctx=new InitialContext();
//查找jndi
HelloWorld hellworld=(HelloWorld)ctx.lookup("HelloWorldBean/remote");
//得到服务
System.out.println(hellworld.sayHello("约定291天后"));
System.out.println(hellworld.getClass().getName());
} catch (NamingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
除了上面的在代码中显示加载相应配置之外,我们还可以使用配置文件,你可能已经发现一个问题,在实例化jndi对象的时候就是上面的ctx,我们并没有看到对上面配置的调用,其实jndi对象实例也可以这样写InitialContext ctx=new InitialContext(props);,如此似乎更直观一点但在实际中,还是上面的写法,因为加入参数反而会影响程序的可移植性,那么我们不传入参数,那jndi实例化时是会自动调用System.getPropety()方法来查找配置的。下面介绍使用配置文件的方法。因为如果没有指定property,jndi还会在classpath中寻找jndi.properties.那么水到渠成。建一个这个配置文件就O了。
WEB程序打包:
War打包
1. 开发集成工具
2. 压缩软件,压缩格式zip然后再改成war
3. Ant打包:
与jar的ant类似,但也有不同:下回在说累了。。。。。。。。。。。。。。。。。。。。
这篇关于EJB3.0初步学习的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!