在Struts2中,Action是可以携带数据的,并且是线程安全的.我们可以通过Jsp页面的Form表单向Action传递数据.这主要有两种方式:

①在Action中组装javaBean的属性到对象.

  JSP页面:

  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.

②ModelDriven 方式

  • 首先,我们的Action类需要实现ModelDriven接口,这是一种泛型类接口,里面只有一个方法getModel()方法,它返回一个泛型类对象.
  • 我们需要在Action类中完成对象类的初始化,并将它在getModel()方法中作为返回值返回.

实例如下:(Java代码)

  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,有以下几点需要注意:

  在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模式时,一定要注意以下几点

  • 必须完成初始化,在类级别
  • 不要将实例引用指向一个新创建的对象或者已经存在的其它对象,否则会出现意料外的事件.