原作者:尚硅谷-佟刚
验证
validation.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'validation.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<s:debug/>
<br>
<s:actionerror/>
<!-- 要求年龄必须在20-60之间 -->
<s:form action="testValidation" theme="simple">
Age:<s:textfield name="age" label="Age"/>
<s:fielderror fieldName="age"/>
<br>
<!--
<s:property value="fieldErrors.age[0]"/>
-->
Password:<s:password name="password"/>
<br>
Password2:<s:password name="password2"/>
<br>
Count:<s:textfield name="count"/>
<s:fielderror fieldName="count"/>
<br>
idCard:<s:textfield name="idCard"/>
<s:fielderror fieldName="idCard"/>
<br>
<s:submit/>
</s:form>
</body>
</html>
struts2配置文件
<!-- 配置国际化资源文件 -->
<constant name="struts.custom.i18n.resources" value="i18n"/>
<action name="testValidation" class="com.atguigu.struts2.validation.app.TestValidationAction">
<result>/success.jsp</result>
<!-- 若验证失败转向input -->
<result name="input">/validation.jsp</result>
</action>
TestValidationAction.java
package com.atguigu.struts2.validation.app;
import com.opensymphony.xwork2.ActionSupport;
public class TestValidationAction extends ActionSupport {
private Integer age;
private String password;
private String password2;
private Integer count;
private String idCard;
public String getIdCard() {
return idCard;
}
public void setIdCard(String idCard) {
this.idCard = idCard;
}
public Integer getCount() {
return count;
}
public void setCount(Integer count) {
this.count = count;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getPassword2() {
return password2;
}
public void setPassword2(String password2) {
this.password2 = password2;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String execute() throws Exception {
System.out.println("age: " + age);
return SUCCESS;
}
}
TestValidationAction-validation.xml
<!DOCTYPE validators PUBLIC
"-//Apache Struts//XWork Validator 1.0.2//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">
<validators>
<!-- 针对于age属性进行验证,基于字段的验证 -->
<field name="age">
<!--
设置短路验证:若当前验证没有通过,则不再进行下面的验证
-->
<field-validator type="conversion" short-circuit="true">
<message>^Conversion Error Occurred</message>
</field-validator>
<field-validator type="int">
<param name="min">20</param>
<param name="max">60</param>
<message key="error.int"/>
</field-validator>
</field>
<field name="count">
<field-validator type="int">
<param name="min">1</param>
<param name="max">10</param>
<message key="error.int"/>
</field-validator>
</field>
<field name="idCard">
<field-validator type="idcard">
<message>It is not a idCard</message>
</field-validator>
</field>
<!-- 测试非字段验证 -->
<validator type="expression">
<param name="expression">
<![CDATA[password==password2]]>
</param>
<message>Password is not equals to password2</message>
</validator>
</validators>
i18n.properties
error.int=^^^${getText(fieldName)} needs to be between ${min} and ${max}
age=\u5E74\u9F84
count=\u6570\u91CF
validatos.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="idcard" class="com.atguigu.struts2.validation.app.IDCardValidator"/>
</validators>
IDCardValidator.java
package com.atguigu.struts2.validation.app;
import com.opensymphony.xwork2.validator.ValidationException;
import com.opensymphony.xwork2.validator.validators.FieldValidatorSupport;
public class IDCardValidator extends FieldValidatorSupport {
@Override
public void validate(Object object) throws ValidationException {
//1.获取字段的名字和值
String fieldName = getFieldName();
Object value = this.getFieldValue(fieldName, object);
//2.验证
IDCard idCard=new IDCard();
boolean result=idCard.Verify((String)value);
//3.若验证失败,则....
if(!result){
addFieldError(fieldName, object);
}
}
}
IDCard.java
package com.atguigu.struts2.validation.app;
public class IDCard {
final int[] wi = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1 };
final int[] vi = { 1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2 };
private int[] ai = new int[18];
public IDCard() {}
public boolean Verify(String idcard) {
if (idcard.length() == 15) {
idcard = uptoeighteen(idcard);
}
if (idcard.length() != 18) {
return false;
}
String verify = idcard.substring(17, 18);
if (verify.equals(getVerify(idcard))) {
return true;
}
return false;
}
public String getVerify(String eightcardid) {
int remaining = 0;
if (eightcardid.length() == 18) {
eightcardid = eightcardid.substring(0, 17);
}
if (eightcardid.length() == 17) {
int sum = 0;
for (int i = 0; i < 17; i++) {
String k = eightcardid.substring(i, i + 1);
ai[i] = Integer.parseInt(k);
}
for (int i = 0; i < 17; i++) {
sum = sum + wi[i] * ai[i];
}
remaining = sum % 11;
}
return remaining == 2 ? "X" : String.valueOf(vi[remaining]);
}
public String uptoeighteen(String fifteencardid) {
String eightcardid = fifteencardid.substring(0, 6);
eightcardid = eightcardid + "19";
eightcardid = eightcardid + fifteencardid.substring(6, 15);
eightcardid = eightcardid + getVerify(eightcardid);
return eightcardid;
}
public static void main(String[] args) {
String idcard1 = "350211197607142059";
String idcard2 = "350211197607442059";
IDCard idcard = new IDCard();
System.out.println(idcard.Verify(idcard1));
System.out.println(idcard.Verify(idcard2));
}
}
覆盖struts的默认文件,添加如下代码
页面运行结果