Struts2 ModelDriven使用總結

    strus2中獲取表單數據有兩種方式屬性驅動和模型驅動,屬性驅動即使用Action的屬性元素封裝請求參數,而模型驅動是使用javaBean來封裝來回請求參數。

【struts2中模型驅動的使用方法】

    一個Action要想成爲模型驅動的話,就必須實現ModelDriven接口,請看下面一個例子:

    wKiom1PmImLB4HyMAADGloGqpLI994.jpg

    上面的代碼,首先BaseAction實現了ModelDriven接口,在BaseAction生命了實例變量model,然後再BaseAction的子類中就可以使用model來進行參數的傳遞。

    UserAction的部分代碼:

wKiom1PmIwSzIvhDAAE_29b3TK8183.jpg

【struts2中模型驅動原理】

    要說驅動模型實現,首先先介紹以下ModelDrivenInterceptor,該攔截器處於defaultStack第九的位置。ModelDrivenInterceptor攔截器主要做的事就是調用Action的getModel()方法然後把返回的model壓入值棧。下面是該攔截器intercept方法源碼:

    @Override

  public String intercept(ActionInvocation invocation) throws Exception {

  Object action = invocation.getAction();//獲取當前正在執行的Action

  //如果Action實現了ModelDriven接口

  if (action instanceof ModelDriven) {

  ModelDriven modelDriven = (ModelDriven) action;

  ValueStack stack = invocation.getStack();

  Object model = modelDriven.getModel();//通過getModel方法獲取model

  if (model != null) {//如果model不爲null則把model壓入值棧

  stack.push(model);

  }

  if (refreshModelBeforeResult) {//在執行Result之前是否要更新model對象,默認爲false

  invocation.addPreResultListener(new RefreshModelBeforeResult(modelDriven, model));

  }

  }

  return invocation.invoke();//調用下一個攔截器

  }

    

    此方法就是就是把getModel方法返回的結果壓入值棧而已,我們一般實現這個接口是利用壓入值棧的model對象接收從頁面提交過來的數據,因爲Action也是在值棧中,而struts2在賦值參數的時候是在值棧從棧頂往棧底尋找有相應setter方法的對象,而這時model壓入了值棧,它是處於棧頂的,所以從頁面提交過來的參數也就被model對象接收了。

    下面是struts2請求執行流程圖:

wKioL1PmH3rxiRuLAADV_TxDpPI956.jpg




    對於屬性驅動,我們需要在Action中定義與表單元素對應的所有的屬性,因而在Action中會出現很多的getter和setter方法,使得Action代碼量增加了很多,而且不利於封裝和繼承,模型驅動使得Action更加簡潔,可以使Action更加專注於是控制業務邏輯。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章