在Struts2中模型驱动就是用来封装数据的..完成数据的自动封装.php
咱们以前就使用过Sturts2的数据自动封装功能,是用params拦截器完成的…既然有了params拦截器,为啥还要模型驱动??java
当咱们使用params拦截器完成数据自动封装的时候,若是要封装的是JavaBean对象,那么在web表单中就必须的name写上javaBean.属性名
….web
这样的话,web层和Action层就耦合了…由于在web层必需要知道封装的JavaBean对象是什么才可以实现自动封装!markdown
而模型驱动就解决了这个问题!即时不知道Action层的JavaBean对象是什么,也可以完成数据自动封装!app
实现模型驱动功能也是由拦截器完成的,咱们来看看拦截器到底作了什么吧….ide
<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 栈的栈顶对象的各个属性中. this
也就是说,使用模型驱动是须要配合Params拦截器完成的!spa
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对象的名称!code
<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>
@Override public String execute() throws Exception { System.out.println(user); return SUCCESS; }