背景:經常要求獲得視圖層傳過來的很多數據,一般都是一個實體類的n多屬性,很多時候實體類的屬性特別多,
這時候如果還是按以前的方式在action里面一個個的定義出這些屬性的私有變量,然后在提供set、get方法的話,
這樣就會使整個action太臃腫,嚴重妨礙了代碼的可閱讀性,並且也違背了代碼的可復用性,
這時我們就需要對這些請求參數進行封裝,提高代碼的可復用性
頁面數據和Action有兩種基本對應方式:屬性驅動和模型驅動
屬性驅動分兩種:基本數據類型的屬性對應(屬性驅動)和 javaBean風格的屬性對應(直接使用域對象)
1.利用實體類封裝參數(直接使用域對象)
①創建實體類User(包括用戶名和密碼屬性)
②創建action,從表單提交的數據會根據User實體類的屬性進行封裝
public class LoginAction extends ActionSupport { private User user; public User getUser() { returnuser; } publicvoid setUser(User user) { this.user = user; } public String execute(){ if(user.getUsername().equals("admin")&&user.getPassword().equals("123456")) return"success"; return"fail"; } }
③定義表單,注意:表單里面的控件的name屬性定義有一定的要求,定義name時我們應該定義為:對象.屬性的形式
示例代碼(在相應的name屬性上,添加一個域對象的前綴,指明這個值到底對應打哪一個域對象里面去)
<s:form action="LoginAction"> <s:actionerror/> <s:textfield name="user.username"></s:textfield> <s:password name="user.password"></s:password> <s:submit value="提交" ></s:submit> </s:form>
2.模型驅動封裝請求參數
模型驅動是指使用JavaBean來封裝來回請求的參數.這種方式的好處就是減少了action的壓力。
既用於封裝來回請求的參數,也保護了控制邏輯,使它的結構清晰.這就是模型驅動的優勢.模型驅動的實現主要在Action上
①.首先建立一個實體。
②、建立action類,繼承自ActionSupport,實現ModelDriven接口,這個接口定義一個getModel()方法,
用於返回定義的Model,然后調用set方法,進行賦值
publicclass LoginAction3 extends ActionSupport implements ModelDriven<User> { private User user=new User();//這里記住要實例化 private LoginService loginService=new LoginServiceImpl();//這里是調用登錄的業務處理邏輯 Override public User getModel() { return user; ·} public String execute() { System.out.println(user.getUsername()); System.out.println(user.getPassword()); if(loginService.isLogin(user.getUsername(),user.getPassword())) { return SUCCESS; } return INPUT; }
ModelDrivenAction類的執行流程是:首先調用getModel()方法得到User對象,接着根據
JavaBean的原則將客戶端傳過來的屬性,一個一個的set到User對象的屬性中,將屬性全部set完之后,
再執行execute()方法。對於模型驅動頁面name屬性不需要前綴
3.屬性驅動接收參數(屬性驅動)
頁面控件的name屬性和Action的屬性或者與屬性對應的getter/setter相對應
①jsp頁面:
<form action="sys/login.action" method="post"> <input type="text" name="username"> <input type="submit" value="submit"> </form>
②Action:直接通過get、set方法獲取。
public class sysAction extends ActionSupport{ private String username; public String login() throws Exception { System.out.println(username); return SUCCESS; } public String getUsername() { return username; } public void setUsername(String username) { this.username= username; } }
總結:
①屬性驅動(基本數據類型的屬性對應):
優點:簡單,頁面那么和屬性直接對應
缺點:導致Action類看上去比較零亂,功能單一
②屬性驅動(直接使用域對象)
優點:把模型數據從Action中分離出來
缺點:頁面必須添加前綴
③模型驅動
優點:把模型數據從Action中分離出來
缺點:Action實現特殊接口
最后三種方式可以混合使用!!!