BEA WebLogic Workshop (後併入 Oracle) 推廣的「頁面流 + Java Control + JSP」模型,將資料存取邏輯封裝於 Java Control (.jcx),頁面流 (.jpf) 負責業務流程編排,JSP 單純負責渲染,形成經典三層架構:
或透過 Workshop 圖形化「資料源查看器」建立。
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 預設大寫)。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"); }
}
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"%>
A B
C D 操作
刪除
A:
B:
C:
D:
@JCSql 註解替代 XML 映射檔,SQL 與 Java 介面共存,重構友善。TblTest 靜態內部類別自動對應 ResultSet 欄位,省去手寫 RowMapper。@JCTransaction) 由容器攔截器處理。{pageFlow.all}、{container.item.A} 直接綁定 Controller 屬性與迴圈變數,JSP 無 Scriptlet。toGb() 統一處理資料庫編碼與頁面編碼差異,符合邏輯層職責。WebLogic Workshop 已停止維護,現有專案建議漸進式遷移:
@Repository + @Query 或 Mapper XML。@Controller + @GetMapping 替換 @Jpf.Action。WebLogic Workshop 的 Java Control + Page Flow 模式在 2000 年代中後期曾大幅降低 J2EE 開發門檻,其「聲明式 SQL、自動映射、容器管理資源」的設計思想直接影響後來的 Spring Data、Seam、Grails 等框架。理解此模式有助於維護舊系統、以及把握現代框架演進脈絡。