目錄java
一、Action基本原理web
2、在Action中訪問Session/Application/spring
3、Action屬性注入瀏覽器
4、Action通配符緩存
5、struts2常量定義(請求後綴)session
6、爲應用指定多個struts配置文件app
7、Action動態方法調用jsp
1)當客戶端發出請求,請求到達控制器。ide
2)控制器根據請求建立一個ValueStack對象,每一個請求建立一個Action對象,Action對象存入到ValueStack對象的root棧項。將ValueStack對象存入到request中。存儲的key爲「struts.valueStack」。ui
3)控制器調用Action對象接受請求參數,執行業務方法處理。
4)控制器根據Action返回值調用result視圖組件處理。
5)請求處理完成後,將ValueStack對象和Action對象銷燬。
2 、在Action 中訪問Session/Application/1)利用ActionContext返回Map方式類型(servlet不相關的非IoC取得Request等對象的方式)
這種方法先取得ActionContext,而後獲取Map類型的request等對象
ActionContext context = ActionContext.getContext(); Map<String,Object> session = context.getSession(); Map<String,Object> request = (Map<String,Object>)this.context.get("request"); Map<String,Object> application =this.context.getApplication();
2)利用ServletActionContext返回的是Servlet類型(servlet 相關的非IoC 取得Request等對象的方式)
這種方法能夠獲取servlet相關的request等對象,取出的request對象不僅僅是設定屬性的做用,而是能夠獲取http相關的信息。
HttpServletRequestrequest = ServletActionContext.getRequset(); HttpSessionsession = request.getSession(); ServletContextapplication = ServletActionContext.getgetServletContext();
3)實現接口(servlet 不相關的 IoC 取得Request等對象的方式)
實現特定的RequestAware, SessionAware, ApplicationAware等接口,由container來設定request等對象。
publicabstractclassBaseAction implementsSessionAware { // 自定義屬性來接收注入的Session privateMap<String, Object> session; // 用於子類取得Session publicMap<String, Object> getSession() { returnsession; } // Struts2經過此方法注入Session publicvoidsetSession(Map<String, Object> m) { System.out.println("BaseAction.setSession()..."); session = m; } }
publicclassLoginAction extendsBaseAction { privateAdmin admin; privateString errorMsg; publicAdmin getAdmin() { returnadmin; } publicvoidsetAdmin(Admin admin) { this.admin = admin; } publicString execute() { // 一、校驗輸入參數是否爲空 if(admin == null) { errorMsg = "用戶名或密碼不能爲空!"; return"error"; } //二、取得賬號及密碼 String code = admin.getAdminCode(); String pwd = admin.getPassword(); //三、根據賬號及密碼,查詢是否存在用戶數據 IAdminDao dao = DAOFactory.getAdminDAO(); Admin user = null; try{ user = dao.findByCodeAndPwd(code, pwd); } catch(DAOException e) { e.printStackTrace(); errorMsg = "對不起,系統出現錯誤,請聯繫管理員!"; return"error"; } // 四、判斷取到底user是否爲空 if(user == null) { // 若爲空,則輸入的是非法的賬號密碼,繼續登陸 errorMsg = "用戶名或密碼不匹配!"; return"error"; } else{ // 若不爲空,則合法,進入首頁 getSession().put("user", user); System.out.println("user:"+getSession().get("user")); return"success"; } } publicString getErrorMsg() { returnerrorMsg; } publicvoidsetErrorMsg(String errorMsg) { this.errorMsg = errorMsg; } }
4)實現接口(servlet相關的 IoC 取得Request等對象的方式)
這種方法也能夠獲取servlet相關的request等對象,也就是說這種方式取出的request對象不僅僅是設定屬性的做用,而是能夠獲取http相關的信息。
可是取出方法是經過接口ServletRequestAware, ServletContextAware進行實現,也就是由struts2的container來設定。
privateHttpServletRequest request; privateHttpSession session; privateServletContext application; publicString execute() throwsException { this.request =ServletActionContext.getRequest(); this.session = this.request.getSession(); this.application =ServletActionContext.getServletContext(); returnSUCCESS; }3 、Action 屬性注入
Struts2爲Action中的屬性提供例如依賴注入功能,在配置文件中咱們能夠很方便的爲Action中的屬性注入值,可是,屬性必須提供setter方法。
Action:
publicclass ActionTest1 { privateStringsavePath; publicStringgetSavePath() { returnsavePath; } publicvoid setSavePath(StringsavePath) { this.savePath = savePath; } publicStringexecute() { return"success"; } }
struts.xml:
<packagename="Test5a"namespace="/test5"extends="struts-default"> <actionname="list"class="cn.action.ActionTest1"method="execute"> <!--爲這個屬性注入值爲/p_w_picpaths --> <paramname="savePath">/p_w_picpaths</param> <resultname="success">/WEB-INF/page/savePath.jsp</result> </action> </package>
上面經過<param>節點爲Action的savePath屬性注入了值/p_w_picpaths
4 、Action 通配符
publicclass UserAction { // 模擬user新增功能 publicString add() { System.out.println("模擬user的新增..."); return"success"; } //模擬user的修改 publicString modify() { System.out.println("模擬user的修改..."); return"success"; } publicString query() { System.out.println("模擬user的查詢..."); return"success"; } }
<struts> <packagename="user"namespace=""extends="struts-default"> <actionname="*_*_*"class="com.tarena.action.{1}Action"method="{2}"> <resultname="success">/WEB-INF/jsp/{3}.jsp</result> </action> </package> </struts>5 、struts2 常量定義( 請求後綴)
1)、請求後綴
struts2默認使用.action後綴訪問Action。其實默認後綴是能夠經過常量
「struts.action.extension」進行修改的,例如:咱們能夠配置Struts2只處理以.do爲後綴的請求路徑:
<struts>
<constant name="struts.action.extension"value="do"/>
</struts>
若是用戶須要指定多個請求後綴,則多個後綴之間以英文逗號(,)隔開。如:
<constantname="struts.action.extension" value="do,go"/>
2)、常量定義:
常量能夠在struts.xml或struts.properties中配置,建議在struts.xml中配置,兩種配置方式以下:
在struts.xml文件中配置常量
<struts>
<constant name="struts.action.extension"value="do"/>
</struts>
在struts.properties中配置常量:struts.action.extension=do
由於常量能夠在下面多個配置文件中進行定義,因此咱們須要瞭解struts2加載常量的搜索順序:
struts-default.xml
struts-plugin.xml
struts.xml
struts.properties
web.xml
若是在多個文件中配置了同一個常量,則後一個文件中配置的常量值會覆蓋前面文件中配置的常量值。
3)、常量介紹:
<!--指定默認編碼集,做用於HttpServletRequest的setCharacterEncoding方法和freemarker 、velocity的輸出 --> <constantname="struts.i18n.encoding"value="UTF-8"/> <!-- 該屬性指定須要Struts 2處理的請求後綴,該屬性的默認值是action,即全部匹配*.action的請求都由Struts2處理。 若是用戶須要指定多個請求後綴,則多個後綴之間以英文逗號(,)隔開。--> <constantname="struts.action.extension"value="do"/> <!-- 設置瀏覽器是否緩存靜態內容,默認值爲true(生產環境下使用),開發階段最好關閉--> <constantname="struts.serve.static.browserCache"value="false"/> <!-- 當struts的配置文件修改後,系統是否自動從新加載該文件,默認值爲false(生產環境下使用),開發階段最好打開--> <constantname="struts.configuration.xml.reload"value="true"/> <!-- 開發模式下使用,這樣能夠打印出更詳細的錯誤信息--> <constantname="struts.devMode"value="true"/> <!-- 默認的視圖主題--> <constantname="struts.ui.theme"value="simple"/> <!– 與spring集成時,指定由spring負責action對象的建立--> <constantname="struts.objectFactory"value="spring"/> <!–該屬性設置Struts 2是否支持動態方法調用,該屬性的默認值是true。若是須要關閉動態方法調用,則可設置該屬性爲false。--> <constantname="struts.enable.DynamicMethodInvocation"value="false"/> <!--上傳文件的大小限制--> <constantname="struts.multipart.maxSize"value=「10701096"/>6 、爲應用指定多個struts 配置文件
<struts>
<includefile="struts-user.xml"/>
<includefile="struts-order.xml"/>
</struts>
7 、Action 動態方法調用若是Action中存在多個方法時,咱們可使用!+方法名調用指定方法。以下:
publicclassHelloWorldAction{ privateString message; publicString execute() throwsException{ this.message= "個人第一個struts2應用"; return"success"; } publicString other() throwsException{ this.message= "第二個方法"; return"success"; } }
假設訪問上面action的URL路徑爲: /struts/test/helloworld.action
要訪問action的other() 方法,咱們能夠這樣調用:
/struts/test/helloworld!other.action
若是不想使用動態方法調用,咱們能夠經過常量struts.enable.DynamicMethodInvocation關閉動態方法調用。
<constant name="struts.enable.DynamicMethodInvocation"value="false"/>