在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; }