zoukankan      html  css  js  c++  java
  • Struts2(四)属性驱动和模型驱动

    一、概述

      所谓模型驱动,就是使用单独的JavaBean实例贯穿整个MVC流程,与之相对应的属性驱动方式,则使用属性作为贯穿MVC流程的信息携带者。属性无法独立存下,它必须依附于一个对象,这个对象就是Action实例。简单来说,模型驱动使用单独的值对象来封装请求参数和处理结果,属性驱动则使用Action实例来封装请求参数和处理结果。

    二、应用实例  

      以前文提到的LoginAction为例,在属性驱动中的action为:

    public class LoginAction extends ActionSupport
    {
        private static final long serialVersionUID = -5377305857336513025L;
        private String username;
        private String password;
        public String getUsername()
        {
            return username;
        }
        public void setUsername(String username)
        {
            this.username = username;
        }
        public String getPassword()
        {
            return password;
        }
        public void setPassword(String password)
        {
            this.password = password;
        }
        @Override
        public String execute() throws Exception
        {
            if(getUsername().equals("xujian")&&getPassword().equals("123456"))
            {
                ActionContext.getContext().getSession().put("user", username);
                return SUCCESS;
            }
            else
                return ERROR;
        }
    }

      而在模型驱动中,我们通常上述的action分解为如下两个类:

    /*
     * 用于封装请求参数和处理结果
     */
    public class UserBean
    {
        private String username;
        private String password;
        private String tip;
        public String getUsername()
        {
            return username;
        }
        public void setUsername(String username)
        {
            this.username = username;
        }
        public String getPassword()
        {
            return password;
        }
        public void setPassword(String password)
        {
            this.password = password;
        }
        public String getTip()
        {
            return tip;
        }
        public void setTip(String tip)
        {
            this.tip = tip;
        }
    }

      还提供一个包含处理逻辑的Action类:

    public class LoginAction implements Action,ModelDriven<UserBean>
    {
        private UserBean model=new UserBean();
        @Override
        public UserBean getModel()
        {
            return model;
        }
        @Override
        public String execute() throws Exception
        {
            if(getModel().getUsername().equals("xujian")&&getModel().getPassword().equals("123"))
                
            {
                getModel().setTip("哈哈,登录成功");
                return SUCCESS;
            }
            else
                return ERROR;
        }
    }

      从上述代码我们可以看到,在模型驱动模式中,Action必须实现ModelDriven接口,并实现getModel()方法,该方法用于把Action和与之对应的Moel实例关联起来。

      在struts-default.xml文件中,我们看到该文件配置了两个拦截器引用params和modelDriven,其中params拦截器负责提取请求参数,如果使用属性驱动模式,还负责将请求参数传递给Action实例的属性,而modelDriven拦截器负责将请求参数传递给模型的属性。

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

    三、总结

      模型驱动和属性驱动各有利弊,模型驱动结构清晰,但编程繁琐,属性驱动则编程简洁,但是结构不够清晰。

      通常情况下,如果表单的属性不是一一对应的话,那么就应该使用属性驱动,否则你的系统就必须提供两个Bean,一个对应表单提交的数据,另一个用于持久层。

  • 相关阅读:
    Systemverilog for design 笔记(三)
    SystemVerilog for design 笔记(二)
    Systemverilog for design 笔记(一)
    假如m是奇数,且m>=3,证明m(m² -1)能被8整除
    SharpSvn操作 -- 获取Commit节点列表
    GetRelativePath获取相对路径
    Dictionary(支持 XML 序列化),注意C#中原生的Dictionary类是无法进行Xml序列化的
    Winform中Checkbox与其他集合列表类型之间进行关联
    Image(支持 XML 序列化),注意C#中原生的Image类是无法进行Xml序列化的
    修复使用<code>XmlDocument</code>加载含有DOCTYPE的Xml时,加载后增加“[]”字符的错误
  • 原文地址:https://www.cnblogs.com/xujian2014/p/4912285.html
Copyright © 2011-2022 走看看