部署Java在服务器端的EJB组件的方法
什么是EJB?
EJB是Java企业Bean,是JavaEE服务端企业组件模型,它的设计目标与核心应用是部署分布式应用程序。话不多说,直接看如何在本机部署EJB3。
部署环境:
操作系统:Windows8.1
EJB容器:Jboss7.1
DB:MySQL5.6.10
IDE:MyEclipse10
JDK:1.6
1、创建数据库、表
由于在此过程中,需要和数据库通信,需要首先创建数据库表。
创建数据库:
createdatabasestudent;//创建数据库student
创建表:
createtablestudent(//创建表student和数据库同名 `id`integer(11)notnull, `name`varchar2(20)defaultnull, primarykey(`id`) )ENGINE=InnoDBDEFAULTCHARSET=latin1插入一条数据:
insertintostudentvalues(1,'easynoder'); commit;给本地的root用户(生产环境请勿这样做)指定访问权限。
grantallprivilegeson*.*toroot@localhostindentifiedby"1234"
通过以上步骤,需要的数据库表已建立好。可通过root用户访问所有数据。
2、编写实体Bean、用户操作接口和会话Bean
建立EJB工程,名为MyEJBProject。该工程META-INFO目录下包含一个文件persistence.xml文件。该文件用来配置数据源,稍后进行配置。
接着建立实体Bean
@Entity//表明这是一个实体Bean @Table(name="student")//和数据库表student建立映射 publicclassStudentEntityimplementsSerializable{ privatestaticfinallongserialVersionUID=4002145187978562529L; @Id//表明是该实体的id @GeneratedValue(strategy=GenerationType.AUTO)//id生成策略 @Column(name="id")//对应student表id字段 privateintid; @Column(name="name")//对应student表name字段 privateStringname; publicintgetId(){ returnid; } publicStringgetName(){ returnname; } publicvoidsetId(intid){ this.id=id; } publicvoidsetName(Stringname){ this.name=name; } }
建立操作接口:
publicinterfaceBaseOperation{ publicList<?>findAll(); }
该接口只有一个方法,获取所有的学生
建立会话Bean
@Stateless//这是一个无状态Bean @Remote(BaseOperation.class)//指明Bean的remote接口 publicclassStudentDaoBeanimplementsBaseOperation{ //EntityManager是由EJB容器自动配置和管理的,unitName属性的值对应 persistence.xml中<persistence-unitname="MyEJBProject"transaction-type="JTA"></persistence-unit>name的配置 @PersistenceContext(unitName="MyEJBProject") privateEntityManagerem; @SuppressWarnings("unchecked") publicList<?>findAll(){ System.out.println("查询开始..."); List<StudentEntity>list=em.createQuery("fromStudentEntity").getResultList(); if(list!=null){ Iterator<StudentEntity>it=list.iterator(); while(it.hasNext()){ StudentEntitystudent=it.next(); System.out.println("学生id:"+student.getId()); System.out.println("学生名称:"+student.getName()); } } System.out.println("查询完毕...."); returnlist; } }
3、数据源配置
这里需要注意下,在jboss6和jboss7的配置是不同的。
jboss6和以前版本都是在deploy目录下添加**-ds.xml,这里**表示任意一种数据库名称,如果是mysql,则是mysql-ds.xml文件。而在jboss7中,是不一样的。
将目录切换至Jboss的安装目录,即%JBOSS_HOME%下,进入modules/com目录,建立文件夹mysqldatabase,进入,建立mysql文件夹,进入,建立main文件夹。
在main目录下,建立module.xml文件,该配置文件内容为:
<?xmlversion="1.0"encoding="UTF-8"?> <modulexmlns="urn:jboss:module:1.1"name="com.mysqldatabase.mysql"> <resources> <resource-rootpath="mysql-connector-java-5.**-bin.jar"/> </resources> <dependencies> <modulename="javax.api"/> <modulename="javax.transaction.api"/> <modulename="javax.servlet.api"optional="true"/> </dependencies> </module>
尤其这里需要注意的是,module节点属性name的值,就是刚才咱们建立的文件夹的路径。resources表示mysql驱动的路径。意味着,需要将mysql的驱动放在main目录下。即main目录下包含两个文件,module.xml和数据库驱动文件。
在做完上一步后,切换到%JBOSS_HOME%\standalone\configuration目录下,
打开standalone.xml,搜索datasources,进行如下配置
<datasources> <datasourcejndi-name="java:jboss/KouMySQLDS"pool-name="MySQLDS"enabled="true"use-java-context="true"> <connection-url>jdbc:mysql://localhost:3306/student</connection-url> <driver>mysql</driver> <security> <user-name>root</user-name> <password>1234</password> </security> </datasource> <drivers> <drivername="mysql"module="com.mysqldatabase.mysql"> <driver-class>com.mysql.jdbc.Driver</driver-class> <xa-datasource-class>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</xa-datasource-class> </driver> </drivers> </datasources>
jndi-name表示数据源jndi名称,connection-url表示连接的url字符串;这里默认使用3306端口,使用student库,用户名和密码即第一步配置的。module配置的即刚刚配置的module的路径。
jboss的相关配置已经完成,接着切换到刚新建的工程,其中有一个persistence.xml配置文件,该文件做如下配置,其中jta-data-source就是上面配置的jndi-name.
<jta-data-source>java:jboss/KouMySQLDS</jta-data-source> <properties> <propertyname="hibernate.hbm2ddl.auto"value="validate"/> <propertyname="hibernate.jdbc.fetch_size"value="15"/> <propertyname="hibernate.jdbc.batch_size"value="10"/> <propertyname="hibernate.show_sql"value="true"/> <propertyname="hibernate.format_sql"value="true"></property> </properties>
到此为止,服务端代码和数据源配置已经完成。接下来需要做的就是如何部署代码以及如何在客户端调用该EJB服务。
4、部署EJB服务。
将之前在工程中写的所有代码打成jar包,命名为ejbservice.jar。同时,只将实体Bean和接口打包成jar包,命名为ebjinterface.jar,这个jar将来用于客户端调用使用。
将ejbservice.jar放入%JBOSS_HOME%\standalone\deployments目录下。在jboss启动时,会自动扫描该目录。然后部署该jar。
ok,我们将jboss配置到MyEclipse下,在MyEclipse中启动Jboss,观察控制台的输出。
如果出现了Deployed"ejbservice.jar"这个日志,说明ejb就部署成功了。
5、客户端如何调用呢?
客户端调用需要两个必备条件:
引入jboss-ejb-client.properties配置、jboss-client.jar和ejbinterface.jar。其中jboss-client.jar位于jbossbin/client目录下。ejbinterface.jar是我们刚刚创建的客户端需要使用的接口jar包。
jboss-ejb-client.properties配置如下:
endpoint.name=client-endpoint remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false remote.connections=default remote.connection.default.host=localhost remote.connection.default.port=4447 remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false remote.connection.default.username=yourUsername remote.connection.default.password=yourPassword
有了这两个条件,就可以安心的建立个测试类EJBTest.java,编写客户端方法了。
publicstaticvoidmain(String[]args){ Propertiesprops=newProperties(); props.setProperty(Context.URL_PKG_PREFIXES,"org.jboss.ejb.client.naming"); try{ Contextcontext=newInitialContext(props); //这里需要注意字符串的写法:ejbservice表示ejb的包名,StudentDaoBean表示咱们实际调用的会话Bean,org.easynoder.ejb2.dao.BaseOperation表示对应的接口 BaseOperationop=(BaseOperation)context .lookup("ejb:/ejbservice//StudentDaoBean!org.easynoder.ejb2.dao.BaseOperation"); op.findAll(); }catch(NamingExceptione){ e.printStackTrace(); } }
运行这段代码,可以成功的查询到数据库的数据啦。
至此,EJB就部署成功啦。