傳統 MVC 框架將 View 渲染壓在 Java 程式設計師身上,導致前後端耦合、審美與邏輯混淆。作者提出 J2J (Java to JavaScript) 方案:自定義 JSP 標籤將請求域 Java 物件自動轉為約定好的 JS 物件,前端設計師純粹用 JS 渲染頁面,雙方互不干擾。
User / user)。<jj:newObject> 標籤掛載 JS 物件,聯調上線。J2J.javapublic class NewObject extends TagSupport {
private String dist; // 目標 JS 類名
private String distName; // 目標 JS 實例名
private String scope; // request/session/page
private String source; // 源 Java 物件屬性名
public int doStartTag() {
JspWriter out = pageContext.getOut();
Object srcObj = getSourceObject(scope, source); // 從指定域取物件
List<Method> getters = getGetMethods(srcObj); // 反射取所有 getXxx()
try {
out.println("<script>");
out.println("var " + distName + " = new " + dist + "();");
for (Method m : getters) {
String field = getFieldName(m); // getName → name
Object val = m.invoke(srcObj);
if (val != null) {
out.println(distName + "." + field + " = \"" + val.toString() + "\";");
}
}
out.println("</script>");
} catch (IOException e) { /* ignore */ }
return EVAL_BODY_INCLUDE;
}
// 反射輔助方法、getter/setter 省略...
}
<tag>
<name>newObject</name>
<tagclass>net.vlinux.tag.j2j.NewObject</tagclass>
<bodycontent>JSP</bodycontent>
<attribute><name>distName</name><required>true</required></attribute>
<attribute><name>dist</name><required>true</required></attribute>
<attribute><name>scope</name><required>true</required></attribute>
<attribute><name>source</name><required>true</required></attribute>
</tag>
<%@ taglib uri="/WEB-INF/J2J.tld" prefix="jj" %>
<%
User user = new User();
user.setId(1); user.setName("vlinux");
user.setUsername("oldmanpushcart"); user.setPassword("lovefs");
request.setAttribute("user", user);
%>
<jj:newObject dist="User" distName="user" scope="request" source="user"/>
<script>
var user = new User();
user.username = "oldmanpushcart";
user.name = "vlinux";
user.id = "1";
user.password = "lovefs";
user.class = "class net.vlinux.test.User";
</script>
<script>document.writeln(user.id);</script><br>
<script>document.writeln(user.name);</script><br>
...
| 優勢 | 代價 |
|---|---|
| 前後端完全解耦,並行開發 | 不適合重構舊專案(JS 物件對舊頁面有侵入性) |
| 前端可用 Mock 資料極早獨立測試 | 頁面大量 <script> 片段,觀感不佳 |
| 維護/替換極易:換 ASP/PHP 只改表單 action | 無 IDE 智能提示支援 |
| 天生支援 AJAX |
J2J 以「約定優於配置」的輕量標籤,打通 Java 後端與 JS 前端的資料通道,是前後端分離演進史上的一種樸素而有效的探索。