struts2學習——Action

目錄java

一、Action基本原理... 1web

2、在Action中訪問Session/Application/. 1spring

3Action屬性注入... 2瀏覽器

4Action通配符... 2緩存

5struts2常量定義(請求後綴)3session

6、爲應用指定多個struts配置文件... 4app

7Action動態方法調用... 5jsp


一、Action 基本原理

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進行實現,也就是由struts2container來設定。

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 屬性注入

        Struts2Action中的屬性提供例如依賴注入功能,在配置文件中咱們能夠很方便的爲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>節點爲ActionsavePath屬性注入了值/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.xmlstruts.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";
}
}

假設訪問上面actionURL路徑爲: /struts/test/helloworld.action

要訪問actionother() 方法,咱們能夠這樣調用:

/struts/test/helloworld!other.action

若是不想使用動態方法調用,咱們能夠經過常量struts.enable.DynamicMethodInvocation關閉動態方法調用。

<constant name="struts.enable.DynamicMethodInvocation"value="false"/>

相關文章
相關標籤/搜索