实验环境
Mac OSX 10.11.4(Windows基本一样)
JDK:1.7
1. 安装MySQL 5.7.12
- 下载MySQL:
http://dev.mysql.com/downloads/mysql
选择 Generally Available (GA) Release 下的 Mac OS X 10.11 (x86, 64-bit), DMG Archive
然后傻瓜式安装,安装后可在 系统偏好设置 中找到 MySQL ,启动或者关闭服务
- 安装完后可用 MySQLWorkBench 建立数据库 test
- 并再 test 里建立 student 表
- 表字段为 id (int PK NN), name (varchar)
- 随便添加点数据
注:安装后会出现一个提醒,内容为root用户的临时密码(在…root@localhost:之后)
修改root密码步骤:
1) 打开终端
2) 输入 cd /usr/local/mysql/bin/
3) 输入 ./mysqladmin -u root -p password
4) 输入刚才的临时密码
5) 输入新密码
2. 安装JBoss 7.1
下载JBoss 7:
http://download.jboss.org/jbossas/7.1/jboss-as-7.1.1.Final/jboss-as-7.1.1.Final.tar.gz下载后解压到任意目录(JBOSS_HOME)
打开MyEclipse2015的Preferences
-> MyEclipse
-> Servers
-> Server Runtime Environments
-> Add…
-> JBoss AS 的 JBoss 7.0 Runtime
-> next
-> Browse 选择解压后的目录
-> Finish在Servers窗口中启动JBoss,浏览器中输入 http://localhost:8080 打开主页即表示成功
在JBoss7中配置MySQL数据源
- 首先进入JBoss安装目录,即 JBOSS_HOME 下,进入modules/com/,新建mysql文件夹,进入,建立main文件夹,进入
- 在main目录下放入JDBC的驱动 mysql-connector-java-5.1.38-bin.jar
- 在main目录下新建文件 module.xml ,记录了添加模块的相关配置,代码如下。其中module节点的name就是建立的文件夹路径,resources表示mysql驱动的路径,添加内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.0" name="com.mysql">
<resources>
<resource-root path="mysql-connector-java-5.1.38-bin.jar"/>
</resources>
<dependencies>
<module name="javax.api"/>
<module name="javax.transaction.api"/>
<module name="javax.servlet.api" optional="true"/>
</dependencies>
</module>
- 进入JBoss安装目录,即 JBOSS_HOME 下,进入 standalone/configuration 目录中的 standalone.xml 文件,找到datasources子系统,修改配置如下,其中jndi-name表示数据源名称:
<subsystem xmlns="urn:jboss:domain:configadmin:1.0"/>
<subsystem xmlns="urn:jboss:domain:datasources:1.0">
<datasources>
<datasource jndi-name="java:jboss/datasources/ExampleDS" pool-name="ExampleDS" enabled="true" use-java-context="true">
<connection-url>jdbc:h2:mem:test;DB_CLOSE_DELAY=-1</connection-url>
<driver>h2</driver>
<security>
<user-name>sa</user-name>
<password>sa</password>
</security>
</datasource>
<datasource jta="true" jndi-name="java:/MySqlDS" pool-name="MySqlDS_Pool" enabled="true" use-java-context="true" use-ccm="true">
<connection-url>jdbc:mysql://localhost:3306/test</connection-url>
<driver>mysql</driver>
<security>
<user-name>root</user-name>
<password>yourPassword</password>
</security>
<timeout>
<idle-timeout-minutes>0</idle-timeout-minutes>
<query-timeout>600</query-timeout>
</timeout>
</datasource>
<drivers>
<driver name="h2" module="com.h2database.h2">
<xa-datasource-class>org.h2.jdbcx.JdbcDataSource</xa-datasource-class>
</driver>
<driver name="mysql" module="com.mysql">
<driver-class>com.mysql.jdbc.Driver</driver-class>
<xa-datasource-class>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</xa-datasource-class>
</driver>
</drivers>
</datasources>
</subsystem>
- 找到jpa子系统,修改配置如下,注意datasource与上面jndi名称一致:
<subsystem xmlns="urn:jboss:domain:jpa:1.0">
<jpa default-datasource="java:/MySqlDS"/>
</subsystem>
- 若以上配置成功,则在JBoss7不部署任何EJB的情况下启动不会报错,查看JBOSS_HOME/modules/com/mysql/main/路径,会发现生成了mysql-connector-java-5.1.38-bin.jar.index文件,表示该模块添加成功。
3. 安装MyEclipse 2015
- 下载 myeclipse-2015-stable-1.0-offline-installer-macosx.dmg
- 破解(参见 点我 )
4. MyEclipse 2015创建JBoss7服务器
- 在Servers窗口中(若没有该窗口,则Window -> Show View -> Other… -> 搜索Servers)
右键 New
-> Server
-> 选择JBoss AS 下的 JBoss AS v7.x
-> Server runtime environment 选择 JBoss 7.0 Runtime 然后点 next
-> Configuration中选择 standalone.xml
-> next -> finish
5. EJB 服务器端
- 新建一个EJB Project命名为FirstEJBProject
- 在工程 META-INFO 目录下新建 persistence.xml 文件,该文件用来配置数据源,内容如下:
<?xml version="1.0" encoding="UTF-8" ?>
<persistence 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_1_0.xsd" version="1.0">
<!-- Name属性用于定义持久化单元的名字 (name必选,空值也合法) -->
<persistence-unit name="Data" transaction-type="JTA">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<!-- Jta-data-source 用于指定持久化提供商使用的JTA数据源的全局JNDI名称(可选) -->
<jta-data-source>java:/MySqlDS</jta-data-source>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
</properties>
</persistence-unit>
</persistence>
- 在firstejbproject 包下新建实体Bean:StudentEntity.java
package firstejbproject;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity //表明这是一个实体Bean
@Table (name = "student" ) //和数据库表student 建立映射
public class StudentEntity implements Serializable {
private static final long serialVersionUID = 4002145187978562529L;
@Id // 表明是该实体的id
@GeneratedValue(strategy = GenerationType. AUTO ) //id生成策略
@Column(name = "id" )//对应student表id字段
private int id ;
@Column(name = "name" ) // 对应student表name字段
private String name;
public int getId() {
return id ;
}
public String getName() {
return name ;
}
public void setId(int id) {
this .id = id;
}
public void setName(String name) {
this .name = name;
}
}
- 在firstejbproject 包下新建接口:BaseOperation.java
package firstejbproject;
import java.util.List;
public interface BaseOperation {
public List<?> findAll();
}
- 在firstejbproject 包下新建会话Bean:StudentDaoBean.java
package firstejbproject;
import java.util.Iterator;
import java.util.List;
import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
@Stateless //这是一个无状态Bean
@Remote (BaseOperation. class) //指明Bean的remote接口
public class StudentDaoBean implements BaseOperation {
// EntityManager是由EJB容器自动配置和管理的,unitName属性的值对应persistence.xml 中<persistence-unit name="Data" transaction-type="JTA"> name的配置
@PersistenceContext(unitName="Data")
private EntityManager em;
@SuppressWarnings("unchecked")
public List<?> findAll() {
System. out .println("Start..." );
List<StudentEntity> list = em.createQuery("from StudentEntity").getResultList();
if (list != null) {
Iterator<StudentEntity> it = list.iterator();
while (it.hasNext()) {
StudentEntity student = it.next();
System.out.println("Id:" + student.getId());
System.out.println("Name:" + student.getName());
}
}
System.out.println("End...." );
return list;
}
}
- 在Servers中的JBoss服务中,右键 -> Add/Remove Deployments… 添加 FirstEJBProject项目,并启动服务,若出现 Deployed “FirstEJBProject.jar” 则表明部署成功。
6. EJB 客户端
- 先在服务器端的实体Bean和接口打包成jar包,ejbinterface.jar:选择 BaseOperation.java 和 StudentEntity.java
右键 -> Export -> Java中的JAR file -> next -> 在export destination中选择一个路径,并命名为 ejbinterface.jar
- 新建一个Java project,命名为 FirstEJBClient
- 在 src 下新建包名 com.test
- 新建文件 EJBTest.java:
package com.test;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import firstejbproject.BaseOperation;
import firstejbproject.StudentEntity;
public class EJBTest {
public static void main(String[] args) {
System.out.println("test...");
Properties props = new Properties();
props.setProperty(Context. URL_PKG_PREFIXES, "org.jboss.ejb.client.naming" );
try {
Context context = new InitialContext(props);
// 这里需要注意字符串的写法:ejbservice 表示ejb的包名,StudentDaoBean表示咱们实际调用的会话Bean,org.easynoder.ejb2.dao.BaseOperation表示 对应的接口
BaseOperation op = (BaseOperation) context
.lookup("ejb:/FirstEJBProject//StudentDaoBean!firstejbproject.BaseOperation");
List<StudentEntity> list = (List<StudentEntity>) op.findAll();
Iterator<StudentEntity> it = list.iterator();
while (it.hasNext()) {
StudentEntity student = it.next();
System.out.println("Id: " + student.getId());
System.out.println("Name: " + student.getName());
}
} catch (NamingException e) {
e.printStackTrace();
}
}
}
- 将刚才导出的 ejbinterface.jar 和 jboss-client.jar(该文件在 JBOSS_HOME 的 bin/client 目录下)放到该工程src下
- 右键该工程名 -> Build Path -> Configure Build Path.. -> Add JARs.. 选择服务器端工程文件下的这两个jar包 -> ok
- 在src下新建文件 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=root
remote.connection.default.password=yourPassword
- 右键EJBTest.java -> Run As -> Java Application 如果出现学生信息则表示成功!