Struts2資料校驗功能實現
前言
資料校驗一般是校驗表單項的內容。
而驗證的主要通過:
前臺驗證:主要是通過JS驗證資料是否合法!
後臺驗證:通過後臺java程式碼進行驗證!
那麼,本文主要介紹後端Struts校驗的實現。
回顧之前的資料驗證,主要是在業務邏輯程式碼之前增加if條件判斷來進行校驗的。比如:在登入時候在Action中的login()方法中進行判斷,但是我們只想在login()寫業務邏輯,不想搞這麼複雜的程式碼,那麼,想在系統呼叫login()方法之前就自動先校驗資料了,那麼Struts定義了validate資料校驗的攔截器,即在執行action中的業務方法之前執行資料校驗方法。
struts中資料校驗的攔截器為:
<interceptor name="validation" class="org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor"/>
Struts資料校驗主要有四種方式。我們分別來討論。
通過程式碼方式驗證Action中所有的方法
我們來驗證註冊頁面中資料的校驗。
Action實現:
public class UserAction extends ActionSupport {
// 封裝請求資料
private User user = new User();
public void setUser(User user) {
this.user = user;
}
public User getUser() {
return user;
}
// 重寫資料驗證的方法
@Override
public void validate() {
// 使用者名稱非空
if (user.getUserName() == null || "".equals(user.getUserName())) {
// 儲存錯誤資訊
super .addFieldError("userName", "使用者名稱必須填寫!");
}
// 密碼
if (user.getPwd() == null || "".equals(user.getPwd())) {
super.addFieldError("pwd", "密碼必填");
}
}
public String register(){
return "success";
}
}
在ActionSupport類中定義了validate()方法,我們需要重寫它。
在驗證方法中的super.addFieldError(“userName”, “使用者名稱必須填寫!”);其實內部封裝了一個map集合來儲存校驗錯誤資訊的,通過檢視原始碼。
public synchronized void addFieldError(String fieldName, String errorMessage) {
// 1. 儲存錯誤資訊的map集合
final Map<String, List<String>> errors = internalGetFieldErrors();
// 2. Map的value值 (一個key,對應的多個值用list儲存)
List<String> thisFieldErrors = errors.get(fieldName);
// 3. 如果錯誤資訊的map中沒有當前的key,就直接建立集合
if (thisFieldErrors == null) {
// 建立
thisFieldErrors = new ArrayList<String>();
errors.put(fieldName, thisFieldErrors);
}
// 4. 新增錯誤資訊
thisFieldErrors.add(errorMessage);
}
通過程式碼方式驗證Action中指定的方法
和上面的程式碼大致相同,只需要修改一點,就是講Action中的validate()方法名字改為validata+指定校驗方法的字尾.
例如:校驗register()方法,那麼public void validateRegister() {},只會驗證當前action的register方法!其他內容不變!
總結程式碼方式驗證:
繁瑣,設計很多重複的驗證邏輯!例如:非空驗證、數值驗證、email、日期等。
通過XML方式驗證Action中所有的方法
Struts對於常用的驗證,進行了封裝,即提供了驗證器, 驗證指定的常用業務邏輯!
Struts提供的所有驗證器在xwork-core-2.3.4.1.jar/com.opensymphony.xwork2.validator.validators/default.xml
中定義:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
"-//Apache Struts//XWork Validator Definition 1.0//EN"
"http://struts.apache.org/dtds/xwork-validator-definition-1.0.dtd">
<!-- START SNIPPET: validators-default -->
<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>
<!-- END SNIPPET: validators-default -->
寫XML檔案注意:
1)XML檔名稱語法: ActionClassName-validation.xml
注意:此xml需要與當前要驗證的action在同一個目錄:
舉例:UserAction-validation.xml
2)寫XML內容
在struts原始碼中找到定義了xml書寫規則(xwork-validator-1.0.3.dtd檔案中)
<?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表示 -->
<field name="user.userName">
<!-- 指定使用的驗證器 -->
<field-validator type="requiredstring">
<!-- 驗證失敗的錯誤提示資訊 -->
<message>使用者名稱不能為空!</message>
</field-validator>
</field>
<!-- 驗證pwd -->
<field name="user.pwd">
<!-- 非空 -->
<field-validator type="requiredstring">
<message>密碼不能為空!</message>
</field-validator>
<!-- 長度 -->
<field-validator type="stringlength">
<param name="minLength">6</param>
<param name="maxLength">8</param>
<message>密碼必須為6-8位!</message>
</field-validator>
</field>
<!-- 驗證日期 -->
<field name="user.birth">
<field-validator type="date">
<message>日期格式不對!</message>
</field-validator>
</field>
<!-- 驗證Email -->
<field name="user.email">
<field-validator type="email">
<message>郵箱格式錯誤!</message>
</field-validator>
</field>
</validators>
上面主要是驗證UserAction類的所有方法!
XML方式驗證Action中指定的方法
與上面xml驗證方式大致相同: 驗證xml檔案內容不變;
檔案命名修改為:
語法:ActionClassName-ActionName-validation.xml
舉例:UserAction-user_register-validation.xml,這裡是配置檔案中Action的name屬性值。
驗證UserAction中的register方法
Struts驗證總結
程式碼:
重寫validate() , 驗證action所有方法
Validate+方法名(), 驗證指定“方法名”的方法
Xml:
驗證所有方法: ActionClassName-validation.xml
驗證指定方法: ActionClassName-actionName-validation.xml
程式碼驗證,
比較靈活,可以滿足所有的需求.
比較繁瑣,要寫重複的驗證判斷邏輯!
適合: 表單欄位較少的情況用!
XML驗證:
通用,但不夠靈活; 可以驗證特定簡單的業務。
適合: 驗證表單欄位較多,可以大大簡化程式碼!
(配置檔案過多)
資料校驗錯誤資訊處理
Struts在進行資料效驗的時候,驗證失敗,會返回input檢視,要求我們要在struts.xml中配置input檢視對應的錯誤頁面!
Struts.xml
<!-- 註冊失敗跳轉到註冊頁面,顯示失敗資訊 -->
<global-results>
<result name="input">/register.jsp</result>
</global-results>
Jsp顯示錯誤
<form action="${pageContext.request.contextPath }/admin_login.action" method="post">
使用者名稱:<input type="text" name="admin.name">
<s:fielderror fieldName="admin.name">
</s:fielderror>
<br/>
密碼:<input type="password" name="admin.password">
<s:fielderror fieldName="admin.password">
</s:fielderror>
<br/>
<input type="submit" value="登入">
</form>
什麼都不輸入,顯示如下:
struts標籤的<s:fielderror>
有一定的樣式,審查元素可以看到,添加了ul標籤。
為了頁面美觀,我們可以修改Struts標籤預設的樣式。主要有兩種方式。
第一種,在頁面中加入css樣式,如下:
<!-- 修改struts標籤預設的樣式: 不讓換行 -->
<style type="text/css">
ul{
display: inline;
}
ul li{
display: inline;
color: red;
}
</style>
顯示結果如下:
第二種方式:修改Struts原始碼中配置檔案。
修改標籤定義的模板
找到fielderror標籤定義的模板檔案:
Struts-core.jar\template\simple\ fielderror.ftl
把修改後的fielderror.ftl檔案內容,把ul標籤和換行符等去除,然後放到src/ template/ simple/ fielderror.ftl,伺服器會先載入Struts中的檔案,然後在載入src中的檔案,發現檔名一致,那麼前者將會被覆蓋掉,這樣標籤顯示的樣式就修改了!