Struts2的屬性驅動與模型驅動的區別

weixin_34119545發表於2016-04-28

一、為什麼要使用屬性驅動和模型驅動?

  struts2與struts很大的不同點在於,struts的execute方法提供了HttpServletRequest和 HttpServletResponse方法在獲取客戶端提交的資料資訊的時候需要使用HttpServletRequest.getParameter()方法,並且還需要進行必要的資料型別轉換。如何客戶端提交的資料量大的時候,我們則需要寫很多的getParameter方法。這樣程式碼量就相應的增加不少。但是struts2為我們提供了屬性驅動和模型驅動,它不需要我們寫很多的獲取值的方法。而只需要我們在Action中定義相應的getter方法,在介面上以Action中的變數名作為表單元素的name屬性值即可。

二、屬性驅動和模型驅動有什麼異同?

 1.屬性驅動

  對於屬性驅動,我們需要在Action中定義與表單元素對應的所有的屬性,因而在Action中會出現很多的getter和setter方法

 2.模型驅動

  對於模型驅動,使用的Action物件需要實現ModelDriven介面並給定所需要的型別.而在Action中我們只需要定義一個封裝所有資料資訊的javabean

 3.屬性和模型驅動的相同點

  當我們使用屬性驅動和模型驅動的時候,必須將表單的元素中的name屬性值與我們定義接收資料資訊的變數名對應起來。

三、如何使用屬性驅動?

  對於屬性驅動的實現是非常簡單的 ,例項如下:

action:

package org.viancent.action;  
        import java.util.Date;  
    import com.opensymphony.xwork2.ActionSupport;  
  
    public class GetFieldAction extends ActionSupport {  
            private String pname;  
            private String address;  
            private int age;  
            private Date date;  
  
            public String getPname() {  
                return pname;  
            }  
  
            public void setPname(String pname) {  
                this.pname = pname;  
            }  
  
            public String getAddress() {  
                return address;  
            }  
                  
                    public void setAddress(String address) {  
                this.address = address;  
            }  
  
            public int getAge() {  
                return age;  
            }  
  
            public void setAge(int age) {  
                this.age = age;  
            }  
  
            public Date getDate() {  
                return date;  
            }  
  
            public void setDate(Date date) {  
                this.date = date;  
            }  
                      
            @Override  
            public String execute() throws Exception {  
                return SUCCESS;  
                      }  
}  

JSP:(register.jsp)  

<div>  
    <form action="/struts2/register.action" method="post">  
        <table width="80%" align="center">  
    <tr>  
        <td>UserName:</td>  
        <td><input type="text" name="pname" id="pname"/>       </td>  
    </tr>  
    <tr>  
        <td>PassWord:</td>  
        <td><input type="text" name="address" id="address"/></td>  
    </tr>  
    <tr>  
        <td>Age:</td>  
        <td><input type="text" name="age" id="age"/></td>  
    </tr>  
    <tr>  
        <td>Date</td>  
        <td><input type="text" name="date" id="date"/></td>  
    </tr>  
    <tr>  
        <td colspan="2"><input type="submit" value="submit"/></td>  
    </tr>  
    </table>  
</form>  
</div> 

 //其他配置資訊,相同  

  四、模型驅

模型驅動與屬性驅動有三點不同

1.所屬的Action需要實現ModelDriven介面,並且給定型別和實現介面中的getModel方法(其實就是簡單的返回泛型的一個物件)

2.需要一個封裝所有屬性的javabean(對應 1.中的給給定型別)

3.在struts.xml檔案中描述此Action的地方讓該Action實現一個攔截器 (ModelDrivenInterceptor)

:具體例項如下:

JavaBean(person)  

package org.viancent.domain;  
import java.util.Date;  
public class Person {  
        private String pname;  
        private int page;  
        private String address;  
        private Date date;  
  
    public Date getDate() {  
            return date;  
    }  
  
    public void setDate(Date date) {  
            this.date = date;  
    }  
  
    public String getPname() {  
            return pname;  
    }  
  
    public void setPname(String pname) {  
            this.pname = pname;  
    }  
  
    public int getPage() {  
            return page;  
    }  
  
    public void setPage(int page) {  
            this.page = page;  
    }  
  
    public String getAddress() {  
            return address;  
    }  
  
    public void setAddress(String address) {  
            this.address = address;  
    }  
} 

Action:(RegisterAction)

package org.viancent.action;  
import org.viancent.domain.Person;  
import com.opensymphony.xwork2.ActionSupport;  
import com.opensymphony.xwork2.ModelDriven;  
  
public class RegisterAction extends ActionSupport implements  
ModelDriven<Person/*這裡需要填寫Person物件*/> {  
                  
    private Person person =  new Person();   
              //定義Person物件用於承載getModel()方法返回的資料資訊  
       //同時這裡必須例項化物件,否則person的物件會為空  
                  
    public Person getPerson() {   
               //實現person的getter方法,用於當請求轉發後,其他介面資料訪問  
            return person;  
    }  
  
    @Override  
    public Person getModel() {  
              //重寫ModleDriven的方法,返回定義的person物件  
            return person;  
    }  
  
    @Override  
    public String execute() throws Exception {   
              //實現跳轉            
             System.out.println(person.getPage()+""+person.getDate());  
                 return SUCCESS;  
        }  
}

 struts.xml:

<action name="register"class="org.viancent.action.RegisterAction">  
    <result name="success">/result.jsp</result>  
        <result name="input">/show.jsp</result>  
        <interceptor-ref name="modelDriven"></interceptor-ref>  
                 //實現模型驅動的攔截器  
        <interceptor-ref name="defaultStack"></interceptor-ref>  
</action>

 JSP(register.jsp)

如上:屬性驅動的JSP介面

 

相關文章