上两节我试了试服务器验证,客服端验证,短路验证。其中有些可以调用内置方法,有些是用XML文件来验证的。我查看了下它内建的可以验证的内型,总共有十多种,基本的验证都可以用内建的。这里我就不写出来了。有空查查文档就搞定了。
但是我想了想,万一我们我要验证的一个东西,那些内建的验证都不能达到我想要的效果怎么办。能不能用自己定义一个喃。仿佛我在说废话,肯定可以撒。
好了,不说了。开工。。。
说明下:为了加快我的练习速度,我选择了一个工具,也就是一个IDE——其名曰:JDeveloper。在我总结的时候我尽量忽略IDE的差异,只把原理讲来,这样具体情况,以后就可以根据具体的情况来配置自己的IDE了。
第一件事情:搭建好开发环境,一些库,jar包,什么什么的。该怎么弄就怎么弄。
然后就是:创建两个页面,还是和以前一样。login.jsp done.jsp.
login.jsp:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<%@ page contentType="text/html;charset=GBK"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK"/>
<title>O(∩_∩)O~~</title>
<style type="text/css">
body {
background-color: #f7f7f7;
}
</style>
</head>
<body>
<div align="center">
<s:form action="login" method="POST" namespace="/test1/test2">
<s:textfield label="姓名" name="name"/>
<s:textfield label="性别" name="sex"/>
<s:textfield label="国籍" name="county"/>
<s:reset value="重置"/>
<s:submit value="提交"/>
</s:form>
</div></body>
</html>
我不想过多解释了。有问题,想知道答案吗?百度知道。O(∩_∩)O哈哈~
done.jsp
<body>done.jsp</body>
只是做个标记。
然后是web.xml
<?xml version = '1.0' encoding = 'GBK'?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee">
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>login.jsp</welcome-file>
</welcome-file-list>
</web-app>
struts.xml
<?xml version="1.0" encoding="GBK" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.i18n.encoding" value="GB18030" />
<package name="test" extends="struts-default" namespace="/test1/test2">
<action name="login" class="actions.LoginAction">
<result name="done" >/done.jsp</result>
<result name="failed" >/login.jsp</result>
<result name="input" >/login.jsp</result>
</action>
</package>
</struts>
LoginAction.java
package actions;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction extends ActionSupport{
private String name;
private String sex;
private String county;
public LoginAction() {
}
public String execute(){
return "done";
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getSex() {
return sex;
}
public void setCounty(String county) {
this.county = county;
}
public String getCounty() {
return county;
}
}
上面的我不再过多的做解释了,如果你不理解的话,你可以看看这里 。
下面我要做的就是,关键的了。
今天我要要验证的是国籍,如果是中国,方可通过,要不然。。。 边边上玩去。 。
首先:
创建一个java文件,叫做CountyValidator.java
package custom;
import com.opensymphony.xwork2.validator.ValidationException;
import com.opensymphony.xwork2.validator.validators.FieldValidatorSupport;
public class CountyValidator extends FieldValidatorSupport {
public CountyValidator() {
}
public void validate(Object object) throws ValidationException {
String fieldName;
fieldName=this.getFieldName();
String county;
county = (String)this.getFieldValue(fieldName,object);//get the textfield's value
if(!"CHINA".equalsIgnoreCase(county)){
this.addFieldError(fieldName,"sorry , only when you come from china can enter the site!");
}else if("JAPAN".equalsIgnoreCase(county)){
this.addFieldError(fieldName,"please do not try again!");
}else if("CHINA".equalsIgnoreCase(county)){
System.out.println(county);
}else{
this.addFieldError(fieldName,"sorry ,this is only design for chinses!");
}
}
}
这个就是我们自定义的一个类型验证器。它继承于FieldValidatorSupport 大家就看validate方法就可以了。他的流程是:1.取得textfield的名字2.取得名字为fieldName的textfield里面的值。3接下来就是验证部分。大家还知道addFieldError() 的作用嘛。当struts知道fielderror里面有值的话,他就知道有错误了。然后就会返回 “input” 至于input对于的view部分,大家可以看看struts.xml 里面对应的页面。
好了,就这样哈。
接下来,我们要注册我的的valdator。怎么样注册了。用最简单的方法是:
创建一个xml文件:叫做validators.xml
如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
"-//OpenSymphony Group//XWork Validator Config 1.0//EN"
"http://www.opensymphony.com/xwork/xwork-validator-config-1.0.dtd">
<validators>
<validator name="validatecounty" class="custom.CountyValidator"/>
</validators>
注意他放的位置,他是放在 你的项目名/WEB-INF/classes/下面的哦。文档说明不要掉了哦。
最后我们还要创建一个xml文件:
就是验证文件:
<?xml version="1.0" encoding="GBK" ?>
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator
1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
<field name="name">
<field-validator type="requiredstring" short-circuit="true">
<message>姓名要求不能为空</message>
</field-validator>
</field>
<field name="sex">
<field-validator type="requiredstring" short-circuit="true">
<message>性别要求不能为空</message>
</field-validator>
</field>
<field name="county"><!--这个是forma里面的字段名,不要搞混了-->
<field-validator type="validatecounty" short-circuit="true">
<message>哈哈,有点问题!</message>
</field-validator>
</field>
</validators>
请和上面 的alidators.xml对应。大家猜猜这个XML文件该是什么名字勒?该放在哪里勒?给大家留个问题在这里哈!
然后我们运行:
看结果:
点击提交:
我们只填姓名和性别喃:
填个JAPAN试试:
填个CHINA试试:
good 成功了。看见没有,根据我们定义的那个java类,只有输入china才会通过,其实那个验证的java文件的validate方法里面还可以做更多的东西。这里只是一个抛砖引玉 !!!
看看这里:
这个是我的IDE的创建的文件的树形结构,当然不同的IDE组织方式肯定有点区别:
但是我还是有个问题。很纳闷:
看这里:
if(!"CHINA".equalsIgnoreCase(county)){
this.addFieldError(fieldName,"sorry , only when you come from china can enter the site!");
}else if("JAPAN".equalsIgnoreCase(county)){
this.addFieldError(fieldName,"please do not try again!");
}else if("CHINA".equalsIgnoreCase(county)){
System.out.println(county);
}else{
this.addFieldError(fieldName,"sorry ,this is only design for chinses!");
我在这里增加了错误信息的,但是为什么显示不出来
显示的是:
是不是因为
的原因。但是如果我去掉了message里面的字符,就没有显示了。
是个问题,有待解决。
睡觉了吧,12:45了。估计等我上床就1点多了,明天再说。不对,应该是今天迟点再说。。。。
未完待续。。。