1. 程式人生 > >Struts2表單驗證、模型驅動、防重複提交、資料回顯筆記整理

Struts2表單驗證、模型驅動、防重複提交、資料回顯筆記整理

 剛學完一些零散的struts內建功能,做點筆記,就當回顧一遍,也便以後使用。

----------------------------------------------------------------------------------------------------------------------------------------

                  1)表單驗證

                    strus的表單驗證通過使用struts內建的vlidation攔截器來完成。使用相對比較簡單,有以下步驟需要完成。       

                        a,寫一個xml配置檔案(和需要驗證的action必須同包),檔名字有要求必須為  actionName+methodName+validation.xml例如:InsertAction-insert-validation.xml,需要注意的是,如果不使用methodName即InsertAction-validation.xml

的格式的話,則InsertAction中所有的方法都會被驗證,加上方法名則只驗證指定的方法。

                         b,如何寫xml檔案,如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
    "-//Apache Struts//XWork Validator 1.0.3//EN"
    "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">  
<validators>
   <field name="name">
                    <field-validator type="requiredstring">
                        <message>使用者名稱不能為空!</message> 
                    </field-validator>
                    <field-validator type="stringlength">
                        <param name="minLength">5</param>
                        <param name="maxLength">11</param>
                        <message>長度必須3-6位之間!</message>
                    </field-validator>
                </field>
              <field name="gender">
                    <field-validator type="requiredstring">
                        <message>性別不能為空!</message> 
                    </field-validator>
                </field>
                <field name="phone">
                    <field-validator type="requiredstring">
                        <message>電話不能為空!</message> 
                    </field-validator>
                </field>
                <field name="qq">
                    <field-validator type="requiredstring">
                        <message>QQ不能為空!</message> 
                    </field-validator>
                </field>
                <field name="email">
                    <field-validator type="requiredstring">
                        <message>email不能為空!</message> 
                    </field-validator>
                    <field-validator type="email">
                        <message>郵箱格式不正確!</message> 
                    </field-validator>
                </field>
                <field name="address">
                    <field-validator type="requiredstring">
                        <message>地址不能為空!</message> 
                    </field-validator>
                </field>         
</validators>   

struts內建了很多常用的驗證攔截器,  <field-validator type="">type的型別可以寫什麼可以參照一下程式碼,
 <validators>
                    <validator name="required" class="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator"/>
                    <validator name="requiredstring" class="com.opensymphony.xwork2.validator.validators.RequiredStringValidator"/>
                    <validator name="int" class="com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator"/>
                    <validator name="long" class="com.opensymphony.xwork2.validator.validators.LongRangeFieldValidator"/>
                    <validator name="short" class="com.opensymphony.xwork2.validator.validators.ShortRangeFieldValidator"/>
                    <validator name="double" class="com.opensymphony.xwork2.validator.validators.DoubleRangeFieldValidator"/>
                    <validator name="date" class="com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator"/>
                    <validator name="expression" class="com.opensymphony.xwork2.validator.validators.ExpressionValidator"/>
                    <validator name="fieldexpression" class="com.opensymphony.xwork2.validator.validators.FieldExpressionValidator"/>
                    <validator name="email" class="com.opensymphony.xwork2.validator.validators.EmailValidator"/>
                    <validator name="url" class="com.opensymphony.xwork2.validator.validators.URLValidator"/>
                    <validator name="visitor" class="com.opensymphony.xwork2.validator.validators.VisitorFieldValidator"/>
                    <validator name="conversion" class="com.opensymphony.xwork2.validator.validators.ConversionErrorFieldValidator"/>
                    <validator name="stringlength" class="com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator"/>
                    <validator name="regex" class="com.opensymphony.xwork2.validator.validators.RegexFieldValidator"/>
                    <validator name="conditionalvisitor" class="com.opensymphony.xwork2.validator.validators.ConditionalVisitorFieldValidator"/>
                </validators>

-------------------------------------------------------------------------------------------------------------------------------

2)模型驅動:使用模型驅動是為了簡化表單中每個表單項的name屬性值,我們都知道如果想要用action中定義的bean來封裝表單資訊,則表單中的每個表單項的name屬性值必須為 action中beanName.bean對應的屬性 即如果是Person person =new Person()來封裝表單,則名字必須為person.name/person.gender這樣比較麻煩,也可能對美工人員造成不便。使用驅動模型後則可以直接使用屬性名即可.

       a,action實現ModelDriven<T>介面,傳入實體物件如,ModelDriven<Person>實現一個方法:

public T getModel() ,返回一個實體物件,值得注意的是必須要new 出實體物件,在之前的封裝中我們只要宣告一個屬性變數即可,但是現在必須要new出其例項,以便getModel() 呼叫。

-------------------------------------------------------------------------------------------------------------------------------------

               3)防表單重複提交,同樣使用Struts內建的攔截器token來完成功能。

                     a,在Struts的預設攔截器中沒有防表單重複提交功能,我們需要在action節點下注冊一個,程式碼如下:

                        <interceptor-ref name="defaultStack" />
                        <!-- 增加令牌攔截器 -->
                         <interceptor-ref name="token">
                        <!-- 哪些方法被令牌攔截器攔截 -->
                        <param name="includeMethods">insert</param>
                        </interceptor-ref>

                    param中可以指定另一個值excludeMethods即指定除了哪些方法都執行攔截器,             includeMethods指定為哪些方法執行攔截器

                     b,配置一個錯誤檢視,即攔截到重複提交後跳轉到那個頁面:

                      <!-- 當用戶重複提交表單的時候,struts2會自動轉到此錯誤頁面 -->
                      <result name="invalid.token">/WEB-INF/jsp/message.jsp</result>

                      但是這裡有個疑問:轉到某個頁面後我們如何設定提示資訊給使用者呢?一切驗證都是struts內部完成,我們怎麼知道什麼時候使用者重複提交了呢?希望大神指點

-------------------------------------------------------------------------------------------------------------------------------------

                     4)資料回顯,很多地方都需要用到資料回顯,比如編輯頁面,或者是驗證的時候驗證失敗,之前的資料回顯是通過將資料存放到域中然後再每個表單項中設定value相對比較麻煩.。struts的回顯則相對比較簡單,但必須使用struts的控制元件。

                       a,在跳轉到比如編輯頁面或者提交頁面的方法中加上如下程式碼:

                       //到到值棧

                       ValueStack vs = ActionContext.getContext().getValueStack();

                       //清空棧頂元素,避免不必要的回顯資料
                       vs.pop();

                       //壓棧,cus即用來封裝資料的實體。
                       vs.push(cus);

                       資料回顯功能比較強大,如之前比較煩躁的radio或者select等控制元件同樣不需要特殊處理,處理方式和其他控制元件一致,但是必須使用struts的控制元件。struts的控制元件radio和select等控制元件和html控制元件差別很大,其他控制元件則大同小異。例如

                      <s:radio name="gender"  id="gender" list="#{'男':'男','女':'女'}"></s:radio>

                       使用map的形式給radio賦值,list項必須填,客戶端生成 的html程式碼顯示為map的value,值即為map的key  

                       <s:select list="#session.departlist" listKey="id" listValue="dname" name="depart" ></s:select>      

                        下拉框的值來自session域中的Bean集合,需要指定每一項顯示的值listValue和每一項真正的值listKey都是Bean的屬性

-------------------------------------------------------------------------------------------------------------------------------------

  學完struts後,感覺是方便了不少,但是有些困惑,java和.net相比,執行效率不才是java的優勢嗎?明顯感覺到使用struts框架和控制元件後執行速度慢了不少,如果只是效率來講的話.net那套控制元件使用起來更方便。。。。。。。