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