Struts2零配置開發(註解Annotation的使用)二

接上篇http://lichuanbao.iteye.com/admin/blogs/1090836
4,Namespace annotation
可以定義在Action中或者是定義在package-info.java文件中。在Action中定義的@Namespace會應用在該Action中所有的相對url上。如果定義在package-info.java文件中,那麼該包中的所有的Action的namespace(不包括子包中的action)。
實例代碼一:在Action中使用@Namespace註解。
package com.example.actions;

import com.opensymphony.xwork2.ActionSupport; 
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;

@Namespace("/custom")
public class HelloWorld extends ActionSupport {
  @Action("/different/url")
  public String execute() {
    return SUCCESS;
  }

  @Action("url")
  public String doSomething() {
    return SUCCESS;
  }
}
如上代碼,execute()訪問的url爲/different/url,doSomething()的訪問url爲/custom/url,這個路徑前面追加了@Namespace。

示例代碼二:在package-info.java中配置@Namespace註解
@org.apache.struts2.convention.annotation.Namespace("/custom")
package com.example.actions;
那麼包com.example.actions中所有的action的Namespace都被指向了/custom。

5,ResultPath annotation,用來改變結果頁面所在的目錄。如下例所示
package com.example.actions;

import com.opensymphony.xwork2.ActionSupport; 
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.ResultPath;

@ResultPath("/WEB-INF/jsps")
public class HelloWorld extends ActionSupport {
  public String execute() {
    return SUCCESS;
  }
}
該Action跳轉的結果頁面將指向/WEB-INF/jsps目錄。

6,ParentPackage annotation,用來改變特定的Action類或者是java包的parent XWork packages(不好意思,這幾個單詞怎麼翻譯覺得都不好,就直接引用了)。示例代碼如下
package com.example.actions;

import com.opensymphony.xwork2.ActionSupport; 
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.ParentPackage;

@ParentPackage("customXWorkPackage")
public class HelloWorld extends ActionSupport {
  public String execute() {
    return SUCCESS;
  }
}


7,ExceptionMapping Annotation,用來配置action出現異常時的跳轉路徑。該註解同樣可以使用params屬性配置要傳入的參數。該註解可以配置在Action級別和Method級別,配置在Action級別對所有的Method都適用;配置在Method級別只對當前的Method使用。示例代碼如下:
在Action上配置ExceptionMapping Annotation:
@ExceptionMappings({
    @ExceptionMapping(exception = "java.lang.NullPointerException", result = "success", params = {"param1", "val1"})
})
public class ExceptionsActionLevelAction {

    public String execute() throws Exception {
        return null;
    }
}
在Method上配置ExceptionMapping Annotation,使用params屬性傳入要設置的參數
public class ExceptionsMethodLevelAction {
    @Action(value = "exception1", exceptionMappings = {
            @ExceptionMapping(exception = "java.lang.NullPointerException", result = "success", params = {"param1", "val1"})
    })
    public String run1() throws Exception {
        return null;
    }
}


Convention Plugin在Action中的配置改變時,可以自動加載改變的內容而不用重新啓動容器。這時需要在struts.xml文件中做如下設置
<constant name="struts.devMode" value="true"/>
<constant name="struts.convention.classes.reload" value="true" />
但這種加載方式只是實驗性的並且還沒有在所有的容器中進行測試,因此官方不推薦使用。

==========常見錯誤============
1,"There is no Action mapped for namespace /orders and action name view.",這說明URL"/orders/view.action"並沒有被映射到任何一個action,這是你需要檢查action的namespace或者action的名稱是否正確。
2,如果碰見如“"No result defined for action my.example.actions.orders.ViewAction and result success"的錯誤,說明action被映射到了正確的url上,但是action返回success時要跳轉的頁面並沒有找到,請確保您的工程的正確目錄中含有諸如/WEB-INF/content/orders/view-success.jsp的頁面。

============難點=============
1,要確保Action的namespace要有對應的頁面。定位器(action,actions,struts,strutss)後面的namespace將作爲action的namespace,並且用來定位該action要跳轉到的頁面。例如包my.example.actions.orders中有個名爲ViewAction的action,那麼他會被映射到/orders/view.action,該Action對應的頁面必須在目錄/WEB-INF/content/orders下面,例如/WEB-INF/content/orders/view-success.jsp。
2,關於Convention Plugin的日誌輸出。本插件在Debug模式下會輸出大量的日誌信息,因此不建議開啓Debug模式。如果你是用的是JDK自帶的logger,可以使用"trace"日誌級別打印日誌;如果使用的是Log4J,可以在配置文件中做如下配置
log4j.logger.org.apache.struts2.convention=DEBUG
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章