Struts2的Action類很有意思,你可以使用3種方式來實現具體的Action類:
- 讓你的Action類繼承自ActionSupport類(項目中最常用這種方式,因為ActionSupport類中定義了很多幫助方法)
- 讓你的Action類實現Action接口
- 使用POJO的方式來實現,只要Action類中有一個返回值為String的execute方法就好了(這種方式使Action類最容易被測試)
以上三種Action的實現方式都可以被struts2框架自動識別,如果你在struts.xml里面配置了一個action塊但是沒有配置action類的路徑,這樣框架默認使用ActionSupport來處理請求。
但是在實際使用struts2的過程中我發現了一個問題,一個Action只有一個execute方法來處理一類請求,如果我開發的某塊功能有100個不同的請求那我豈不是要寫100個Action類,每個類實現一個execute方法,這樣雖然滿足了一個類一個責任的設計原則,但是會不會造成“類爆炸”?后來看了struts2的文檔才知道,其實我們可以使用struts2靈活的通配符配置來達到減少action類的目的:
先來看看一個簡單的時序圖
請求從這個頁面發起,只是簡單的兩個鏈接
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <a href="infoadd">ADD INFO</a><br> <a href="infodel">DEL INFO</a><br> </body> </html>
請求的控制轉發是在struts.xml里面配置的
<struts> <constant name="struts.enable.DynamicMethodInvocation" value="true" /> <package name="mypack" extends="struts-default"> <action name="info*" class="com.stone.struts2.action.MyFirstAction" method="{1}"> <result>/{1}info.jsp</result> <allowed-methods>add,del</allowed-methods> </action> </package> </struts>
上面這個XML的配置內容有幾點需要注意:
- 我開啟了struts2的RMI,apache struts基於安全性考慮,RMI默認是關閉的。
- 大家看到action name的值跟平常有點不一樣,我使用了星號通配符用來匹配JSP中的兩個鏈接:infoadd和infodel, 要配置method="{1}", 這樣要被調用的method名字就分別是add和del了。
- result的JSP頁面的名字也可以用通配符來配置,我分別定義了兩個JSP,addinfo.jsp和delinfo.jsp,這樣正好一一對應。
- 注意在struts2.5之后,基於安全性考慮struts2默認開啟了SMI,必須顯示定義Action中能被請求調用的方法,所以我有配置<allowed-methods>
看看這個Action類
public class MyFirstAction extends ActionSupport { public String add() { return SUCCESS; } public String del() { return SUCCESS; } }
這個demo是為了測試struts2的通配符配置,所以兩個JSP里面的內容只是返回一句話而已,這里我就不貼出來了,現在看看調用,我點第一個鏈接:

點第二個鏈接
由此可見,struts2的通配符配置真的是很靈活很強大滴,這樣我們在實際項目開發中可以少寫很多Action類並減少很多配置。
