//表單提交過來的數據全都是String類型的,birthday也不例外! private String username; private String password; private String password2; private String email; private String birthday; //記錄錯誤的信息 private HashMap<String, String> error = new HashMap<>(); /*用於判斷表單提交過來的數據是否合法*/ public boolean validate() { //用戶名不能爲空,而且要是3-8的字符 abcdABcd if (this.username == null || this.username.trim().equals("")) { error.put("username", "用戶名不能爲空,而且要是3-8的字符"); return false; } else { if (!this.username.matches("[a-zA-Z]{3,8}")) { error.put("username", "用戶名不能爲空,而且要是3-8的字符"); return false; } } //密碼不能爲空,而且要是3-8的數字 if (this.password == null || this.password.trim().equals("")) { error.put("password", "密碼不能爲空,而且要是3-8的數字"); return false; } else { if (!this.password.matches("\\d{3,8}")) { error.put("password", "密碼不能爲空,而且要是3-8的數字"); return false; } } //兩次密碼要一致 if (this.password2 != null && !this.password2.trim().equals("")) { if (!this.password2.equals(this.password)) { error.put("password2", "兩次密碼要一致"); return false; } } //郵箱能夠爲空,若是爲空就必須合法 if (this.email != null && !this.email.trim().equals("")) { if (!this.email.matches("\\w+@\\w+(\\.\\w+)+")) { error.put("email", "郵箱不合法!"); return false; } } //日期能夠爲空,若是爲空就必須合法 if (this.birthday != null && !this.birthday.trim().equals("")) { try { DateLocaleConverter dateLocaleConverter = new DateLocaleConverter(); dateLocaleConverter.convert(this.birthday); } catch (Exception e) { error.put("birthday", "日期不合法!"); return false; } } //若是上面都沒有執行,那麼就是合法的了,返回true return true; } //.....各類的setter和getter
//驗證表單的數據是否合法,若是不合法就跳轉回去註冊的頁面 if(formBean.validate()==false){ //在跳轉以前,把formbean對象傳遞給註冊頁面 request.setAttribute("formbean", formBean); request.getRequestDispatcher("/WEB-INF/register.jsp").forward(request, response); return; }
Struts2爲了簡化咱們的開發,也提供了數據校驗的功能…前面已經說過了,若是想要使用數據校驗的功能,在編寫Action的時候就必須繼承着ActionSupport類或者實現相對應的接口css
如今,咱們的Action類已經繼承了ActionSupport類了,如今那怎麼使用數據校驗的功能呢??咱們想一下….java
若是咱們不寫FormBean對象,直接在Action進行校驗的話,咱們可能會這樣寫:web
private Map<String, String> map; public void validation() { //若是有錯誤了,那麼就將錯誤信息添加到map集合 map.put(); } public String login() { //判斷map是否有錯誤信息,若是有,就直接跳轉到相對應的頁面了,不執行login剩下的代碼了。 }
上面的思路是可行的,可是不優雅…..在login()方法驗證map集合,就與數據校驗耦合了….因而乎,咱們想要的是在調用login()方法以前就驗證map集合是否存在…若是存在了錯誤的信息,就不調用login()方法了。express
明顯地,咱們就須要使用攔截器…….Struts2內部的數據校驗也是使用攔截器來實現的。apache
<interceptor name="validation" class="org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor"/>
Struts2爲咱們提供了4種方式來實現攔截markdown
Struts2提供了咱們作校驗的方法….實現validate()app
@Override public void validate() { super.validate(); }
validate()方法在內部已經維護了一個Map集合了jsp
public synchronized void addFieldError(String fieldName, String errorMessage) { Map errors = this.internalGetFieldErrors(); Object thisFieldErrors = (List)errors.get(fieldName); if(thisFieldErrors == null) { thisFieldErrors = new ArrayList(); errors.put(fieldName, thisFieldErrors); } ((List)thisFieldErrors).add(errorMessage); }
咱們若是捕獲到了錯誤信息,那麼直接使用底層爲咱們寫好的Map集合就行了!ide
@Override public void validate() { //判斷用戶名是否爲空 if (user.getUsername() == null || "".equals(user.getUsername())) { super.addFieldError("username","用戶名是空的"); } //判斷密碼是否爲空 if (user.getPassword() == null || "".equals(user.getPassword())) { super.addFieldError("username","密碼是空的"); } }
配置struts.xml文件post
<package name="xxx" extends="struts-default"> <action name="user_*" class="zhongfucheng.action.UserAction" method="{1}"> <!--若是校驗成功,那麼回到首頁--> <result name="success">/index.jsp</result> <!--若是失敗,從新回到login頁面,並顯示錯誤信息--> <result name="input">/login.jsp</result> </action> </package>
在JSP頁面中,能夠使用Struts自帶的標籤來顯示錯誤信息
<s:fielderror></s:fielderror>
上面已經實現了數據校驗的功能了,可是呢。如今我有一個list()方法。使用list()方法講道理是不用進行數據校驗的…
//查看user信息 public String list() { return SUCCESS; }
可是呢,當我執行list()方法的時候,仍是通過了數據校驗….
所以,咱們要作的是:攔截特定的方法..很是簡單,只要重命名validate()方法就好了!
validate + 要驗證的方法名
將validate()方法名改爲是validateLogin(),那麼Struts2就僅僅過濾指定的方法了。
前面咱們已經使用過了代碼驗證的方法,,,,感受仍是要寫不少代碼….不少代碼也是囉嗦的,要判斷非空啊,數值的驗證啊..等等的處理…這樣判斷、驗證每每都是通用的…因而Struts又幫咱們封裝了不少的校驗器
<?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文件來配置,編寫XML文件的語法:
那麼XML該怎麼寫呢????Struts2也爲咱們提供了DTD文件
<?xml version="1.0" encoding="UTF-8"?> <!-- XWork Validators DTD. Used the following DOCTYPE. <!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.3//EN" "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd"> --> <!ELEMENT validators (field|validator)+> <!ELEMENT field (field-validator+)> <!ATTLIST field name CDATA #REQUIRED > <!ELEMENT field-validator (param*, message)> <!ATTLIST field-validator type CDATA #REQUIRED short-circuit (true|false) "false" > <!ELEMENT validator (param*, message)> <!ATTLIST validator type CDATA #REQUIRED short-circuit (true|false) "false" > <!ELEMENT param (#PCDATA)> <!ATTLIST param name CDATA #REQUIRED > <!ELEMENT message (#PCDATA|param)*> <!ATTLIST message key CDATA #IMPLIED >
<?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> <!--指定Bean對象的username屬性--> <field name="user.username"> <!--指定類型不能是空的--> <field-validator type="requiredstring"> <message>用戶名不能是空的</message> </field-validator> </field> <!--指定Bean對象的屬性--> <field name="user.password"> <!--指定類型不能是空的--> <field-validator type="requiredstring"> <message>密碼不能是空的</message> </field-validator> <!--設置密碼的長度6到8位--> <field-validator type="stringlength"> <param name="minLength">6</param> <param name="maxLength">8</param> <message>密碼只能是6-8位</message> </field-validator> </field> </validators>
用戶名和密碼都不能爲空
密碼只能是6-8位
和代碼的方式同樣,咱們寫上了XML文件,它也是默認攔截全部的方法。那麼咱們想要它只攔截特定的方法,怎麼辦呢???
修改XML文件的名稱:
ActionClassName-ActionName-validation.xml
咱們發現,返回錯誤信息的樣式是這樣的:
這明顯不符合咱們的審美的……因而乎咱們是能夠修改它的樣式的…咱們查看源文件的時候,能夠發現Struts爲它自動加了ul li
咱們能夠在css文件中把它們去除就好了
<style type="text/css"> ul{ display: inline; } ul li { display: inline; color: red;; } </style>
Struts2標籤的樣式是由文件來指定的…具體路徑以下:
咱們發現ul li
是它指定加上去的,咱們把它修改,而後覆蓋掉它,那麼Struts2在讀取的時候就使用咱們的文件
在src下建立template.simple包..文件是fielderror.ftl…項目在執行的時候就會把Struts2自帶的給覆蓋了!
使用<s:fielderror></s:fielderror>
是默認返回所有錯誤的,咱們一般來講,都是把錯誤放在輸入框的後面的…Struts提供了指定返回錯誤..只要指定fileName就好了
<form action="${pageContext.request.contextPath}/user_login" method="post"> 用戶名:<input type="text" name="user.username"><s:fielderror fieldName="user.username"/><br> 密碼:<input type="password" name="user.password"><s:fielderror fieldName="user.password"/><br> <input type="submit" value="登錄"><br> </form>
Struts2也支持客戶端的校驗,在使用Struts2的form標籤的使用,在validate屬性上設置爲true,那麼Struts2會自動加載JavaScript的類庫來實現客戶端的數據校驗了!
Struts2也提供了客戶端的數據校驗功能….
咱們如今已經學會了使用手寫代碼的方式和XML配置的方式去校驗數據了。。
那麼哪一種方式更好呢???咱們來總結一下
手寫代碼方式:
XML配置方式
最後補充:Struts2也支持經過註解的方式實現數據校驗,可是這會形成Action類看起來十分冗餘,通常不多使用