8.3 ? 集合類型輸入校驗介紹
于之前類型轉化章節中記述的集合類型的對象類型轉化相同。 Struts2 也支持集合類型的對象的輸入校驗。因此批量的對同一對象包含的屬性數據的輸入校驗也是筆者需要向讀者說明的,讀者可以于類型轉化中相關章節一起對照來學習。
8.3.1 ? Struts2 中單個 Java 對象的輸入校驗形式
技術要點 在介紹集合類型的輸入校驗之前,必須向讀者介紹單個 Java 對象輸入校驗的形式。因為每個集合類型中包含的元素都是一個個單獨的 java 對象,因此 Java 對象的輸入校驗是集合類型對象數據輸入校驗的基礎。請讀者必須要掌握。
?
Visitor 校驗器的介紹和使用方式。
Action 和 Java 對象的輸入校驗配置文件介紹。
演示代碼
還是使用第七章的添加材料那個示例。具體的 Material 對象代碼和第七章相同。 Action 代碼如下:
- <!---------------文件名:AddMaterialAction.java---------------> ??
- ………… ??
- public ? class ?AddMaterialAction? extends ?ActionSupport?{ ??
- ????????? //屬性類型需要輸入校驗的材料對象 ??
- ????????? private ?Material?material; ??
- ??
- ????????? public ?Material?getMaterial()?{ ??
- ??????????????????? return ?material; ??
- ?????????} ??
- ? ??
- ????????? public ? void ?setMaterial(Material?material)?{ ??
- ??????????????????? this .material?=?material; ??
- ?????????} ??
- ? ??
- ????????? public ?String?execute()? throws ?Exception?{ ??
- ??????????????????? return ?SUCCESS; ??
- ?????????} ??
- }??
<!---------------文件名:AddMaterialAction.java---------------> ………… public class AddMaterialAction extends ActionSupport { //屬性類型需要輸入校驗的材料對象 private Material material; public Material getMaterial() { return material; } public void setMaterial(Material material) { this.material = material; } public String execute() throws Exception { return SUCCESS; } }
?
添加材料和顯示添加材料成功的 JSP 視圖界面代碼也和第七章相同。修改 Action 的輸入校驗配置文件 AddMaterialAction-validation.xml 文件,代碼如下:
- <!-------------文件名:AddMaterialAction-validation.xml-------------> ??
- <validators> ??
- ?????????<field?name= "material" > ??
- ???????????????????<!-?-單個JAVA對象校驗??--> ??
- ???????????????????<field-validator?type= "visitor" > ??
- ????????????????????????????<param?name= "context" >materialContext</param> ??
- ????????????????????????????<param?name= "appendPrefix" > true </param> ??
- ????????????????????????????<message>添加材料輸入校驗:</message> ??
- ???????????????????</field-validator> ??
- ?????????</field> ??
- </validators>??
<!-------------文件名:AddMaterialAction-validation.xml-------------> <validators> <field name="material"> <!- -單個JAVA對象校驗 --> <field-validator type="visitor"> <param name="context">materialContext</param> <param name="appendPrefix">true</param> <message>添加材料輸入校驗:</message> </field-validator> </field> </validators>
?
除了 Action 校驗配置文件之外,本示例中還要增加 1 個對于 Material 這個 Java 對象的輸入校驗配置文件,名字叫 Material-materialContext-validation.xml 。至于為什么取這個名字稍后在代碼解釋中將說明。代碼如下:
- <!-------文件名:Material-materialContext-validation.xml----------> ??
- <validators>????? ??
- ?????????<field?name= "material" > ??
- ???????????????????<!?-?-?校驗材料是否輸入-?-> ??
- ???????????????????<field-validator?type= "requiredstring" > ??
- ????????????????????????????<message>請輸入材料名</message> ??
- ???????????????????</field-validator> ??
- ?????????</field> ??
- ??????? ??
- ?????????<field?name= "bid" > ??
- ???????????????????<!?-?-?校驗價格是否輸入-?-> ??
- ???????????????????<field-validator?type= "double" > ??
- ????????????????????????????<param?name= "minExclusive" > 0.1 </param> ??
- ????????????????????????????<message>請輸入價格</message> ??
- ???????????????????</field-validator> ??
- ?????????</field> ??
- ???????? ??
- ?????????<field?name= "mount" > ??
- ???????????????????<!?-?-?校驗庫存量是否輸入-?-> ??
- ???????????????????<field-validator?type= "int" > ??
- ????????????????????????????<param?name= "min" > 1 </param> ??
- ????????????????????????????<message>請輸入庫存量</message> ??
- ???????????????????</field-validator> ??
- ?????????</field> ??
- ???????? ??
- ?????????<field?name= "expireDate" > ??
- ???????????????????<!?-?-?校驗過期日期是否輸入-?-> ??
- ???????????????????<field-validator?type= "required" > ??
- ????????????????????????????<message>請輸入過期日期</message> ??
- ???????????????????</field-validator> ??
- ???????????????????<!?-?-?校驗過期日期是否在指定日期范圍內-?-> ??
- ???????????????????<field-validator?type= "date" > ??
- ????????????????????????????<param?name= "min" > 2009 - 01 - 01 </param> ??
- ????????????????????????????<param?name= "max" > 2019 - 01 - 01 </param> ??
- ????????????????????????????<message>輸入過期日期無效</message> ??
- ???????????????????</field-validator> ??
- ?????????</field> ??
- </validators>??
<!-------文件名:Material-materialContext-validation.xml----------> <validators> <field name="material"> <! - - 校驗材料是否輸入- -> <field-validator type="requiredstring"> <message>請輸入材料名</message> </field-validator> </field> <field name="bid"> <! - - 校驗價格是否輸入- -> <field-validator type="double"> <param name="minExclusive">0.1</param> <message>請輸入價格</message> </field-validator> </field> <field name="mount"> <! - - 校驗庫存量是否輸入- -> <field-validator type="int"> <param name="min">1</param> <message>請輸入庫存量</message> </field-validator> </field> <field name="expireDate"> <! - - 校驗過期日期是否輸入- -> <field-validator type="required"> <message>請輸入過期日期</message> </field-validator> <! - - 校驗過期日期是否在指定日期范圍內- -> <field-validator type="date"> <param name="min">2009-01-01</param> <param name="max">2019-01-01</param> <message>輸入過期日期無效</message> </field-validator> </field> </validators>
?
注意:該輸入校驗配置文件要和 Material 這個 Java 對象的代碼文件放在同一目錄下。
筆者還增加了一個 struts.properties 文件,方便輸入支持本示例的字符編碼集 GB2312
代碼如下:
- <!-------------文件名:struts.properties----------------------> ??
- #支持本地化的資源文件名定義 ??
- struts.i18n.encoding=gb2312??
<!-------------文件名:struts.properties----------------------> #支持本地化的資源文件名定義 struts.i18n.encoding=gb2312
?
如圖 8.5 ,如果沒有輸入任何信息時候的輸入校驗錯誤信息提示。
圖 8.5 ? 輸入校驗發現數據沒有進行任何輸入
如果輸入的過期日期不是 Material-materialContext-validation.xml 文件中定義的日期范圍時候出錯信息如圖 8.6 。
?
圖 8.6 ? 輸入校驗發現日期不符合所定義的日期范圍
代碼解釋
( 1 )其實本示例代碼很多都和類型轉換中復合類型對象的類型轉換示例很相似。所不同的就是兩個輸入校驗時候使用的 xml 文件。
( 2 )第 1 個文件是 Action 的校驗文件。該文件里由于 Action 的私有變量是一個 Material 對象。因此代碼中 fieldname 是該變量名字,定義了 2 個參數。 1 個是 context 參數,所定義的名字是有開發者自己自由定義。但是之后 Material 對象的輸入校驗配置文件名字中必須有這個名字。而 appendPrefix 參數缺省是 false, 定義為 true 時候則表明在輸入校驗出錯信息之前可以加上 message 所定義內容。圖 8.5 和圖 8.6 也顯示了每個出錯信息前都有 message 中定義的“添加材料輸入校驗:”這幾個字,其原因就是筆者把 appendPrefix 參數設置了 true 才會有這樣的效果。
( 3 )第 2 個文件是本示例重點,這個輸入校驗配置文件名字命名格式是“ Java 對象名 -context 參數 -validation.xml ”。在本示例中就是“ Material-materialContext-validation.xml ”。而且之前也已經說了該文件一定要和 Java 對象的類代碼文件放在同一目錄下。其中對輸入校驗規則的定義和前幾節類似。都是使用了 Struts2 內置的輸入校驗器。其中用到了 1 個前幾節沒有用到的 double 類型,在之后小節會綜合 Struts2 內置的輸入校驗器一起說明。
8.3.2 ? Struts2 對象集合即批量輸入的校驗形式
技術要點
Struts2 中也支持對 List 、 Set 等數據集合的輸入校驗。在視圖頁面上即是對同一 Java 對象進行批量的輸入。這里筆者值介紹 List 數據集合類型的校驗。其他數據集合類型校驗依此類推。
批量輸入校驗格式和相關注意點。
演示代碼
其實和上一小節代碼是相同的。這里只將不同的代碼羅列出來。支持 List 類型轉換的屬性文件如下:
- <!-----------文件名:AddMaterialAction-conversion.properties-----------> ??
- #集合屬性-List類型 ??
- Element_materialList=com.model.Material??
<!-----------文件名:AddMaterialAction-conversion.properties-----------> #集合屬性-List類型 Element_materialList=com.model.Material
?
Action 代碼如下:
- <!-------------文件名:AddMaterialAction.java---------------> ??
- public ? class ?AddMaterialAction? extends ?ActionSupport?{ ??
- ????????? private ?List<Material>?materialList;?? ??
- ??
- ????????? public ?String?execute()? throws ?Exception?{ ??
- ??????????????????? return ?SUCCESS; ??
- ?????????} ??
- ??
- ????????? public ?List<Material>?getMaterialList()?{ ??
- ??????????????????? return ?materialList; ??
- ?????????} ??
- ??
- ????????? public ? void ?setMaterialList(List<Material>?materialList)?{ ??
- ??????????????????? this .materialList?=?materialList; ??
- ?????????} ??
- }??
<!-------------文件名:AddMaterialAction.java---------------> public class AddMaterialAction extends ActionSupport { private List<Material> materialList; public String execute() throws Exception { return SUCCESS; } public List<Material> getMaterialList() { return materialList; } public void setMaterialList(List<Material> materialList) { this.materialList = materialList; } }
?
輸入的 JSP 視圖界面代碼如下:
- <!------------文件名:addMaterial.jsp------------------> ??
- ????????????????????????????<s:form?id= "materialForm" ?action= "addMaterial" ?theme= "simple" > ??
- ????????????????????????????<table> ??
- ????????????????????????????<tr> ??
- ????????????????????????????<td>材料名</td> ??
- ????????????????????????????<td>價格</td> ??
- ????????????????????????????<td>庫存量</td> ??
- ????????????????????????????<td>過期日期</td> ??
- ????????????????????????????</tr> ??
- ????????????????????????????<s:iterator?value= "new?int[4]" ?status= "m" > ??
- ????????????????????????????<tr> ??
- ????????????????????????????<td><s:textfield?name= "%{'materialList['+#m.index+'].material'}" ?/></td> ??
- ????????????<td><s:textfield?name= "%{'materialList['+#m.index+'].bid'}" ?/></td> ??
- ????????????<td><s:textfield?name= "%{'materialList['+#m.index+'].mount'}" ?/></td> ??
- ????????????<td><s:datetimepicker?name= "%{'materialList['+#m.index+'].expireDate'}" ?/></td> ??
- ????????????????????????????</tr> ??
- ????????????????????????????</s:iterator> ??
- ????????????????????????????<tr> ??
- ????????????????????????????<td?colspan= "4" ><s:submit?value= "提交" ></s:submit> ??
- ????????????????????????????</tr> ??
- ????????????????????????????</table> ??
- ????????????????????????????</s:form>??
<!------------文件名:addMaterial.jsp------------------> <s:form id="materialForm" action="addMaterial" theme="simple"> <table> <tr> <td>材料名</td> <td>價格</td> <td>庫存量</td> <td>過期日期</td> </tr> <s:iterator value="new int[4]" status="m"> <tr> <td><s:textfield name="%{'materialList['+#m.index+'].material'}" /></td> <td><s:textfield name="%{'materialList['+#m.index+'].bid'}" /></td> <td><s:textfield name="%{'materialList['+#m.index+'].mount'}" /></td> <td><s:datetimepicker name="%{'materialList['+#m.index+'].expireDate'}" /></td> </tr> </s:iterator> <tr> <td colspan="4"><s:submit value="提交"></s:submit> </tr> </table> </s:form>
?
輸入校驗顯示出錯信息如圖 8.7
?
圖 8.7 ? 輸入校驗所有數據為輸入時候的出錯信息
代碼解釋
( 1 ) Action 中私有變量是個 List 類型的 Material 對象的集合。但是 Action 和 Material 對象的輸入校驗配置文件內容和前 1 小節相同。
( 2 ) AddMaterialAction-conversion.properties 文件定義了 List 的元素都是 Material 對象 ( 請讀者翻閱 List 集合類型轉換章節,回憶一下這么做的原因 ) 。
( 3 )批量輸入材料的 JSP 視圖界面由代碼可知和前一章類型轉換中界面相同。筆者在本章一開始就說明了類型轉換其實也是輸入校驗的 1 種。從這里也可以佐證這 1 論點。在下 1 小節也有說明。
( 4 )圖 8.7 顯示了所有信息未輸入時候的出錯信息。表明批量輸入校驗的確是在起作用。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
