用过struts1的人接触struts2的时候,通常会产生一个疑惑,明明struts1已经把action的form分开了,为什么struts2确把模型放在action中定义。其实这个方式只是想让action更加直观,但是如果表单数据过多的话,action类就会出现过于冗长,所以struts2的ModelDriven就要出来解决问题了。下面讲讲ModelDriven的机制
1.工作原理
ModelDriven的机制背后就是ValueStack.界面可以通过直接指定对象的属性名就能给对象进行赋值。
ModelDriven其实实现的是一个缺省的拦截器ModelDrivenInterceptor,当一个请求通过该拦截器的时候,会判断该请求是否实现了ModelDriven接口,如果实现了,那么就调用getModel方法,然后把返回值压入ValueStack。
public class ModelDrivenInterceptor extends AbstractInterceptor { protected boolean refreshModelBeforeResult = false; public void setRefreshModelBeforeResult(boolean val) { this.refreshModelBeforeResult = val; } @Override public String intercept(ActionInvocation invocation) throws Exception { Object action = invocation.getAction(); if (action instanceof ModelDriven) { ModelDriven modelDriven = (ModelDriven) action; ValueStack stack = invocation.getStack(); Object model = modelDriven.getModel(); if (model != null) { stack.push(model); } if (refreshModelBeforeResult) { invocation.addPreResultListener(new RefreshModelBeforeResult(modelDriven, model)); } } return invocation.invoke(); }
2.前面说的,我们应该在Action中实现ModelDriven并且实现其中的方法getModel,下面代码只是截取片段
public class ManageStudentAction extends ActionSupport implements Action,ModelDriven<Student> { private static final long serialVersionUID = 1L; private Student student; @Override public Student getModel() { if(student == null){ student = new Student(); } return student; } }
3.页面代码就跟直接定义属性是一样的,以student的属性作为name。
<tr> <td align="right">学生名</td> <td> <input type="text" name="studentname" value="${theUser.studentname}"></td></tr> <tr> <td align="right">年龄:</td> <td> <input type="text" name="age" value="${theUser.age}"></td></tr> <td align="right">班级:</td> <td> <input type="text" name="classname" value="${theUser.classname}"></td></tr> <tr> <td colspan='2' align="center"><input type="submit" value="保存" name="btnSubmit"> <input type="reset" value="重置" name="btnCancel"></td> </tr>
4.这样我们就可以把Action和Model分开,去实现Struts2的MVC架构
本站文章为 宝宝巴士 SD.Team 原创,转载务必在明显处注明:(作者官方网站: 宝宝巴士 )
转载自【宝宝巴士SuperDo团队】 原文链接: http://www.cnblogs.com/superdo/p/4824321.html