<%@ page language="java" contentType="text/html; charset=BIG5" pageEncoding="BIG5" %> 史帝芬心得筆記 -- SessionBean

Session Bean

(史帝芬, idealist@gcn.net.tw, 2003/04/17)

  Sessoin Bean分Stateless Session Bean和Stateful Session Bean兩種,大部份的應用以Stateless Session Bean為主, 在這裡我也只示範Stateless Session Bean。
  本單元將以下列步驟實作一個Stateless Session Bean:
1. 新建資料庫
2. 新建企業應用程式專案
3. 新建伺服器及伺服器配置
4. 為Server1設定資料庫資料
5. 新建套件
6. 新建一個Session Bean
7. 為Library Bean增加參照
8. 修改LibraryBean.java
9. 產生部署和RMIC程式碼
10. 用UTC測試
11. 新建套件
12. 新建Servlet
13. 修改WEB部署描述子
14. 修改Servlet
15. 用UTC測試

1. 新建資料庫
 a. 在DB2 Server上開啟port 5678供JDBC使用,方法參照Q&A
 b. 在DB2中新建一個資料庫叫Steven,再於Steven中新增一個Table叫Guest,Guest的欄位如下:
KeyFieldTypeNULLComment
 IPVARCHAR(23)No 
 DNVARCHAR(50)No 
 VISIT_DATECHARACTER(10)No 
 VISIT_TIMECHARACTER(8)No 
*IDINTEGERNo自動編號

2. 新建企業應用程式專案
 命名為steven。
3. 新建伺服器及伺服器配置
 命名為Server1,並將steven專案加入Server1。
4. 為Server1設定資料庫資料
 a. 設定安全裡的JAAS
 b. 設定資料來源: 除如圖4,設定名稱及JNDI名稱,並且記得設定databaseName為steven、portNumber為5678及serverName為DB2 Server所在電腦名稱。

圖4 設定資料來源

5. 新建套件
 命名為tw.idv.idealist.session。
6. 新建一個Session Bean
 命名為Library,預設套件設為tw.idv.idealist.session,並同時勾選本端及遠端用戶端檢視畫面。
7. 為Library Bean增加參照
 為了使Library Bean能夠使用資料庫,所以要為它新增一個指向JDBC的"EJB資源參照",如圖7-1所示。 記得如圖7-2所示,在"WebSphere Application Server 的連結內容"加上JNDI名稱。

圖7-1 EJB資源參照

圖7-2 加上JNDI名稱

8. 修改LibraryBean.java
為LibraryBean.java加上如下import...
  import javax.naming.*;
  import javax.rmi.*;
  import javax.sql.*;
  import java.sql.*;
  import javax.ejb.*;
  import java.text.*;
  import java.util.*;

 同時加上如下四個function...
public void AddGuest(String strIP, String strDN) {
Connection cn = null;
PreparedStatement ps = null;
String strSQL = null;

strSQL = "Insert Into Guest(IP, DN, Visit_Date, Visit_Time) Values('" + strIP + "', '" + strDN + "', '" + getDate() + "', '" + getTime() + "')";
try {
cn = getConnection();
ps = cn.prepareStatement(strSQL);
ps.execute();

}
catch (SQLException se) {
throw new EJBException(se);
}
finally {
try {
if (ps != null) ps.close();
if (cn != null) cn.close();
}
catch (SQLException se) {
throw new EJBException(se);
}
}
}

private Connection getConnection() throws SQLException {
try {
InitialContext jndiCntx = new InitialContext();
DataSource ds = (DataSource) jndiCntx.lookup("java:comp/env/jdbc/steven");
return ds.getConnection();
}
catch (NamingException ne) {
throw new EJBException(ne);
}
}

private String getDate() {
DecimalFormat df = new DecimalFormat("00");
Calendar c = Calendar.getInstance();
int nYear = c.get(Calendar.YEAR);
int nMonth = c.get(Calendar.MONTH);
int nDay = c.get(Calendar.DAY_OF_MONTH);

return nYear + "/" + df.format(nMonth+1) + "/" + df.format(nDay);
}

private String getTime() {
DecimalFormat df = new DecimalFormat("00");
Calendar c = Calendar.getInstance();
int nHour = c.get(Calendar.HOUR_OF_DAY);
int nMin = c.get(Calendar.MINUTE);
int nSec = c.get(Calendar.SECOND);

return df.format(nHour) + ":" + df.format(nMin) + ":" + df.format(nSec);
}

 修改完成後,記得將AddGuest提升到本端介面及遠端介面。
9. 產生部署和RMIC程式碼
 在stevenEJB上按滑鼠右鍵,選"產生/部署和RMIC程式碼"。
10. 用UTC測試
 在Library上按滑鼠右鍵,選"在伺服器中執行",就可以用UTC測試了。 測試成功後,下面我們還將寫一個簡單的servlet來做測試。
11. 新建套件
 命名為tw.idv.idealist.servlet,如圖11。

圖11 新增套件tw.idv.idealist.servlet

12. 新建Servlet
 命名為AddGuest.java,並屬於tw.idv.idealist.servlet。
13. 修改WEB部署描述子
 為了使servlet能夠存取Library Bean,必需在WEB部署描述子做以下步驟。
 a. 在總覽頁面中,新增WEB程式庫專案。
 b. 新增指向Library Bean的遠端參照,如圖13。

圖13 新增指向Library Bean的遠端參照

14. 修改Servlet

 在AddGuest.java中加入以下import...
  import javax.rmi.*;
  import javax.naming.*;
  import javax.ejb.*;
  import tw.idv.idealist.session.*;
  import java.rmi.*;

 在doPost中新增下列程式...
try {
InitialContext jndiCntx = new InitialContext();
Object ref = jndiCntx.lookup("java:comp/env/ejb/session/LibraryRemote");
LibraryHome home = (LibraryHome) PortableRemoteObject.narrow(ref, LibraryHome.class);
Library lib = home.create();
lib.AddGuest("192.168.10.11", "ws1010001");
}
catch (NamingException ne) {
ne.printStackTrace();
}
catch (RemoteException re) {
re.printStackTrace();
}
catch (CreateException ce) {
ce.printStackTrace();
}

 在doGet中加入下列程式...
 doPost(req, resp);
15. 用UTC測試
 在AddGuest.java上按滑鼠右鍵,選"在伺服器中執行",就可以用UTC測試了。