Struts 2 是經典的 MVC 框架,通過攔截器機制實現請求處理。本文以 Eclipse + Tomcat 為環境,手把手構建從零配置到完整 CRUD 的 Struts 2 應用,涵蓋核心組件、配置文件、標籤庫及實戰案例。
HelloWorldStruts2Generate web.xml deployment descriptorWEB-INF/lib)commons-fileupload-x.y.z.jar
commons-io-x.y.z.jar
commons-lang-x.y.jar
commons-logging-x.y.z.jar
commons-logging-api-x.y.jar
freemarker-x.y.z.jar
javassist-x.y.z.GA.jar
ognl-x.y.z.jar
struts2-core-x.y.z.jar
xwork-core-x.y.z.jar
package com.example.struts2;
public class HelloWorldAction {
private String name; // 對應表單字段
public String execute() {
// 業務邏輯
return "success"; // 邏輯視圖名
}
// getter/setter
public String getName() { return name; }
public void setName(String name) { this.name = name; }
}
index.jsp(入口)
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<body>
<h1>Hello World From Struts2</h1>
<s:form action="hello">
<s:textfield name="name" label="Please enter your name"/>
<s:submit value="Say Hello"/>
</s:form>
</body>
</html>
helloWorld.jsp(結果頁)
<%@ taglib prefix="s" uri="/struts-tags" %>
<html><body>
Hello World, <s:property value="name"/>
</body></html>
struts.xml(放在 src/ 根目錄)<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"https://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.devMode" value="true"/>
<package name="helloworld" extends="struts-default">
<action name="hello" class="com.example.struts2.HelloWorldAction" method="execute">
<result name="success">/helloWorld.jsp</result>
</action>
</package>
</struts>
web.xml<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
webapps/https://localhost:8080/HelloWorldStruts2/index.jspHello World, [名稱]// com.bean.StudentBean
private String stuId, stuName, stuSex, stuBir, stuAdd; // getter/setter
// com.dao.StudentDao
public ArrayList<StudentBean> queryStuByName(String sname) {
String sql = "SELECT 學號,姓名,性別,出生年月,家庭住址 FROM 學籍表 WHERE 姓名 LIKE '%" + sname + "%'";
// JDBC 執行查詢,封裝 List 返回
}
// QueryForm extends ActionForm
private String sname; // getter/setter
// QueryAction extends Action
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
QueryForm qf = (QueryForm) form;
String sname = new String(qf.getSname().getBytes("ISO-8859-1"), "GB2312"); // 編碼轉換
ArrayList<StudentBean> stus = new StudentDao().queryStuByName(sname);
request.setAttribute("stus", stus);
return new ActionForward("/result.jsp");
}
struts-config.xml<form-beans>
<form-bean name="queryForm" type="project02.QueryForm"/>
</form-beans>
<action-mappings>
<action name="queryForm" path="/query" type="project02.QueryAction"/>
</action-mappings>
<global-forwards>
<forward name="RESULT" path="/result.jsp"/>
</global-forwards>
queryform.jsp
<form action="/Project02/query.do" method="post">
請輸入學生姓名:<input name="sname">
<input type="submit" value="模糊查詢">
</form>
result.jsp
<%@page import="com.bean.StudentBean,java.util.ArrayList"%>
<table>
<tr><td>學號</td><td>姓名</td><td>性別</td><td>出生年月</td><td>家庭住址</td></tr>
<%
ArrayList<StudentBean> stus = (ArrayList<StudentBean>) request.getAttribute("stus");
for (StudentBean stu : stus) {
%>
<tr>
<td><%=stu.getStuId()%></td>
<td><%=stu.getStuName()%></td>
<td><%=stu.getStuSex()%></td>
<td><%=stu.getStuBir()%></td>
<td><%=stu.getStuAdd()%></td>
</tr>
<% } %>
</table>
<action name="hello" class="...HelloWorldAction">
<result name="success" type="dispatcher">/success.jsp</result>
<result name="input" type="dispatcher">/input.jsp</result>
<result name="json" type="json">
<param name="root">data</param>
</result>
<result name="redirect" type="redirect">/otherAction.action</result>
</action>
params:自動注入請求參數到 Action 屬性validation:配合 validate() 方法做服務端校驗fileUpload:處理文件上傳i18n:國際化語言切換| 現象 | 原因 | 解決 |
|---|---|---|
| 404 無法訪問 .action | struts.xml 未放在 classpath 根目錄 | 確保 src/struts.xml 編譯到 classes/ |
| 標籤庫報錯 | 缺少 struts2-core JAR 或 taglib uri 錯誤 | 檢查 WEB-INF/lib 及 <%@ taglib uri="/struts-tags" %> |
| 中文亂碼 | 請求/響應編碼不一致 | web.xml 配置 CharacterEncodingFilter UTF-8 |
| OGNL 表達式報錯 | 屬性名不匹配或類型轉換失敗 | 檢查 Action getter/setter 與表單 name 一致 |
Struts 2 以「約定優於配置」、強大的 OGNL 表達式、靈活的攔截器鏈著稱。掌握 Action → struts.xml → Result → View 核心流程,配合標籤庫開發效率極高。雖然新項目多選 Spring MVC,但維護舊系統、理解 MVC 演進歷史仍具價值。