struts2學習——Action

目錄

1、Action基本原理... 1

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

3Action屬性注入... 2

4Action通配符... 2

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

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

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


1、Action基本原理

1)當客戶端發出請求,請求到達控制器。

2)控制器根據請求創建一個ValueStack對象,每個請求創建一個Action對象,Action對象存入到ValueStack對象的root棧項。將ValueStack對象存入到request中。存儲的key爲“struts.valueStack”。

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() {
// 1、校驗輸入參數是否爲空
if(admin == null) {
errorMsg = "用戶名或密碼不能爲空!";
return"error";
}     
//2、取得帳號及密碼
String code = admin.getAdminCode();
String pwd = admin.getPassword();     
//3、根據帳號及密碼,查詢是否存在用戶數據
IAdminDao dao = DAOFactory.getAdminDAO();
Admin user = null;
try{
user = dao.findByCodeAndPwd(code, pwd);
} catch(DAOException e) {
e.printStackTrace();
errorMsg = "對不起,系統出現錯誤,請聯繫管理員!";
return"error";
}     
// 4、判斷取到底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;
}

3Action屬性注入

        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">
<!--爲這個屬性注入值爲/images -->
<paramname="savePath">/images</param>
<resultname="success">/WEB-INF/page/savePath.jsp</result>
</action>
</package>


上面通過<param>節點爲ActionsavePath屬性注入了值/images

4Action通配符

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>

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

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>

7Action動態方法調用

如果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"/>


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章