struts2中的模型驅動

模型驅動:作用:將動作和模型隔開
ModelDriven攔截器:
情景: 有一個用來處理客戶的 CustomerAction 類, 該動作類實現了 ModelDriven 接口. 
當用戶觸發CustomerAction 動作時, ModelDriven 攔截器將調用相關CustomerAction 對象的 getModel() 方法, 並把返回的模型(Customer實例)壓入到 ValueStack 棧. 接下來 Parameters 攔截器將把表單字段映射到 ValueStack 棧的棧頂對象的各個屬性中. 因爲此時 ValueStack 棧的棧頂元素是剛被壓入的模型(Product)對象, 所以該模型將被填充. 如果某個字段在模型裏沒有匹配的屬性, Param 攔截器將嘗試 ValueStack 棧中的下一個對象.
一個模型類必須有一個不帶任何參數的構造器.
Struts2的模型驅動將對象放置到棧頂。
使用場景:使用ModelDriven進行回顯
/**
  * 如果該Action實現了模型驅動的接口,此時需要通過getModel,
  * 將傳遞的Customer進行出來,返回對應Customer對象,將Customer對象賦給Action中屬性customer
  *   * 模型驅動的宗旨就是將該對象壓入棧頂,這樣好處可以方便的頁面獲取值,而且可以支持表單的回顯
  * */
 <!-- struts標籤支持回顯,在標籤中用name的屬性值匹配對象棧中對應屬性,這樣的話就可以將對象棧中該屬性對應的值,回顯到對應的標籤中 -->
方法一:
對模型驅動中的對象賦值
this.customer.setUsername("張三");
this.customer.setPsw("123");
this.customer.setTel("13212121212");
方法二:
//實例化javabean對象(Customer),放置棧頂
Customer c = new Customer();
c.setUsername("李四");
c.setPsw("11111");
c.setTel("88888888888");

//this.customer = c;
//獲取值棧
ValueStack valueStack = ActionContext.getContext().getValueStack();  
//刪除棧頂的對象
valueStack.pop();
//放入新的對象到棧頂
valueStack.push(c);
token防止表單重複提交:
<s:token />標籤防止重複提交,用法如下:
第一步:在表單中加入<s:token />
<s:form action="helloworld_other" method="post" namespace="/test">
  <s:textfield name="person.name"/><s:token/><s:submit/>
  </s:form>
第二步:
<action name="helloworld_*" class="cn.itcast.action.HelloWorldAction" method="{1}">
         <interceptor-ref name="defaultStack"/>
          <!-- 增加令牌攔截器 -->
          <interceptor-ref name="token">
                  <!-- 哪些方法被令牌攔截器攔截 -->
                  <param name=“includeMethods">save</param>
          </interceptor-ref>    
         <!-- 當表單重複提交轉向的頁面 -->
        <result name="invalid.token">/WEB-INF/page/message.jsp</result>   
</action>
第三步:
     在message.jsp提示表單提示的錯誤信息,使用<s:actionerror>
以上配置加入了“token”攔截器和“invalid.token”結果,因爲“token”攔截器在會話的token與請求的token不一致時,將會直接返回“invalid.token”結果。

 

 

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