日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

EJB开发第一个无状态会话bean、开发EJB客户端

發(fā)布時(shí)間:2024/8/1 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 EJB开发第一个无状态会话bean、开发EJB客户端 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

開發(fā)第一個(gè)無狀態(tài)會(huì)話bean

EJB中的三中bean

會(huì)話BeanSession Bean

負(fù)責(zé)與客戶端交互,是編寫業(yè)務(wù)邏輯的地方,在會(huì)話bean中可以通過JDBC直接操作數(shù)據(jù)庫(kù),但大多數(shù)情況下都是通過實(shí)體bean來完成對(duì)數(shù)據(jù)庫(kù)的操作。

?

實(shí)體BeanEntity Bean

它實(shí)際上屬于java持久化規(guī)范(JPA)里的技術(shù),JPA的出現(xiàn)主要是為了簡(jiǎn)化現(xiàn)有的持久化開發(fā)工作和整合ORM技術(shù),結(jié)束現(xiàn)在HibernateTopLinkORM框架各自為營(yíng)的局面。

?

消息驅(qū)動(dòng)BeanMessageDriven Bean

???????? 它是專門用于異步處理Java消息的組件。具有處理大量并發(fā)消息的能力。

?

會(huì)話bean

???????? 無狀態(tài)會(huì)話bean

平常我們使用最多的是無狀態(tài)bean,因?yàn)樗?/span>bean實(shí)例可供多個(gè)用戶使用,所以它的性能比有狀態(tài)bean高。正因?yàn)橐粋€(gè)bean實(shí)例被多個(gè)用戶使用,那么前一個(gè)用戶設(shè)置的值可能被后一個(gè)用戶所修改,所以它無法正確保存某個(gè)用戶設(shè)置的值,因此是無狀態(tài)的。

?

???????? 有狀態(tài)會(huì)話bean

有狀態(tài)會(huì)話bean平常使用的并不多,因?yàn)樗囊粋€(gè)bean實(shí)例只供一個(gè)用戶使用,所以性能開銷比較大,正因?yàn)樗膶?shí)例只被一個(gè)用戶使用,那么用戶設(shè)置的值是不會(huì)被其他用戶所修改的,所以可以正確保存用戶設(shè)置的值,因此是有狀態(tài)的。

?

開發(fā)一個(gè)無狀態(tài)會(huì)話bean

???????? 開發(fā)工具:MyEclipse

???????? 開發(fā)EJB依賴的jar文件:Jboss安裝路徑下的client下,通常把所以的jar添加到項(xiàng)目。

結(jié)構(gòu):

???????? 接口(可以是遠(yuǎn)程接口或本地接口)

???????? 實(shí)現(xiàn)類

?

步驟:

1.新建一個(gè)JavaProject:HelloWorld

2.導(dǎo)入所有的client的jar包

?

?

3.新建一個(gè)接口HelloWorld 在cn.hqu.ejb3下

添加方法 String sayHello(String name);

?

4.創(chuàng)建實(shí)現(xiàn)類:

新建一個(gè)類HelloWorldBean,實(shí)現(xiàn)HelloWorld接口,在包 cn.hqu.ejb3.impl;

實(shí)現(xiàn)方法里面:

return name+"說:你好!";

5.把這兩個(gè)類變成ejb3

在HelloWorldBean加入注解 @Stateless

指定這個(gè)ejb是一個(gè)無狀態(tài)會(huì)話bean;

?

指定這個(gè)接口是一個(gè)遠(yuǎn)程接口:(默認(rèn)是本地接口)

在HelloWorldBean加入注解@Remote(HelloWorld.class) 。

Ejb開發(fā)完成

@Stateless

@Remote(HelloWorld.class)

public class HelloWorldBean implements HelloWorld {

??? @Override

??? public String sayHello(String name) {

??????? // TODO Auto-generated method stub

??????? return name+"說:你好!";

??? }

}

?

6.進(jìn)行發(fā)布:

打成jar包,可以通過eclipse打包或者通過ant打包。

這里使用MyEclipse,右擊項(xiàng)目選擇Export→jar file 。

?

發(fā)布:先啟動(dòng)JBoss,復(fù)制打包好的jar拷貝到JBoss的server/default/deploy下,這樣就完成ejb的部署;這樣就發(fā)布成功了;會(huì)話bean開發(fā)完了。

?

開發(fā)EJB的客戶端

Ejb在軟件分層結(jié)構(gòu)上,屬于業(yè)務(wù)層,通常要被客戶端調(diào)用,這里用Java類做ejb客戶端。

新建類EJBClient 在包c(diǎn)n.hqu.test,在main里面編寫EJB的調(diào)用代碼:

?

package cn.hqu.test;import java.util.Properties;import javax.naming.InitialContext; import javax.naming.NamingException;import cn.hqu.ejb3.HelloWorld;public class EJBClient {/*** @param args*/public static void main(String[] args) {Properties pros = new Properties();pros.setProperty("java.naming.factory.initial","org.jnp.interfaces.NamingContextFactory");pros.setProperty("java.naming.provider.url", "localhost:1099");try {InitialContext ctx = new InitialContext(pros);HelloWorld helloworld = (HelloWorld) ctx.lookup("HelloWorldBean/remote");System.out.println(helloworld.sayHello("蘇志達(dá)"));} catch (NamingException e) {e.printStackTrace();}}}

執(zhí)行客戶端(main方法);調(diào)用成功;

?

代碼含義:客戶端要調(diào)用ejb,要通過JNDI去尋找EJB的xx代理對(duì)象,JNDI是一套用來訪問命名服務(wù)器的API,也是JavaEE里面的規(guī)范。

?

設(shè)置JNDI訪問環(huán)境信息

如同數(shù)據(jù)庫(kù)一樣,根據(jù)訪問命名服務(wù)器不同,為上下文設(shè)置的驅(qū)動(dòng)類和URL也是不同的,如下面是訪問Sun應(yīng)用服務(wù)器的上下文信息:


如果客戶端運(yùn)行在應(yīng)用服務(wù)器內(nèi),我們不需要為InitlalContext設(shè)置應(yīng)用服務(wù)器的上下文信息,也不建議設(shè)置。因?yàn)閼?yīng)用服務(wù)器啟動(dòng)時(shí)會(huì)把JNDI驅(qū)動(dòng)類等上下文信息添加進(jìn)系統(tǒng)屬性,創(chuàng)建InitialContext對(duì)象時(shí)如果沒有指定Properties參數(shù),InitialContext內(nèi)部會(huì)調(diào)用System.getProperty()方法從系統(tǒng)屬性里獲得必要的上下文信息。對(duì)本例子而言,可以省略傳入的props參數(shù),在實(shí)際應(yīng)用中如果給InitialContext設(shè)置了參數(shù),反而會(huì)帶來不可移植的問題。

???????? 注:創(chuàng)建InitialContext對(duì)象時(shí)如果沒有指定Properties參數(shù),InitialContext還會(huì)在classpath下尋找jndi.properties文件,并從該文件中加載應(yīng)用服務(wù)器的上下文信息,這樣避免了硬編碼為InitialContext設(shè)置Properties參數(shù)。

InitialContext ctx = newInitialContext();

jndi.properties的配置如下:

java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory

java.naming.provider.url=localhost\:1099

?

提示:這里編寫的客戶端程序完全可以部署在另外一臺(tái)計(jì)算機(jī)上,只需要修改其中的連接服務(wù)器IP地址和啟動(dòng)Jboss時(shí)綁定相應(yīng)IP地址即可。這正是EJB的遠(yuǎn)程調(diào)用特性。在第19行返回的helloworld實(shí)例對(duì)象并不是我們?cè)诜?wù)器編寫的HelloWorldBean,而是一個(gè)也實(shí)現(xiàn)了HelloWorld接口的代理對(duì)象,這個(gè)代理對(duì)象最終遠(yuǎn)程調(diào)用我們自己編寫的HelloWorldBean,在19后加入如下代碼,即可看到這個(gè)代理對(duì)象的類名:

System.out.println(helloworld.getClass().getName())

?

?????? Jboss默認(rèn)生成的JNDI名稱

???????? 當(dāng)EJB發(fā)布到Jboss時(shí),如果我們沒有為它指定全局JNDI名稱或者修改過其默認(rèn)EJB名稱,Jboss就會(huì)按照默認(rèn)的命名規(guī)則為EJB生成全局JNDI名稱,默認(rèn)是命名規(guī)則如下:

???????? 本地接口:EAR-FILE-BASE-NAME/EJB-CLASS-NAME/local

???????? 遠(yuǎn)程接口:EAR-FILE-BASE-NAME/EJB-CLASS-NAME/remote

????????

???????? EAR-FILE-BASE-NAME為ear文件的名稱,EJB-CLASS-NAME為EJB的非限定類名。

例:把HelloWorld應(yīng)用作為EJB模塊打包進(jìn)名為HelloWorld.ear的企業(yè)應(yīng)用文件,它的遠(yuǎn)程接口的JNDI名稱是:HelloWorld/HelloWorldBean/remote

?

???????? 如果把EJB應(yīng)用打包成后綴為*.jar的模塊文件,默認(rèn)全局JNDI名稱是

???????? 本地接口:EJB-CLASS-NAME/local

???????? 遠(yuǎn)程接口:EJB-CLASS-NAME/remote

例:把HelloWorld應(yīng)用打包成HelloWorld.jar文件,它的遠(yuǎn)程接口的JNDI名稱是:

HelloWorldBean/remote

代碼:http://pan.baidu.com/s/1dDckCXN

總結(jié)

以上是生活随笔為你收集整理的EJB开发第一个无状态会话bean、开发EJB客户端的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。