1. 程式人生 > >Struts2 Action標籤

Struts2 Action標籤

Struts Action 筆記

package.Namespace

package.namespace預設為“”,必須以“/”開頭,例如“/req”而不能是“req”。如果namespace為“”,那這個package就會成為全域性的,凡請求可以匹配到action,都會匹配到這個namespace,例如:

//package 的namespace不寫預設為
<package extends="struts-default" name="main">
    <action name="req">
        <result>/index.jsp</result
>
</action> </package>

請求無論為http://localhost:8080/Struts2/abcdefg/a/b/c/req還是http://localhost:8080/Struts2/req都是可以請求到index.jsp的

Action的方法呼叫(3種方式)

第一種方式是在struts.xml中明確指明該請求應該呼叫哪個方法:

<package extends="struts-default" name="main">
    <action name="req" class="action.action" method="index"
>
<result>/index.jsp</result> </action> </package>

第二種方式是在請求的時候用動態方法呼叫(DMI)來呼叫方法,struts.xml可以指明也可以不指明具體呼叫的方法名,而在請求連結的時候用!連線方法實現呼叫

<package extends="struts-default" name="main">
    <action name="req" class="action.action">
        <result>/index.jsp</result
>
</action> </package>
請求可以為:http://localhost:8080/Struts2/req!index

第三種方式:

<package extends="struts-default" name="main">
    <action name="req_*" class="action.action" method="{1}">
        <result>/{1}.jsp</result>
    </action>
</package>

這種方式是通過萬用字元呼叫,主要有兩個主要地方:*萬用字元 和 {1}佔位符。
萬用字元可以模糊匹配客戶端的請求,而佔位符是為 準備呼叫哪個方法而佔位的。
上面的程式碼為例,如果如果請求為http://localhost:8080/Struts2/req_index的話,則會呼叫action.action中的index()或者doIndex()。佔位符中數字說明這個為第幾個*而佔位。

第三種方法以犧牲可讀性縮短xml配置檔案內容,可以使xml非常精簡,例如:

<package extends="struts-default" name="main" namespace="/">
    <action name="*_*" class="action.action" method="{1}{2}">
        <result>/{1}{2}.jsp</result>
    </action>
</package>

當請求http://localhost:8080/Struts2/req_index的時候就會呼叫action.action類下的index()方法,如果方法返回了success的話,則會在web-Root下找到req_index.jsp頁面。這樣的話請求的自由度非常的高。凡是xxx_xxx的請求都是適用的。

接收請求引數(3種方式)

在action類中定義成員變數以及成員的setting、getting,在請求傳遞到Struts的時候,Struts會根據action中的class反射action類並且例項化,這個時候就會將引數通關過setting給變數賦值。

public class action extends ActionSupport{
    private int id;
    private String name;
    public void setId(int id){
        this.id = id;
    }
    public int getId(){
        return this.id;
    }
    public void setName(String name){
        this.name = name;
    }
    public String getName(){
        return this.name;
    }
    //...
}

請求為:http://localhost:8080/Struts2/req!index?id=10&name=abc
需要注意的是:Struts反射的是方法而不是成員變數,所以,請求的引數名要與方法名(getting、setting)對應。

第二種方式是在action類中使用物件進行接收引數

public class action extends ActionSupport{
    private User user;
    public void setUser(User user){
        this.user = user;
    }
    public int getUser(){
        return this.user;
    }
    //...
}

請求為:http://localhost:8080/Struts2/req!index?user.id=10&user.name=abc

第三種方式:
action類實現ModelDriven介面,並實現方法public T getModel()

public class action extends ActionSupport implements ModelDriven<User>{
    private User user = new User();
    @Override
    public User getModel() {
        return this.user;
    }
    @Override
    public String execute() throws Exception {
        System.out.println(this.user.getName());
        return super.execute();
    }
}

請求為:http://localhost:8080/StrutsDemo/req?user.name=abcdef
這種方式需要例項化好物件。

資料校驗

簡單的資料校驗,檢視錯誤資訊,debug標籤。

action類繼承了ActionSupport類之後,可以使用addFieldError()來為欄位新增錯誤,在頁面中用Strtus標籤庫來檢視這個錯誤。或者使用debug標籤檢視各個物件的資料資訊。

    @Override
    public String execute() throws Exception {
        this.addFieldError("name","錯誤1");
        return ERROR;
    }
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<body>
    <s:fielderror></s:fielderror>
    <s:debug></s:debug>
</body>

action中訪問web元素(四種方式)

struts.xml配置
第一種:依賴容器
依賴Struts的ActionContext.getContext()獲取web元素。

public class action extends ActionSupport {
    private Map request;
    private Map session;
    private Map application;
    @Override
    public String execute(){
        Map request = (Map)ActionContext.getContext().get("request");
        request.put("r", "rrr");

        Map session = (Map)ActionContext.getContext().getSession();
        session.put("s", "ssss");

        Map application = (Map)ActionContext.getContext().getApplication();
        application.put("a", "aaaa");
        return SUCCESS;
    }

第二種:依賴注入/控制反轉

public class action extends ActionSupport implements SessionAware,RequestAware,ApplicationAware{
    private Map<String, Object> request;
    private Map<String, Object> session;
    private Map<String, Object> application;

    @Override
    public String execute(){
        Map request = (Map)ActionContext.getContext().get("request");
        request.put("r", "rrr");

        Map session = (Map)ActionContext.getContext().getSession();
        session.put("s", "ssss");

        Map application = (Map)ActionContext.getContext().getApplication();
        application.put("a", "aaa");
        return SUCCESS;
    }
    @Override
    public void setApplication(Map<String, Object> arg0) {
        this.application = arg0;
    }
    @Override
    public void setRequest(Map<String, Object> arg0) {
        this.request = arg0;
    }
    @Override
    public void setSession(Map<String, Object> arg0) {
        this.session = arg0;
    }
}

第三種:依賴容器

public class action extends ActionSupport{
    private HttpServletRequest request;
    private HttpSession session;
    private ServletContext application;

    @Override
    public String execute(){
        this.request = ServletActionContext.getRequest();
        request.setAttribute("r", "rrr");

        this.session = this.request.getSession();
        this.session.setAttribute("s", "sss");

        this.application = ServletActionContext.getServletContext();
        this.application.setAttribute("a", "aaa");
        return SUCCESS;
    }
}

第四種:依賴注入/控制反轉

public class action extends ActionSupport implements ServletRequestAware,ServletContextAware{
    private HttpServletRequest request;
    private HttpSession session;
    private ServletContext application;

    @Override
    public String execute() throws Exception {
        this.request.setAttribute("r", "rrr");
        this.session = this.request.getSession();
        this.session.setAttribute("s", "sss");
        this.application.setAttribute("a", "aaa");
        return SUCCESS;
    }

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

    @Override
    public void setServletContext(ServletContext arg0) {
        this.application = arg0;
    }
}

包含模組和預設Action

包含模組標籤<default-action-ref name="req">index.jsp</default-action-ref>
預設Action標籤<include file="struts2.xml"></include>