Sun推薦的企業級Java架構:前端Applet/HTML/JSP + 後端Servlet/EJB。關鍵挑戰在於Applet安全沙箱限制下的客戶端-服務端高效通信。
結論:HTTP連接是唯一合法通信通道。
Servlet端:
public class ShowMemServlet extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
res.setContentType("text/plain");
PrintWriter out = res.getWriter();
Runtime rt = Runtime.getRuntime();
out.println(rt.freeMemory());
out.println(rt.totalMemory());
}
}
Applet端:
private void refresh() throws IOException {
URL url = new URL(getCodeBase(), "/servlet/ShowMemServlet");
URLConnection con = url.openConnection();
con.setUseCaches(false);
DataInputStream in = new DataInputStream(con.getInputStream());
double free = Double.parseDouble(in.readLine());
double total = Double.parseDouble(in.readLine());
int percent = (int)(100 * (total - free) / total);
meter.setLength(percent);
}
優點:簡單、穿透防火牆。缺點:複雜數據需手動解析,維護成本高。
利用Java序列化機制,直接傳輸完整對象圖。
Servlet端:
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
OutputStream out = res.getOutputStream();
ObjectOutputStream objOut = new ObjectOutputStream(out);
Album album = fetchNextAlbum(); // 獲取業務對象
objOut.writeObject(album); // 直接序列化輸出
}
Applet端:
private Album getNextAlbum() throws IOException, ClassNotFoundException {
URL url = new URL(getCodeBase(), "/servlet/AlbumServlet");
URLConnection con = url.openConnection();
con.setUseCaches(false);
ObjectInputStream objIn = new ObjectInputStream(con.getInputStream());
return (Album)objIn.readObject(); // 直接反序列化
}
關鍵要求:傳輸對象及其引用對象必須實現Serializable接口。
優勢:無需解析,對象邏輯復用,客戶端服務端共享領域模型。
優點:長連接、雙向、服務端主動推送。
缺點:防火牆通常阻擋非標準端口,僅適用內網環境。
實現要點:需自定義應用層協議,建議多線程架構支持多客戶端。
| 架構 | 結構 | 優點 | 缺點 |
|---|---|---|---|
| 直連數據庫 | Applet → JDBC/RMI → DB | 簡單 | 憑證暴露、防火牆穿透難、無法集群 |
| Servlet中介 | Applet → Servlet → DB/EJB | 安全、可集群、邏輯分層 | 增加網絡跳轉 |
| EJB分層 | Applet → Servlet → EJB → DB | 事務/安全/分布式透明 | 複雜度最高 |
Applet-Servlet通信受限於安全模型,HTTP文本流適合簡單數據,對象流適合複雜領域模型,Socket適合內網實時場景。遵循Sun應用模型分層架構,可構建安全、可擴展、可維護的企業級系統。