承接上篇 Spring 配置,本文詳細演示如何在 Spring 2.5 基礎上整合 Struts 2,涵蓋 web.xml Filter 配置、struts.xml 核心常量、Spring Plugin 依賴、Action 開發與驗證全流程。
<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>
<!-- Spring ContextLoaderListener 保持不變 -->
<struts>
<constant name="struts.objectFactory" value="spring" />
<package name="mizi" namespace="" extends="struts-default">
<action name="Hello" class="Hello"> <!-- class 指向 Spring Bean ID -->
<result>/hello.jsp</result>
</action>
</package>
</struts>
關鍵點:struts.objectFactory=spring 將 Action 創建權委託給 Spring;Action 的 class 屬性不再寫全限定類名,而是 Spring Bean ID。
struts2-spring-plugin-2.0.11.1.jar 內含 StrutsSpringObjectFactory,是整合橋樑,缺失將報錯「Unable to load object factory」。
// test.action.Hello extends ActionSupport
private String username, sex; private int age;
// getter/setter 省略
public String execute() {
hello = "Hello:" + username + ";u is " + age + " age; and u is a " + sex;
return SUCCESS;
}
<bean id="Hello" class="test.action.Hello" scope="prototype"/>
scope=prototype 保證每次請求新實例,避免線程安全問題。
<%@ taglib prefix="s" uri="/struts-tags" %>
<s:form action="Hello">
<s:textfield name="username" label="u name"/>
<s:textfield name="age" label="u age"/>
<s:textfield name="sex" label="u sex"/>
<s:submit/>
</s:form>
結果頁 hello.jsp:<s:property value="hello"/>
訪問 https://localhost/miziStudy,填寫表單提交,頁面顯示「Hello:Mizi;u is 25 age; and u is a man」即代表整合成功。
StrutsPrepareAndExecuteFilter 替換 FilterDispatcher。Serializable 導致 Session 複制失敗(集群環境)。class 不一致導致「No bean named 'XXX' is defined」。/struts-tags 而非 https://struts.apache.org/tags-struts)。