理解Struts2中的ModelDriven Action

  在Struts2中,Action是能夠攜帶數據的,而且是線程安全的.咱們能夠經過Jsp頁面的Form表單向Action傳遞數據.這主要有兩種方式:java

①在Action中組裝javaBean的屬性到對象.安全

  JSP頁面:ide

  
  
  
  
  1. <s:form action="loginAction"
  2.    <s:textfield label="UserName" name="user.userName" /> 
  3.    <s:textfield label="Password" name="user.password"/> 
  4.    <s:textfield label="Email"  name="user.email"/> 
  5.    <s:submit /> 
  6. </s:form> 

  Action中代碼測試

 

  
  
  
  
  1. private User user; 
  2.  
  3. public User getUser() { 
  4.     return user; 
  5.  
  6. public void setUser(User user) { 
  7.     this.user = user; 
  8.  
  9. @Override 
  10. public String execute() throws Exception { 
  11.      
  12.     if(StringUtils.isBlank(user.getUserName())  
  13.             || StringUtils.isBlank(user.getPassword()) 
  14.             || StringUtils.isBlank(user.getEmail())) 
  15.     { 
  16.         return "failed"
  17.     } 
  18.      
  19.     if(userService.validateUserRegistered(user)) 
  20.     { 
  21.         return "registerTipPage"
  22.     } 
  23.     return SUCCESS; 

在Result頁面要訪問userName屬性,也須要寫user.userName.this

②ModelDriven 方式spa

  • 首先,咱們的Action類須要實現ModelDriven接口,這是一種泛型類接口,裏面只有一個方法getModel()方法,它返回一個泛型類對象.
  • 咱們須要在Action類中完成對象類的初始化,並將它在getModel()方法中做爲返回值返回.

實例以下:(Java代碼)prototype

  
  
  
  
  1. @Controller("loginAction"
  2. @Scope("prototype"
  3. public class LoginAction extends ActionSupport implements ModelDriven<User> { 
  4.  
  5.      
  6.     private User user = new User(); 
  7.  
  8.     public User getModel() { 
  9.         // TODO Auto-generated method stub 
  10.         return user; 
  11.     } 

在JSP頁面的訪問方式以下:線程

  
  
  
  
  1. <s:form action="loginAction"
  2.     <s:textfield label="UserName" name="userName" /> 
  3.     <s:textfield label="Password" name="password"/> 
  4.     <s:textfield label="Email"  name="email"/> 
  5.     <s:submit /> 
  6. </s:form> 

須要說明的是使用ModelDriven Action,有如下幾點須要注意:orm

  在Action的方法中,不要再進行建立相應的對象的操做,即便手動建立了相應的對象,並對這個對象進行賦值,在顯示時,也會只顯示原來從頁面接收的數據.例如:對象

 測試的Java代碼

  
  
  
  
  1. @Override 
  2. public String execute() throws Exception { 
  3.      
  4.     user = new User(); 
  5.     user.setPassword("zhangsan"); 
  6.     user.setUserName("zhangsan"); 
  7.     user.setEmail("zhangsan@sina.cn"); 
  8.      
  9.     if(StringUtils.isBlank(user.getUserName())  
  10.             || StringUtils.isBlank(user.getPassword()) 
  11.             || StringUtils.isBlank(user.getEmail())) 
  12.     { 
  13.         return "failed"
  14.     } 
  15.      
  16.     if(userService.validateUserRegistered(user)) 
  17.     { 
  18.         return "registerTipPage"
  19.     } 
  20.     return SUCCESS; 

 在這段代碼中,但願將從用戶表單提交過來的數據進行修改,因而從新建立了一個User實例,看Jsp頁面的測試結果:

 

點擊提交後,按原來的意圖,但願出現UserName,zhangsan等信息,但實際以下:

仍是原來表單提交的數據.若是改爲這樣,就OK了

 

  
  
  
  
  1. @Override 
  2.     public String execute() throws Exception { 
  3.          
  4. //      user = new User(); 
  5.         user.setPassword("zhangsan"); 
  6.         user.setUserName("zhangsan"); 
  7.         user.setEmail("zhangsan@sina.cn"); 
  8.          
  9.         if(StringUtils.isBlank(user.getUserName())  
  10.                 || StringUtils.isBlank(user.getPassword()) 
  11.                 || StringUtils.isBlank(user.getEmail())) 
  12.         { 
  13.             return "failed"
  14.         } 
  15.          
  16.         if(userService.validateUserRegistered(user)) 
  17.         { 
  18.             return "registerTipPage"
  19.         } 
  20.         return SUCCESS; 
  21.     } 

結果以下:

因此在使用ModelDriven模式時,必定要注意如下幾點

  • 必須完成初始化,在類級別
  • 不要將實例引用指向一個新建立的對象或者已經存在的其它對象,不然會出現意料外的事件.
相關文章
相關標籤/搜索