面試問「為什麼用 Struts/Spring/Hibernate?」,許多開發者答不上來。實則是「為了學而學、為了工作而學」,忽略了框架誕生要解決的核心問題。
<%
String name = request.getParameter("name");
UserHandler handler = new UserHandler();
if (handler.authenticate(name, pwd)) { %>
<p>登入成功</p>
<% } else { %>
<p>登入失敗</p>
<% } %>
痛點:Java/HTML 混雜、可讀性差、邏輯複用難、變更風險大、事務/日誌無統一支援。
// LoginServlet.java
protected void doPost(req, resp) {
String name = req.getParameter("name");
UserHandler handler = new UserHandler();
String msg = handler.authenticate(name, pwd) ? "成功" : "失敗";
req.setAttribute("msg", msg);
req.getRequestDispatcher("/result.jsp").forward(req, resp);
}
<!-- web.xml -->
<servlet><servlet-name>Login</servlet-name>
<servlet-class>com.demo.LoginServlet</servlet-class></servlet>
<servlet-mapping><servlet-name>Login</servlet-name>
<url-pattern>/Login</url-pattern></servlet-mapping>
代價:每個 Servlet 需在 web.xml 註冊 URL 映射,配置膨脹,開發效率未根本提升。
ActionServlet 統一入口,struts-config.xml 映射 URL→Action。ActionForm 自動封裝表單資料、驗證。Action 處理業務,返回 ActionForward 控制跳轉。解決了「職責分離」,但開發者仍困惑:框架到底幫我做了什麼?我到底需要它做什麼?
| MVC 角色 | 核心職責 | 歷代實現形式 |
|---|---|---|
| Model | 資料與業務邏輯 | JavaBean → EJB → Spring Bean / JPA Entity |
| View | 資料呈現 | JSP → Velocity/FreeMarker → Thymeleaf/React/Vue |
| Controller | 請求分發、流程控制 | Servlet → Struts Action → Spring MVC @Controller |
Controller 內部還需處理:異常統一處理、結果封裝(JSON/View/Redirect)、國際化、權限攔截等。
框架不是學習目標,而是解決上述問題的工具箱。不同框架針對不同痛點、以不同優雅度解決。學框架應帶著問題去:
- 這個框架如何做資料綁定?
- 如何整合驗證框架(Bean Validation)?
- 如何支援 RESTful API 與傳統頁面雙模式?
- 異常處理機制是否符合團隊規範?
web.xml、struts-config.xml、spring-mvc.xml,理解配置本質。DispatcherServlet、HandlerMapping、HandlerAdapter、ViewResolver。MVC 概念是王道,框架只是 Jar 包。為了解決問題而學框架,而非為了學框架而學框架,這才是程式設計師的正確進階之道。