struts2通配符,動態方法的調用

動態方法調用
在Struts2中動態方法調用有三種方式,動態方法調用就是爲了解決一個Action對應多個請求的處理,以免Action太多

第一種方式:指定method屬性
這種方式我們前面已經用到過,類似下面的配置就可以實現
<action name="chainAction" class="chapter2.action.Chapter2Action"
method="chainAction">
<result name="chainAction" type="chain">redirect</result>
</action>  
<action name="plainText" class="chapter2.action.Chapter2Action"
method="plainText">
<result name="plainText" type="plainText">/WEB-INF/JspPage/chapter2/plaintext.jsp</result>
</action>

第二種方式:感嘆號方式(需要開啓),官網不推薦使用這種方式,建議大家不要使用.
用這種方式需要先開啓一個開關
<constant name="struts.enable.DynamicMethodInvocation" value="true" /> 
將此常量設置爲true,這種方式才能使用,使用見示例
Action
package chapter3.action;

public class Chapter3Action {
public String result1(){
   return "result1";
}

public String result2(){
   return "result2";
}
}

Jsp中訪問方式
<body>
    <a href="basePath/chapter3/chapter3Action!result1">result1</a><br><ahref="basePath/chapter3/chapter3Action!result1">result1</a><br><ahref="{basePath}/chapter3/chapter3Action!result2">result2</a><br>
</body> 
如果配置了後綴,必須這樣寫:
/chapter4/chapter4Action!create.action
XML中配置方式
<package name="chapter3" namespace="/chapter3" extends="struts-default">
   <action name="chapter3Action" class="chapter3.action.Chapter3Action">
    <result name="result1">/WEB-INF/JspPage/chapter3/result1.jsp</result>
    <result name="result2">/WEB-INF/JspPage/chapter3/result2.jsp</result>
    <result name="chapter3">/WEB-INF/JspPage/chapter3/chapter3.jsp</result>
   </action>
</package>

第三種方式:通配符方式(官網推薦使用)
首先得關閉開關
<constant name="struts.enable.DynamicMethodInvocation" value="false" /> 
這一種方式是由第一種轉變過來的,我們可以看到,第一種方式有很多重複的代碼,那麼我們可以進行變形,看下面的代碼
<action name="chapter3_*" class="chapter3.action.Chapter3Action"
method="{1}">
<result name="test">/…/test.jsp</result>
</action> 
chapter3_*這裏的*就是你呆會要匹配的字符串,即你在後面的請求中得這樣寫
http://...../ chapter3_create 或 http://...../ chapter3_update
注意,這時你action中必須有create和update方法與之匹配,甚至還可以這樣匹配
<action name="chapter3_*" class="chapter3.action.Chapter3Action"
method="{1}">
<result name="test">/…/{1}.jsp</result>
</action> 
但是這時一定要有對應的JSP頁面存在,並且相應的路徑不能錯,這就對我們的命名進行了強制性的規定,一定要規範.

課堂示例:
Action
public class Chapter4Action extends ActionSupport {
public String list(){
   return "list";
}

public String create(){
   return "create";
}

public String index(){
   return "index";
}

XML:
<action name="chapter4_*" class="chapter4.action.Chapter4Action" method="{1}">
    <result name="{1}">/WEB-INF/JspPage/chapter4/chapter4_{1}.jsp</result>
</action>


訪問Servlet API
有時我們需要用到Request, Response, Session,Page, ServletContext這些我們以前常用的對象,那麼在Struts2中怎麼樣使用到這些對象呢,通常有三種方式.
間接訪問1
//向Session中放
   ActionContext.getContext().getSession().put("wdpc", "Session中的WDPC");
  
   //向request中放
   ActionContext.getContext().put("wdpc","request中的WDPC");
  
   //向application中放
   ActionContext.getContext().getApplication().put("wdpc", "Application中的WDPC");
   
取值方式:
ActionContext.getContext().getSession().get("wdpc");
間接訪問2


Struts2中提供了一個靜態類,他裏面的方法可以獲取到我們的HttpServletResponse, HttpServletRequest, 然後呢就可以還原到我們以前的使用方式了.

直接訪問
雖然Struts2提供了ActionContext來訪問Servlet API,但是這種方式畢竟不能直接獲取Servelt API實例,爲了在Action中直接訪問Servlet API,Struts2還提供了一系列接口
ServletContextAware   實現此接口後,可以取得ServletContext
ServletRequestAware   實現此接口後,可以取得HttpServletRequest
ServletResponseAware 實現此接口後,可以取得HttpServletResponse
SessionAware         實現此接口後,可以取得HttpSession,注意,這裏有點特殊,取得的是一個Map<String,Object> session,攔截器負責將session中存儲的鍵值進行解析,並一一對應.

所以我們通常的做法是:
public class BaseAction implements ServletResponseAware, ServletRequestAware,
   SessionAware {

protected HttpServletResponse response;
protected HttpServletRequest request;
protected Map<String, Object> session;

public void setServletResponse(HttpServletResponse response) {
   this.response = response;
}

public void setServletRequest(HttpServletRequest request) {
   this.request = request;
}

public void setSession(Map<String, Object> session) {
   this.session = session;
}

public HttpServletResponse getResponse() {
   return response;
}

public void setResponse(HttpServletResponse response) {
   this.response = response;
}

public HttpServletRequest getRequest() {
   return request;
}

public void setRequest(HttpServletRequest request) {
   this.request = request;
}

public Map<String, Object> getSession() {
   return session;
}
}

爲了讓BaseAction能有驗證的功能,並且不能被實例化,開發中我們會這樣做:
public abstract class BaseAction extends ActionSupport implements
ServletResponseAware, ServletRequestAware, SessionAware 
然後讓我們每個模塊的Action來繼承這個BaseAction類,然後我們就可以在Action中直接使用Servelt的API了.


以上轉自:http://www.cnblogs.com/yangy608/archive/2010/11/08/1871958.html


在配置<action …./>元素時,需要指定name,class和method屬性,這三個屬性都支持通配符。

例如: 
1.<action name = ”*Action” class = “student.RegisterAction” method = “{1}”> 
如果用戶請求的URL爲loginAction.action,則調用student.RegisterAction中的login()方法 

2.<action name=”*Action” class = “student.{1}Action”> 
如果用戶請求的URL爲loginAction.action,則調用student.LoginAction中的execute(),因爲沒有指定method屬性,既總是使用execute方法來處理用戶請求。 

3.<action name = ”*_*” method = “{2}” class=”actions.{1}”> 
如果用戶請求爲Book_save.action,則調用Book處理類的save()方法來處理用戶請求 

4.<action name=”*”><result>/{1}.jsp</result></action> 
改action匹配任意的Action,即所有的用戶請求都可以通過該Action來處理。因爲沒有爲該action指定class屬性,即該action使用ActionSupport來作爲處理類,而且因爲該ActionSupport類的execute()返回的的success字符串,即該action總是直接返回result中指定的jsp資源。

當使用通配符配置action時,會經常出現一個action請求符合多個action的情況。此時會先在Struts.xml文件中查找同名的action(沒有使用匹配符),則一定由該Action來處理用戶請求。如果沒有則查找帶有匹配符的action,此時是先找到那個符合的action由那個進行處理。 
即除非請求的URL與action的name屬性絕對相同,否則將按先後順序來決定哪個action來處理用戶請求。因此,應該將名爲*的action配置在最後,否則struts2將使該action來處理所有希望使用模式匹配的請求


轉自:http://www.cnblogs.com/prairielonewolf/archive/2013/12/02/3425898.html

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