熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

struts2自定義驗證器(身份證驗證)

2022-06-13   來源: Java開源技術 

  struts的驗證器是用的xwork裡面的驗證自定義驗證器就是根據源碼繼承已有的字段驗證器而來具體步驟如下:

  展開xworkjarcomopensymphonyxwork

  validatorvalidators目錄下有個defaultxml將它復制到項目根目錄下改名叫validatorsxml

  驗證框架首先在根目錄下找validatorsxml文件沒找到validatorsxml文件驗證框架將調用默認的驗證設置即defaultxml裡面的配置信息

  新建一個類(身份證驗證為例:類名CardIdFieldValidator)繼承FieldValidatorSupport實現validate方法

  package monsvalidators;

  import comopensymphonyxworkvalidatorValidationException;

  import comopensymphonyxworkvalidatorvalidatorsFieldValidatorSupport;

  public class CardIdFieldValidator extends FieldValidatorSupport{

  public void validate(Object object) throws ValidationException

  {

  // 獲得字段的名字

  String fieldName = getFieldName();

  // 獲得輸入界面輸入的值

  String value = getFieldValue(fieldName object)toString();

  if (value == null || valuelength() <= )

  return;

  if(valuelength()!= && valuelength()!= )//身份證必須是位!

  addFieldError(fieldName object);

  if(valuelength()==)

  validateCardId(value object);

  if(valuelength()==)

  validateCardId(value object);

  }

  /** *//**

  * <p>位身份證驗證</p>

  *

  * 根據〖中華人民共和國國家標准 GB 〗中有關公民身份號碼的規定公民身份號碼是特征組合碼由十七位數字本體碼和一位數字校驗碼組成

  * 排列順序從左至右依次為六位數字地址碼八位數字出生日期碼三位數字順序碼和一位數字校驗碼

  *

  * 第十八位數字(校驗碼)的計算方法為

  * 將前面的身份證號碼位數分別乘以不同的系數從第一位到第十七位的系數分別為

  * 將這位數字和系數相乘的結果相加

  * 用加出來和除以看余數是多少?

  * 余數只可能有 個數字其分別對應的最後一位身份證的號碼為 X

  * 通過上面得知如果余數是就會在身份證的第位數字上出現羅馬數字的Ⅹ如果余數是身份證的最後一位號碼就是

  *

  * @date Oct

  * @param value

  * @param object

  */

  public void validateCardId(String value Object object)

  {

  // 獲得字段的名字

  String fieldName = getFieldName();

  String tempStr = valuesubstring();

  String sourceCheckCode = valuesubstring();

  String checkCode = ;

  int[] a = new int[];

  int i = ;

  try

  {

  while(i<){

  a[i] = IntegerparseInt(tempStrsubstring(ii+));

  i++;

  }

  } catch (NumberFormatException e)

  {

  addFieldError(fieldName object);

  }

  int mod = (a[]*+a[]*+a[]*+a[]*+a[]*+a[]*+a[]*+a[]*+a[]*+a[]*+a[]*

  +a[]*+a[]*+a[]*+a[]*+a[]*+a[]*)%;

  switch (mod){

  case :

  checkCode = ;

  break;

  case :

  checkCode = ;

  break;

  case :

  checkCode = ;

  break;

  case :

  checkCode = ;

  break;

  case :

  checkCode = ;

  break;

  case :

  checkCode = ;

  break;

  case :

  checkCode = ;

  break;

  case :

  checkCode = ;

  break;

  case

  :   checkCode = x;

  break;

  case :

  checkCode = ;

  break;

  case :

  checkCode = ;

  break;

  }

  if(!sourceCheckCodeequalsIgnoreCase(checkCode))

  addFieldError(fieldName object);

  }

  /** *//**

  * <p>位身份證驗證</p>

  *

  * 只做了數字驗證

  * @date Oct

  * @param value

  * @param object

  */

  public void validateCardId(String value Object object)

  {

  String fieldName = getFieldName();

  int i = ;

  try

  {

  while(i<){

  if(!CharacterisDigit(valuecharAt(i)))

  addFieldError(fieldName object);

  i++;

  }

  } catch (NumberFormatException e)

  {

  addFieldError(fieldName object);

  }

  }

  }

  在validatorsxml中添加一個validator節點和其他validator一樣指定名稱和類名這裡指定的name就是你將來要是使用的類型名字

  <validator name=cardid class=monsvalidatorsCardIdFieldValidator/>到此自定義驗證器就完成剩下的就和使用自帶的驗證器一樣了

  新建action繼承ActionSupport或Action都行寫上相應需要驗證的屬性字段

  新建驗證文件xxxxvalidationxml這個xxxx就是你前面action的類名字xxxxxxvalidationxml第二個xxx表示是jsp中的form提交action

  <field name=studentsfzh>

  <fieldvalidator type=requiredstring shortcircuit=true>

  <message>身份證號不能為空</message>

  </fieldvalidator>

  <fieldvalidator type=cardid>

  <message>身份證號格式不正確</message>

  </fieldvalidator>

  </field>配置strutsxml以及action

  


From:http://tw.wingwit.com/Article/program/Java/ky/201311/28891.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.