struts2教程(2)--配置
Struts2配置
一、Struts2配置文件加載順序
struts2 配置文件 由核心控制器加載 StrutsPrepareAndExecuteFilter ?(預處理,執行過濾)
??????????
init_DefaultProperties(); // [1] ---------- org/apache/struts2/default.propertiesinit_TraditionalXmlConfigurations(); // [2] --- struts-default.xml,struts-plugin.xml,struts.xmlinit_LegacyStrutsProperties(); // [3] --- 自定義struts.propertiesinit_CustomConfigurationProviders(); // [5] ----- 自定義配置提供init_FilterInitParameters() ; // [6] ----- web.xmlinit_AliasStandardObjects() ; // [7] ---- Bean加載結論 :
1、default.properties 該文件保存在 struts2-core-2.3.7.jar中 org.apache.struts2包里面 ?(常量的默認值)
2、struts-default.xml 該文件保存在 struts2-core-2.3.7.jar ?(Bean、攔截器、結果類型 )
3、struts-plugin.xml 該文件保存在struts-Xxx-2.3.7.jar ?(在插件包中存在 ,配置插件信息 )
4、struts.xml 該文件是web應用默認的struts配置文件 (實際開發中,通常寫struts.xml)
5、struts.properties 該文件是Struts的默認配置文件 ?(配置常量)
6、web.xml 該文件是Web應用的配置文件(配置常量)
?后加載文件中struts2常量會覆蓋之前加載文件 常量內容
二、Struts2的Action配置
1)必須要為<action>元素 配置<package>元素 ?(struts2圍繞package進行Action的相關配置 )
配置package 三個常用屬性
<package name="default" namespace="/" extends="struts-default">
1、name 包名稱,在struts2的配置文件文件中 包名不能重復 ,name并不是真正包名,只是為了管理Action
2、namespace 和 <action>的name屬性,決定Action的訪問路徑 ?(以/開始 )
3、extends 繼承哪個包,通常開發中繼承 struts-default包 (struts-default包在struts-default.xml定義 ),例如,如果需要使用json,則需要繼承json的包。
? 繼承struts-default包后,可以使用 包中定義攔截器和結果類型
?2)Action的通過<action>元素配置
<action name="hello" class="com.sihai.struts2.demo1.HelloAction">
<action>的name和 <package>的namespace屬性 共同決定Action的訪問路徑 !!!!!!!!
例如 :
<package name="default" namespace="/user" extends="struts-default"><action name="hello" class="com.sihai.struts2.demo1.HelloAction">?訪問路徑 /user/hello.action
?3) <action> 元素配置默認值
????<package> 的namespace默認值 “”?
??? <action> 的class默認值 ActionSupport類
??? <result> 的 name默認值 success
默認Action和 Action的默認處理類
1) 默認Action, 解決客戶端訪問Action不存在的問題 ,客戶端訪問Action,Action找不到,默認Action就會執行
<default-action-ref name="action元素的name" />2) 默認處理類 ,客戶端訪問Action,已經找到匹配<action>元素,但是<action>元素沒有class屬性,執行默認處理類
??
<default-class-ref class="完全類名" />*在struts-default.xml配置默認處理類 ActionSupport
三、Struts2的常量配置
1) struts2默認常量 在 default.properties中配置
2) 開發者自定義常量
struts.xml (要求)
格式 : <constant name="struts.devMode" value="true" />
struts.properties (要求)
????格式 : struts.devMode = true
web.xml
????格式?:
<filter><filter-name>struts2</filter-name><filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class><init-param><param-name>struts.devMode</param-name><param-value>true</param-value></init-param></filter>3) 常用常量
<constant name="struts.i18n.encoding" value="UTF-8"/> ----- 相當于request.setCharacterEncoding("UTF-8"); 解決post請求亂碼<constant name="struts.action.extension" value="action"/> --- 訪問struts2框架Action訪問路徑 擴展名 (要求)struts.action.extension=action,, 默認以.action結尾擴展名 和 不寫擴展名 都會分發給 Action<constant name="struts.serve.static.browserCache" value="false"/> false不緩存,true瀏覽器會緩存靜態內容,產品環境設置true、開發環境設置false<constant name="struts.devMode" value="true" /> 提供詳細報錯頁面,修改struts.xml后不需要重啟服務器 (要求) <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN""http://struts.apache.org/dtds/struts-2.3.dtd"><struts><package name="default" namespace="/" extends="struts-default"><!-- <default-action-ref name="default" /> --> <!-- 處理其它的action處理不了的請求路徑 --><default-class-ref class="com.sihai.action.DefaultAction" /><!-- 用于設置action默認處理類 --><action name="good"><result>/index.jsp</result></action><action name="hello" class="com.sihai.action.HelloAction"><result>/hello.jsp</result></action><action name="default" class="com.sihai.action.DefaultAction"><result>/default.jsp</result></action></package></struts>四、struts2 配置文件分離
通過 <include file="struts-part1.xml"/> 將struts2 配置文件 拆分
五、Action
HTTP請求 提交 Struts2 StrutsPrepareAndExecuteFilter核心控制器 ------請求分發給不同Action
Action書寫的的三種格式
第一種 Action可以是POJO ?((PlainOldJavaObjects)簡單的Java對象)---- 不需要繼承任何父類,實現任何接口
??? struts2框架 讀取struts.xml獲得 完整Action類名
??? obj = Class.forName("完整類名").newInstance();
???? Method m = Class.forName("完整類名").getMethod("execute"); ?m.invoke(obj);通過反射 執行 execute方法
第二種 編寫Action 實現Action接口
Action接口中,定義默認五種 邏輯視圖名稱
public static final String SUCCESS = "success"; ?// 數據處理成功 (成功頁面)
public static final String NONE = "none"; ?// 頁面不跳轉 ?return null;效果一樣
public static final String ERROR = "error"; ?// 數據處理發送錯誤(錯誤頁面)
public static final String INPUT = "input"; // 用戶輸入數據有誤,通常用于表單數據校驗 (輸入頁面)
public static final String LOGIN = "login"; // 主要權限認證(登陸頁面)
第三種 編寫Action ?繼承ActionSupport ?(推薦)
???在Action中使用 表單校驗、錯誤信息設置、讀取國際化信息 三個功能
六、Action的配置method(通配符)
1) 在配置 <action>元素時,沒有指定method屬性, 默認執行Action類中execute方法
<action name="request1" class="com.sihai.struts2.demo3.RequestAction1" />2) 在<action>元素內部 添加 method屬性,指定執行Action中哪個方法
??
<action name="regist" class="cn.itcast.struts2.demo4.RegistAction" method="regist"/> 執行 RegistAction 的regist方法? 將多個請求 業務方法 寫入到一個Action類中
<action name="addBook" class="com.sihai.struts2.demo4.BookAction" method="addBook" ></action><action name="delBook" class="com.sihai.struts2.demo4.BookAction" method="delBook" ></action>3) 使用通配符*,簡化struts.xml配置
<a href="${pageContext.request.contextPath }/user/customer_add.action">添加客戶</a><a href="${pageContext.request.contextPath }/user/customer_del.action">刪除客戶</a>struts.xml
<action name="customer_*" class="com.sihai.struts2.demo4.CustomerAction" method="{1}"></action> --- {1}就是第一個* 匹配內容七、動態方法調用
訪問Action中指定方法,不進行配置
???1) 在工程中使用 動態方法調用 ,必須保證 struts.enable.DynamicMethodInvocation = true常量值 為true
???2) 在action的訪問路徑 中 使用"!方法名"
頁面
<a href="${pageContext.request.contextPath }/user/product!add.action">添加商品</a>配置
<action name="product" class="com.sihai.struts2.demo4.ProductAction"></action>執行 ProductAction 中的 add方法
八、Action訪問Servlet
1、 在Action中解耦合方式 間接訪問 Servlet API ?---------使用 ActionContext對象
在struts2 中 Action API 已經與Servlet API 解耦合 (沒有依賴關系 )
Servlet API 常見操作 : 表單提交請求參數獲取,向request、session、application三個范圍存取數據
actionContext = ActionContext.getContext();
1) actionContext.getParameters(); 獲得所有請求參數Map集合
2) actionContext.put("name", "sihai"); / actionContext.get("company")對request范圍存取數據
3) actionContext.getSession(); 獲得session數據Map,對Session范圍存取數據
4) actionContext.getApplication(); 獲得ServletContext數據Map,對應用訪問存取數據
package com.sihai.action;import java.util.Map;import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport;//獲取servlet api 通過ActionContext獲取 public class ServletDemo1Action extends ActionSupport {@Overridepublic String execute() throws Exception {// 1.獲取ActionContextActionContext context = ActionContext.getContext();// 2.獲取Servlet api// 2.1 獲取application中數據// Map<String, Object> applicationMap = context.getApplication();// System.out.println(applicationMap.get("aname"));//// // 2.2 獲取session中數據// Map<String, Object> sessionMap = context.getSession();// System.out.println(sessionMap);//// // 2.3 獲取請求參數// Map<String, Object> paramMap = context.getParameters();// //request.getParameterMap();// System.out.println(((String[])paramMap.get("username"))[0]);// 2.4 向request范圍存儲數據context.put("username", "tom");// context.get("username");return SUCCESS;} } com.sihai.action;import java.util.Map;import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport;//獲取servlet api 通過ActionContext獲取 public class ServletDemo1Action extends ActionSupport {@Overridepublic String execute() throws Exception {// 1.獲取ActionContextActionContext context = ActionContext.getContext();// 2.獲取Servlet api// 2.1 獲取application中數據// Map<String, Object> applicationMap = context.getApplication();// System.out.println(applicationMap.get("aname"));//// // 2.2 獲取session中數據// Map<String, Object> sessionMap = context.getSession();// System.out.println(sessionMap);//// // 2.3 獲取請求參數// Map<String, Object> paramMap = context.getParameters();// //request.getParameterMap();// System.out.println(((String[])paramMap.get("username"))[0]);// 2.4 向request范圍存儲數據context.put("username", "tom");// context.get("username");return SUCCESS;} }2、 使用接口注入的方式,操作Servlet API(耦合)
ServletContextAware : 注入ServletContext對象
ServletRequestAware :注入 request對象
ServletResponseAware : 注入response對象
package com.sihai.action;import java.util.Map;import javax.servlet.http.HttpServletRequest;import org.apache.struts2.interceptor.ServletRequestAware;import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport;//獲取servlet api 通過注入方式 public class ServletDemo2Action extends ActionSupport implementsServletRequestAware {private HttpServletRequest request;@Overridepublic String execute() throws Exception {System.out.println(request.getParameter("username"));return null;}public void setServletRequest(HttpServletRequest request) {this.request = request;} } com.sihai.action;import java.util.Map;import javax.servlet.http.HttpServletRequest;import org.apache.struts2.interceptor.ServletRequestAware;import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport;//獲取servlet api 通過注入方式 public class ServletDemo2Action extends ActionSupport implementsServletRequestAware {private HttpServletRequest request;@Overridepublic String execute() throws Exception {System.out.println(request.getParameter("username"));return null;}public void setServletRequest(HttpServletRequest request) {this.request = request;} }3、 在Action中直接通過ServletActionContext 獲得Servlet API
ServletActionContext.getRequest() : 獲得request對象 (session)
ServletActionContext.getResponse() : 獲得response對象
ServletActionContext.getServletContext() : 獲得ServletContext對象
靜態方法沒有線程問題,ThreadLocal
package com.sihai.action;import java.util.Map;import javax.servlet.http.HttpServletRequest;import org.apache.struts2.ServletActionContext; import org.apache.struts2.interceptor.ServletRequestAware;import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport;//獲取servlet api 通過ServletActionContext獲取 public class ServletDemo3Action extends ActionSupport {@Overridepublic String execute() throws Exception {HttpServletRequest request = ServletActionContext.getRequest();System.out.println(request.getParameter("username"));return SUCCESS;}} com.sihai.action;import java.util.Map;import javax.servlet.http.HttpServletRequest;import org.apache.struts2.ServletActionContext; import org.apache.struts2.interceptor.ServletRequestAware;import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport;//獲取servlet api 通過ServletActionContext獲取 public class ServletDemo3Action extends ActionSupport {@Overridepublic String execute() throws Exception {HttpServletRequest request = ServletActionContext.getRequest();System.out.println(request.getParameter("username"));return SUCCESS;}}九、Result結果類型
Action處理請求后, 返回字符串(邏輯視圖名),需要在struts.xml提供 <result>元素定義結果頁面
1、 局部結果頁面 和 全局結果頁面
<action name="result" class="com.sihai.struts2.demo6.ResultAction"><!-- 局部結果 當前Action使用 --><result name="success">/demo6/result.jsp</result></action><global-results><!-- 全局結果 當前包中 所有Action都可以用--><result name="success">/demo6/result.jsp</result></global-results>
?
2、 結果頁面跳轉類型
* 在struts-default.xml定義了 一些結果頁面類型
* 使用默認type是 dispatcher轉發 (request.getRequestDispatcher.forward)
1) dispatcher :Action轉發給 JSP
2) chain :Action調用另一個Action(同一次請求)
<result name="success" type="chain">hello</result> hello是一個Action的name3) redirect: Action重定向到JSP
4) redirectAction:Action重定向到另一個Action
<result name="success" type="redirectAction">hello</result>總結
以上是生活随笔為你收集整理的struts2教程(2)--配置的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: struts2教程--快速入门
- 下一篇: struts2教程(3)--请求参数处理