8.3 ? 集合類型輸入校驗(yàn)介紹
于之前類型轉(zhuǎn)化章節(jié)中記述的集合類型的對(duì)象類型轉(zhuǎn)化相同。 Struts2 也支持集合類型的對(duì)象的輸入校驗(yàn)。因此批量的對(duì)同一對(duì)象包含的屬性數(shù)據(jù)的輸入校驗(yàn)也是筆者需要向讀者說(shuō)明的,讀者可以于類型轉(zhuǎn)化中相關(guān)章節(jié)一起對(duì)照來(lái)學(xué)習(xí)。
8.3.1 ? Struts2 中單個(gè) Java 對(duì)象的輸入校驗(yàn)形式
技術(shù)要點(diǎn) 在介紹集合類型的輸入校驗(yàn)之前,必須向讀者介紹單個(gè) Java 對(duì)象輸入校驗(yàn)的形式。因?yàn)槊總€(gè)集合類型中包含的元素都是一個(gè)個(gè)單獨(dú)的 java 對(duì)象,因此 Java 對(duì)象的輸入校驗(yàn)是集合類型對(duì)象數(shù)據(jù)輸入校驗(yàn)的基礎(chǔ)。請(qǐng)讀者必須要掌握。
?
Visitor 校驗(yàn)器的介紹和使用方式。
Action 和 Java 對(duì)象的輸入校驗(yàn)配置文件介紹。
演示代碼
還是使用第七章的添加材料那個(gè)示例。具體的 Material 對(duì)象代碼和第七章相同。 Action 代碼如下:
- <!---------------文件名:AddMaterialAction.java---------------> ??
- ………… ??
- public ? class ?AddMaterialAction? extends ?ActionSupport?{ ??
- ????????? //屬性類型需要輸入校驗(yàn)的材料對(duì)象 ??
- ????????? 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 { //屬性類型需要輸入校驗(yàn)的材料對(duì)象 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 的輸入校驗(yàn)配置文件 AddMaterialAction-validation.xml 文件,代碼如下:
- <!-------------文件名:AddMaterialAction-validation.xml-------------> ??
- <validators> ??
- ?????????<field?name= "material" > ??
- ???????????????????<!-?-單個(gè)JAVA對(duì)象校驗(yàn)??--> ??
- ???????????????????<field-validator?type= "visitor" > ??
- ????????????????????????????<param?name= "context" >materialContext</param> ??
- ????????????????????????????<param?name= "appendPrefix" > true </param> ??
- ????????????????????????????<message>添加材料輸入校驗(yàn):</message> ??
- ???????????????????</field-validator> ??
- ?????????</field> ??
- </validators>??
<!-------------文件名:AddMaterialAction-validation.xml-------------> <validators> <field name="material"> <!- -單個(gè)JAVA對(duì)象校驗(yàn) --> <field-validator type="visitor"> <param name="context">materialContext</param> <param name="appendPrefix">true</param> <message>添加材料輸入校驗(yàn):</message> </field-validator> </field> </validators>
?
除了 Action 校驗(yàn)配置文件之外,本示例中還要增加 1 個(gè)對(duì)于 Material 這個(gè) Java 對(duì)象的輸入校驗(yàn)配置文件,名字叫 Material-materialContext-validation.xml 。至于為什么取這個(gè)名字稍后在代碼解釋中將說(shuō)明。代碼如下:
- <!-------文件名:Material-materialContext-validation.xml----------> ??
- <validators>????? ??
- ?????????<field?name= "material" > ??
- ???????????????????<!?-?-?校驗(yàn)材料是否輸入-?-> ??
- ???????????????????<field-validator?type= "requiredstring" > ??
- ????????????????????????????<message>請(qǐng)輸入材料名</message> ??
- ???????????????????</field-validator> ??
- ?????????</field> ??
- ??????? ??
- ?????????<field?name= "bid" > ??
- ???????????????????<!?-?-?校驗(yàn)價(jià)格是否輸入-?-> ??
- ???????????????????<field-validator?type= "double" > ??
- ????????????????????????????<param?name= "minExclusive" > 0.1 </param> ??
- ????????????????????????????<message>請(qǐng)輸入價(jià)格</message> ??
- ???????????????????</field-validator> ??
- ?????????</field> ??
- ???????? ??
- ?????????<field?name= "mount" > ??
- ???????????????????<!?-?-?校驗(yàn)庫(kù)存量是否輸入-?-> ??
- ???????????????????<field-validator?type= "int" > ??
- ????????????????????????????<param?name= "min" > 1 </param> ??
- ????????????????????????????<message>請(qǐng)輸入庫(kù)存量</message> ??
- ???????????????????</field-validator> ??
- ?????????</field> ??
- ???????? ??
- ?????????<field?name= "expireDate" > ??
- ???????????????????<!?-?-?校驗(yàn)過(guò)期日期是否輸入-?-> ??
- ???????????????????<field-validator?type= "required" > ??
- ????????????????????????????<message>請(qǐng)輸入過(guò)期日期</message> ??
- ???????????????????</field-validator> ??
- ???????????????????<!?-?-?校驗(yàn)過(guò)期日期是否在指定日期范圍內(nèi)-?-> ??
- ???????????????????<field-validator?type= "date" > ??
- ????????????????????????????<param?name= "min" > 2009 - 01 - 01 </param> ??
- ????????????????????????????<param?name= "max" > 2019 - 01 - 01 </param> ??
- ????????????????????????????<message>輸入過(guò)期日期無(wú)效</message> ??
- ???????????????????</field-validator> ??
- ?????????</field> ??
- </validators>??
<!-------文件名:Material-materialContext-validation.xml----------> <validators> <field name="material"> <! - - 校驗(yàn)材料是否輸入- -> <field-validator type="requiredstring"> <message>請(qǐng)輸入材料名</message> </field-validator> </field> <field name="bid"> <! - - 校驗(yàn)價(jià)格是否輸入- -> <field-validator type="double"> <param name="minExclusive">0.1</param> <message>請(qǐng)輸入價(jià)格</message> </field-validator> </field> <field name="mount"> <! - - 校驗(yàn)庫(kù)存量是否輸入- -> <field-validator type="int"> <param name="min">1</param> <message>請(qǐng)輸入庫(kù)存量</message> </field-validator> </field> <field name="expireDate"> <! - - 校驗(yàn)過(guò)期日期是否輸入- -> <field-validator type="required"> <message>請(qǐng)輸入過(guò)期日期</message> </field-validator> <! - - 校驗(yàn)過(guò)期日期是否在指定日期范圍內(nèi)- -> <field-validator type="date"> <param name="min">2009-01-01</param> <param name="max">2019-01-01</param> <message>輸入過(guò)期日期無(wú)效</message> </field-validator> </field> </validators>
?
注意:該輸入校驗(yàn)配置文件要和 Material 這個(gè) Java 對(duì)象的代碼文件放在同一目錄下。
筆者還增加了一個(gè) struts.properties 文件,方便輸入支持本示例的字符編碼集 GB2312
代碼如下:
- <!-------------文件名:struts.properties----------------------> ??
- #支持本地化的資源文件名定義 ??
- struts.i18n.encoding=gb2312??
<!-------------文件名:struts.properties----------------------> #支持本地化的資源文件名定義 struts.i18n.encoding=gb2312
?
如圖 8.5 ,如果沒(méi)有輸入任何信息時(shí)候的輸入校驗(yàn)錯(cuò)誤信息提示。
圖 8.5 ? 輸入校驗(yàn)發(fā)現(xiàn)數(shù)據(jù)沒(méi)有進(jìn)行任何輸入
如果輸入的過(guò)期日期不是 Material-materialContext-validation.xml 文件中定義的日期范圍時(shí)候出錯(cuò)信息如圖 8.6 。
?
圖 8.6 ? 輸入校驗(yàn)發(fā)現(xiàn)日期不符合所定義的日期范圍
代碼解釋
( 1 )其實(shí)本示例代碼很多都和類型轉(zhuǎn)換中復(fù)合類型對(duì)象的類型轉(zhuǎn)換示例很相似。所不同的就是兩個(gè)輸入校驗(yàn)時(shí)候使用的 xml 文件。
( 2 )第 1 個(gè)文件是 Action 的校驗(yàn)文件。該文件里由于 Action 的私有變量是一個(gè) Material 對(duì)象。因此代碼中 fieldname 是該變量名字,定義了 2 個(gè)參數(shù)。 1 個(gè)是 context 參數(shù),所定義的名字是有開(kāi)發(fā)者自己自由定義。但是之后 Material 對(duì)象的輸入校驗(yàn)配置文件名字中必須有這個(gè)名字。而 appendPrefix 參數(shù)缺省是 false, 定義為 true 時(shí)候則表明在輸入校驗(yàn)出錯(cuò)信息之前可以加上 message 所定義內(nèi)容。圖 8.5 和圖 8.6 也顯示了每個(gè)出錯(cuò)信息前都有 message 中定義的“添加材料輸入校驗(yàn):”這幾個(gè)字,其原因就是筆者把 appendPrefix 參數(shù)設(shè)置了 true 才會(huì)有這樣的效果。
( 3 )第 2 個(gè)文件是本示例重點(diǎn),這個(gè)輸入校驗(yàn)配置文件名字命名格式是“ Java 對(duì)象名 -context 參數(shù) -validation.xml ”。在本示例中就是“ Material-materialContext-validation.xml ”。而且之前也已經(jīng)說(shuō)了該文件一定要和 Java 對(duì)象的類代碼文件放在同一目錄下。其中對(duì)輸入校驗(yàn)規(guī)則的定義和前幾節(jié)類似。都是使用了 Struts2 內(nèi)置的輸入校驗(yàn)器。其中用到了 1 個(gè)前幾節(jié)沒(méi)有用到的 double 類型,在之后小節(jié)會(huì)綜合 Struts2 內(nèi)置的輸入校驗(yàn)器一起說(shuō)明。
8.3.2 ? Struts2 對(duì)象集合即批量輸入的校驗(yàn)形式
技術(shù)要點(diǎn)
Struts2 中也支持對(duì) List 、 Set 等數(shù)據(jù)集合的輸入校驗(yàn)。在視圖頁(yè)面上即是對(duì)同一 Java 對(duì)象進(jìn)行批量的輸入。這里筆者值介紹 List 數(shù)據(jù)集合類型的校驗(yàn)。其他數(shù)據(jù)集合類型校驗(yàn)依此類推。
批量輸入校驗(yàn)格式和相關(guān)注意點(diǎn)。
演示代碼
其實(shí)和上一小節(jié)代碼是相同的。這里只將不同的代碼羅列出來(lái)。支持 List 類型轉(zhuǎn)換的屬性文件如下:
- <!-----------文件名: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>價(jià)格</td> ??
- ????????????????????????????<td>庫(kù)存量</td> ??
- ????????????????????????????<td>過(guò)期日期</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>價(jià)格</td> <td>庫(kù)存量</td> <td>過(guò)期日期</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>
?
輸入校驗(yàn)顯示出錯(cuò)信息如圖 8.7
?
圖 8.7 ? 輸入校驗(yàn)所有數(shù)據(jù)為輸入時(shí)候的出錯(cuò)信息
代碼解釋
( 1 ) Action 中私有變量是個(gè) List 類型的 Material 對(duì)象的集合。但是 Action 和 Material 對(duì)象的輸入校驗(yàn)配置文件內(nèi)容和前 1 小節(jié)相同。
( 2 ) AddMaterialAction-conversion.properties 文件定義了 List 的元素都是 Material 對(duì)象 ( 請(qǐng)讀者翻閱 List 集合類型轉(zhuǎn)換章節(jié),回憶一下這么做的原因 ) 。
( 3 )批量輸入材料的 JSP 視圖界面由代碼可知和前一章類型轉(zhuǎn)換中界面相同。筆者在本章一開(kāi)始就說(shuō)明了類型轉(zhuǎn)換其實(shí)也是輸入校驗(yàn)的 1 種。從這里也可以佐證這 1 論點(diǎn)。在下 1 小節(jié)也有說(shuō)明。
( 4 )圖 8.7 顯示了所有信息未輸入時(shí)候的出錯(cuò)信息。表明批量輸入校驗(yàn)的確是在起作用。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

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