出于结构清晰的考虑,应该采用单独的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>

  

 

  

  

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

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

    一.Result结果配置 1.全局和局部结果 ​ 平常我们设置跳转页面,是在action标签里面加上 result标签来控制,这种设置的页面跳转,称之为局部结果页面但是我们有时候在很多个action里 ...

  2. Struts2的学习-属性驱动和模型驱动

    1.新建空项目,并托管到码云 2.设立maven 3.设置pom.xml 4.建包 5.在java包里建立两个类 package com.nf.entity; public class User { ...

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

    一.概述 所谓模型驱动,就是使用单独的JavaBean实例贯穿整个MVC流程,与之相对应的属性驱动方式,则使用属性作为贯穿MVC流程的信息携带者.属性无法独立存下,它必须依附于一个对象,这个对象就是A ...

  4. struts2属性驱动模型

    属性驱动模型的作用: 因为struts2与servlet API 实现了解耦,无法直接使用HttpServlet Request对象获取表单提交的参数,但Struts2提供了属性驱动模型机制来解决这个 ...

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

    1.Struts2的属性驱动. Struts2的属性驱动指的是在action中JSP页面的每一个form中的name都对应在action中有一个属性与之对应.看下面代码片段: <form act ...

  6. Struts2中属性驱动与模型驱动

    属性驱动: 1.概念 能够利用属性驱动获取页面表单元素的内容 2.步骤 1.在action中声明属性,属性的名称和页面元素中name属性的值保持一致 2.action中的属性必须有set和get方法 ...

  7. Struts2属性驱动与模型驱动

    为什么要使用属性驱动和模型驱动 struts2与struts很大的不同点在于,struts的execute方法提供了HttpServletRequest和HttpServletResponse方法在获 ...

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

    模型驱动使用单独的VO(值对象)来封装请求参数和处理结果,属性驱动则使用Action实例来封装请求参数和处理结果. 一.使用模型驱动 1.login.action采用模型驱动模式实现,采用模型驱动时必 ...

  9. struts2 中属性驱动(其实就是struts2 action 中处理 request 的参数【old 方式servlet api 封装数据到javabean中(or beanutils)】),这里属性驱动是新方式

    1.属性驱动 a\  一般的set public class UserAction extends ActionSupport { private String username; private S ...

随机推荐

  1. vue v-io 父子组件双向绑定多个数据

    vue-io-directive 可以减少使用emit,组件自带的v-model好像也只能设置一个 安装 npm i vue-io-directive 使用 import Vue from 'vue' ...

  2. GridSearchCV网格搜索得到最佳超参数, 在K近邻算法中的应用

    最近在学习机器学习中的K近邻算法, KNeighborsClassifier 看似简单实则里面有很多的参数配置, 这些参数直接影响到预测的准确率. 很自然的问题就是如何找到最优参数配置? 这就需要用到 ...

  3. Java并发包源码学习系列:同步组件Semaphore源码解析

    目录 Semaphore概述及案例学习 类图结构及重要字段 void acquire() 非公平 公平策略 void acquire(int permits) void acquireUninterr ...

  4. 防抖和节流及对应的React Hooks封装

    Debounce debounce 原意消除抖动,对于事件触发频繁的场景,只有最后由程序控制的事件是有效的. 防抖函数,我们需要做的是在一件事触发的时候设置一个定时器使事件延迟发生,在定时器期间事件再 ...

  5. 移动端时间回显iphone出现的问题

    new Date(item.startTime.replace(/-/g, '/') dateFormat('hh:mm', new Date(item.startTime.replace(/-/g, ...

  6. Mybatis高级:Mybatis注解开发单表操作,Mybatis注解开发多表操作,构建sql语句,综合案例学生管理系统使用接口注解方式优化

    知识点梳理 课堂讲义 一.Mybatis注解开发单表操作 *** 1.1 MyBatis的常用注解 之前我们在Mapper映射文件中编写的sql语句已经各种配置,其实是比较麻烦的 而这几年来注解开发越 ...

  7. 渗透测试--Nmap主机识别

    通过本篇博客可以学到:Nmap的安装和使用,列举远程机器服务端口,识别目标机器上的服务,指纹,发现局域网中存活主机,端口探测技巧,NSE脚本使用,使用特定网卡进行检测,对比扫描结果ndiff,可视化N ...

  8. elasticsearch如何设计集群

    本文为博客园作者所写: 一寸HUI,个人博客地址:https://www.cnblogs.com/zsql/ 在写本文时就在想,如果让你负责一个elasticsearch集群,从零开始,你会从哪些方面 ...

  9. 优化程序性能(CSAPP)

    [前言]虽然现在没有接触过大型项目,但是工作了会注重性能.学习一下,应该能更好更快的理解别人写的经典优化的代码.结合CSAPP和自己的理解,总结一下. 一.程序优化综述 1.高效程序的特点 (1)适当 ...

  10. 算法 - 链表操作思想 && case

    算法 - 链表操作题目套路 前面这一篇文章主要讲链表操作时候的实操解决方式,本文从本质讲解链表操作的元信息,学完后,再也不怕链表操作题目了. 1.链表的基本操作 链表的基本操作无外乎插入,删除,遍历 ...