真的是纸上得来终觉浅,绝知此事要躬行。
校验器配置的刚刚好,struts.xml写的刚刚好,Action也 “毛” 问题啊,就是校验出错怎么也不跳到input视图下,直接跳到成功页面,气死我也。
平时没继承ActionSupport也没什么事,这下翻车了。整了半天,帖子也翻了不少,仍旧没找到问题。突然灵机一动,input来自哪?在哪声明的?Action接口嘛!你都没实现Action接口,也没继承它的子类,人家凭什么给你返回input。so 继承一下就OK啦。
附上代码:
UserAction.java
package com.hncj.edu;
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport{
private String address;
private int age;
private String password;
private String repassword;
private String userName;
public String getAddress() {
return address;
}
public int getAge() {
return age;
}
public String getPassword() {
return password;
}
public String getRepassword() {
return repassword;
}
public String getUserName() {
return userName;
}
public void setAddress(String address) {
this.address = address;
}
public void setAge(int age) {
this.age = age;
}
public void setPassword(String password) {
this.password = password;
}
public void setRepassword(String repassword) {
this.repassword = repassword;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String save() {
return "success";
}
}
struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<package name="pack1" extends="struts-default">
<action name="save" class="com.hncj.edu.UserAction" method="save">
<result name="success">/save.jsp</result>
<result name="input">/index2.jsp</result>
</action>
</package>
</struts>
关键是校验文件的写法,位置的放法:
命名规则:ActionName-validation.xml (ActionName为类的名字) 该文件和action放在同一个包下。
该文件的dtd约束可以在 /struts2-core-2.5.16.jar /xwork-validator-1.0.3.dtd 文件中复制。
字段校验的类型可以在 com/opensymphony/xwork2/validator/validators/default.xml 文件中查找,有如下类型:
<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="creditcard" class="com.opensymphony.xwork2.validator.validators.CreditCardValidator"/>
<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>
UserAction-validation.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>
<field name="userName">
<field-validator type="requiredstring">
<message>用户名不能为空</message>
</field-validator>
</field>
<field name="password">
<field-validator type="regex">
<param name="regex">[a-zA-Z]{4,6}</param>
<message>密码必须为4-6位大小写字母</message>
</field-validator>
</field>
<validator type="expression">
<param name="fieldName">repassword</param>
<param name="expression">password==repassword</param>
<message>两次密码不一致</message>
</validator>
<validator type="int">
<param name="fieldName">age</param>
<param name="min">0</param>
<param name="max">150</param>
<message>年龄必须在${min}-${max}之间</message>
</validator>
</validators>
index2.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/save" method="post">
<table>
<caption>用户登录</caption>
<tr>
<td>用户名:</td>
<td><input type="text" name="userName"/></td>
<td><s:fielderror fieldName="userName"></s:fielderror></td>
</tr>
<tr>
<td>密码:</td>
<td><input type="password" name="password"/></td>
<td><s:fielderror fieldName="password"></s:fielderror></td>
</tr>
<tr>
<td>重复密码:</td>
<td><input type="text" name="repassword"/></td>
<td><s:fielderror fieldName="repassword"></s:fielderror><s:actionerror/></td>
</tr>
<tr>
<td>年龄:</td>
<td><input type="text" name="age"/></td>
<td><s:fielderror fieldName="age"></s:fielderror></td>
</tr>
<tr>
<td>地址:</td>
<td><input type="text" name="address"/></td>
<td><s:fielderror fieldName="address"></s:fielderror></td>
</tr>
<tr>
<td><input type="submit" value="submit"/></td>
</tr>
</table>
</form>
<s:debug></s:debug>
</body>
</html>
save.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
save successfully
</body>
</html>