Struts2對象集合(批量輸入)校驗 詳解
最后的目錄結構:
addMaterial.jsp:
<%@ page language="java" pageEncoding="gb2312"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <!-- struts2標簽庫調用聲明 --> <%@taglib prefix="s" uri="/struts-tags"%> <%@taglib prefix="sx" uri="/struts-dojo-tags"%> <html> <head> <title>添加材料</title> <s:head /> <sx:head /> </head> <body> <s:fielderror/> <h3 align="left"> Struts2類型轉換使用范例 </h3> <!-- 材料輸入表單 --> <table> <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><sx:datetimepicker name="%{'materialList['+#m.index+'].expireDate'}" /></td> </tr> </s:iterator> <tr> <td colspan="4"><s:submit value="提交"></s:submit> </tr> </table> </s:form> </table> </body> </html>
注釋:關于此段代碼詳細解釋見 Struts2 <s:lterator>標簽的一個復雜應用 解析。
最終提交的是一個名為materialList的集合實例,它有4個Material類型元素,每個元素都有material、bid、mount、expireDate這四個屬性。
struts.xml:
<?xml version="1.0" encoding="gb2312"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <!-- Action所在包定義 --> <package name="Convert" extends="struts-default" > <action name="addMaterial" class="com.action.AddMaterialAction"> <result name="input">/jsp/addMaterial.jsp</result> <result name="success">/jsp/showMaterial.jsp</result> </action> <action name="index"> <result>/jsp/addMaterial.jsp</result> </action> </package> </struts>
注釋:表單數據提交經struts.xml配置導航到action="addMaterial"的Action類AddMaterialAction去處理。
AddMaterialAction.java:
package com.action; import java.util.List; import com.model.Material; import com.opensymphony.xwork2.ActionSupport; 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頁面按"提交"按鈕后,就相當于"setMaterialList()"方法,實例化一個materialList集合實例。
AddMaterialAction-conversion.properties:
Element_materialList=com.model.Material
注釋:定義了List元素都是Material對象(由于定義時是用泛型List<Material>,此處是可缺省的)。
AddMaterialAction-validation:
<?xml version="1.0" encoding="gb2312"?> <!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd"> <validators> <field name="materialList"> <field-validator type="visitor"> <param name="context">materialContext</param> <param name="appendPrefix">true</param> <message>添加材料輸入校驗:</message> </field-validator> </field> </validators>
注釋:這是Action類AddMaterialAction的校驗配置文件,從命名就可看出來,它放在com.model目錄下。其中的格式算是比較統一的,appendPrefix參數設置了true 即在出錯信息前都加上message標簽中的內容。context參數設置為"materialContext",Material類校驗文件名“-”之間的名字要與之對應,本例為Material-materialContext-validation.xml。
Material.java:
package com.model; import java.util.Date; public class Material implements java.io.Serializable { // Fields private String material; private double bid; private int mount; private Date expireDate; public Material() {} public double getBid() { return bid; } public void setBid(double bid) { this.bid = bid; } public int getMount() { return mount; } public void setMount(int mount) { this.mount = mount; } public String getMaterial() { return this.material; } public void setMaterial(String material) { this.material = material; } public Date getExpireDate() { return expireDate; } public void setExpireDate(Date expireDate) { this.expireDate = expireDate; } }
Material-materialContext-validation.xml:
<?xml version="1.0" encoding="gb2312"?> <!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd"> <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對象的輸入校驗配置文件,它放在com.model目錄下。
struts.properties:
struts.i18n.encoding=gb2312
注釋:使輸入支持字符編碼集GB2312。
showMaterial.jsp:
<%@ page language="java" pageEncoding="gb2312"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <!-- struts2標簽庫調用聲明 --> <%@taglib prefix="s" uri="/struts-tags"%> <html> <head> <title>添加材料</title> <s:head /> </head> <body> <!-- 材料數據顯示 --> <table> <tr> <td>材料名</td> <td>價格</td> <td>庫存量</td> <td>過期日期</td> </tr> <s:iterator value="materialList" status="m"> <tr> <td><s:property value="material" ></s:property></td> <td><s:property value="bid" ></s:property></td> <td><s:property value="mount" ></s:property></td> <td><s:property value="expireDate" ></s:property></td> </tr> </s:iterator> </table> </body> </html>
注釋:它完成提交的表單數據的顯示。
地址欄運行 http://localhost:8080/Convert/jsp/addMaterial.jsp ,顯示頁面:
直接“提交”后,輸出:
輸入數據如下:
結果: