Struts学习(三)
1.前言
今天学习了validator校验器,validator有很多功能,这里只介绍和使用validator进行表单提交。
2.初始化配置
2.1 查看示例效果
首先需要下载Apache组织的struts-1.3.10(我这里是这个包),将里面的apps/struts-cookbook-1.3.10.war文件用rar格式打开,将全部文件复制到Tomcat服务器的webapps文件夹的ValidatorDemo文件夹下(这是文件夹名自取),
最后开启服务器,在ie地址中输入http://localhost:8080/ValidatorDemo/即可打开.效果如图:
在此之后打开Validator右边的Execute即可查看示例效果.其中的红色区域可查看表单的配置文件.这里不加说明.后面会说明配置文件的写法.
2.2 配置web工程环境
导入的struts-1.3.10中的jar包,如果光做validator的话不用全部导入.还有validator.xml文件,这个是配置校验信息的。其他不用.如图:
3.步骤
3.1 整体过程
表单提交以后,交给一个struts的ActionServlet处理,将FormBean(继承ValidatorFormBean)进行封装以后会调用Validate()方法进行校验.Validator校验器这时候就会去调用自己写好的Validate框架,该框架需要validator-rules.xml和validator-rules.xml文件的支持.总体图:
3.2 Struts-config.xml配置
这里使用动态FormBean的方法,也就是在struts-config.xml中创建FormBean,这样就必须继承DynaValidateFormBean.如果是普通的FormBean类的话,继承ValidateFormBean.这两个类都在org.apache.struts.validator目录下.action的配置没什么变化,要校验的话叫validate制成true就好了.
其中配置的message-resources后面会提到.最后配置的plug-in中就说明了校验需要org/apache/struts/validator/validator-rules.xml的支持.
配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"
"http://struts.apache.org/dtds/struts-config_1_3.dtd">
<struts-config>
<form-beans>
<form-bean name="UserFormBean" type="org.apache.struts.validator.DynaValidatorForm">
<form-property name="username" type="java.lang.String"></form-property>
<form-property name="password" type="java.lang.String"></form-property>
<form-property name="password2" type="java.lang.String"></form-property>
<form-property name="birthday" type="java.lang.String"></form-property>
<form-property name="email" type="java.lang.String"></form-property>
<form-property name="resume" type="java.lang.String"></form-property>
</form-bean>
</form-beans>
<action-mappings>
<action path="/Register"
type="cn.itcast.web.action.RegisterAction"
name="UserFormBean"
input="/register.jsp"
validate="true">
</action>
</action-mappings>
<message-resources parameter="config" />
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property property="pathnames"
value="/org/apache/struts/validator/validator-rules.xml,
/WEB-INF/validator-rules.xml"/>
</plug-in>
</struts-config>
3.3 validator-rules.xml文件
validator-rules.xml文件是配置校验器,要找到它的话在struts-core-1.3.10中,不过不用动它,因为在上面已经定义它了!
打开该文件,在注释中可以看到上面引用的plug-in标签, 在validator标签中定义了很多属性,
可以是required必须的, maxlength最大,mixlength最小,date日期,short,int,long等等,这也说明它支持这些格式的校验,最后的 msg属性表示表单错误信息在配置文件中手动配置.
3.4 config.properties配置文件
该配置文件就是用来存储输出页面给用户看到的信息的,在上面提到的msg属性会调用该文件中的值输出给页面.该配置文件方在src目录下,写法参考validator-rules.xml注释中的写法.
errors.required={0} is required.
errors.minlength={0} can not be less than {1} characters.
errors.maxlength={0} can not be greater than {1} characters.
errors.invalid={0} is invalid.
errors.byte={0} must be a byte.
errors.short={0} must be a short.
errors.integer={0} must be an integer.
errors.long={0} must be a long.
errors.float={0} must be a float.
errors.double={0} must be a double.
errors.date={0} is not a date.
errors.range={0} is not in the range {1} through {2}.
errors.creditcard={0} is an invalid credit card number.
errors.email={0} is an invalid e-mail address.
errors.twofields=The '{0}' field must have the same value as the '{1}' field.
prompt.username=\u7528\u6237
prompt.password=\u5BC6\u7801
prompt.date=\u65F6\u95F4
prompt.email=email
3.5 validation.xml文件配置
这是最关键的一步,validation.xml文件就是用来配置校验信息的,在field标签中配置一个个校验格式.
1.proprtty定义FoemBean字段.
2.depends定义取决于哪些要求,如用户名为required,minlength,maxlength表示它是必须的,且有最大最小的限制,这些属性可参考validator-rules.xml文件.
3.key中表示读取资源文件中相对应的值,并放在positon(位置)为0的标志符上,也就是config中相应的{0}中.其中还可定义resource="false"这样key直接用来放在位置0中,不需要在资源文件中取了.
4.var标签用于定义属性,如var-name为minlength,var-value为3,则最小长度为3.
5.name="minlength"就是指向配置文件中的 errors.minlength,这里的{1}位置用key="${var:minlength}"代替,该表达式表示下面的var-value值,这个表达式记住就行了.
6.mask标记用于正则表达式匹配,大家都懂的.
7.最后还有一个密码验证twofields,这个在最上面的global中定义了,这个在基本的校验文件中是没有的.写法看程序.
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE form-validation PUBLIC
"-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.3.0//EN"
"http://jakarta.apache.org/commons/dtds/validator_1_3_0.dtd">
<form-validation>
<global>
<!-- Custom Validator -->
<validator name="twofields"
classname="examples.validator.CustomValidator"
method="validateTwoFields"
methodParams="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionMessages,
javax.servlet.http.HttpServletRequest"
msg="errors.twofields" />
</global>
<formset>
<!-- Form for Validation example -->
<form name="UserFormBean">
<field property="username" depends="required,minlength,maxlength">
<arg key="prompt.username" position="0" />
<arg name="minlength" key="${var:minlength}" resource="false" position="1"/>
<arg name="maxlength" key="${var:maxlength}" resource="false" position="1"/>
<var>
<var-name>minlength</var-name>
<var-value>3</var-value>
</var>
<var>
<var-name>maxlength</var-name>
<var-value>8</var-value>
</var>
</field>
<field property="password" depends="required,minlength,twofields">
<arg key="prompt.password" position="0"/>
<arg name="minlength" key="${var:minlength}" resource="false" position="1"/>
<arg name="twofields" key="确认密码" position="1" resource="false"/>
<var>
<var-name>mask</var-name>
<var-value>\w{3,9}</var-value>
</var>
<var>
<var-name>minlength</var-name>
<var-value>5</var-value>
</var>
<var>
<var-name>secondProperty</var-name>
<var-value>password2</var-value>
</var>
</field>
<field property="date" depends="date">
<arg key="prompt.date" position="0"/>
</field>
<field property="email" depends="email,mask">
<arg key="prompt.email" position="0"/>
<var>
<var-name>mask</var-name>
<var-value>\w+@\w+(.\w+)+</var-value>
</var>
</field>
</form>
</formset>
</form-validation>
3.6 JSP注册表单
注册表单中的话,注意两点
1.提交属性需要加上οnsubmit="return validateUserFormBean(this)",就可以在客户端进行校验了,不过生成的代码量超大,正式运营还是不要添加这个.
2.要显示错误的地方加上 html:errors就行了.
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>注册</title>
<script type="text/javascript" src="${pageContext.request.contextPath }/js/fckeditor/fckeditor.js"></script>
</head>
<body style="text-align: center">
<html:errors/>
<html:form action="/Register" οnsubmit="return validateUserFormBean(this)">
用户名:<html:text property="username"></html:text><br>
密码:<input type="password" name="password"><br/>
确认密码:<input type="password" name="password2"><br/>
电子邮箱:<input type="text" name="email"><br/>
生日:<input type="text" name="birthday"><br/>
4.Validator校验器总结
Validator好处:
1.更好的维护性,可以在资源文件中配置.
2.校验实现标准化,校验标准可以自己手工配.
3.正确的实现.
4.更少的代码重复,根本就不用写代码!全是配的~.
5.自动客户端验证 οnsubmit="return validateUserFormBean(this).
其他博客介绍校验器: http://ltc603.iteye.com/blog/67136