在Strut2中,頁面的數據和Action有兩種基本對應方式:分別是:屬性驅動(FieldDriven)和模型驅動(ModelDriven)。屬性驅動又分為兩種情況:一種是基本數據類型的屬性對應:另一種是JavaBean風格的屬性對應。下面就分別來看看它們是什麼意思都如何實現。
屬性驅動(FieldDriven):基本數據類型的屬性對應
在index.jsp中,我是這樣寫的
<form action="helloWorldAction.action" method="post">
賬號:<input type="text" name="account"/><br>
密碼:<input type="password" name="password"/>
<input type="submit" value="提交"/>
</form>
在Action中是這樣寫的
public class HelloWorldAction extends ActionSupport{
private String account;
private String password;
public String getAccount() {
return account;
}
public void setAccount(String account) {
this.account = account;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
//其他代碼省略....
}
可以發現,在頁面上index.jsp的name的屬性,和Action的屬性是同一個名稱的。這樣一來,當頁面提交的時候,Struts2會自動從request對象裡把數據提取出來,然後按照名稱進行對應,自動設置到Action屬性裡面去。
2.屬性驅動FieldDriven(JavaBean風格的屬性對應)
(1)先看看域對象的寫法,按照JavaBean的風格來寫,示例代碼如下:
public class HelloWorldModel {
private String account;
private String password;
public String getAccount() {
return account;
}
public void setAccount(String account) {
this.account = account;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
(2)這時候Action寫法也有變化,主要就是直接使用這個對象,其實就是定義一個屬性就是這樣對象類型,然後為這個屬性提供相應的getter()和setter()方法即可。如果把這個屬性的可訪問屬性設置為public就不需要getter()和setter()方法。Action修改後的示例代碼如下:
public class HelloWorldAction extends ActionSupport{
private HelloWorldModel hwm = new HelloWorldModel();
public HelloWorldModel getHwm() {
return hwm;
}
public void setHwm(HelloWorldModel hwm) {
this.hwm = hwm;
}
//其他代碼省略....
}
(3)Action發生變化後,index.jsp頁面中的內容也要進行相應的改變,否則數據就無法正確對應,主要是在相應的name屬性上,添加一個域對象的前綴,指明這個值到底是對應到哪宇哥域對象裡面去,示例如下:
<form action="helloWorldAction.action" method="post">
賬號:<input type="text" name="hwm.account"/><br>
密碼:<input type="password" name="hwm.password"/>
<input type="submit" value="提交"/>
</form>
</body>
3.模型驅動(ModelDriven)
它的基本實現方式讓Action實現一個ModelDriven的接口,這個接口需要我們實現getModel的方法。這個方法的返回值就是Action所使用的數據模型對象。修改後的示例代碼如下:
public class HelloWorldAction extends ActionSupport implements ModelDriven{
private HelloWorldModel hwm = new HelloWorldModel();
public Object getModel() {
// TODO Auto-generated method stub
return hwm;
}
//其他代碼省略....
}
在index.jsp中也需要做相應的調整,主要是是去掉剛才給name屬性添加的hwm前綴。其示例代碼如下:
<form action="helloWorldAction.action" method="post">
賬號:<input type="text" name="account"/><br>
密碼:<input type="password" name="password"/>
<input type="submit" value="提交"/>
</form>
為什麼種方式不需要前綴了呢?
因為使用這種ModelDriven的方式,一個Actiion只能對應一個Model,因此不需要添加前綴,Struts2j就知道,頁面上account的值就對應到這個Model的account屬性。
Struts2學習筆記-Value Stack(值棧)和OGNL表達式 http://www.linuxidc.com/Linux/2015-07/120529.htm
struts2文件上傳(保存為BLOB格式) http://www.linuxidc.com/Linux/2014-06/102905.htm
Struts2的入門實例 http://www.linuxidc.com/Linux/2013-05/84618.htm
Struts2實現ModelDriven接口 http://www.linuxidc.com/Linux/2014-04/99466.htm
遇到的Struts2文件下載亂碼問題 http://www.linuxidc.com/Linux/2014-03/98990.htm
Struts2整合Spring方法及原理 http://www.linuxidc.com/Linux/2013-12/93692.htm
Struts2 注解模式的幾個知識點 http://www.linuxidc.com/Linux/2013-06/85830.htm
Struts 的詳細介紹:請點這裡
Struts 的下載地址:請點這裡