Struts2模型驱动

来源:互联网 发布:淘宝宝贝怎么发布 编辑:程序博客网 时间:2024/05/10 11:16

把动作和模型隔开

在使用 Struts 作为前端的企业级应用程序时把动作和模型清晰地隔离开是有必要的: 有些动作类不代表任何模型对象, 它们的功能仅限于提供图文显示服务

ModelDriven 拦截器

l情景:有一个用来处理客户的CustomerAction,该动作类实现了ModelDriven接口.
l当用户触发CustomerAction动作时,ModelDriven拦截器将调用相关CustomerAction对象的getModel()方法,并把返回的模型(Customer实例)压入到ValueStack.接下来Parameters拦截器将把表单字段映射到 ValueStack栈的栈顶对象的各个属性中.因为此时 ValueStack栈的栈顶元素是刚被压入的模型(Product)对象,所以该模型将被填充.如果某个字段在模型里没有匹配的属性,Param拦截器将尝试ValueStack栈中的下一个对象.
l一个模型类必须有一个不带任何参数的构造器.




配置ModelDriven 拦截器

UserAction类实现ModelDriven接口

模型驱动的目的是将对象放入到值栈顶,由struts2中的模型驱动拦截器处理


publicclassUserActionextendsActionSupportimplementsModelDriven<CustomAction> {

 

  publicCustomActiongetModel() {

  returnuser;

  }

}

ModelDriven 拦截器—底层代码

struts2标签自动回显


struts2标签如何自动回显

public String edit(){

  //该对象是从数据库查询出来的

  CustomActionnewUser =newCustomAction();

  newUser.setUsername("zhang");

  newUser.setTel("13600000000");

  newUser.setDes("xxxxx");

方法一:

  user.setUsername(newUser.getUsername());

  user.setTel(newUser.getTel());

  user.setDes(newUser.getDes());

}

问题:user=newUser可以吗

总结

模型驱动:
    * 要从页面中获取表单元素的值,需要在动作类中声明与页面元素同名的属性。导致动作类中既有javabean又有业务方法。
    
    * 将javabean和业务方法进行分离:
        * 将重新创建一个javabean,将javabean的内容放置其中。
        * 动作类action中只留业务方法
    
    * 在动作类中声明的javabean无法从页面中获取同名的属性
    
    * 需要使用struts2框架提供"ModelDriven(模型驱动)"
        
        * 实现ModelDriven这个接口
        
        * 重写getModel()方法,返回该javabean的实例
        
        * 代码如下:
            public class UserAction extends ActionSupport implements ModelDriven<User> {

                private User user = new User();
                
                public User getModel() {
                    return user;
                }
            
                public String add(){
                    System.out.println("UserAction ************* add()");
                    return "add";
                }
                
                public String save(){
                    System.out.println("UserAction ************* save()");
                    
                    return "success";
                }
            }
        
        * 模型驱动的原理:
            
            * 在不使用模型驱动的时候,之所以在动作类中获取不到对应的属性的原因:
                * 在ValueStack中没有对应javabean的所有属性
                
            * 模型驱动的作用,就是将javabean的实例压入对象栈的栈顶,从而可以获取到对应的属性的值


页面回显技术:
    * 通过模型驱动,在动作类action中,可以获取到页面中元素的值
    
    //方法一
    * 通过javabean实例的set()方法,将新的内容set到javabean中,从而放置在页面对应元素中
        user.setUsername(newUser.getUsername());
        user.setTel(newUser.getTel());
        user.setDes(newUser.getDes());
    
    //方法二
    * 首先将值栈中,旧的javabean的内容,删除掉
    * 然后将新的内容压入到值栈中的栈顶
        ValueStack valueStack = ServletActionContext.getContext().getValueStack();
        valueStack.pop();//从栈顶弹出
        valueStack.push(newUser);//压入新model













0 0
原创粉丝点击