(九)模型驱动和属性驱动

出于结构清晰的考虑,应该采用单独的Model实例来封装请求参数和处理结果,这就是所谓的模型驱动,

所谓模型驱动,就是使用单独的JavaBean来贯穿整个MVC流程。

所谓属性驱动,就是使用属性来作为贯穿MVC流程的信息携带者,当然属性必须依附于对象,

这个对象就是Action实例。 简单说,模型驱动就是使用单独的javaBean封装请求参数。 属性驱动就是把属性写在Action类中。

我们发现上一章的jsp中的name必须前面得加 user.username。。太过麻烦。我们使用模型驱动来解决这个问题。实际开发中使用这种方式

一、模型驱动的要求

1.动作类实现ModelDriven接口

2.实现接口中的getModel方法,返回我们的数据对象。(实现中用泛型将确定传入模型 implements ModelDriven<?>)

3.数据模型对象必须由我们实例化。

例子:

                public class AdduserAction extends ActionSupport implements ModelDriven<User>{
                    //数据模型对象由我们实例化
                    private User user=new User();

                    public User getUser() {
                        System.out.println("getuser");
                        return user;
                    }

                    public void setUser(User user) {
                        System.out.println("setuser");
                        this.user = user;
                    }
                    public String adduser(){
                        System.out.println(user.getUsername()+":"+user.getAge());
                        return null;
                    }
                    //实现接口方法,返回我们的数据模型对象
                    public User getModel() {
                        // TODO Auto-generated method stub
                        return user;
                    }

                }

 我们在jsp上就能像以前那样 ,name只用我们的参数相同即可 

        <body>
            <form action="${pageContext.request.contextPath }/action1" method="post">
                用户名:<input type="text" name="username"><br>
                年 龄:<input type="text" name="age"><br>
                <input type="submit" value="提交">
            </form>
        </body>

  原理:

    其实这时候表单的name已经不仅仅是一个简单的字符串了。 

    这一系列的操作是由ModelDriven和params拦截器帮我们做的 。 

    params拦截器负责提取请求参数,如果是属性驱动模式,则还负责将请求参数传给Action类的属性 

    模型驱动的话就只提取请求参数。 

    ModelDriven拦截器会先判断我们的动作类是否属于ModelDriven类型  

    属于的话,就调用我们实现的getModel方法,获取我们传入的对象 

    然后将我们的对象给压入栈中

附:struts2注册案例

(1)我们先创建数据库表

        create database demo;
        use demo;

        create table user(
            username varchar(100) primary key,
            password varchar(100),
            birthday date,
            hobby varchar(255),
            married boolean
        );

(2)在domain包创建我们的user实体类  

        public class User {
            private String username;//用户名
            private String password;//密码
            private Date birthday; //生日
            private String hobby; //爱好
            private boolean married; //是否结婚
            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 Date getBirthday() {
                return birthday;
            }
            public void setBirthday(Date birthday) {
                this.birthday = birthday;
            }
            public String getHobby() {
                return hobby;
            }
            public void setHobby(String hobby) {
                this.hobby = hobby;
            }
            public boolean isMarried() {
                return married;
            }
            public void setMarried(boolean married) {
                this.married = married;
            }

        }

(3)完成数据层,我们在Dao层处理数据

        public class UserDao {
            QueryRunner qr=new QueryRunner(JdbcUtils.getDataSource()); 

            //根据名字查找用户
            public User findUserByUsername(String username){
                try {
                    String sql="select * from user where username=?";
                    return qr.query(sql, new BeanHandler<User>(User.class),username);
                } catch (Exception e) {
                    throw new RuntimeException(e);
                }
            }

            //添加用户
            public int addUser(User user){
                String sql="insert into user values(?,?,?,?,?)";
                Object []params={user.getUsername(),user.getPassword(),user.getBirthday(),user.getHobby(),user.isMarried()};
                try {
                    return qr.update(sql,params);
                } catch (SQLException e) {
                    throw new RuntimeException(e);
                }
            }

        }

(4)完成业务逻辑层的编写,service层  

        public class UserService {
            private UserDao userdao=new UserDao();
            //注册
            public int regist(User user){
                return userdao.addUser(user);
            }
            //通过用户名查找用户
            public User findByUsername(String username){
                return userdao.findUserByUsername(username);
            }
        }

(5)创建web层,我们创建web层动作类    

    public class UserAction extends ActionSupport implements ModelDriven{
        private User user=new User();
        private UserService userservice=new UserService();  

        //注册方法
        public String regist(){
            User _user=userservice.findByUsername(user.getUsername());
            //判断用户是否存在,存在返回exists字符串
            if(_user!=null){
                return "exists";
            }
            //获取注册成功更新的行数
            int count=userservice.regist(user);
            //如果>0,返回success
            if(count>0){
            return SUCCESS;
            }
            return null;
        }

        public Object getModel() {
            // TODO Auto-generated method stub
            return user;
        }

        public User getUser() {
            return user;
        }

        public void setUser(User user) {
            this.user = user;
        }

    }

(6)我们编写注册的jsp页面

    <body>
        <form action="${pageContext.request.contextPath }/regist.action" method="post">
            用户名:<input type="text" name="username"><br>
            密   码:<input type="password" name="password"><br>
            生   日:<input type="text" name="birthday"><br>
            爱好:<input type="checkbox" name="hobby" value="篮球">篮球
                <input type="checkbox" name="hobby" value="足球">足球
                <input type="checkbox" name="hobby" value="写代码">写代码<br>
            已婚:<input type="checkbox" name="married" value="true"><br>
            <input type="submit" name="注册"><br>
        </form>

    </body>

(7)配置 struts.xml  

 

        <package name="p1" extends="struts-default">

            <action name="regist" class="com.cad.web.action.UserAction"  method="regist">
                <result name="success">/success.jsp</result>
                <result name="exists">/msg.jsp</result>
            </action>
        </package>

  

 

  

  

原文地址:https://www.cnblogs.com/yuexiaoyun/p/9448178.html

时间: 2024-10-17 13:47:36

(九)模型驱动和属性驱动的相关文章

struts2进阶【3】——模型驱动与属性驱动

一.为什么要使用属性驱动和模型驱动? struts2与struts很大的不同点在于,struts的execute方法提供了HttpServletRequest和HttpServletResponse方法在获取客户端提交的数据信息的时候需要使用HttpServletRequest的getParameter()方法,并且还需要进行必要的数据类型转换.如何客户端提交的数据量大的时候,我们则需要写很多的getParameter方法.这样代码量就相应的增加不少.但是struts2为我们提供了属性驱动和模型

Struts2(二)— Result结果配置、Servlet的API的访问、模型驱动、属性驱动

一.Result结果配置 1.全局和局部结果 ? 平常我们设置跳转页面,是在action标签里面加上 result标签来控制,这种设置的页面跳转,称之为局部结果页面但是我们有时候在很多个action里面,针对不同的结果进行跳转时,也有可能跳转同一个页面,那么这个时候就可以配置全局结果页面. 1.1局部结果 在action里面写上的result跳转的页面,称之为局部结果页面配置 <action name="demo01_*" class="com.pri.web.acti

模型驱动与属性驱动区别

POJO(Plain Old Java Objects)简单的Java对象,实际就是普通JavaBeans,是为避免和EJB混淆所创造的简称 Property-Driven示例 标签name名与Action和POJO中名称保持一致即可 ①.JSP <s:form action="login.action" method="post" theme="simple"> <input type="text" nam

Struts2的属性驱动与模型驱动的区别

一.为什么要使用属性驱动和模型驱动? struts2与struts很大的不同点在于,struts的execute方法提供了HttpServletRequest和 HttpServletResponse方法在获取客户端提交的数据信息的时候需要使用HttpServletRequest.getParameter()方法,并且还需要进行必要的数据类型转换.如何客户端提交的数据量大的时候,我们则需要写很多的getParameter方法.这样代码量就相应的增加不少.但是struts2为我们提供了属性驱动和模

Struts2(四)属性驱动和模型驱动

一.概述 所谓模型驱动,就是使用单独的JavaBean实例贯穿整个MVC流程,与之相对应的属性驱动方式,则使用属性作为贯穿MVC流程的信息携带者.属性无法独立存下,它必须依附于一个对象,这个对象就是Action实例.简单来说,模型驱动使用单独的值对象来封装请求参数和处理结果,属性驱动则使用Action实例来封装请求参数和处理结果. 二.应用实例 以前文提到的LoginAction为例,在属性驱动中的action为: public class LoginAction extends ActionS

Struts2属性驱动与模型驱动

原文地址:http://blog.csdn.net/wuwenxiang91322/article/details/11660207 为什么要使用属性驱动和模型驱动 struts2与struts很大的不同点在于,struts的execute方法提供了HttpServletRequest和HttpServletResponse方法在获取客户端提交的数据信息的时候需要使用HttpServletRequest的getParameter()方法,并且还需要进行必要的数据类型转换.如何客户端提交的数据量大

Struts2 属性驱动、模型驱动、异常机制

模型驱动使用单独的VO(值对象)来封装请求参数和处理结果,属性驱动则使用Action实例来封装请求参数和处理结果. 一.使用模型驱动 1.login.action采用模型驱动模式实现,采用模型驱动时必须提供对应的模型,该模型就是一个普通的javabean. UserBean.java 1: package cc.openhome; 2: public class UserBean { 3: private String username; 4: private String password;

strus2中获取表单数据 两种方式 属性驱动 和模型驱动

strus2中获取表单数据 两种方式 属性驱动 和模型驱动 属性驱动 /** * 当前请求的action在栈顶,ss是栈顶的元素,所以可以利用setValue方法赋值* 如果一个属性在对象栈,在页面上可以根据name属性进行回显*/ /** * 属性驱动实现的条件:* 1.当前请求的action在栈顶,所以action中的属性就暴漏出来了* 2.获取页面上表单的元素,整合成一个map * 3.调用setValue方法赋值*/ 1 package cn.itcast.struts2.sh; 2 3

Struts2中属性驱动与模型驱动

属性驱动: LoginAction.java: public class LoginAction extends ActionSupport implements ModelDriven<User>{ private User mdoel = new User(); @Override public User getModel() { // TODO Auto-generated method stub return this.mdoel; } public String login(){ S