struts2表單校驗與錯誤資訊處理
struts2的表單校驗
對於開發表單校驗兩種途徑:
- 客戶端校驗:js在頁面校驗,好處:使用者體驗好,快,缺點:不安全.
- 服務端校驗:通過頁面需要訪問伺服器來獲取校驗結果,校驗在服務端,優點:安全.缺點:效率.
伺服器端表單校驗
服務端表單校驗,是表單安全的最後一道防線.
Struts2實現服務端校驗
- java編碼方式
- xml配置方式
- 註解方式
程式設計式校驗
//在action中覆蓋volidate方法 public void validate(){ if(StringUtils.isEmpty(user.getUsername)){ addFieldError("username","使用者名稱必須輸入"); } }
針對動作類中的某個動作方法進行驗證
1:給不需要驗證的動作方法新增一個@SkipValidation 註解。
2:validation 方法遵守書寫規範。書寫規範:validate+要驗證的動作方法名稱。要驗證的動作方法首字母要大寫。如:validateRegist
xml配置校驗表單(推薦)
業務:登陸的時候,使用者或密碼不能為空,如果為空,提示使用者.
操作:
第一步:在action類所在的包中,建立一個xml檔案,名字必須滿足規則,ActionClassName-ActionName-validation.xml。如:UserAction-user_login-validation.xml(想對UserAction的login方法進行表單校驗)
第二步:引入xml約束,從包中的dtd檔案(xwork-core-2.3.15.3.jar)中複製.在未聯網的情況下,需要匯入本地提示。
第三步:配置校驗規則,進行表單校驗。xwork-core-2.3.15.3.jar\com\opensymphony\xwork2\validator\validator\default.xml裡面定義了很多內建的校驗器。可使用國際化進行解耦合。
<?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> <!-- 使用者名稱 --> <!-- name:欄位名(屬性名) --> <field name="name"> <!-- 指定校驗器 :內建,也可以自定義' type:校驗器的名字,欄位值不能為空 --> <field-validator type="requiredstring"> <!-- 校驗沒有通過的提示資訊,底層程式碼相當於:addFieldError(xxx,msg)--> <message>使用者名稱不能為空</message> </field-validator> </field> <!-- 密碼 --> <field name="password"> <!-- 指定校驗器 :內建,也可以自定義' type:校驗器的名字,欄位值不能為空 --> <field-validator type="requiredstring"> <!-- 校驗沒有通過的提示資訊,底層程式碼相當於:addFieldError(xxx,msg)--> <message>密碼不能為空</message> </field-validator> </field> </validators>
第四部:配置input結果集檢視:
在struts.xml中配置:
頁面回顯資訊:
Struts2錯誤資訊的儲存和處理
依賴於集合來儲存(3個集合)
ValidationAwareSupport
- Collection actionErrors
- Coolection actionMessages
- Map
Struts2的配置檔案
可以讀取6個,2類
第一類:框架內建,使用者不能修改,只能看.
- default.property (常量,功能開關)
- struts-default.xml (內建功能,結果集、攔截器等)
- struts-plugin.xml (外掛功能)
第二類:自定義,使用者可以用來覆蓋內建一些預設值,以及自己對映配置(action和class關係)
- struts.property (自定義常量)
- struts.xml (自定義常量或功能,如自定義action)
- web.xml (自定義常量)
載入順序:從上到下執行.後加載的會覆蓋新載入的.
struts2的引數接收
請求引數型別:字串
後臺接收型別:java型別:int String date(yy-MM-dd)
同名多個引數,會自動封裝為陣列,比如:多個引數名hobby,
java類中定義一個屬性 private String[] hobby ,接收setHobby(),可以全部接收String[]。
用private String hobby接收setHobby() 可以嗎?
答案是可以的,頁面會全部接收,格式:”xx,xx”;—逗號空格