| 架構 | 組成 | 請求流向 | 缺點 |
|---|---|---|---|
| JSP + JavaBean(兩層) | JSP(視圖+控制) + JavaBean(模型) | 瀏覽器 → JSP → JavaBean → JSP → 瀏覽器 | JSP 混雜邏輯與顯示,難以維護 |
| JSP + JavaBean + Servlet(三層/MVC) | Servlet(控制器) + JSP(視圖) + JavaBean(模型) | 瀏覽器 → Servlet → JavaBean → JSP → 瀏覽器 | 職責清晰,利於分工與測試 |
<servlet>
<servlet-name>ms1</servlet-name>
<servlet-class>news.FirstAction</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ms1</servlet-name>
<url-pattern>/newsmain</url-pattern>
</servlet-mapping>
解析:/newsmain → ms1 → news.FirstAction。容器根據 URL Pattern 找到 Servlet 名稱,再映射至具體類。
public class FirstAction extends HttpServlet {
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
DB db = new DB();
HttpSession session = req.getSession();
try {
// 1. 業務邏輯預處理
List list = News.SearchNewsTitle(db);
// 2. 結果存入 Session
session.setAttribute(Constants.NEWS_LIST_KEY, list);
} catch (Exception e) {
e.printStackTrace();
} finally {
db.close();
}
// 3. 重導向至視圖頁
resp.sendRedirect("/P43_News/newsMain.jsp");
}
}
關鍵點:
Session 或 Request 屬性,供 JSP 讀取。sendRedirect 或 RequestDispatcher.forward 轉向 JSP。<%-- newsMain.jsp --%>
<table>
<c:forEach items="${sessionScope.NEWS_LIST_KEY}" var="news">
<tr><td>${news.title}</td><td>${news.date}</td></tr>
</c:forEach>
</table>
使用 JSTL <c:forEach> 迭代,EL 表達式 ${...} 存取屬性,零 Java 代碼嵌入。
兩層:JSP 直接呼叫
News.SearchNewsTitle(db),業務邏輯耦合在頁面中。
三層:Servlet 完成預處理,JSP 僅負責「顯示」。Controller 隔離了變化:業務邏輯變更不影響視圖,視圖變更不影響控制流。
ListAction、DetailAction)。HttpServletRequest 等 Web API,保持可單元測試。web.xml 配置 <error-page>,避免堆疊追蹤洩露給用戶。JSP + JavaBean + Servlet 三層架構是 Java Web 開發的經典基石。理解 web.xml 映射、Servlet 預處理模式、屬性傳遞與轉發機制,是進階框架學習的前提。現代框架本質上皆在此模型上封裝,掌握核心原理,方能舉一反三。