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");
}
}