搭建环境:
Eclipse :Eclipse 版本其实相对用低最新版本几个版本的较好用,可以集成更多的插件,像我这个版本,可以直接去eclipse的商店里搜Jboss Tools(Eclipse中集成jboss必须插件。),直接集成jboss。较高版本或者新版本就不行,具体原因不清楚,较高版本想在eclipse集成jboss服务器,请看我上篇文章:Eclipse 集成Jboss服务器和svnJDK:1.8
jboss: 4.2
Mysql:5.7
上面环境不懂怎么搭的自己多搜搜,不难。
进入正题:
直接新建一个ejb项目工程。
这里就直接点 Finish,就可以创建一个ejb的工程。
接下来,你就要大概了解一下什么是ejb了。
1、什么是EJB?
Enterprise JavaBeans(EJB)定义了3种企业Bean:会话Bean(Session Bean)、实体Bean(Entity Bean)和消息驱动Bean(Message Driven Bean)
2、支持EJB的容器有哪些?
Jboss(4.2x以上版本)、Glassfish、WebLogic(10以上版本)、Sun Application Server(9.0以上版本)、Oracle Application Server(10g以上版本)和我们国内的Apusic应用服务器。
3、什么是API?
API(application programming interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。
4、什么是JNDI?
JNDI(Java Naming and Directory Interface,Java命名和目录接口)是一组在Java应用中访问命名和目录服务的API。命名服务将名称和对象联系起来,使得我们可以用名称访问对象。目录服务是一种命名服务,在这种服务里,对象不但有名称,还有属性。
JNDI是一个应用程序设计的API,为开发人员提供了查找和访问各种命名和服务的通用、统一的接口,类似JDBC都是构建在抽象层上。
5、Stateless Session Beans(无状态Bean)开发
@Stateless注释指明这是一个无状态的bean
@Remote注释指定这个无状态Bean的romote接口。Bean类可以具有多个remote接口,每个接口之间用逗号分隔。
@Local和@Remote不同是的,@Remote声明接口是远程接口,@Local是本地接口。
------------------------------------------------------------------------------------------------------------------------------------------------------分割线–
我们已经大致了解什么是ejb了,我们手头上也有一个空的项目,现在我们就来创建这些所谓的bean。
右键项目,在new一个Session Bean。
图片中的名词解释我都有给。不懂往回翻。直接jpa注释上去的。
测试项目我就不迁包了。
接下来创建一个实体bean
package com.ejb.bean;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity // 告知persistence provider这是一个映射到数据的实体类,而且能够受管于EntityManager服务。
@Table(name = "CABIN") // 告知EJB容器。beanclass 应该被映射到哪一张数据库表。
public class Cabin implements java.io.Serializable { // 序列化,并发处理
private static final long serialVersionUID=1L;// 版本号,并发处理
private int id;
private String name;
private int deckLevel;
private int shipId;
private int bedCount;
@Id
@Column(name = "ID")
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Column(name = "NAME")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Column(name = "DECK_LEVEL")
public int getDeckLevel() {
return deckLevel;
}
public void setDeckLevel(int deckLevel) {
this.deckLevel = deckLevel;
}
@Column(name="SHIP_ID")
public int getShipId() {
return shipId;
}
public void setShipId(int shipId) {
this.shipId = shipId;
}
@Column(name="BED_COUNT")
public int getBedCount() {
return bedCount;
}
public void setBedCount(int bedCount) {
this.bedCount = bedCount;
}
}
这里就需要有一点jpa基础的同学更吃香一点了。
接着改造接口可无状态Session Bean和接口
package com.ejb.test;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import com.ejb.bean.Cabin;
/**
* Session Bean implementation class testbean
*/
@Stateless//表示这是一个无状态sessionbean
public class testbean implements testbeanRemote, testbeanLocal {
@PersistenceContext(unitName="titan")
private EntityManager manager;
public void createCabin(Cabin cabin) {
manager.persist(cabin);
}
public Cabin findCabin(int id) {
return manager.find(Cabin.class, id);
}
}
本地接口:
package com.ejb.test;
import javax.ejb.Local;
import com.ejb.bean.Cabin;
@Local
public interface testbeanLocal {
public void createCabin(Cabin cabin);
public Cabin findCabin(int id);
}
远程接口:
package com.ejb.test;
import javax.ejb.Remote;
import com.ejb.bean.Cabin;
@Remote
public interface testbeanRemote {
public void createCabin(Cabin cabin);
public Cabin findCabin(int id);
}
接下来在META-INF下创建文件persistence.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0"
xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="titan">
<jta-data-source>java:/titan</jta-data-source>
<properties>
<property name="hibernate.hbm2ddl.auto" value="create-drop" />
</properties>
</persistence-unit>
</persistence>
上文titan 是我数据库名,也是jndi的标识,待会要在jboss服务文件里配置mysql的数据源文件,titan也是唯一标识。
接下来是mysql的数据源配置:
1. 将mysql-connector-java-5.1.44.jar包放置到JBOSS_HOME\server\default\lib文件夹下.(其实任何一个5.**的包都行)
2. 将配置好的mysql-ds.xml放到JBOSS_HOME\server\default\deploy文件夹下。配置例如以下:
<?xml version="1.0" encoding="UTF-8"?>
<datasources>
<local-tx-datasource>
<jndi-name>titan</jndi-name> <!-- jndi 标识,对应ejb项目 persistence.xml 文件-->
<connection-url>jdbc:mysql://localhost:3306/titan</connection-url><!-- 本地开发加localhost就行,默认接口3306,有更改的写改完的接口-->
<driver-class>com.mysql.jdbc.Driver</driver-class>
<user-name>*****************</user-name> <!-- 这个用户名密码填写自己的-->
<password>******************</password>
<transaction-isolation>TRANSACTION_READ_UNCOMMITTED</transaction-isolation>
<min-pool-size>5</min-pool-size>
<max-pool-size>50</max-pool-size>
<metadata>
<type-mapping>mySQL</type-mapping>
</metadata>
</local-tx-datasource>
</datasources>
创建数据库:
1、创建数据库titan
2、创建数据表cabin
CREATE TABLE `cabin` (
`ID` int(11) NOT NULL,
`NAME` varchar(255) DEFAULT NULL,
`BED_COUNT` int(11) DEFAULT NULL,
`DECK_LEVEL` int(11) DEFAULT NULL,
`SHIP_ID` int(11) DEFAULT NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
至此,服务端配置完毕。我们有创建和查找的方法了。现在我们创建一个客户端,我们用远程接口做例子
package com.ejb.client;
import javax.naming.Context;
import javax.naming.NamingException;
import javax.rmi.PortableRemoteObject;
import com.ejb.bean.Cabin;
import com.ejb.test.testbeanRemote;
import java.util.Properties;
public class Client {
public static void main(String[] args) {
try {
Context jndiContext = getInitialContext();
System.out.println(jndiContext);
Object ref = jndiContext.lookup("testbean/remote");
testbeanRemote dao = (testbeanRemote) PortableRemoteObject.narrow(ref, testbeanRemote.class);
Cabin cabin_1 = new Cabin();
cabin_1.setId(1);
cabin_1.setName("MasterSuite");
cabin_1.setDeckLevel(1);
cabin_1.setShipId(1);
cabin_1.setBedCount(3);
dao.createCabin(cabin_1);
Cabin cabin_2 = dao.findCabin(1);
System.out.println(cabin_2.getId());
System.out.println(cabin_2.getName());
System.out.println(cabin_2.getShipId());
System.out.println(cabin_2.getDeckLevel());
System.out.println(cabin_2.getBedCount());
} catch (ClassCastException e) {
e.printStackTrace();
} catch (NamingException e) {
e.printStackTrace();
}
}
private static Context getInitialContext() throws NamingException {
Properties p = new Properties();
// ...制定专有EJB厂商的JNDI属性
p.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
p.put(Context.PROVIDER_URL, "://localhost:1099");
return new javax.naming.InitialContext(p);
}
}
接下来先把ejb项目打包扔到jboss服务器上,运行
然后看控制台
有上图这三个东西创建成功,服务端就算跑起来了。
接下来运行客户端,可以看到我控制台是一直在跑服务端的。
你就会看到控制台输出。和数据库被插入了一条数据
最后贴原文地址