您的位置:首页 > 编程语言 > Java开发

详解Struts2的输入校验一

2012-01-02 16:04 501 查看
本文分三个部分:



一.输入校验简介

二.为什么需要输入校验

三.输入校验的方式

四.输入校验实例

一 .输入校验简介:几乎所有的JAVA开发者都会遇到输入校验的问题,输入校验简单的说就是对前台页面文本框中输入的值进行判断,比如用户名、密码不能为空,二次输入密码不正确,输入长度不合格,日期不正确等的验证。比如

reg.jsp 界面:





如果直接点注册,而不输入任何数据的话,则出现下面的错误提示。





如果输入的数据不合法,则出现如下错误提示:





通过上面的两个截图,详细读者已经大概明白的输入校验的作用了。

输入校验的原因:





二.为什么需要输入校验:输入校验直接影响了系统的稳定性。因为不能保证每个用户都按照开发者的意图来输入数据,而往往有些用户喜欢恶意的输入些非法数据来进行测试和破坏,如上图中所示,生日这样的字段,格式虽然正确,但是在逻辑上缺是错误的!所以必须对用户输入的信息进行校验。良好的输入校验,是一个项目的必不可少的环节!

三.输入校验的方式:

1.JavaScript完成客户端校验

2.validate(),validateXxx()方法进行输入校验

3.基于框架的输入校验

4.AJAX输入校验

四.输入校验实例

本文写的是 基于框架的输入校验:

①业务控制器Action:UserReg.action

package com.yaxing.register;

import java.util.Date;
import com.opensymphony.xwork2.ActionSupport;

public class UserReg extends ActionSupport{
private String username;
private String password1;
private String password2;
private Date birthday;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword1() {
return password1;
}
public void setPassword1(String password1) {
this.password1 = password1;
}
public String getPassword2() {
return password2;
}
public void setPassword2(String password2) {
this.password2 = password2;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String execute() throws Exception{
return SUCCESS;
}
}

这就是一个普通JAVA类(POJO),execute()方法只是简单的返回一个SUCCESS 字符串。

为了使用Struts2的框架校验规则文件进行输入校验,需要建立一个特定的校验规则文件。此文件是一个xml格式的配置文件。该文件的命名规则为

Action名称-validation.xml 保存在Action实现类相同的目录下面。 本文的校验文件就是UserReg-validation.xml

如图所示





校验规则 这个使用的是

②字段校验UserReg-validation.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-1.0.2.dtd">
<validators>
<!-- username字段校验 -->
<field name="username">
<field-validator type="stringlength">
<param name="minLength">4</param>
<param name="maxLength">10</param>
<message>用户名长度为${minLength}到${maxLength}之间!</message>
</field-validator>
<field-validator type="requiredstring">
<message >用户名不能为空!</message>
</field-validator>
</field>
<!-- password1字段校验 -->
<field name="password1">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>错误,密码不能为空!</message>
</field-validator>
<field-validator type="stringlength">
<param name="minLength">4</param>
<param name="maxLength">20</param>
<message>用户密码长度为${minLength}到${maxLength}之间!</message>
</field-validator>
</field>
<!-- password2字段校验 -->
<field name="password2">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>错误,确认密码不能为空!</message>
</field-validator>
<field-validator type="stringlength">
<param name="minLength">4</param>
<param name="maxLength">20</param>
<message>用户密码长度为${minLength}到${maxLength}之间!</message>
</field-validator>
<field-validator type="fieldexpression">
<param name="expression">password1==password2</param>
<message>两次输入密码不一样!</message>
</field-validator>
</field>
<!-- birthday字段校验 -->
<field name="birthday">
<field-validator type="date">
<param name="min">1990-01-01</param>
<param name="max">2011-04-14</param>
<message>错误:生日应该在一个范围内!</message>
</field-validator>
</field>
</validators>

③JSP视图:reg.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%@ taglib uri="/struts-dojo-tags" prefix="sx"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>

<title>My JSP 'reg.jsp' starting page</title>

<s:head/>
<sx:head/>

</head>

<body>
<s:form action="UserReg">
<s:textfield name="username" label="用户名"></s:textfield>
<s:password name="password1" label="密码"></s:password>
<s:password name="password2" label="确认密码"></s:password>
<sx:datetimepicker name="birthday" label="生日:" displayFormat="yyyy-MM-dd"></sx:datetimepicker>
<s:submit value="注册"/>
<s:reset value="重置"></s:reset>
</s:form>

</body>
</html>

④reg_success.jsp成功页面

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>

<title>注册成功</title>

<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->

</head>

<body>
欢迎<s:property value="username"/>,注册成功!
<h1><s:text name="username" ></s:text></h1>
<h1><s:text name="password1"></s:text></h1>
<h1><s:text name="password2"></s:text></h1>
<h1><s:text name="birthday"></s:text></h1>

</body>
</html>

⑤struts.xml 配置文件:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<package name="test" extends="struts-default">
<action  name="UserReg" class="com.yaxing.register.UserReg" method="execute">
<result name="success">/reg_success.jsp</result>
<result name="input">/reg.jsp</result>
</action>

</package>
</struts>

说下字段校验和非字段校验的区别:作用一样,配置风格不一样而已。

字段校验文件格式:

<validators>
<field name="校验字段名称">
<field-validator type="校验类型">
<param name="参数1">参数值1</param>
<param name="参数2">参数值2</param>
..........
<message>校验失败后的错误信息</message>
</field-validator>
<field-validator type="校验类型">
........
</field-validator>
</field>
</validators>

非字段校验文件:

<validators>
<validator type="校验类型">
<param name="fieldName">字段名称</param>
<param name="参数1">参数1</param>
<param name="参数2">参数2</param>
.............

<message >校验异常信息message>
</validator>
............
</validators>

非字段校验配置:UserReg-validation.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-1.0.2.dtd">

<validators>
<!-- username字段校验 -->

<validator type="stringlength">
<param name="fieldName">username</param>
<param name="minLength">4</param>
<param name="maxLength">10</param>
<message>用户名长度为${minLength}到${maxLength}之间!</message>
</validator>
<validator type="requiredstring">
<param name="fieldName">username</param>
<message >用户名不能为空!</message>
</validator>

<!-- password1字段校验 -->

<validator type="requiredstring">
<param name="fieldName">password1</param>
<message>错误,密码不能为空!</message>
</validator>
<validator type="stringlength">
<param name="fieldName">password1</param>
<param name="minLength">4</param>
<param name="maxLength">20</param>
<message>用户密码长度为${minLength}到${maxLength}之间!</message>
</validator>

<!-- password2字段校验 -->

<validator type="requiredstring">
<param name="fieldName">password2</param>
<param name="trim">true</param>
<message>错误,确认密码不能为空!</message>
</validator>
<validator type="stringlength">
<param name="fieldName">password2</param>
<param name="minLength">4</param>
<param name="maxLength">20</param>
<message>用户密码长度为${minLength}到${maxLength}之间!</message>
</validator>
<validator type="fieldexpression">
<param name="fieldName">password1</param>
<param name="fieldName">password2</param>
<param name="expression">password1==password2</param>
<message>两次输入密码不一样!</message>
</validator>

<!-- birthday字段校验 -->

<validator type="date">
<param name="fieldName">birthday</param>
<param name="min">1990-01-01</param>
<param name="max">2011-04-14</param>
<message>错误:生日应该在一个范围内!</message>
</validator>

</validators>

其他均不用修改,运行结果与前面相同!

上面配置文件中的type 即校验类型如下 这几个类型,是在com.opensymphony.xwork2.validator.validators.下面

default.xml文件里面 Struts2自带的校验器,代码如下:

<?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">

<!-- START SNIPPET: validators-default -->
<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="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>
<!--  END SNIPPET: validators-default -->

关于这几个校验器会在下文介绍。

本文出自 “幽灵柯南的技术blog” 博客,请务必保留此出处/article/4317804.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: