MVC (Model-View-Controller) 是架構層級模式,內含策略、組合、聚合等多種設計模式。Struts 框架即為其經典實作。本文示範自製 MVC 架構核心機制:單一入口 Servlet (Front Controller)、動作對應表、介面統一,並設計可重用的 JavaBean 分頁元件。
使用 Hashtable 映射動作名稱至 JSP 路徑,集中管理導航。
public interface Action {
void execute(HttpServlet servlet, HttpServletRequest request, HttpServletResponse response);
}
所有處理類實作此介面,便於工廠統一調度。
web.xml 僅映射一個 Servlet,依請求參數 action 分派至對應處理類:
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>com.example.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
public class ListUserBean {
private String name, pass;
// getter/setter 省略
}
getPage(int pageNo, int pageSize, String sql):public ListUserBean[] getPage(int intpage, int intpagecount, String sql) {
// 1. 取得總筆數 (rs.last() + getRow())
// 2. 計算總頁數、修正頁碼
// 3. 定位至起始列 (absolute)
// 4. 讀取 pageSize 筆資料填入 Bean 陣列
// 5. 設定總筆數、總頁數供前端顯示
}
intpage、intpagecount 參數listuser_page.getPage() 取得資料陣列// 前端分頁導航生成片段
out.println("<script>function check(f,v){f.intpage.value=v;f.submit();}</script>");
out.println("<form action='/main?action=listuser' method='post' name='theform'>");
out.println("<input type='hidden' name='intpage'>");
out.println("<a href='javascript:check(theform,"+(intpage+1)+");'>next</a>");
out.println("<a href='javascript:check(theform,"+(intpage-1)+");'>back</a>");
out.println("</form>");
geezer_Model.geezer_user.ListUserBean // 資料 Bean
geezer_Model.geezer_user.ListUserPage // 分頁邏輯
geezer_Model.geezer_user.ListUserAction // 實作 Geezer_Action 介面
geezer_controller.Geezer_Action // 統一介面
| 優點 | 不足/改進 |
|---|---|
| 架構清晰、單一入口、易擴充動作 | 手工分頁 SQL 依賴資料庫方言 (Oracle ROWNUM / MySQL LIMIT) |
| 分頁邏輯封裝於 JavaBean,JSP 無 Java 程式碼 | 前端導航使用內嵌 JavaScript,建議改用 JSTL/EL 或前端框架 |
| 介面導向設計,便於單元測試 | 連線管理未使用連接池,生產環境需整合 DataSource |