Struts2中的ModelDriven机制及其运用
来源:互联网 发布:java上传图片回显 编辑:程序博客网 时间:2024/05/29 17:38
来自:
http://blog.csdn.net/P_Doraemon/article/details/54024032?locationNum=6&fps=1
所谓ModelDriven,意思是直接把实体类当成页面数据的收集对象。比如,有实体类User如下:
假如要写一个Action,用来添加User。
第一种做法是直接在Action中定义所有需要的属性,然后在JSP中直接用属性名称来提交数据:
UserAction:
add_input.jsp:上述做法不好之处是:如果实体类的属性非常多,那么Action中也要定义相同的属性
第二种做法是将User对象定义到UserAction中,然后在JSP中通过user属性来给user赋值:
UserAction:
第三种做法是利用ModelDriven机制,让UserAction实现一个ModelDriven接口,同时实现接口中的方法:getModel()。如下所示:JSP的代码如下:
可见,第三种做法是比较好的,Action和JSP写起来都比较简单。
注意:(1)一个请求在最终到达Action的方法之前,Action对象本身会被压入ValueStack(实际上就是放到ValueStack的CompoundRoot中),所以Action对象是CompoundRoot中的一个元素(2)这里的user必须不能为null才会被压入到栈顶中!!
ModelDriven机制
ModelDriven背后的机制就是ValueStack。界面通过:username/age/address这样的名称,就能够被直接赋值给user对象,这证明user对象正是ValueStack中的一个root对象!
那么,为什么user对象会在ValueStack中呢?它是什么时候被压入ValueStack的呢?答案是:ModelDrivenInterceptor。ModelDrivenInterceptor是缺省的拦截器链的一部分,当一个请求经过ModelDrivenInterceptor的时候,在这个拦截器中,会判断当前要调用的Action对象是否实现了ModelDriven接口,如果实现了这个接口,则调用getModel()方法,并把返回值(本例是返回user对象)压入ValueStack。
请看ModelDrivenInterceptor的代码:
其中的refreshModelBeforeResult是为了接下来描述的一个问题而提供的解决方法。
理解常见的陷阱及其解决方法
假设我们要更新一个实体对象,那么第一步首先是打开更新界面,请看下述模拟打开更新界面的代码:
public Object getModel() { if(user == null){ user = new User();//user.setUsername("这是原来的User对象"); } return user;}public String updateInput(){ //根据ID,查询数据库,得到User对象 user = new UserManager().findUserById(user.getId()); return "update_input";}
}上述代码中,new UserManager().findUserById(user.getId());这一行,将从数据库中查询相应的记录,同时转换为User对象返回。而return “update_input”;将转向更新显示页面。
更新页面如下:
理解上述问题很重要,当你理解了问题,那么问题的解决方法就可以有很多了:
比如,你可以把新对象的属性拷贝到旧对象上;比如,你可以先把旧对象从ValueStack中移除,然后再把新对象压入ValueStack等……
在最新的struts2版本中,ModelDrivenInterceptor提供了一个配置参数:refreshModelBeforeResult,只要将它定义为true,上述问题就被解决了!struts2的解决方案就是:先把旧的model对象从ValueStack中移除,然后再把新的model对象压入ValueStack!
再看下一个例子会更加清楚:
MyJsp.jsp:
UserAction:getData.jsp:用<s:debug></s:debug>可以将OgnlValueStack中的成员看得清清楚楚。ModelDriven中的model属性可以直接将Action中的成员变量取出!#root[i]表示的是从CompoundRoot的第i个成员开始往下取值,i从0开始。
- Struts2中的ModelDriven机制及其运用
- Struts2中的ModelDriven机制及其运用
- Struts2中的ModelDriven机制及其运用
- Struts2中的ModelDriven机制及其运用
- Struts2中的ModelDriven机制及其运用
- Struts2中的ModelDriven机制及其运用 .
- Struts2中的ModelDriven机制及其运用
- Struts2中的ModelDriven机制及其运用
- Struts2中的ModelDriven机制及其运用
- Struts2中的ModelDriven机制及其运用
- Struts2中的ModelDriven机制及其运用
- Struts2中的ModelDriven机制及其运用
- Struts2中的ModelDriven机制及其运用
- Struts2中的ModelDriven机制及其运用 .
- Struts2中的ModelDriven机制及其运用
- Struts2中的ModelDriven机制及其运用
- Struts2中的ModelDriven机制及其运用
- Struts2中的ModelDriven机制及其运用
- 面试题43:骰子的点数
- linux驱动开发---并发控制
- SQL语句--select
- tar命令
- MFC单文档之基于MSCOMM的多个编辑框的串口通讯
- Struts2中的ModelDriven机制及其运用
- Java DOM解析XML的几个例子
- 黑白图像
- 理解Python的With语句
- 【小游戏】三子棋
- 在linux下挂载硬盘
- 算法相关文章索引(2)
- 作业2
- JZOJ 3749. 【Srm590】Fox And City(fox)