在正式學習 Struts 1 之前,我們先通過三個版本的 Servlet 迭代,親歷「頁面跳轉控制」的演進歷程,理解框架誕生的必然性。
文件結構:

web.xml 註冊 Servlet 及映射public class AddUserServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String username = request.getParameter("username");
UserManager userManager = new UserManager();
userManager.add(username);
request.getRequestDispatcher("/add_success.jsp").forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { doGet(request, response); }
}
文件結構:

TestServlet 處理所有 *.do 請求request.getRequestURI() 截取路徑作為路由鍵web.xml 僅需一組 Servlet 映射String uri = request.getRequestURI();
String path = uri.substring(uri.indexOf("/", 1), uri.indexOf("."));
String username = request.getParameter("username");
UserManager userManager = new UserManager();
if ("/servlet/addUser".equals(path)) {
userManager.add(username);
request.getRequestDispatcher("/add_success.jsp").forward(request, response);
} else if ("/servlet/delUser".equals(path)) {
userManager.del(username);
request.getRequestDispatcher("/del_success.jsp").forward(request, response);
} // ... 其他分支
路由邏輯硬編碼在 Servlet 內部,新增功能需修改源碼並重新編譯部署,失去靈活性。
文件結構:

public interface Action {
String execute(HttpServletRequest request, HttpServletResponse response);
}
各業務實現介面:
public class AddUserAction implements Action {
public String execute(HttpServletRequest request, HttpServletResponse response) {
String username = request.getParameter("username");
new UserManager().add(username);
return "/add_success.jsp"; // 返回轉向路徑
}
}
Action action = null;
if ("/servlet/addUser".equals(path)) action = new AddUserAction();
// ... 其他分支
String forward = action.execute(request, response);
request.getRequestDispatcher(forward).forward(request, response);
if-else 鏈從三版迭代中提煉出的核心需求:
這正是 Struts 1 框架的基因密碼!