欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
在JB9中用EJB開(kāi)發(fā)在線(xiàn)課堂

在JB9中用EJB開(kāi)發(fā)在線(xiàn)課堂- -

                                      

導讀

  在項目開(kāi)發(fā)中如何進(jìn)行需求分析,如何規劃數據庫、數據庫建模以及怎樣將模式設計應用于具體的項目困擾了開(kāi)發(fā)人員。本文以一個(gè)在線(xiàn)課程項目為線(xiàn)索全景展現軟件開(kāi)發(fā)的各個(gè)步驟。

閱讀導航

導航
簡(jiǎn)介
CoursesOnline簡(jiǎn)介 簡(jiǎn)要介紹CoursesOnline系統的設計目的
開(kāi)發(fā)環(huán)境 介紹開(kāi)發(fā)工具
需求分析 CoursesOnline系統開(kāi)發(fā)初期的需求調研,數據庫建模、數據字典、數據表的規劃
CoursesOnline系統設計 在系統設計中引入設計模式,如何選擇設計模式
創(chuàng )建數據庫 在Oracle9i中創(chuàng )建數據庫
CoursesOnline的具體實(shí)現 用JBuilder9開(kāi)發(fā)CoursesOnline系統步驟
部分代碼 部分步驟代碼
附錄 Jbuilder9、Oracle9i、Weblogic7的安裝配置;數據表SQL腳本


一、CoursesOnline簡(jiǎn)介

  CoursesOnline是一個(gè)實(shí)驗性質(zhì)的系統,CoursesOnline是"在線(xiàn)課程"的意思,在這個(gè)CoursesOnline系統里,學(xué)生選擇課程,老師可以開(kāi)設課程,系統管理員則對學(xué)生、老師以及課程進(jìn)行管理。

  CoursesOnline使用J2EE來(lái)實(shí)現,目的是為其它EJB系統的開(kāi)發(fā)提供一些參考。

二、開(kāi)發(fā)環(huán)境

  CoursesOnline使用Jbuilder9 + Oracle9i + WebLogic7的開(kāi)發(fā)環(huán)境。

  因為J2EE是一種行業(yè)標準,所以采用哪種開(kāi)發(fā)環(huán)境的搭配并不是最重要的。目前其它常見(jiàn)開(kāi)發(fā)環(huán)境的搭配還有Eclipse + MySQL + Jboss(都是OpenSource),VJA + DB2 + WebSphere,等等。

  Jbuilder9 + Oracle9i + WebLogic 7開(kāi)發(fā)環(huán)境的配置請參考附錄A。

  三、CoursesOnline需求分析

  3.1 CoursesOnline用例



  上圖是CourcesOnline的Use Case Diagram。顯而易見(jiàn),系統中有學(xué)生、老師和系統管理員三種Actor。學(xué)生需要注冊成系統用戶(hù)后才能瀏覽課程和選課。

  3.2 數據庫建模(ER圖)及數據字典



  上圖是CoursesOnline的數據庫ER圖,建模工具是ERWin。順便提一下,ERWin的正向工程支持ER圖直接生成數據庫表結構,逆向工程支持數據庫表結構生成ER圖。

  CoursesOnline使用到的表有5個(gè),數據字典如下:

  3.2.1 Actor登錄信息表(Actor)

序號 字段名 數據類(lèi)型 約束 備注
1 ActorID SmallInt PK Actor標識符
2 UserName Varchar(20) Actor登錄賬號
3 Password Char(8) Actor登錄口令
4 ActorType SmallInt Actor類(lèi)型,0:系統管理員;1:老師;2:學(xué)生

  3.2.2 Actor基本信息表(ActorInfo)

序號 字段名 數據類(lèi)型 約束 備注
1 ActorID SmallInt FK(Actor) Actor標識符
2 ActorName Varchar(20) Actor姓名
3 Phone Varchar(16) 電話(huà)
4 Email Varchar(50) Email

  3.2.3 課程信息表(Courses)

序號 字段名 數據類(lèi)型 約束 備注
1 CoursesID SmallInt PK 課程標識符
2 CoursesName Varchar(20) 課程名稱(chēng)
3 StartDate Date 課程開(kāi)始時(shí)間
4 EndDate Date 課程結束
5 ActorID SmallInt FK(Actor)
6 RoomID SmallInt FK(Room) 教室標識符

  3.2.4 學(xué)生選課表(Appointment)

序號 字段名 數據類(lèi)型 約束 備注
1 ActorID SmallInt FK(Actor) Actor標識符(學(xué)生,ActorType=2)
2 CoursesID SmallInt FK(Courses) 課程標識符

  3.2.5 教室信息表(Room)

序號 字段名 數據類(lèi)型 約束 備注
1 RoomID SmallInt PK 教室標識符
2 RoomName Varchar(30) 教室名稱(chēng)


 四、CoursesOnline系統設計

  4.1 Design Pattern的選擇和思考

  在系統設計上,Design Pattern的選擇是很重要的。因為正確的Design Pattern不僅在開(kāi)發(fā)階段可以讓開(kāi)發(fā)人員思路清晰得心應手,而且在維護階段也不至于讓維護人員抓狂。除此之外,對于系統的健壯和運行效率而言也起著(zhù)舉足輕重的作用。如果采用了錯誤的Design Pattern,那么對于系統來(lái)說(shuō)就像是在錯誤的時(shí)間錯誤的地點(diǎn)與錯誤的敵人打了一場(chǎng)錯誤的戰爭。

  下面以CoursesOnline系統學(xué)生注冊時(shí)采用的兩種不同的處理方法為例來(lái)簡(jiǎn)單說(shuō)明選擇Design Pattern的重要性。

  學(xué)生在Client提交注冊信息,包括登錄賬號,登錄口令,姓名,電話(huà)和Email五項內容。從數據庫ER圖中我們可以看到學(xué)生信息被分散在兩張表里,也就是說(shuō)服務(wù)器端有兩個(gè)Entity Bean來(lái)存取學(xué)生的注冊信息,一個(gè)為Actor,另一個(gè)為ActorInfo。

  方法一:客戶(hù)端直接與Entity Bean溝通以完成工作



  方法二:客戶(hù)端與Session Bean交互,由Session Bean與Entity Bean溝通以完成工作



  方法一的設計雖然也能完成對學(xué)生注冊的處理,但是客戶(hù)端必須寫(xiě)所有的業(yè)務(wù)邏輯代碼,而且由于客戶(hù)端直接訪(fǎng)問(wèn)Entity Bean,不但造成了多次的網(wǎng)絡(luò )roundtrip,使執行效率大幅下降,也使客戶(hù)端與Entity Bean形成強耦合,日后不管修改客戶(hù)端還是Entity Bean,都會(huì )牽一發(fā)而動(dòng)全身,對系統的改造簡(jiǎn)直就是一場(chǎng)災難。

  方法二不但大幅降低了網(wǎng)絡(luò )的roundtrip,而且Session Facade分隔了客戶(hù)端和Entity Bean,Entity Bean對于客戶(hù)端來(lái)說(shuō)是透明的,客戶(hù)端需要關(guān)心的只是Session Facade提供的接口。這樣一來(lái)系統的可擴展性就得到了質(zhì)的提升。

  4.2 CoursesOnline系統示意圖



  五、創(chuàng )建數據庫

  先有雞再有蛋?還是先有蛋再有雞?

  先有數據庫表再有Entity Bean?還是先有Entity Bean再有數據庫表?

  這兩個(gè)問(wèn)題有異曲同工之妙。雞與蛋的問(wèn)題已經(jīng)討論幾千年了,哲學(xué)的Big Fans可能會(huì )爭的臉紅耳赤唾沫橫飛;偶們只是普通的程序員,誰(shuí)先誰(shuí)后的問(wèn)題還留給理論學(xué)家吧。

  可能會(huì )有人先設計Entity Bean再建數據庫表,也有可能反其道而行。在CoursesOnline這個(gè)實(shí)驗性質(zhì)系統的開(kāi)發(fā)過(guò)程中,是先建數據庫表然后才有Entity Bean。

  5.1 新建一個(gè)數據庫

  Oracle可以在命令行模式下敲入dbca,或者直接在開(kāi)始菜單里找到并運行Database Configuration Assistant,然后根據向導的提示新建一個(gè)名為CoursesDB的數據庫。



  Oracle 9i新建數據庫的詳細過(guò)程請參考Oracle的相關(guān)文檔。

  5.2 為數據庫創(chuàng )建一個(gè)用戶(hù)

  在命令行下敲入oemapp console,或者直接在開(kāi)始菜單里找到EnterPrise Manager Console打開(kāi)Oracle管理控制中心,以SYSDBA的身份進(jìn)入CoursesDB數據庫后,在安全性->用戶(hù)中新增一個(gè)用戶(hù),如chenxc,口令chenxc,并賦予dba的角色。這些設置在接下來(lái)的CourseseOnline系統具體開(kāi)發(fā)中會(huì )用到。

  Oracle 9i新建用戶(hù)的具體操作請參考Oracle的相關(guān)文檔。

  5.3 建表及表的初始化

  5.3.1 建表

  建表的方法有N種:1)用sqlplus連上CoursesDB數據庫后,用sql語(yǔ)句把數據字典中列出來(lái)的表結構敲進(jìn)去;2)把數據字典中表結構寫(xiě)成sql腳本文件,然后用sqlplus連上CoursesDB,執行SQL>@@ c:\CoursesDB.sql;3)使用一種支持正向工程的數據庫建模工具直接把ER圖轉換成數據庫表結構,如ERWin;4)使用可視化工具建表,如PLSQL Developer。

  其它的我知道的還有我還不知道的數據庫的建表方法,在這里就不一一列舉了,有興趣的請自行研究,然后把經(jīng)驗告訴大家。

  附錄C提供了CoursesOnline建表及表的初始化的sql腳本。

  5.3.2 表的初始化

  從CoursesOnline用例圖中可以看出,系統沒(méi)有提供系統管理員、老師以及教室的管理的接口,系統管理員、老師和教室的信息在數據庫建完后就應該初始化了。也就是說(shuō),這些信息是已經(jīng)存在的,除非直接操作數據庫,否則無(wú)法改變系統管理員、老師和教室的信息。

  建完表后,我們?yōu)镃oursesOnline系統初始化了一位系統管理員,名為sysadmin;三位老師,分別為任我行、東方不敗和岳不群;除此之外還初始化了三間教室,分別為黑木崖教室1、黑木崖教室2和華山教室3。
附錄C提供了CoursesOnline建表及表的初始化的sql腳本。

 六、CoursesOnline的具體實(shí)現

  6.1 在Jbuilder 9中新建一個(gè)工程

  啟動(dòng)Jbuilder 9,File->New Project,項目名為CoursesOnline,選擇路徑后,點(diǎn)擊finish



  因為CoursesOnline項目使用Oracle 9i數據庫,所以還需要把Oracle的驅動(dòng)加載進(jìn)來(lái),Project -> Project Properties -> Path -> Required libraries,點(diǎn)擊add,在Select One Or More Libraries窗口中選擇OracleJDBCLib



  OracleJDBCLib的配置請參考附錄A.5.3 配置數據庫驅動(dòng)

  6.2 創(chuàng )建Entity Bean(CMP)

  6.2.1 新建一個(gè)EJB Module

  File -> New -> Enterprise ->EJB Module



  點(diǎn)擊ok,并在接下來(lái)的窗口中為EJB Module命名為Courses,結果如下圖



  6.2.2 Import Schema From Database

  在上圖中的DataSources上點(diǎn)擊右鍵,或者在Courses設計面板上點(diǎn)擊右鍵,然后點(diǎn)擊Import Schema From Database,在彈出的窗口中輸入Driver,URL等參數,如下圖所示



  點(diǎn)擊ok,這時(shí)數據庫中的5個(gè)表在DataSources面板中顯示出來(lái),如下圖所示



  6.2.3 創(chuàng )建Entity Bean

  在上圖中DataSources面板中右鍵Actor,在彈出菜單中選擇Create CMP 2.0 Entity Bean,結果如下圖



  左鍵點(diǎn)擊Entity Bean Actor可以在彈出的窗口中編輯它的屬性,在這里我們暫時(shí)使用默認值。接下來(lái)用同樣的方法為其它四個(gè)表創(chuàng )建CMP 2.0 Entity Bean,結果如下圖



  從左邊的Project下拉菜單中可以看到,每個(gè)Entity Bean都有三個(gè)(或四個(gè))Java程序與之相對應,例如Actor.java、ActorBean.java和ActorHome.java。為了便于管理,以及避免和后面的程序胡攪蠻纏搞得眼睛高度緊張,我把Entity Bean對應的java程序都放在com.chenxc.coursesOnline.ejb20下。點(diǎn)擊Entity Bean的名稱(chēng),在Bean Properties窗口中點(diǎn)擊Classes And Packages...按鈕,然后為每個(gè)類(lèi)指定路徑。

  6.2.4 階段總結

  這一節中創(chuàng )建了五個(gè)CMP 2.0 Entity Bean,是CMP而不是BMP,是2.0而不是1.x,是local接口而不是remote接口,而且還沒(méi)有動(dòng)手寫(xiě)過(guò)任何代碼。本文并不打算深入探討EJB的內部機制,而僅僅是舉例子來(lái)說(shuō)明使用EJB實(shí)現分層思想及分布式計算的方法。如果要研究EJB的細節,請參考附錄B 參考資料列舉的書(shū)籍或文章。

  當前階段的五個(gè)Entity Bean只能算是半成品,要完成業(yè)務(wù)邏輯還需要進(jìn)一步加工,這些在接下來(lái)開(kāi)發(fā)Session Bean的過(guò)程中會(huì )提到。欲知后事如何,請聽(tīng)下回分解。

  6.3 創(chuàng )建Session Bean(Stateless)

  6.3.1 SessionFacade - 連接Struts與Entity Bean的橋梁

  新建一個(gè)名為SessionFacade的Session Bean。SessionFacade負責與Entity Bean溝通,并為Struts提供接口。

  這個(gè)Session Bean扮演一個(gè)中間人的角色,就像是北京西客站的售票廳,旅客可以買(mǎi)T97的火車(chē)票去往廣州,也可以買(mǎi)T31的火車(chē)票去往上海。在CoursesOnline系統中,Struts跟購買(mǎi)火車(chē)票的旅客一樣,通過(guò)SessionFacade提供的接口完成系統登錄、學(xué)生注冊、學(xué)生選課等操作。

  下面以Actor登錄為例來(lái)說(shuō)明SessionFacade是怎樣扮演中間人的角色,如下圖:



  在SessionFacade中新增一個(gè)名為actorLogin的方法,返回值boolean,輸入參數用戶(hù)名,口令和用戶(hù)類(lèi)型(學(xué)生、老師或系統管理員),接口remote。

  方法actorLogin提供給遠程的Struts調用。
 
  登錄處理流程如下:

  1、用戶(hù)在頁(yè)面上輸入用戶(hù)名、口令和用戶(hù)類(lèi)型并提交;

  2、JavaBean存儲用戶(hù)在頁(yè)面提交上來(lái)的用戶(hù)名、口令和用戶(hù)類(lèi)型;

  3、Struts讀取JavaBean的用戶(hù)名、口令和用戶(hù)類(lèi)型;

  4、Struts通過(guò)遠程接口調用SessionFacade的actorLogin(String username,String Password,int actortype)方法;

  5、SessionFacade通過(guò)本地接口調用Entity Bean(Actor)的findByName(String username,int actortype)方法;

  6、SessionFacade獲取Entity Bean(Actor)的findByName(String username,int actortype)方法的返回值;

  7、SessionFacade在actorLogin(String username,String Password,int actortype)方法中比較Entity Bean(Actor)的findByName(String username,int actortype)得到的password的值;

  8、如果兩個(gè)password的值相等,則actorLogin(String username,String Password,int actortype)返回true,否則返回false;

  9、Struts根據SessionFacade的actorLogin(String username,String Password,int actortype)的返回值(true or false)判斷登錄是否成功,并導航到對應的頁(yè)面。


  6.3.2 登錄流程的代碼

/*--------------------------------------------------------------------------------------*/
//1、用戶(hù)登錄界面 - login.jsp

<!- 部分HTML代碼此處省略 -- >
<form name="teaForm" method="post" action="<%=contextPath%>/login.do">
?。紅able border="0" cellspacing="0" cellpadding="0">
 ?。紅r>
  ?。紅d width="60"><font size="2">用戶(hù)類(lèi)型</font></td>
  ?。紅d>
  ?。糹nput type="radio" value="0" name="actortype" checked><font size="2">系統管理員 </font>
  ?。糹nput type="radio" value="1" name="actortype"><font size="2">學(xué)生 </font>
  ?。糹nput type="radio" value="2" name="actortype"><font size="2">老師 </font>
  ?。?td>
 ?。?tr>
 ?。紅r>
  ?。紅d width="60"><font size="2">用戶(hù)名</font></td>
  ?。紅d><input name="username" value="" size="12"> *</td>
 ?。?tr>
 ?。紅r>
  ?。紅d width="60"><font size="2">口令</font></td>
  ?。紅d><input type="password" name="password" value="" size="8" maxlength="8"> *</td>
 ?。?tr>
?。?table>
?。糱r>
?。紅able border="0" cellspacing="0" cellpadding="0">
 ?。紅r>
  ?。紅d width="50"> </td>
  ?。紅d><input type="submit" value="登 錄"></td>
 ?。?tr>
?。?table>
</form>


/*--------------------------------------------------------------------------------------*/
//2、Struts程序
//2.1 LoginForm.java(存儲用戶(hù)在頁(yè)面上提交的用戶(hù)名、口令和用戶(hù)類(lèi)型)

package com.chenxc.coursesonline.struts;
/**
* Title: LoginForm
* Description: 存儲登錄信息
* Time: 2004-3-20
* Company:
* Author: chenxc
* version 1.0
*/
import java.util.*;
public class LoginForm extends org.apache.struts.action.ActionForm{
 private String username; //用戶(hù)名
 private String password; //口令
 private int actortype; //用戶(hù)類(lèi)型
 //用戶(hù)名
 public void setUsername(String username) {
  this.username = username;
 }

 public String getUsername() {
  return username;
 } 

 //口令
 public void setPassword(String password) {
  this.password = password;
 }

 public String getPassword() {
  return password;
 }
 //用戶(hù)類(lèi)型
 public void setActortype(int actortype)
 {
  this.actortype = actortype;
 }
 public int getActortype()
 {
  return actortype;
 }
}


//2.2 LoginAction.java(控制登錄流程的走向)

package com.chenxc.coursesonline.struts;
/**
* Title: LoginAction
* Description: 登錄驗證
* Time: 2004-3-20
* Company:
* Author: chenxc
* version 1.0
*/
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
import org.apache.struts.action.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletException;
import com.chenxc.coursesonline.struts.*;

public class LoginAction extends org.apache.struts.action.Action{
public ActionForward execute(ActionMapping mapping,ActionForm actionForm,HttpServletRequest request,HttpServletResponse response) throws Exception
{
 ActionErrors errors = new ActionErrors();
 HttpSession session = request.getSession();
 ActionForward forward = null;

 LoginForm loginForm = (LoginForm)actionForm;
 FacadeBean facadeBean = new FacadeBean();
 if(facadeBean.actorlogin(loginForm.getUsername(),loginForm.getPassword(),loginForm.getActortype()))
{
 forward = mapping.findForward("success");
 return forward;
}
 return (new ActionForward(mapping.getInput()));
 }
}


//2.3 FacadeBean.java(實(shí)現登錄驗證)

package com.chenxc.coursesonline.struts;
/**
* Title: FacadeBean
* Description: 負責與Session Bean溝通
* Time: 2004-3-20
* Company:
* Author: chenxc
* version 1.0
*/
import com.chenxc.coursesonline.ejb20.*;
import javax.naming.*;
import java.util.Properties;
import javax.rmi.PortableRemoteObject;
import javax.ejb.CreateException;
import java.rmi.RemoteException;

public class FacadeBean
extends Object {
 private static final String ERROR_NULL_REMOTE = "Remote interface reference is null. It must be created by calling one of the Home interface methods first.";
 private static final int MAX_OUTPUT_LINE_LENGTH = 100;
 private CoursesFacadeHome coursesFacadeHome = null;
 private CoursesFacade coursesFacade = null;

 //Construct the FacadeBean
 public FacadeBean() {
  initialize();
 }

 public void initialize() {
  try {
   //get naming context
   Context context = getInitialContext();
   //look up jndi name
   Object ref = context.lookup("CoursesFacade");
   //look up jndi name and cast to Home interface
   coursesFacadeHome = (CoursesFacadeHome) PortableRemoteObject.narrow(ref,CoursesFacadeHome.class);

  }
  catch (Exception e) {
   e.printStackTrace();
  }
 }

 private Context getInitialContext() throws Exception {
  String url = "t3://192.168.100.134:7001";
  String user = null;
  String password = null;
  Properties properties = null;
  try {
   properties = new Properties();
   properties.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
   properties.put(Context.PROVIDER_URL, url);
   if (user != null) {
    properties.put(Context.SECURITY_PRINCIPAL, user);
    properties.put(Context.SECURITY_CREDENTIALS,
    password == null ? "" : password);
   }
 
   return new InitialContext(properties);
  }
  catch (Exception e) {
   throw e;
  }
 }
 //actorlogin
 public boolean actorlogin(String username, String password, int actortype) {
  try {
   coursesFacade = coursesFacadeHome.create();
   if (coursesFacade.actorLogin(username, password, actortype)) {
    return true;
   }
   else
   {
    return false;
   }
  }
  catch (CreateException ex) {
   ex.printStackTrace();
  }
  catch (RemoteException ex) {
   ex.printStackTrace();
  }
  return false;
 }
}


/*--------------------------------------------------------------------------------------*/
//3、Session Bean程序
//3.1 SessionFacadeHome.java

package com.chenxc.coursesonline.ejb20;

import javax.ejb.*;
import java.util.*;
import java.rmi.*;

public interface SessionFacadeHome extends javax.ejb.EJBHome {
 public SessionFacade create() throws CreateException, RemoteException;
}


//3.2 SessionFacade.java

package com.chenxc.coursesonline.ejb20;

import javax.ejb.*;
import java.util.*;
import java.rmi.*;

public interface SessionFacade extends javax.ejb.EJBObject {
 public boolean actorLogin(String actor, String password, int actortype) throws RemoteException;
}


//3.2 SessionFacadeBean.java

package com.chenxc.coursesonline.ejb20;

import javax.ejb.*;
import javax.naming.*;
import java.rmi.RemoteException;

public class SessionFacadeBean implements SessionBean {
 SessionContext sessionContext;

 ActorHome actorHome;
 Actor actor;

 public void ejbCreate() throws CreateException {
  try
  {
   Context ctx = new InitialContext();
   actorHome = (ActorHome)ctx.lookup("Actor");
  }
  catch (Exception ex) {
   throw new EJBException(ex);
  }
 }
 public void ejbRemove() {
  /**@todo Complete this method*/
 }
 public void ejbActivate() {
  /**@todo Complete this method*/
 }
 public void ejbPassivate() {
  /**@todo Complete this method*/
 }
 public void setSessionContext(SessionContext sessionContext) {
  this.sessionContext = sessionContext;
 }
 public boolean actorLogin(String username, String password, int actortype) {
  try
  {
   actor = actorHome.findByName(username,actortype);
   if(actor.getPassword().equals(password))
   {
    System.out.println(username + " 登錄成功!");
    return true;
   }
  }catch(ObjectNotFoundException ex) {
  }
  catch(Exception ex) {
   ex.printStackTrace();
  }
  return false;
 }
}


/*--------------------------------------------------------------------------------------*/
//4、為Entity Bean(Actor)新增一個(gè)findByName的Finder,如下圖



  Finder名findByName,返回值Actor,輸入參數用戶(hù)名,用戶(hù)類(lèi)型,接口local home,EJB-QL: SELECT OBJECT(a) FROM Actor AS a WHERE a.username = ?1 AND a.actortype = ?2

  6.3.3 階段總結

  Client -> Struts -> Session Bean -> Entity Bean,實(shí)現一個(gè)登錄流程用了十幾個(gè)java程序,真是累人的說(shuō)。一個(gè)JSP程序就可以實(shí)現的功能卻要大陣戰對待,殺雞用牛刀乎?

  答案是否定的,因為EJB存在的意義在于分布式計算和分層的思想。

  6.4未完成的

  寫(xiě)到這里,CoursesOnline系統只實(shí)現了系統登錄驗證的功能,主要的業(yè)務(wù)邏輯基本上沒(méi)實(shí)現,但MVC框架,Facade Design Pattern都或多或少有所描述,繼續完成CoursesOnline系統應該不會(huì )太困難。

  另外由于使用CMP查詢(xún)記錄集時(shí)處理起來(lái)比較麻煩,所以在瀏覽課程或瀏覽學(xué)生等記錄集查詢(xún)時(shí)可以考慮用BMP來(lái)實(shí)現,或者干脆在Session Bean實(shí)現。


  附錄A 開(kāi)發(fā)環(huán)境的配置

  對于JBuilder、Oracle9i、WebLogic 7、WebLogic Domain的安裝配置除參考相關(guān)的安裝手冊外,可參考本欄目發(fā)表的《Jbuilder9+Oracle9i+Weblogic8.1安裝配置

  A. 配置Jbuilder 9

   A.選擇Tools->Configure Servers配置Server信息



   Home Directory:選擇Weblogic安裝目錄下的Server目錄,如:C:\bea\weblogic700\server
Main Class,VM Parameters:系統會(huì )自動(dòng)獲得,不用修改
Working Directory:創(chuàng )建的新Domain目錄 如:C:\bea\user_projects\mydomain
Class 中:由于沒(méi)有Weblogic的SP包,刪除weblogic_sp.jar包,僅保留weblogic.jar



   JDK Install directory:選擇安裝Weblogic目錄下的JDK目錄 如:D:\bea\jdk131_03
BEA Home directory: 選擇安裝Weblogic目錄 如:C:\bea User Name and Password:創(chuàng )建Domain時(shí)Administor的用戶(hù)名稱(chēng)和密碼。

   Domain Name and Server Name:系統會(huì )自動(dòng)獲得

   配置缺省工程的Server信息(Project->Default Projects Properties)



   這樣一來(lái)新建的工程默認情況下就使用這種Server配置

   配置數據庫驅動(dòng)



  點(diǎn)擊Add按鈕



  在本機Oracle的目錄下選擇Oracle JDBC lib的路徑,如D:\Oracle\Ora92\jdbc\lib\classes12.jar



  配置數據庫驅動(dòng)后需重啟JB才能使設置生效

  附錄B 參考資料

  1)《Mastering EJB 2》
  2)《Enterprise JavaBeans, 3rd Edition》
  3)《EJB Design Pattern》
  4)http://java.sun.com
  5)http://dev2dev.bea.com.cn

  附錄C 建表及表初始化的sql腳本

  C.1 建表

CREATE TABLE Appointment (ActorID SMALLINT NOT NULL,CoursesID SMALLINT NOT NULL);
ALTER TABLE Appointment ADD ( PRIMARY KEY (ActorID, CoursesID) ) ;

CREATE TABLE Courses (
 CoursesID SMALLINT NOT NULL,
 CoursesName VARCHAR(30) NULL,
 StartDate DATE NULL,
 EndDate DATE NULL,
 RoomID SMALLINT NULL,
 ActorID SMALLINT NULL
);
ALTER TABLE Courses ADD ( PRIMARY KEY (CoursesID) ) ;

CREATE TABLE ActorInfo (
 ActorID SMALLINT NOT NULL,
 ActorName VARCHAR(30) NULL,
 Phone VARCHAR(16) NULL,
 Email VARCHAR(50) NULL
);
ALTER TABLE ActorInfo ADD ( PRIMARY KEY (ActorID) ) ;

CREATE TABLE Actor (
 ActorID SMALLINT NOT NULL,
 UserName VARCHAR(20) NULL,
 Password CHAR(8) NULL,
 ActorType SMALLINT NULL
);
ALTER TABLE Actor ADD ( PRIMARY KEY (ActorID) ) ;

CREATE TABLE Room (RoomID SMALLINT NOT NULL,RoomName VARCHAR(20) NULL);
ALTER TABLE Room ADD ( PRIMARY KEY (RoomID) ) ;

ALTER TABLE Appointment ADD ( FOREIGN KEY (CoursesID) REFERENCES Courses ) ;
ALTER TABLE Appointment ADD ( FOREIGN KEY (ActorID) REFERENCES Actor ) ;
ALTER TABLE Courses ADD ( FOREIGN KEY (ActorID) REFERENCES Actor ) ;
ALTER TABLE Courses ADD ( FOREIGN KEY (RoomID) REFERENCES Room ) ;
ALTER TABLE ActorInfo ADD ( FOREIGN KEY (ActorID) REFERENCES Actor ) ;

  C.2表的初始化

  --1)初始化系統管理員

insert into actor values(1,‘sysadmin‘,‘sysadmin‘,0);
insert into actorinfo values(1,‘sysadmin‘,‘66668888‘,‘chenxc@263.net‘);

  --2)初始化老師

  --增加任我行老師

insert into actor values(2,‘rwx‘,‘rwx‘,1);
insert into actorinfo values(2,‘任我行‘,‘77778888‘,‘rwx@courses.com.cn‘);

  --增加東方不敗老師

insert into actor values(3,‘dfbb‘,‘dfbb‘,1);
insert into actorinfo values(3,‘東方不敗‘,‘88888888‘,‘dfbb@courses.com.cn‘);

  --增加岳不群老師

insert into actor values(4,‘ybq‘,‘ybq‘,1);
insert into actorinfo values(4,‘岳不群‘,‘99998888‘,‘ybq@courses.com.cn‘);

  --3)初始化教室

insert into room values(1,‘黑木崖教室1‘);
insert into room values(2,‘黑木崖教室2‘);
insert into room values(3,‘華山教室3‘);

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
Spring DAO支持
CXF方式發(fā)布WebService全步驟
Java持久性API(JPA)第1講
煮酒論英雄,漫談Java數據庫存取技術(shù)
CAS RESTful API 開(kāi)發(fā)文檔
配置Spring數據源c3p0與dbcp
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久