struts2模型驱动深入理解
来源:互联网 发布:jsp中引用js文件 编辑:程序博客网 时间:2024/06/05 03:56
本文作为个人知识积累,转自【尊重原创,若要深入了解请前往】:http://m.blog.csdn.net/hon_3y/article/details/71189623
由于之前遇到过model这个对象,一直想深入理解其中机制,查阅很多资料(就是懒得翻源码,以后要自己翻源码了!),没有找到合适的解释或者说没有讲解到模型驱动这个model对象的由来以及实用。最近看到这位优秀的作者的讲解,豁然开朗,再自己翻看源码,有了更深的理解,感谢这位作者。
本文没有对模型驱动的使用非常全面的说明,而深入的讲解了模型驱动的执行机制。
什么是模型驱动
在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对象的数据
- struts2模型驱动深入理解
- Struts2的模型驱动、属性驱动的理解
- Struts2的模型驱动、属性驱动的理解
- Struts2的模型驱动、属性驱动的理解
- Struts2-属性驱动与模型驱动的理解
- Struts2的模型驱动与属性驱动的理解
- Struts2的模型驱动
- struts2模型驱动
- struts2模型驱动
- struts2模型驱动
- struts2模型驱动
- Struts2的模型驱动
- Struts2的模型驱动
- JavaWeb -- Struts2 模型驱动
- Struts2模型驱动
- Struts2模型驱动
- Struts2的模型驱动
- Struts2的模型驱动
- 方便自己查对蓝牙设备类型 Class of Device (CoD) Calculator
- PAT1116. Come on! Let's C (map)
- 音乐
- hive 教程
- 上传本地项目到github
- struts2模型驱动深入理解
- [NOIP2016提高组]D2T1:组合数问题
- Mat数据结构
- poj 1797 Heavy Transportation 最短路 dijkstra
- 白话经典算法系列之六 快速排序 快速搞定
- 【数论-莫比乌斯】hdu 6053 TrickGCD
- 异步任务
- 2017多校第4场 HDU 6071 Lazy Running 同余最短路
- 关于使用markdown的一点心得