struts2的參數的封裝形式


背景:經常要求獲得視圖層傳過來的很多數據,一般都是一個實體類的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實現特殊接口

最后三種方式可以混合使用!!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM