zoukankan      html  css  js  c++  java
  • Struts2第十二篇【模型驱动】

    什么是模型驱动

    在Struts2中模型驱动就是用来封装数据的..完成数据的自动封装.

    为什么要使用模型驱动?

    我们之前就使用过Sturts2的数据自动封装功能,是用params拦截器完成的…既然有了params拦截器,为啥还要模型驱动??

    当我们使用params拦截器完成数据自动封装的时候,如果要封装的是JavaBean对象,那么在web表单中就必须的name写上javaBean.属性名….

    这样的话,web层和Action层就耦合了…因为在web层必须要知道封装的JavaBean对象是什么才能够实现自动封装

    模型驱动就解决了这个问题!即时不知道Action层的JavaBean对象是什么,也能够完成数据自动封装!

    模型驱动的实现原理

    实现模型驱动功能也是由拦截器完成的,我们来看看拦截器到底做了什么吧….

    
             <interceptor name="modelDriven" class="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor"/>

    拦截方法的源码是这样的:

    
        public String intercept(ActionInvocation invocation) throws Exception {
    
            //得到当前要执行的Action对象
            Object action = invocation.getAction();
    
            //判断该Action对象是否实现了ModelDriven接口
            if(action instanceof ModelDriven) {
                ModelDriven modelDriven = (ModelDriven)action;
    
                //获取值栈对象
                ValueStack stack = invocation.getStack();
    
                //得到model的对象
                Object model = modelDriven.getModel();
    
                //把对象存到值栈对象中
                if(model != null) {
                    stack.push(model);
                }
                if(this.refreshModelBeforeResult) {
                    invocation.addPreResultListener(new ModelDrivenInterceptor.RefreshModelBeforeResult(modelDriven, model));
                }
            }
    
            return invocation.invoke();
        }
    

    把model对象放到值栈对象之后,Parameters 拦截器将把表单字段映射到 ValueStack 栈的栈顶对象的各个属性中.

    也就是说,使用模型驱动是需要配合Params拦截器完成的!

    使用数据模型驱动

    实现ModelDriven接口

    • 实现ModelDriven接口,重写方法….实现接口时,要封装的对象是什么,形参类型就给什么
    
    public class UserAction extends ActionSupport implements ModelDriven<User> {
    
    
    
        public String login() {
    
            return SUCCESS;
        }
    
    
        @Override
        public User getModel() {
            return null;
        }
    }
    

    对象实例化

    
    public class UserAction extends ActionSupport implements ModelDriven<User> {
    
    
        //这里一定要实例化
        User user = new User();
    
        public User getUser() {
            return user;
        }
    
        public void setUser(User user) {
            this.user = user;
        }
    
        @Override
        public User getModel() {
            return user;
        }
    }
    

    测试

    JSP提交页面,直接写上JavaBean对象的属性就行了..不需要写上JavaBean对象的名称!

    <form action="${pageContext.request.contextPath}/user_execute">
        <table border="1">
    
            <tr>
                <td>用户名:<input type="text" name="username"></td>
            </tr>
            <tr>
                <td> 密码:<input type="password" name="password"></td>
            </tr>
            <tr>
                <td>电话:<input type="text" name="cellphone"></td>
            </tr>
            <tr>
                <td> 邮箱:<input type="text" name="email"></td>
            </tr>
    
            <tr>
                <td><input type="submit" value="提交"></td>
            </tr>
    
        </table>
    
    
    </form>
    • 在Action业务方法中输出User对象的数据
    
        @Override
        public String execute() throws Exception {
    
            System.out.println(user);
            return SUCCESS;
        }

    这里写图片描述


  • 相关阅读:
    activityalias 的使用
    关于淘宝直通车的那些事(二):关键词选词方法
    Laucher 九宫格风格 长按移动删除 宫格
    NSAutoReleasePool的理解
    类似人人网的侧滑动层叠窗口实现及代码
    从应用中启动另外的应用
    android应用 获取本地指定类型文件 的两种最优方法
    获取手机中安装的所有应用程序
    Spring事务配置的五种方式【转】
    [转]理解inode
  • 原文地址:https://www.cnblogs.com/zhong-fucheng/p/7202977.html
Copyright © 2011-2022 走看看