Struts2模型驱动

把动作和模型隔开

在使用 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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值