Strut2的属性驱动,模型驱动的理解

    因为在struts1的版本中,属性的拦截以及控制的处理是被封装为两个对立的ActionForm、Action来获取HttpServerRequest的参数、控制访问MAPPING的。而在Struts2中我们可以直接通过Action来获取请求参数,并把处理的 资源映射返回给struts.xml指向对应的视图资源或者模型或者控制器进行下一步的处理。发现Struts2中的Action负责了struts1的ActionForm以及Action的双重任务。如果我们习惯了struts1的开发方式,在Struts中提供模型驱动的方式来分解Action的任务,这种模式是通过专门的JavaBean来封装请求。
    下面我们来比较一下:属性驱动和模型驱动的区别
    一、属性驱动的例子

 

public class Login implements Action { // 继承Action接口
    private String username;
    private String password;

    // 在属性驱动里面是依靠getter/setter方法获存取请求参数
    public void setUsername(String username) {
        this.username = username;
    }

    public String getUsername(){
        return this.username;
    }

    public void setPassword(String password){
        this.password = password;
    }

    public String getPassword(){
        return this.password;
    }
    // 默认的方法
    public String execute() throws Exception{
        return SUCCESS;
    }
}

 

  二、  模型驱动例子 

 

//模型使用JavaBean的设计方式    
//和Struts1的ActionForm是一样    
public   class  UserBean   {   
    private  String username;   
    private  String password;   
    public   void  setUsername(String username){    
         this .username = username;   
    }   
   
    public  String getUsername(){   
        return   this .username;   
    }      
   
    public   void  setPassword(String password){     
        this .password = password;   
    }   
   
    public  String  getPassword(){    
        return   this .password;   
    }   
}   
   
//实现Action    
  public   class  Login  implements  Action,ModelDriver<UserBean> {  //必须继承ModelDriver 且指明具体的UserBean类型   
     private  UserBean  model =  new  UserBean();   
     public  String execute()  throws  Exception{   
     if  (getMode().getUsername().equals( "scott" ) && getMode().getPassword().equeals("tiger" ) ){   
          return  SUCCESS;   
     }else{       
          return  ERROR;      
     }       
  }   
    
  public  UserBean getModel(){    
    return  model;   
  }   
}     

 

其实,模型驱动必须实现ModelDriver接口,以及必须实现getMode()方法,该方法把Action和以及对应的Model实例关联。

配置属性驱动和模型驱动的方式一样,在struts.xml文件中配置对应的Action即可,那他怎么实现的? 那么,我们要看到Struts2是一个拦截器为核心的框架,在struts_default.xml文件里面可以发现对应的拦截器的设置。
三、在JSP页面访问的区别:
而我们在属性驱动模型下在JSP中访问属性时:
  
<s:property value="username">
  而在模型驱动模型下在JSP中访问属性时:
 
<s:property value ="model.usename">
    但是,Struts2会自动识别使用何种驱动模式,省略model.系统仍能自动会关联到model.username的属性值。    四、选择属性驱动和模型驱动的问题: 当JSP表单的属性和
数据持久层对象的数据成员一致的话就用strut2的模型驱动,代码统一。 当表单的属性和数据持久层对象的数据成员不一致的话就用属性驱动,因为如果用模型驱动要两个bean,一个与数据持久层对象,一个与提交的表单对应

 

  

 

 

 

posted @ 2012-12-14 13:13  zdp072  阅读(238)  评论(0编辑  收藏  举报