invalid.fieldvalue.age=age conversion error
invalid.fieldvalue.birthday=/u751f/u65e5/u65e5/u671f/u8f93/u5165/u9519/u8bef
invalid.fieldvalue.graduation=/u6bd5/u4e1a/u65f6/u95f4/u65e5/u671f/u8f93/u5165/u9519/u8bef
填写信息自动保存:第一
<td>
<input type="text" name="username"
value="${requestScope.username}">
</td>
第二使用from属性标签库
<s:form action="register" theme="simple">
<table align="center" width="40%" border="1">
<tr>
<td>
username
</td>
<td>
<s:textfield name="username" label="username" id="usernameId"></s:textfield>
</td>
</tr>
</s:form>
上面是增加Flelt级别的错误信息,下面是增加Action级别的错误信息
修改的如下:
校验的实现:public class RegisterAction extends ActionSupport复写验证方法
@Override
public void validate()
{
//浏览器访问的方式可以有null的出现,其他情况没有Null出现
if (null == username || username.length() < 6 || username.length() > 10)
{
this.addActionError("username invalid");
}
if (null == password || password.length() < 6 || password.length() > 10)
{
this.addActionError("password invalid");
}
else if (null == repassword || repassword.length() < 6
|| repassword.length() > 10)
{
this.addActionError("re-password invalid");
}
else if (!password.equals(repassword))
{
this.addActionError("two passwords not the same");
}
//注意Age的改变用小于默认的小于0
if (age <= 0 || age > 150)
{
this.addActionError("age should be between 1 and 150");
}
//日期谁在前谁在后,可以通过DATE的GETtIME方法的毫秒数,比较前后第二种方法如下
if (null != birthday && null != graduation)
{
Calendar c1 = Calendar.getInstance();
c1.setTime(birthday);
Calendar c2 = Calendar.getInstance();
c2.setTime(graduation);
if (!c1.before(c2))
{
this.addActionError("birthday should be before graduation");
}
}
}
页面调用:addFieldError 是放在map里边的,而addActionError放在list里边
cssStyle:定义样式,而cssClass引入CSS文件
<s:actionerror cssStyle="color:red" />
解决两种情况addFieldError 。addActionError都出现的方案:
增加Theme 选择简单方式:将不用XHTML格式显示而用一般格式
<s:textfield name="age" label="age" theme = "simple"></s:textfield>
如果表单改为simple,则表单里边的所有内容都变成一般格式出现
<s:form action="register" theme="simple">
一般采用以上两种方式来处理页面错误信息
1配置dispatchAction 配置method 指定实例执行方法
Struts.xml配置
<action name="register" class="com.test.action.RegisterAction" method="test">
<result name="success">/success.jsp</result>
<result name="input">/register2.jsp</result>
</action>
<action name="abc" class="com.test.action.RegisterAction" method="abc">
<result name="success">/success.jsp</result>
<result name="input">/register2.jsp</result>
</action>
在Action中
public class RegisterAction extends ActionSupport
public String test() throws Exception
{
return SUCCESS;
}
指定验证的做法在以上方法里面:validate+Abc(执行方法名第一个字母大写)
public void validateAbc()
{
System.out.println("validateAbc() invoked");
}
但还是在调用执行方法时先执行:validate方法,才执行test()方法。validate方法总是要执行的
解决办法一,去掉validate方法
方法二、:增加一个validateExcute方法去执行execute方法(如果有Excute方法时使用)
校验框架-字段校验
用于校验不复杂情况,如果校验复杂就用velidate方法校验
要验证RegisterAction
要在其同一个目录下:建立文件:Action名+-validation.xml,实例在下载的war文件里边
RegisterAction-validation.xml
注意,dtd不是XML文档,shame才是xml文档所以它不能被IE浏览器打开。用Firefox打开
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
<!--
<validator type="requiredstring">
<param name="fieldName">username</param>
<message>username should not be blank!</message>
</validator>
<validator type="stringlength">
<param name="fieldName">username</param>
<param name="minLength">6</param>
<param name="maxLength">10</param>
<message>username should be between ${minLength} and ${maxLength}</message>
</validator>
-->
// short-circuit是短路,只要前面验证不通过,后面就不进行验证了
<field name="username">
<field-validator type="requiredstring"short-circuit ="true"> <param name="trim">true</param>
<message>username should not be blank!</message>
</field-validator>
<field-validator type="stringlength">
<param name="minLength">6</param>
<param name="maxLength">10</param>
<message>username should be between ${minLength} and ${maxLength}</message>
</field-validator>
</field>
<field name="password">
<field-validator type="requiredstring">
<message>password should not be blank!</message>
</field-validator>
<field-validator type="stringlength">
<param name="minLength">6</param>
<param name="maxLength">10</param>
<message>password should be between ${minLength} and ${maxLength}</message>
</field-validator>
</field>
<field name="repassword">
<field-validator type="requiredstring">
<message>repassword should not be blank!</message>
</field-validator>
<field-validator type="stringlength">
<param name="minLength">6</param>
<param name="maxLength">10</param>
<message>repassword should be between ${minLength} and ${maxLength}</message>
</field-validator>
</field>
<field name="age">
<field-validator type="required">
<message>age should not be blank!</message>
</field-validator>
<field-validator type="int">
<param name="min">1</param>
<param name="max">150</param>
<message>age should be between ${min} and ${max}</message>
</field-validator>
</field>
//下面用requiredstring,表示字符串必须要出现,而required表示不是字符串出现
<field name="birthday">
<field-validator type="required">
<message>birthday should not be blank!</message>
</field-validator>
<field-validator type="date">
<param name="min">2001-01-01</param>
<param name="max">2003-12-31</param>
<message>birthday should be between ${min} and ${max}</message>
</field-validator>
</field>
<field name="graduation">
<field-validator type="required">
<message>graduation should not be blank!</message>
</field-validator>
<field-validator type="date">
<param name="min">2005-01-01</param>
<param name="max">2007-12-31</param>
<message>graduation should be between ${min} and ${max}</message>
</field-validator>
</field>
</validators>
验证的依据是,在源文件的xwork下的default.xml的要求
页面调用:
<s:fielderror cssStyle="color:red" />
注意避免校验混交,要么就在配置文件里面校验,要么就在代码里面(validator方法)校验
校验框架-非字段校验
注意可以通过HTTP底层协议来跳过校验
客户端验证
1、去掉
theme="simple"
2、validate = "true" //它自己会去调用相应的RegisterAction-validation.xml
进行校验
如:<s:form action="register" validate = "true">
调用就是:标签的调用。最好不要使用:由于只要验证失败,再次验证通过,验证信息依然保留在页面上。使用一下验证:
<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'register2.jsp' starting page</title>
<script type="text/javascript">
function validate()
{
var usernameValue = document.getElementById("usernameId").value;//通过加ID获取不然通过name获取到得是一个数组
var passwordValue = document.getElementById("password").value;
var repasswordValue = document.getElementById("repassword").value;
if(usernameValue.length == 0)
{
alert("username should not be blank!");
return false;
}
else if(usernameValue.length < 6 || usernameValue.length > 10)
{
alert("length of username should be between 6 and 10!");
return false;
}
if(passwordValue.length == 0)
{
alert("password should not be blank!");
return false;
}
else if(passwordValue.length < 6 || passwordValue.length > 10)
{
alert("length of password should be between 6 and 10!");
return false;
}
if(repasswordValue.length == 0)
{
alert("repassword should not be blank!");
return false;
}
else if(repasswordValue.length < 6 || repasswordValue.length > 10)
{
alert("length of repassword should be between 6 and 10!");
return false;
}
if(passwordValue != repasswordValue)
{
alert("password and repassword should be same!");
return false;
}
return true;
}
</script>
</head>
<body>
<table align="center" width="40%">
<tr>
<td>
<s:fielderror cssStyle="color:red" />
</td>
</tr>
</table>
<s:form action="register" theme="simple" onsubmit = "return validate();">
<table align="center" width="40%" border="1">
<tr>
<td>
username
</td>
<td>
<s:textfield name="username" label="username" id="usernameId"></s:textfield>
</td>
</tr>
<tr>
<td>
password
</td>
<td>
<s:password name="password" label="password" id="passwordId"></s:password>
</td>
</tr>
<tr>
<td>
re-password
</td>
<td>
<s:password name="repassword" label="repassword" id="repasswordId"></s:password>
</td>
</tr>
</table>
</s:form>
</body>
</html>
根据方法提供校验方式的解决:
配置文件就要写成,action名-方法名-validation.xml
如:registerAction-test-validation.xml
但如果也提供了registerAction-validation.xml的话,它会先调用:registerAction-validation.xml才调用:registerAction-test-validation.xml
最好的办法就是提供局部的校验就行
注意父类和子类的校验,方法名相同,就会先校验父类,在校验子类就不方便了
非字段校验:我用谁去校验,我去校验谁而字段校验呢是:我校验谁,我用谁来校验
<validator type="requiredstring">
<param name="fieldName">username</param>
<message>username should not be blank!</message>
</validator>
<validator type="stringlength">
<param name="fieldName">username</param>
<param name="minLength">6</param>
<param name="maxLength">10</param>
<message>username should be between ${minLength} and ${maxLength}</message>
</validator>
校验的顺序,先执行校验文件xml的,才去校验validate方法:
真正存放field级别错误信息的对象是LinkedHashMap
2. 该LinkedHashMap的key是String类型的,value是ArrayList类型的
3. 对于Action级别的错误信息,实际上是放置在ArrayList中的
//只增加到它的一个副本,只能读,不用写也不能修改进去了。下面的操作在读取的时候是取不到的
this.getFieldErrors().put("username","bbbbbbbbbbbbb");
拦截器:Interceptor
对象接口
package com.interceptor;
public interface TargetInterface
{
public void doSomething();
}
目标对象:
package com.interceptor;
public class Target implements TargetInterface
{
public void doSomething()
{
System.out.println("do something");
}
}