国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

在J2EE平臺(tái)上開發(fā)企業(yè)應(yīng)用

2019-11-18 16:15:51
字體:
供稿:網(wǎng)友

  ilamei

  在這次的教程中,我們將上次的用會(huì)話EJB:Calc換成實(shí)體EJB。作為客戶的BonusServlet調(diào)用實(shí)體Bean,將社會(huì)保險(xiǎn)號(hào)和獎(jiǎng)金的信息存到數(shù)據(jù)庫中去,在另一個(gè)時(shí)候,還可以從數(shù)據(jù)庫中把這些信息重新取出來。數(shù)據(jù)庫訪問將第四層加到瘦客戶端,成為了四層體系機(jī)結(jié)構(gòu)的企業(yè)應(yīng)用程序。

  J2EE SDK自帶了一個(gè)Cloudscape數(shù)據(jù)庫。用我們呆會(huì)兒提到的實(shí)體Bean例子來訪問這個(gè)自帶的數(shù)據(jù)庫,并不需要我們另外去設(shè)定環(huán)境變量和參數(shù)。甚至在本例子中,并不需要你去寫SQL語句和JDBC的代碼就可以執(zhí)行數(shù)據(jù)庫的訪問操作。是不是很神奇?其實(shí),這些都是由J2EE的配置工具在配置實(shí)體Bean的時(shí)候產(chǎn)生了表和SQL代碼。

創(chuàng)建一個(gè)實(shí)體Bean
  一個(gè)實(shí)體Bean代表了數(shù)據(jù)表中一行持久的數(shù)據(jù)。當(dāng)創(chuàng)建一個(gè)實(shí)體Bean的時(shí)候,其代表的數(shù)據(jù)就寫到相應(yīng)的數(shù)據(jù)表中。產(chǎn)生一個(gè)新行。如果實(shí)體Bean的數(shù)據(jù)被更新,數(shù)據(jù)表中相應(yīng)的行也要更新。所有這些表的創(chuàng)建和行的創(chuàng)建都不需要客戶來寫SQL代碼。

  即使在服務(wù)器崩潰的情況下,實(shí)體Bean的數(shù)據(jù)也能保存下來,這就是所謂的實(shí)體Bean數(shù)據(jù)的持久性。如果在更新實(shí)體Bean的數(shù)據(jù)的時(shí)候服務(wù)器崩潰,數(shù)據(jù)庫中的數(shù)據(jù)就是最后一次保存的數(shù)據(jù)。如果是在一個(gè)事務(wù)進(jìn)行的時(shí)候服務(wù)器崩潰了,事務(wù)就必須回滾,免得部分提交導(dǎo)致數(shù)據(jù)庫中數(shù)據(jù)被破壞。

BonusHome接口:這個(gè)Home接口和上個(gè)例子的會(huì)話Bean的Home接口最大的不同就是這個(gè)例子里面增加了findByPRimaryKey這個(gè)方法。這個(gè)finder方法把主鍵作為一個(gè)參數(shù)值。這個(gè)例子里面是社會(huì)保險(xiǎn)號(hào):

  creat方法將獎(jiǎng)金值和主鍵做為參數(shù)。當(dāng)BonusServlet來初始化Home接口并且調(diào)用其create方法的時(shí)候。容器生成一個(gè)BonusBean的實(shí)例,并且調(diào)用實(shí)例的ejbCreate方法。這里,Home接口的create方法和Bean實(shí)例的ejbCreate方法必須具有相同的參數(shù)。這樣,才能夠?qū)⒅麈I通過容器從Home接口傳遞到Bean的實(shí)例。如果給定的主鍵在數(shù)據(jù)表里面有相應(yīng)的記錄,就會(huì)觸發(fā)一個(gè)java.rmi.RemoteException異常。

以下是BonusHome的代碼:

package Beans;
import java.rmi.RemoteException;
import javax.ejb.CreateException;
import javax.ejb.FinderException;
import javax.ejb.EJBHome;
public interface BonusHome extends EJBHome {

public Bonus create(double bonus, String socsec)

throws CreateException, RemoteException;
public Bonus findByPrimaryKey(String socsec)

throws FinderException, RemoteException;

}

Bonus接口:創(chuàng)建了Home接口以后,容器就創(chuàng)建remote接口和實(shí)體Bean。Bonus接口里面聲明了getBonus方法和getSocSec方法。這樣Servlet就可以使用這兩個(gè)方法從實(shí)體Bean中得到數(shù)據(jù)。

其代碼如下:

package Beans;
import javax.ejb.EJBObject;
import java.rmi.RemoteException;
public interface Bonus extends EJBObject {

public double getBonus()

throws RemoteException;

public String getSocSec()

throws RemoteException;

}

下面用圖來說明會(huì)話Bean和實(shí)體Bean的不同:

BonusBean:

  這是一個(gè)容器管理持續(xù)性的實(shí)體Bean。就是說由容器來處理和數(shù)據(jù)庫打交道的操作以及一些事務(wù)處理的操作。不需要由客戶編寫B(tài)ean數(shù)據(jù)和數(shù)據(jù)庫里的數(shù)據(jù)進(jìn)行轉(zhuǎn)換的代碼。

  當(dāng)Servlet調(diào)用BonusHome的create方法的時(shí)候,容器調(diào)用BonusBean的setEntityContext方法。傳遞給setEntityContext方法的實(shí)體上下文EntityContext有一個(gè)返回指向它本身的refenrence。也可以得到其對(duì)應(yīng)的主鍵值。

  然后,容器調(diào)用ejbCreate方法,ejbCreate方法把數(shù)據(jù)值分配給Bean實(shí)例的變量。容器將這些數(shù)據(jù)寫到數(shù)據(jù)庫里面去。在ejbCreate方法之后,容器調(diào)用ejbPostCreate方法。這個(gè)簡(jiǎn)單的例子沒有ejbPostCreate方法。

  另一個(gè)空方法是calback方法,由容器調(diào)用它來通知Bean,告訴Bean有事件要發(fā)生。如果是用的Bean管理持續(xù)性的實(shí)體Bean,寫B(tài)ean的人必須要提供這些方法的實(shí)現(xiàn)代碼。另外,如果你需要提供Bean自己的退出的清除代碼和建立時(shí)初始化代碼。這些清除和初始化的操作就會(huì)在Bean的生命周期的某個(gè)適當(dāng)?shù)臅r(shí)候被容器所調(diào)用。下面是這些空方法的簡(jiǎn)單描述。

ejbPassivate和ejbActivate方法:在Bean從存貯器調(diào)入調(diào)出,進(jìn)行交換的時(shí)候,容器調(diào)用這兩個(gè)方法。這個(gè)過程和虛擬存貯中頁面的調(diào)入調(diào)出的概念有點(diǎn)相似。
ejbRemove方法:在客戶調(diào)用Home接口的remove方法的時(shí)候,由容器調(diào)用相應(yīng)的ejbRemove方法。
ejbLoad和ejbStore方法:在Bean的數(shù)據(jù)和數(shù)據(jù)庫中的數(shù)據(jù)執(zhí)行同步的時(shí)候,容器調(diào)用這兩個(gè)方法。

  getBonus和getSocSec方法是客戶用來從Bean的實(shí)例變量中取數(shù)據(jù)的方法。本例子沒有用來往Bean實(shí)例變量寫數(shù)據(jù)的set方法。當(dāng)然,如果有的話,客戶用這樣的方法來設(shè)定Bean實(shí)例變量數(shù)據(jù)值。所有的Bean實(shí)例中的變量的值的改動(dòng)都會(huì)使數(shù)據(jù)庫中相應(yīng)的記錄的數(shù)據(jù)的改動(dòng)。

package Beans;
import java.rmi.RemoteException;
import javax.ejb.CreateException;
import javax.ejb.EntityBean;
import javax.ejb.EntityContext;
public class BonusBean implements EntityBean {

public double bonus;
public String socsec;
private EntityContext ctx;
public double getBonus() {

return this.bonus;

}
public String getSocSec() {

return this.socsec;

}
public String ejbCreate(double bonus,String socsec)

throws CreateException{

//Called by container after setEntityContext
this.socsec=socsec;
this.bonus=bonus;
return null;

}
public void ejbPostCreate(double bonus,String socsec) {

//Called by container after ejbCreate

}

//These next methods are callback methods that
//are called by the container to notify the
//Bean some event is about to occur
public void ejbActivate() {

//Called by container before Bean
//swapped into memory

}
public void ejbPassivate() {

//Called by container before
//Bean swapped into storage

}
public void ejbRemove() throws RemoteException {

//Called by container before
//data removed from database

}

public void ejbLoad() {

//Called by container to
//refresh entity Bean’s state

}

public void ejbStore() {

//Called by container to save
//Bean’s state to database

}

public void setEntityContext(EntityContext ctx){

//Called by container to set Bean context

}

public void unsetEntityContext(){

//Called by container to unset Bean context

}

}

改變Servlet:

  BonusServlet的代碼和上一個(gè)例子很相似,只是在init方法和doGet方法里面有點(diǎn)改動(dòng)。這個(gè)例子的init里面既查詢了CalcBean這個(gè)會(huì)話Bean,也查詢了BonusBean這個(gè)實(shí)體Bean。

public void init(ServletConfig config)

throws ServletException{
try {

InitialContext ctx = new InitialContext();
Object objref = ctx.lookup(“bonus”);
Object objref2 = ctx.lookup(“calcs”);
homebonus=(BonusHome)PortableRemoteObject.narrow(objref, BonusHome.class);
homecalc=(CalcHome)
PortableRemoteObject.narrow(objref2, CalcHome.class);

} catch (Exception NamingException) {

NamingException.printStackTrace();

}

}

  doGet方法中的try中的代碼段里面創(chuàng)建了CalcBean和BonusBean的Home接口。在調(diào)用了calcBonus中的方法計(jì)算獎(jiǎng)金之后,再調(diào)用BonusHome的create方法來產(chǎn)生一個(gè)實(shí)體Bean的實(shí)例,并且在數(shù)據(jù)庫中相應(yīng)的表中生成一行數(shù)據(jù)。在創(chuàng)建了數(shù)據(jù)表之后,BonusHome的findByPrimaryKey可以從數(shù)據(jù)表中取出與主鍵相同的一條記錄。然后,將結(jié)果通過Html頁面的形式返回給瀏覽器。

  在catch代碼段里面處理了主鍵的重復(fù)的情況。數(shù)據(jù)表里面不能存在兩行具有相同關(guān)鍵字的記錄。所以,如果將重復(fù)的主鍵傳遞給容器,Servlet就會(huì)在創(chuàng)建實(shí)體Bean之前捕獲到這個(gè)異常。這時(shí),Servlet把重復(fù)的主鍵值,和傳遞進(jìn)來的原始參數(shù)用HTML頁面的形式返回給瀏覽器。

編譯實(shí)體Bean:

先設(shè)定環(huán)境變量:

Classpath = J2EE安裝目錄libj2ee.jar
J2EE_HOME = J2EE的安裝目錄

把例子放到J2EE的安裝目錄下面的Beans子目錄下:然后在J2EE的安裝目錄下執(zhí)行:

javac Beans/BonusBean.java Beans/BonusHome.java Beans/Bonus.java

編譯Servlet:

把Servlet放到J2EE的安裝目錄下的ClientCode子目錄下,然后在J2EE安裝目錄下執(zhí)行:

javac BonusServlet.java

編譯好之后,就該啟動(dòng)服務(wù)平臺(tái)和配置工具了:
  這個(gè)例子需要用到的有:J2EE服務(wù)、配置工具、Cloudscape數(shù)據(jù)庫。除了前面兩個(gè)環(huán)境變量以外,還需要將環(huán)境變量JAVA_HOME 設(shè)為 JDK的安裝目錄

然后在J2EE的安裝目錄下的in目錄下執(zhí)行:

j2ee -verbose
deploytool
cloudscape -start

把三個(gè)服務(wù)啟動(dòng)。

配置步驟:

首先是更新application:
Web包里面包括了BonusServlet和bonus.html文件。因?yàn)槲覀兏淖兞薆onusServlet,所以必須用新的BonusServlet代碼來更新應(yīng)用程序。先在Local Application Window中選擇BonusApp,然后在Tools菜單中選擇Update Application Files就可以了。

創(chuàng)建一個(gè)實(shí)體Bean
  創(chuàng)建實(shí)體Bean和上個(gè)例子中的創(chuàng)建會(huì)話Bean非常相似。也是先在Files菜單中選New Enterprise Bean,然后在Add類文件的時(shí)候把Bonus.class,BonusHome.class,BonusBean.class三個(gè)類文件加入。但要注意Bean的類型這次應(yīng)該選為Entity實(shí)體。

  在Entity Setting對(duì)話框中,應(yīng)該選擇:Container-Managered persistence。在下面的窗口中,把bonus和socsec兩個(gè)復(fù)選框都選上。下面的Primkey key class中填上java.lang.String。注意,Primary Key的類型必須是類的類型,而不能是原始類型。然后Next,一直到事務(wù)管理Transaction Management對(duì)話框。

選擇容器管理事務(wù):Container-managed transaction。

  在下面的各個(gè)方法中,將create,findByPrimaryKey,getBonus,getSocSec這些方法設(shè)成required。這以為著在調(diào)用這些方法之前,容器要啟動(dòng)一個(gè)新的事務(wù)。正好在這些方法結(jié)束的前面要調(diào)用事務(wù)的commits方法。然后將BonusApp的JNDI設(shè)為BonusBean。

在配置應(yīng)用程序以前。先要設(shè)定實(shí)體Bean的SQL代碼:

  在左邊先選擇實(shí)體Bean:BonusBean,在右邊選擇標(biāo)簽Entity。然后單擊Deploymetn Setting按紐。將Database JNDI name 設(shè)為jdbc/Cloudscape。還要確定Create table on Deploy和Delete table on Undeploy兩個(gè)復(fù)選框被選上。然后就可以單擊Generate SQL,產(chǎn)生SQL代碼了。(如果產(chǎn)生了數(shù)據(jù)庫連接錯(cuò)誤,那就是因?yàn)槟銢]有啟動(dòng)數(shù)據(jù)庫服務(wù)器。在J2EE的安裝目錄下的in下,啟動(dòng):Cloudscape -start)

SQL代碼產(chǎn)生好之后,OK就可以了。
最后就是運(yùn)行這個(gè)應(yīng)用程序了。注意J2EE的默認(rèn)端口號(hào)是8000
在瀏覽器的地址欄中輸入:http://localhost:8000/BonusRoot/bonus.html
結(jié)果和上個(gè)例子應(yīng)該是一樣的。這里,如果你兩次輸入了重復(fù)的關(guān)鍵字,將得到如下類似的頁面:
Bonus Calculation
Soc Sec passed in: 777777777
Multiplier passed in: 2
Bonus Amount calculated: 200.0
Duplicate primary key.

(出處:http://m.survivalescaperooms.com)



發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 科尔| 运城市| 凤台县| 东辽县| 长岭县| 商南县| 天水市| 盐城市| 弥渡县| 和硕县| 香港| 柳州市| 阳谷县| 南澳县| 信宜市| 长沙县| 绍兴市| 中卫市| 永善县| 改则县| 盱眙县| 娄底市| 革吉县| 临西县| 司法| 溧阳市| 衡阳市| 乐平市| 南澳县| 乐清市| 七台河市| 连云港市| 锦屏县| 岑巩县| 修文县| 玛沁县| 伊金霍洛旗| 斗六市| 滕州市| 吉隆县| 白银市|