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

WebLogic Workshop 開發模式:Java Control 封裝資料存取實現三層架構

     編輯:Java 程式設計入門

架構定位

BEA WebLogic Workshop (後併入 Oracle) 推廣的「頁面流 + Java Control + JSP」模型,將資料存取邏輯封裝於 Java Control (.jcx),頁面流 (.jpf) 負責業務流程編排,JSP 單純負責渲染,形成經典三層架構:

  • 資料層:Java Control (定義 SQL、連線池、結果映射)
  • 邏輯層:Page Flow Controller (動作轉發、參數轉換、異常處理)
  • 顯示層:JSP + NetUI 標籤庫 (資料綁定、表單處理)

資料源配置 (config.xml 片段)




或透過 Workshop 圖形化「資料源查看器」建立。

資料層:Database Control Test.jcx


package recordset;

import com.bea.control.*;

@ControlExtension // 標記為 Control
@JCConnection(dataSourceJndiName = "liwei") // 綁定 JNDI 資料源
public interface Test extends DatabaseControl {

    @JCSql(statement = "INSERT INTO TEST (A,B,C,D) VALUES ({_A},{_B},{_C},{_D})")
    int insert(String _A, String _B, String _C, String _D);

    @JCSql(statement = "UPDATE TEST SET B={_B}, C={_C}, D={_D} WHERE A={_A}")
    int update(String _A, String _B, String _C, String _D);

    @JCSql(statement = "DELETE FROM TEST WHERE A={_A}")
    int delete(String _A);

    @JCSql(statement = "SELECT * FROM TEST WHERE A={_A}")
    TblTest select(String _A);

    @JCSql(statement = "SELECT * FROM TEST")
    TblTest[] selectAll();

    // 內部靜態類別對應結果集列
    public static class TblTest implements java.io.Serializable {
        public String A, B, C, D;
    }
}

關鍵點:

  • 介面方法參數名 (如 _A) 對應 SQL 佔位符 {_A}。
  • 回傳類別 TblTest 欄位名需與資料表欄位大小寫一致 (Oracle 預設大寫)。
  • Workshop 編譯器根據註解自動產生實作類別,開發者無需寫 JDBC 樣板碼。

邏輯層:Page Flow Controller RecordsetController.jpf


package recordset;

import com.bea.netuix.servlets.controls.pageflow.*;

public class RecordsetController extends PageFlowController {

    @CommonControl // 注入 Control
    private Test recTest;

    private Test.TblTest[] recNew;

    // 編碼轉換工具 (ISO-8859-1 → GB2312)
    private String toGb(String s) {
        try { return new String(s.getBytes("ISO8859-1"), "GB2312"); }
        catch (Exception e) { return ""; }
    }

    // 提供給 JSP 綁定的屬性
    public Test.TblTest[] getAll() {
        recNew = recTest.selectAll();
        for (Test.TblTest r : recNew) {
            r.A = toGb(r.A); r.B = toGb(r.B); r.C = toGb(r.C); r.D = toGb(r.D);
        }
        return recNew;
    }

    @Jpf.Action(forwards = @Jpf.Forward(name="success", path="index.jsp"))
    public Forward add() {
        recTest.insert(getRequest().getParameter("a"),
                       getRequest().getParameter("b"),
                       getRequest().getParameter("c"),
                       getRequest().getParameter("d"));
        return new Forward("success");
    }

    @Jpf.Action(forwards = @Jpf.Forward(name="success", path="index.jsp"))
    public Forward delete() {
        recTest.delete(getRequest().getParameter("ToDelete"));
        return new Forward("success");
    }

    @Jpf.Action(forwards = @Jpf.Forward(name="success", path="index.jsp"))
    protected Forward begin() { return new Forward("success"); }
}

顯示層:JSP index.jsp (NetUI 標籤)


<%@ page language="java" contentType="text/html;charset=GB2312"%>
<%@ taglib prefix="netui" uri="https://bea.com/netui/tags/html-1.0"%>
<%@ taglib prefix="netui-data" uri="https://bea.com/netui/tags/databinding-1.0"%>



    
    
AB CD操作
刪除

A:
B:
C:
D:

關鍵技術亮點

  1. 聲明式 SQL:@JCSql 註解替代 XML 映射檔,SQL 與 Java 介面共存,重構友善。
  2. 自動結果映射:TblTest 靜態內部類別自動對應 ResultSet 欄位,省去手寫 RowMapper。
  3. Control 容器管理生命週期:連線借還、事務邊界 (可配合 @JCTransaction) 由容器攔截器處理。
  4. NetUI 資料綁定運算式:{pageFlow.all}、{container.item.A} 直接綁定 Controller 屬性與迴圈變數,JSP 無 Scriptlet。
  5. 編碼轉換集中在 Controller:toGb() 統一處理資料庫編碼與頁面編碼差異,符合邏輯層職責。

遷移至現代技術棧建議

WebLogic Workshop 已停止維護,現有專案建議漸進式遷移:

  • Control → Spring Data JPA / MyBatis:保留介面定義,實作替換為 @Repository + @Query 或 Mapper XML。
  • Page Flow → Spring MVC / Spring WebFlux Controller:@Controller + @GetMapping 替換 @Jpf.Action。
  • NetUI JSP → Thymeleaf / FreeMarker / React:資料綁定運算式語法相近,模板引擎更標準化。
  • 資料源 → HikariCP + @Transactional:統一事務管理。

結語

WebLogic Workshop 的 Java Control + Page Flow 模式在 2000 年代中後期曾大幅降低 J2EE 開發門檻,其「聲明式 SQL、自動映射、容器管理資源」的設計思想直接影響後來的 Spring Data、Seam、Grails 等框架。理解此模式有助於維護舊系統、以及把握現代框架演進脈絡。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved