Struts2第十二篇【模型驅動】

什麼是模型驅動

在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

使用數據模型驅動

實現ModelDriven接口

  • 實現ModelDriven接口,重寫方法….實現接口時,要封裝的對象是什麼,形參類型就給什麼
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>
  • 在Action業務方法中輸出User對象的數據
@Override
    public String execute() throws Exception {

        System.out.println(user);
        return SUCCESS;
    }

這裏寫圖片描述

相關文章
相關標籤/搜索