首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

EJB 實戰深度解析:CMP Entity Bean + Stateless Session Bean + JSP 完整範例

     編輯:Java 相關知識

實例背景與架構

  • 資料庫:SQL Server 2000(JDBC Type 4 驅動)
  • 開發環境:JBuilder 7 + WebLogic 7.0
  • 架構:JSP → Stateless Session Bean → CMP 2.0 Entity Bean (Local 接口) → DB

1. 資料源配置

連接池

Name: cacd
URL: jdbc:microsoft:sqlserver://10.11.12.58:1433;user=sa;password=cacd;
Driver: com.microsoft.jdbc.sqlserver.SQLServerDriver
Initial/Max Capacity: 3/10

Tx Data Source

Name: cacd
JNDI Name: cacd
Pool Name: cacd (必須與連接池一致)

注意:SQL Server 需設為「混合認證」;Tx Data Source 支援分散式事務,普通 Data Source 不支援。

2. 資料庫建模

create table techniquespec (
    techniqueitem char(100) not null primary key,
    units char(10) null,
    minvalue decimal(16,6) null,
    maxvalue decimal(16,6) null,
    types char(1) null,
    signon char(1) null
)

建議先建資料表,再由工具(PowerDesigner/ERWin/JBuilder)反向生成 CMP Bean,確保資訊模型先行。

3. CMP 2.0 Entity Bean (Local 接口)

LocalHome

package cacdsystem;
public interface TechniquespecHome extends EJBLocalHome {
    Techniquespec create(String techniqueitem) throws CreateException;
    Collection findByTypes() throws FinderException; // 自定義 Finder
    Techniquespec findByPrimaryKey(String techniqueitem) throws FinderException;
}

Local

public interface Techniquespec extends EJBLocalObject {
    String getTechniqueitem(); void setUnits(String u); String getUnits();
    void setMinvalue(BigDecimal v); BigDecimal getMinvalue();
    void setMaxvalue(BigDecimal v); BigDecimal getMaxvalue();
    void setTypes(String t); String getTypes();
    void setSignon(String s); String getSignon();
}

Bean 類


abstract public class TechniquespecBean implements EntityBean {
    EntityContext entityContext;
    public String ejbCreate(String techniqueitem) { setTechniqueitem(techniqueitem); return null; }
    public void ejbPostCreate(String techniqueitem) {}
    // 抽象 getter/setter 對應 CMP 欄位
    public abstract void setTechniqueitem(String v); public abstract String getTechniqueitem();
    public abstract void setUnits(String v); public abstract String getUnits();
    public abstract void setMinvalue(BigDecimal v); public abstract BigDecimal getMinvalue();
    public abstract void setMaxvalue(BigDecimal v); public abstract BigDecimal getMaxvalue();
    public abstract void setTypes(String v); public abstract String getTypes();
    public abstract void setSignon(String v); public abstract String getSignon();
    // 容器回調留空
    public void ejbLoad(){} public void ejbStore(){}
    public void ejbActivate(){} public void ejbPassivate(){}
    public void setEntityContext(EntityContext ctx){ this.entityContext = ctx; }
    public void unsetEntityContext(){ this.entityContext = null; }
}

EJB QL:SELECT OBJECT(p) FROM Techniquespec AS p,回傳 Collection。

4. Stateless Session Bean (Remote 接口)

Home / Remote


public interface VocHome extends EJBHome { Voc create() throws CreateException, RemoteException; }
public interface Voc extends EJBObject { Collection getVocTechnique() throws RemoteException; }

Bean 實現


public class VocBean implements SessionBean {
    SessionContext sessionContext;
    TechniquespecHome techniquespecHome;

    public void setSessionContext(SessionContext ctx) {
        this.sessionContext = ctx;
        try {
            Context ic = new InitialContext();
            techniquespecHome = (TechniquespecHome) ic.lookup("Techniquespec"); // Local JNDI
        } catch (Exception ex) { throw new EJBException(ex); }
    }

    public Collection getVocTechnique() {
        Collection coll = techniquespecHome.findByTypes();
        List results = new ArrayList();
        if (coll != null && coll.size() > 0) {
            Iterator it = coll.iterator();
            while (it.hasNext()) {
                Techniquespec t = (Techniquespec) it.next();
                String item = t.getTechniqueitem();
                results.add(charASC.chinTOISO(item)); // 中文編碼轉換
            }
        }
        return results;
    }
    // 其他回調留空...
}

5. 中文編碼轉換工具類


package cacdsystem;
public class charASC {
    public static String chinTOISO(String temp) {
        if (temp == null) return "";
        try {
            return new String(temp.getBytes("ISO-8859-1"), "gb2312").trim();
        } catch (Exception e) { return temp; }
    }
}

6. JSP 前端展示


<%@ page import="javax.naming.*, javax.rmi.PortableRemoteObject, cacdsystem.*" %>
<%@ page contentType="text/html;charset=gb2312" %>
<html><body>
<% 
    InitialContext ctx = new InitialContext();
    VocHome home = (VocHome) PortableRemoteObject.narrow(ctx.lookup("Voc"), VocHome.class);
    Voc voc = home.create();
    Collection coll = voc.getVocTechnique();
    int i = 0;
    for (Iterator it = coll.iterator(); it.hasNext(); ) {
        i++;
%>
    <tr><td><input type="checkbox" name="select<%=i%>" value="<%=i%>"><%=it.next()%></td></tr>
<% } voc.remove(); %>
</body></html>

7. 部署描述檔關鍵片段


<ejb-local-ref>  <!-- Session Bean 參照 Entity Bean -->
    <ejb-ref-name>Techniquespec</ejb-ref-name>
    <ejb-ref-type>Entity</ejb-ref-type>
    <local-home>cacdsystem.TechniquespecHome</local-home>
    <local>cacdsystem.Techniquespec</local>
    <ejb-link>Techniquespec</ejb-link>
</ejb-local-ref>

部署步驟:打包 JAR(含介面類、工具類)→ 部署到 WebLogic(Console/Builder/自動部署)→ 可選打包 EAR。

關鍵設計決策總結

  • Local 接口:Session 與 Entity 同 JVM,避免 RMI 開銷。
  • CMP 2.0:容器管理關係與查詢,減少 JDBC 代碼。
  • Session Facade:封裝業務邏輯、事務邊界、遠程訪問入口。
  • 編碼轉換:解決 ISO-8859-1 與 GB2312 互轉亂碼問題。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved