什么是模型驱动

在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;
}


最新文章

  1. 查看npm全局安装的模块
  2. Objective-C中的浅拷贝和深拷贝(转载)
  3. 分布式消息队列 Kafka
  4. linux学习4 网络命令和关机重启
  5. 用cryptico.js实现RSA加密(应对cryptico不支持PEM)
  6. 如何加入自定义WebControl
  7. Mysql表基本操作
  8. 02.Lua的数据类型
  9. hadoop搭建杂记:Linux下hadoop的安装配置
  10. oracle dataguard 角色切换
  11. 网络传入安全jwts
  12. allocator
  13. python中闭包的理解
  14. Go语言的map如何判断key是否存在
  15. C#集合。
  16. vue router.push(),router.replace(),router.go()
  17. ToString()的各种用法(大全) C# 获取所有国家时间格式
  18. 吉哥系列故事——完美队形I
  19. Java时间格式化时YYYY(大写)和yyyy(小写)的区别
  20. mybatis的mapper的特殊符号处理

热门文章

  1. 抛开深层次底层,快速入门SpringMVC
  2. ffmpeg音频播放代码示例-avcodec_decode_audio4
  3. You don&#39;t know js
  4. [mark] first shellcode
  5. JavaWeb(六)Listener监听器
  6. Python3 TA-Lib
  7. 从零构建一个react+webpack+typescript的应用
  8. java异常—检查异常(checked exception)和未检查异常(unchecked exception)
  9. 二:搭建一个webpack3.5.5项目:建立项目的webpack配置文件
  10. OpenSSL中的大数接口与基于其的自用RSA加密接口设计