struts2 使用驗證框架驗證域模型和ModelDriven驗證
阿新 • • 發佈:2019-02-14
有一類特殊的屬性,即這個屬性的型別是另外一個JavaBean,如有一個User類,程式碼如下:
package data; public class User { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
在NewValidateAction類中加一個user屬性,程式碼如下:
package action; import com.opensymphony.xwork2.ActionSupport; import data.User; public class NewValidateAction extends ActionSupport { private String msg; private int age; private User user; public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } }
如果要驗證NewValidateAction中的user屬性,可以使用visitor驗證器。操作過程如下:
首先在NewValidateAction-validation.xml中加入一個<field>標籤,程式碼如下:
<?xml version="1.0" encoding="UTF-8"?> <!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="user"> <field-validator type="visitor"> <param name="context">abc</param> <param name="appendPrefix">true</param> <message>User:</message> </field-validator> </field> </validators>
其中context引數將作為驗證User類屬性的檔名的一部分,如user屬性返回一個User物件,那麼用於驗證User物件屬性的檔名為User-abc-validation.xml。這個檔案要和User.class檔案在同一個目錄中。appendPrefix表示是否在欄位里加user,如果為true,Struts2就會使用user.name在form提交的資料中查詢要驗證的資料。這個屬性的預設值是true。如果出錯,Struts2會將<message>標籤中的資訊加到User-abc-validation.xml檔案中的相應錯誤資訊前面。User-abc-validation.xml檔案的內容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!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="name">
<field-validator type="requiredstring">
<message>請輸入name</message>
</field-validator>
</field>
<field name="age">
<field-validator type="int">
<param name="min">5</param>
<param name="max">20</param>
<message>
必須在 5至20之間
</message>
</field-validator>
</field>
</validators>
下面修改validate_form.jsp,程式碼如下:
<s:form validate="true" action="new_validate" namespace="/test" >
<s:textfield name="msg" label="姓名" />
<s:textfield name="age" label="年齡"/>
<s:textfield name="user.name" label="姓名1" />
<s:textfield name="user.age" label="年齡1"/>
<s:submit/>
</s:form>
大家可以看到,最後兩個<s:textfield>的name屬性是user.name和user.age,正好是加了字首的。現在重新訪問 http://localhost:8080/validation/validate_form.jsp
經筆者測試,使用visitor無法以客戶端驗證的方式來驗證user屬性,但NewValidateAction中其他的屬性可以使用客戶端測試。
還有一種就是在ModelDriven動作中使用驗證框架
和域模型相似,User-validation.xml沒有變化,主要的變化在動作和JSP頁面上。在動作方面,我們必須實現ModelDriven介面。
JSP變化:省略了OGNL表示式的使用者級別,只保留頂級的引用,例如:username和password。
基於引用名稱空間的改變,現在需要對visitor驗證器的對映做一些輕微的改變。
<validators>
<field name="model">
<field-validator type="visitor">
<param name="appendPrefix">false</param>
<message>User:</message>
</field-validator>
</field>
</validators>
做了兩處變更。首先,由於ModelDriven動作的域物件通過getModel()獲取方法公開出來,所以現在我們需要改變指向model的欄位名。其次,我們需要使用appendPrefix引數告訴visitor驗證器不再需要在欄位名之前增加user字首。把這個引數設定為false允許驗證器發現頂級欄位名字。