struts2-ModelDriven模型驱动
把动作和模型隔开
在使用 Struts 作为前端的企业级应用程序时把动作和模型清晰地隔离开是有必要的: 有些动作类不代表任何模型对象, 它们的功能仅限于提供图文显示服务
ModelDriven 拦截器
情景: 有一个用来处理客户的 CustomerAction 类, 该动作类实现了 ModelDriven 接口.
当用户触发CustomerAction 动作时, ModelDriven 拦截器将调用相关CustomerAction 对象的 getModel() 方法, 并把返回的模型(Customer实例)压入到 ValueStack 栈. 接下来 Parameters 拦截器将把表单字段映射到 ValueStack 栈的栈顶对象的各个属性中. 因为此时 ValueStack 栈的栈顶元素是刚被压入的模型(Product)对象, 所以该模型将被填充. 如果某个字段在模型里没有匹配的属性, Param 拦截器将尝试 ValueStack 栈中的下一个对象.
一个模型类必须有一个不带任何参数的构造器.
模型驱动的目的是将对象放入到值栈顶,由struts2中的模型驱动拦截器处理
1 public class UserAction extends ActionSupport implements ModelDriven<CustomAction> { 2 3 public CustomAction getModel() { 4 return user; 5 } 6 }
底层代码:<interceptor name="modelDriven" class="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor"/>
struts2标签自动回显
方法一:
1 public String edit(){ 2 //该对象是从数据库查询出来的 3 CustomAction newUser = new CustomAction(); 4 newUser.setUsername("zhang"); 5 newUser.setTel("13600000000"); 6 newUser.setDes("xxxxx"); 7 } 8 方法一: 9 user.setUsername(newUser.getUsername()); 10 user.setTel(newUser.getTel()); 11 user.setDes(newUser.getDes()); 12 } 13 方法二: 14 //获取栈 15 ValueStack valueStack = ServletActionContext.getContext().getValueStack(); 16 //删除栈顶的user对象 17 valueStack.pop(); 18 //增加新的对象到栈顶newUser 19 valueStack.push(newUser); 20 }
-方式二原理
by hacket