Struts2簡要概述
- 三層架構中的表現層框架
- 相對于常規的MVC模式, 其核心為Filter控制器
- 內部的Filter實例是在客戶端每發送一次就實例化一次, 相比于Servlet具有線程安全性
- 內部控制器默認攔截以.action或無后綴名的url
Struts2案例步驟
- 配置web.xml, 由于Struts2核心為Fiter, 所以需要在web.xml中配置過濾器
<filter><filter-name>struts2</filter-name><filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping><filter-name>struts2</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>
<!-- StrutsPrepareAndExecuteFilte代表struts2的核心控制器-->
- 建立addUser.jsp文件: 在addUser.jsp中處理用戶的操作請求
例如: <a href="${pageContext.request.contextPath}/addUser.action">添加用戶</a>
例如: <struts><package name="p1" extends="struts-default"><action name="addUser" class="com.strutstest.action.DemoAction" method="addUser"><result name="success">/success.jsp</result></action></package></struts>
//例如:
public class DemoAction extends ActionSupport{public String addUser(User user){if(user != null){userList.add(user);return SUCCESS; //ActionSupport中的字符串常量, 代表"success"}else{System.out.println("user == null");return ERROR; //ActionSupport中的字符串常量, 代表"error"}}
}
- 結果視圖: 如果用戶添加操作正確, 返回"success"至result中, 將會請求轉發至success.jsp中, 操作失敗不做任何轉發操作
上述案例執行過程
- 加載web.xml- 實例化并初始化過濾器; 與web.xml同時發生- 由StrutsPrepareAndExecuteFilte加載struts.xml, 加載時間優先于web.xml- 客戶端發送addUser.action的請求- 請求到達過濾器- 由過濾器攔截該請求, 在struts.xml中查找對應的namespace- 6中操作成功后, 獲得動作名稱addUser, 然后在struts.xml中查找對應的action name; 若操作失敗, 重新遍歷整個root, 如果還未找到則報404- 根據struts.xml中action標簽中的class屬性去工程中查找對應的動作類- 找到動作類后, 調用動作方法, 獲得方法返回值, 根據返回值查找對應的jsp界面
Struts2配置文件的加載過程
在應用加載的時候加載, 在應用運行過程中只加載一次
- default.properties //系統默認配置文件, 不可修改- struts-default.xml //struts2的核心配置, 不可修改- struts-plugin.xml //不可修改- struts.xml //當前應用, 可修改- struts.properties //當前應用, 可修改- web.xml //當前引用
注:- 具有多個配置文件的時候,且配置文件參數相同, 后一個的配置文件信息會覆蓋前一個配置文件的信息- 使用系統默認的攔截器的時候, 攔截器總是執行兩遍; 執行過程: 正向一遍-> 將結果反饋到jsp中-> 然后反向一遍
Struts2提供的常量
下面列舉常用常量:
- struts.i18n.encoding 默認編碼utf-8
- struts.multipart.parser 指定文件上傳組件,默認jakarta
- struts.multipart.maxSize 默認值:2097152 文件上傳總文件大小限制:2M
- struts.action.extension 默認為"action"或者為空 能進入Struts2框架內部的url地址后綴名。多個值用逗號分隔, 可以加空格表示沒有后綴
- struts.enable.DynamicMethodInvocation 默認false 是否允許動態方法調用
- struts.devMode 默認false 是否是開發模式, 進入開發者模式, 修改Struts.xml無需重啟服務器
常量覆蓋方式
- 使用< constant name=“常量名” value=“值”></ constant>
Struts.xml文件主要標簽及屬性
- package: 配置文件的分包管理, 與java中的package一致
內部屬性:1. name: 包名, 必須寫且唯一2. extends: 默認繼承struts-default包(類似于java中Object), 提供Struts2核心功能3. namespace: 名稱空間, 名稱空間 + 動作名稱 = 訪問路徑4. abstract: 聲明當前包為抽象包, 沒有action標簽的包都可以是抽象包
例:<package name="p1" extends="struts-default" namespace="/a"></package>
注: namespace沒有寫的情況下使用默認提供的命名空間及""(表示空串)
記住: namespace的查找是在整個root下尋找, 而action的查找只在所有的滿足條件的namespace下查找(感覺自己都講不清楚, 版面太小無法敘述)
- action: 配置動作行為, 表示用戶執行的動作
內部屬性:1. name: 動作名稱2. class: 動作類, 默認動作類com.opensymphony.xwork2.ActionSupport(在Struts-default中定義)3. method: 動作類中包含的動作方法, 用于執行用戶動作請求, 默認public String execute(){}
例:<action name="addUser" class="com.strutstest.action.DemoAction" method="addUser"></action>
注: 動作方法必須滿足: public, 返回值String, 無參數;為了滿足動作方法的靈活調用, 避免寫死代碼, 所以使用通配符代替屬性參數, 或者通過動態調用.例如:通配符:<action name="*" class="com.strutstest.action.DemoAction" method="{1}"><result name="success">/{1}.jsp</result></action>"*"代表用戶要執行的操作, {1}代表截取用戶操作的名稱(此時動作方法中也要具有相同名稱的動作方法, 跳轉的頁面也要具有相同的動作名稱)動態調用:在index.jsp中我們寫的操作鏈接如下:注: 在動態方法調用之前要修改default中常量值, 保證可以使用動態方法調用, 如下的<constant><a href="${pageContext.request.contextPath}/user/user!addUser.action">在struts.xml中action對應的寫法是:<constant name="struts.enable.DynamicMethodInvocation" value="true"><package name="user" extends="struts-default" namespace="/user"><action name="user" class="com.strutstest.action.DemoAction"><result name="success">/success.jsp</result></action></package>當執行動態調用的時候就是反射截取user!addUser.action中"!"后面的addUser
- result: 結果視圖, 獲得動作方法反饋后進行頁面跳轉或顯示
內部屬性:1. name: 邏輯視圖名稱2. type: 跳轉類型, 取值在struts-default.xml中有介紹, 但也可以自定義type類型注:type 常用取值: dispatcher(默認值, 請求轉發), redirect(頁面重定向), redirectAction(動作重定向), chain(動作請求轉發);動作請求轉發可以在相同或不同名稱空間轉發例:chain: 轉發到另一個動作同包下直接使用: <result name=”success” type=”chain”>action2</action>不同包使用: <result name=”success” type=”chain”> //觸發Servle****Result的類, 獲取namespace與actionName的值, 確定轉發的空間與動作<param name=”namespace”>/n2<param> <param name=”actionName”>action3<param></result>redirectAction: 重定向到另一個動作同包下與chain操作一直, 直接type=”redirectAction”不同包下與chain一致, 將type修改即可3. param: 當需要轉發到不同包下的動作, 當需要自定義結果視圖使用param修改內部參數注: 通過反射機制獲取setter方法, 將param中參數通過依賴注入對結果類參數進行修改4. 自定義結果類型: 讓自定義的javaBean實現com.opensymphony.xwork2.Result接口或者繼承該接口的實現類org.apache.struts2.dispatcher.StrutsResultSupport重寫doExecute方法, 執行自定義的結果視圖
動作類的3中書寫方式
- 直接寫一個簡單的JavaBean, 不推薦使用, 可操作性太低
- 寫一個實現com.opensymphony.xwork2.Action接口的類
此接口提供默認的動作方法execute()以及默認的動作返回值( SUCCESS, ERROR, INPUT, LOGIN, NONE)
- 動作類繼承com.opensymphony.xwork2.ActionSupport類
動作類中訪問Servlet的API
HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
HttpSessionContent session = request.getSession(); //session不能使用ServletActionContext獲得
動作類實現ServletRequestAware, ServletResponseAware
重寫接口方法即可獲得對應的request, response
有問題請指教(我會很O(∩_∩)O~~), 喜歡請點個贊喲!!!
總結
以上是生活随笔為你收集整理的Struts2_1_基础案例_配置文件详解_动作类的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。