(九)Struts2模型驱动和属性驱动
出于结构清晰的考虑,应该采用单独的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模型驱动和属性驱动的更多相关文章
- Struts2(二)— Result结果配置、Servlet的API的访问、模型驱动、属性驱动
一.Result结果配置 1.全局和局部结果 平常我们设置跳转页面,是在action标签里面加上 result标签来控制,这种设置的页面跳转,称之为局部结果页面但是我们有时候在很多个action里 ...
- Struts2的学习-属性驱动和模型驱动
1.新建空项目,并托管到码云 2.设立maven 3.设置pom.xml 4.建包 5.在java包里建立两个类 package com.nf.entity; public class User { ...
- Struts2(四)属性驱动和模型驱动
一.概述 所谓模型驱动,就是使用单独的JavaBean实例贯穿整个MVC流程,与之相对应的属性驱动方式,则使用属性作为贯穿MVC流程的信息携带者.属性无法独立存下,它必须依附于一个对象,这个对象就是A ...
- struts2属性驱动模型
属性驱动模型的作用: 因为struts2与servlet API 实现了解耦,无法直接使用HttpServlet Request对象获取表单提交的参数,但Struts2提供了属性驱动模型机制来解决这个 ...
- Struts2的属性驱动与模型驱动的区别
1.Struts2的属性驱动. Struts2的属性驱动指的是在action中JSP页面的每一个form中的name都对应在action中有一个属性与之对应.看下面代码片段: <form act ...
- Struts2中属性驱动与模型驱动
属性驱动: 1.概念 能够利用属性驱动获取页面表单元素的内容 2.步骤 1.在action中声明属性,属性的名称和页面元素中name属性的值保持一致 2.action中的属性必须有set和get方法 ...
- Struts2属性驱动与模型驱动
为什么要使用属性驱动和模型驱动 struts2与struts很大的不同点在于,struts的execute方法提供了HttpServletRequest和HttpServletResponse方法在获 ...
- Struts2 属性驱动、模型驱动、异常机制
模型驱动使用单独的VO(值对象)来封装请求参数和处理结果,属性驱动则使用Action实例来封装请求参数和处理结果. 一.使用模型驱动 1.login.action采用模型驱动模式实现,采用模型驱动时必 ...
- struts2 中属性驱动(其实就是struts2 action 中处理 request 的参数【old 方式servlet api 封装数据到javabean中(or beanutils)】),这里属性驱动是新方式
1.属性驱动 a\ 一般的set public class UserAction extends ActionSupport { private String username; private S ...
随机推荐
- js form.onformData事件
在表单提交前修改数据,此事件在submit之后 f1.addEventListener("formdata", (e) => { e.formData.append(&quo ...
- 开发Microsoft Teams选项卡应用安全注意事项
我们都知道,为了方便广大的开发人员快速开发Microsoft Teams选项卡应用,微软提供了一个JS SDK,你可以通过这里 https://docs.microsoft.com/en-us/jav ...
- WLAN-AC+AP射频一劳永逸的调优方式
AP射频调优组网图 射频调优简介 射频调优的主要功能就是动态调整AP的信道和功率,可以使同一AC管理的各AP的信道和功率保持相对平衡,保证AP工作在最佳状态.WLAN网络中,AP的工作状态会受到周围环 ...
- socket通信框架——boost asio
boost asio是一个封装了基本socket的跨平台通信框架.它支持异步访问,并支持tcp的自动封闭控制等操作. 一个简单的通信协议可以为: header body body长 数据 通过boos ...
- 【springboot读取配置文件】@ConfigurationProperties、@PropertySource和@Value
概念: @ConfigurationProperties : 是springboot的注解,用于把主配置文件中配置属性设置到对于的Bean属性上 @PropertySource :是spring的注解 ...
- ValidationUtils 验证工具
package com.appnirman.vaidationutils;import android.content.Context;import java.util.regex.Matcher;i ...
- Elasticsearch--Logstash定时同步MySQL数据到Elasticsearch
新地址体验:http://www.zhouhong.icu/post/139 一.Logstash介绍 Logstash是elastic技术栈中的一个技术.它是一个数据采集引擎,可以从数据库采集数据到 ...
- java的基础知识
编写一个hello,world public class Hello{ public static void main(String[] arge){ System.out.p ...
- PHP中一些常用的安全类函数
(1) htmlspecialchars() 表单验证(验证表单中的数据是否为空以及提交的数据是否合法) htmlspecialchars() //该函数将预定义的字符转化为html实体,预定义的 ...
- SQL注入绕过waf的一万种姿势
绕过waf分类: 白盒绕过: 针对代码审计,有的waf采用代码的方式,编写过滤函数,如下blacklist()函数所示: 1 ........ 2 3 $id=$_GET['id']; 4 5 $ ...