奇妙的paramsPrepareParamsStack

paramsPrepareParamsStack在Struts 2.0中是一個很奇妙的interceptor stack,以至於很多人疑問爲何不將其設置爲默認的interceptor stack。paramsPrepareParamsStack主要解決了ModelDriven和Preparable的配合問題,從字面上理解來說,這個stack的攔截器調用的順序爲:首先params,然後prepare,接下來modelDriven,最後再params。Struts 2.0的設計上要求modelDriven在params之前調用,而業務中prepare要負責準備model,準備model又需要參數,這就需要在prepare之前運行params攔截器設置相關參數,這個也就是創建paramsPrepareParamsStack的原因。流程如下:
   1. params攔截器首先給action中的相關參數賦值,如id
   2. prepare攔截器執行prepare方法,prepare方法中會根據參數,如id,去調用業務邏輯,設置model對象
   3. modelDriven攔截器將model對象壓入value stack,這裏的model對象就是在prepare中創建的
   4. params攔截器再將參數賦值給model對象
   5. action的業務邏輯執行 依據此stack,一個action的代碼通常如下:
public class UserAction extends ActionSupport implements ModelDriven, Preparable{
private User user;
private int id;
private UserService service; // user business service

public void setId(int id) {
   this.id = id;
}
/**
* create a new user if none exists, otherwise load the user with the specified id
*/
public void prepare() throws Exception {
   if( id==0 ) {
      user = new User();
   } else {
      user = service.findUserById(id);
   }
}
public Object getModel() {
return user;
}
/**
* create or update the user and then view the created user
*/
public String update() {
   if( id==0 ) {
     service.create(user);
   } else {
     service.update(user);
}
return "redirect";
}
/**
* delete the user and go to a default home page
*/
public String delete() {
service.deleteById(id);
return "home";
}
/**
* show the page allowing the user to view the existing data 
*/
public String view() {
   return "view";
}
/** 
* show the page allowing the user to view the existing data and change the values 
*/
public String edit() {
   return "input";
}
}
在上述代碼中,edit和view都不需要根據id再爲界面準備數據,因爲prepare方法已經準備好了model,這些方法很簡單。對於update方法,prepare首先會從數據庫中加載數據,然後params攔截器會將參數值付給model,在update直接更新就可以,不會出現數據被亂更新的情況。象Hibernate框架,會判斷哪些字段更新了,然後進行更新,性能也不會損失。
通過paramsPrepareParamsStack可以讓流程更明確,代碼更簡潔,也更利於大家的交流。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章