什麼是EJB?
EJB 是 Java 企業Bean, 是JavaEE服務端 企業元件模型,它的設計目標與核心應用是部署分散式應用程式。話不多說,直接看如何在本機部署EJB3。
部署環境:
View Code
View Code
View Code
View Code
View Code
View Code
View Code
作業系統:Windows 8.1
EJB容器:Jboss 7.1
DB: MySQL 5.6.10
IDE: MyEclipse 10
JDK: 1.6
1、建立資料庫、表
由於在此過程中,需要和資料庫通訊,需要首先建立資料庫表。
建立資料庫: create database student; //建立資料庫 student
建立表: create table student( //建立表student 和 資料庫同名
`id` integer(11) not null,
`name` varchar2(20) default null,
primary key (`id`)
)ENGINE=InnoDB DEFAULT CHARSET=latin1
插入一條資料:
insert into student values(1,'easynoder');
commit;
給本地的root使用者(生產環境請勿這樣做)指定訪問許可權。
grant all privileges on *.* to root@localhost indentified by "1234"
通過以上步驟,需要的資料庫表已建立好。可通過root使用者訪問所有資料。
2、編寫實體Bean、使用者操作介面和會話Bean
建立EJB工程,名為MyEJBProject。該工程META-INFO目錄下包含一個檔案persistence.xml檔案。該檔案用來配置資料來源,稍後進行配置。
接著建立實體Bean
1 @Entity //表明這是一個實體Bean 2 @Table (name = "student" ) //和資料庫表student 建立對映 3 public class StudentEntity implements Serializable { 4 5 private static final long serialVersionUID = 4002145187978562529L; 6 7 @Id // 表明是該實體的id 8 @GeneratedValue(strategy = GenerationType. AUTO ) //id生成策略 9 @Column(name = "id" )//對應student表id欄位 10 private int id ; 11 12 @Column(name = "name" ) // 對應student表name欄位 13 private String name; 14 15 public int getId() { 16 return id ; 17 } 18 19 public String getName() { 20 return name ; 21 } 22 23 public void setId(int id) { 24 this .id = id; 25 } 26 27 public void setName(String name) { 28 this .name = name; 29 } 30 31 }
建立操作介面:
1 public interface BaseOperation { 2 3 public List<?> findAll(); 4 }
該介面只有一個方法,獲取所有的學生
建立會話Bean
1 @Stateless //這是一個無狀態Bean 2 @Remote (BaseOperation. class) //指明Bean的remote介面 3 public class StudentDaoBean implements BaseOperation { 4 5 // EntityManager是由EJB容器自動配置和管理的,unitName屬性的值對應 6 persistence.xml 中< persistence-unit name = "MyEJBProject" transaction-type = "JTA" ></ persistence-unit > name的配置 7 @PersistenceContext(unitName = "MyEJBProject" ) 8 private EntityManager em; 9 10 @SuppressWarnings( "unchecked" ) 11 public List<?> findAll() { 12 System. out .println("查詢開始..." ); 13 List<StudentEntity> list = em.createQuery( " from StudentEntity ").getResultList(); 14 if (list != null) { 15 Iterator<StudentEntity> it = list.iterator(); 16 while (it.hasNext()) { 17 StudentEntity student = it.next(); 18 System. out .println("學生id:" + student.getId()); 19 System. out .println("學生名稱:" + student.getName()); 20 } 21 } 22 System. out .println("查詢完畢...." ); 23 return list; 24 } 25 26 }
3、資料來源配置
這裡需要注意下,在jboss6 和jboss7的配置是不同的。
jboss6和以前版本都是在deploy目錄下 新增**-ds.xml,這裡**表示任意一種資料庫名稱,如果是mysql,則是mysql-ds.xml檔案。而在jboss7中,是不一樣的。
將目錄切換至Jboss 的安裝目錄,即%JBOSS_HOME%下,進入modules/com目錄,建立資料夾mysqldatabase,進入,建立mysql資料夾,進入,建立main資料夾。
在main目錄下,建立module.xml檔案,該配置檔案內容為:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <module xmlns="urn:jboss:module:1.1" name="com.mysqldatabase.mysql"> 3 <resources> 4 <resource-root path="mysql-connector-java-5.**-bin.jar"/> 5 </resources> 6 <dependencies> 7 <module name="javax.api"/> 8 <module name="javax.transaction.api"/> 9 <module name="javax.servlet.api" optional="true"/> 10 </dependencies> 11 </module>
尤其這裡需要注意的是,module 節點屬性name的值,就是剛才我們們建立的資料夾的路徑。resources表示mysql驅動的路徑。意味著,需要將mysql的驅動放在main目錄下。即main目錄下包含兩個檔案,module.xml和資料庫驅動檔案。
在做完上一步後,切換到%JBOSS_HOME%\standalone\configuration目錄下,
開啟standalone.xml,搜尋datasources,進行如下配置
1 <datasources> 2 <datasource jndi-name="java:jboss/KouMySQLDS" pool-name="MySQLDS" enabled="true" use-java-context="true"> 3 <connection-url>jdbc:mysql://localhost:3306/student</connection-url> 4 <driver>mysql</driver> 5 <security> 6 <user-name>root</user-name> 7 <password>1234</password> 8 </security> 9 </datasource> 10 <drivers> 11 <driver name="mysql" module="com.mysqldatabase.mysql"> 12 <driver-class>com.mysql.jdbc.Driver</driver-class> 13 <xa-datasource-class>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</xa-datasource-class> 14 </driver> 15 </drivers> 16 </datasources>
jndi-name表示資料來源jndi名稱,connection-url表示連線的url字串;這裡預設使用3306埠,使用student庫,使用者名稱和密碼即第一步配置的。module配置的即剛剛配置的module的路徑。
jboss的相關配置已經完成,接著切換到剛新建的工程,其中有一個persistence.xml配置檔案,該檔案做如下配置,其中jta-data-source 就是上面配置的jndi-name.
1 < jta-data-source> java:jboss/KouMySQLDS </jta-data-source > 2 < properties> 3 < property name= "hibernate.hbm2ddl.auto" value ="validate" /> 4 < property name= "hibernate.jdbc.fetch_size" value ="15" /> 5 < property name= "hibernate.jdbc.batch_size" value ="10" /> 6 < property name= "hibernate.show_sql" value ="true" /> 7 < property name= "hibernate.format_sql" value ="true" ></ property> 8 </ 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 位於jboss bin/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,編寫客戶端方法了。
1 public static void main(String[] args) { 2 3 Properties props = new Properties(); 4 props.setProperty(Context. URL_PKG_PREFIXES,"org.jboss.ejb.client.naming" ); 5 try { 6 Context context = new InitialContext(props); 7 // 這裡需要注意字串的寫法:ejbservice 表示ejb的包名,StudentDaoBean表示我們們實際呼叫的會話Bean,org.easynoder.ejb2.dao.BaseOperation表示 對應的介面 8 BaseOperation op = (BaseOperation) context 9 .lookup("ejb:/ejbservice//StudentDaoBean!org.easynoder.ejb2.dao.BaseOperation" ); 10 op.findAll(); 11 } catch (NamingException e) { 12 e.printStackTrace(); 13 } 14 }
執行這段程式碼,可以成功的查詢到資料庫的資料啦。
至此,EJB就部署成功啦。