在注册某个网站的时候,通常都会对我们输入的用户名、密码、邮箱等的格式进行验证,比如验证我们输入的用户名是否大于多少个字符,验证我们的密码和确认密码是否相同、验证我们输入的邮箱格式是否正确、验证我们输入的数字是否在规定的范围。。。。
这些验证代码虽说不难,但是却很繁琐。为此,Struts2为我们提供了一套验证框架能够帮助我们完成对上述输入格式等的验证。
一、Struts2验证简介
Struts基于Struts2拦截器,为开发者提供了一套易用的验证框架,并可扩展。一般的验证都支持。
二、内置验证
我们还是以项目为例为大家演示Struts2验证框架是使用方法。对于验证框架的使用方法,大家也可以参考Struts2自带的示例代码(docs/basic-validation.html)。
我们这里以一个简单的注册功能为例来演示Struts2验证的框架的用法。
1.新建工程:SecondLearnStruts2Chap07;
2.新建一个用户类User:
package com.test.model;
public class User {
private String userName;
private String name;
private int age;
private String email;
private String homePage;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getHomePage() {
return homePage;
}
public void setHomePage(String homePage) {
this.homePage = homePage;
}
@Override
public String toString() {
return "User [userName=" + userName + ", name=" + name + ", age=" + age + ", email=" + email + ", homePage="
+ homePage + "]";
}
}
我们这里在注册的时候让用户输入用户名、真实姓名、年龄、邮箱以及主页信息。
3.新建一个action:RegisterAction
package com.test.action;
import com.opensymphony.xwork2.ActionSupport;
import com.test.model.User;
public class RegisterAction extends ActionSupport{
/**
*
*/
private static final long serialVersionUID = 1L;
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@Override
public String execute() throws Exception {
System.out.println("传入的用户:"+user);
return SUCCESS;
}
}
这里只是简单的打印出用户的信息,并返回success;
4.写配置文件struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="manager" extends="struts-default">
<action name="registerAction" class="com.test.action.RegisterAction">
<result name="input">/register.jsp</result>
<result name="success">/success.jsp</result>
</action>
</package>
</struts>
这里需要注意:使用验证框架的时候,如果验证有问题的话,框架会自动返回input字符。我们这里定义,如果返回的是input字符,就还是停留在注册页面。如果返回的是success则转发到success.jsp页面。
5.写注册页面register.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
用户注册
<s:form action="/registerAction" method="post">
<s:textfield name="user.userName" label="用户名"></s:textfield>
<s:textfield name="user.name" label="真实姓名"></s:textfield>
<s:textfield name="user.age" label="年龄"></s:textfield>
<s:textfield name="user.email" label="邮件"></s:textfield>
<s:textfield name="user.homePage" label="主页"></s:textfield>
<s:submit value="注册"></s:submit>
</s:form>
</body>
</html>
我们这里使用了Struts2的界面标签来编辑注册界面。
6.写success.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
注册成功
</body>
</html>
这里只是简单的提醒一下注册成功。
7.下面写最重要的,验证代码。
7.1 新建一个RegisterAction-validation.xml文件,这里注意文件的命名规则是: <ActionClassName>-validation.xml
或者是 <ActionClassName>-<ActionAliasName>-validation.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.2//EN" "http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">
<validators>
<field name="user.userName">
<field-validator type="requiredstring">
<message>请输入用户名</message>
</field-validator>
<field-validator type="stringlength">
<param name="minLength">6</param>
<param name="maxLength">10</param>
<message>用户名必须在${minLength}和${maxLength}之间</message>
</field-validator>
</field>
<field name="user.name">
<field-validator type="requiredstring">
<message>请输入姓名</message>
</field-validator>
</field>
<field name="user.age">
<field-validator type="int">
<param name="min">18</param>
<message>必须年满18岁</message>
</field-validator>
</field>
<field name="user.email">
<field-validator type="requiredstring">
<message>请输入邮件</message>
</field-validator>
<field-validator type="email">
<message>请输入正确的邮件格式</message>
</field-validator>
</field>
<field name="user.homePage">
<field-validator type="requiredstring">
<message>请输入主页</message>
</field-validator>
<field-validator type="url">
<message>请输入正确的主页格式</message>
</field-validator>
</field>
</validators>
这里注意每一个<field>标签对应一个输入项,<field>标签中每一个<field-validator>代表一个验证条件。
比如对于输入用户名的验证条件中:第一个.<field-validator>的type属性是requiredstring,这代表这一项是必须输入的字符串类型,如果没有输入的话就会提示<message>标签中的内容;第二个<field-validator>的type属性是stringlength,这代表输入的长度,<field-validator>中定了了两个参数minLength和maxLength,并分别给他们赋值为6和10,这代表输入的长度必须介于两者之间。
对于年龄输入,<field-validator type="int">中type为int,表示这一项输入的值必须是整数值,里面定了了一个参数<param name="min">18</param>,表示该项输入的最小值为18.
对于邮箱的输入,其中一个验证条件为<field-validator type="email">,这代表这一项输入的值必须满足email格式。
8.上面的验证都是对输入的值本身进行验证。我们有时还会遇到验证输入的密码和确认密码是否相同这样的验证,这种验证成为表达式验证。我们这里在添加一个验证,验证输入的用户名和真实姓名是否相同,当两者不同时才能注册成功。修改Struts.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.2//EN" "http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">
<validators>
<field name="user.userName">
<field-validator type="requiredstring">
<message>请输入用户名</message>
</field-validator>
<field-validator type="stringlength">
<param name="minLength">6</param>
<param name="maxLength">10</param>
<message>用户名必须在${minLength}和${maxLength}之间</message>
</field-validator>
</field>
<field name="user.name">
<field-validator type="requiredstring">
<message>请输入姓名</message>
</field-validator>
</field>
<field name="user.age">
<field-validator type="int">
<param name="min">18</param>
<message>必须年满18岁</message>
</field-validator>
</field>
<field name="user.email">
<field-validator type="requiredstring">
<message>请输入邮件</message>
</field-validator>
<field-validator type="email">
<message>请输入正确的邮件格式</message>
</field-validator>
</field>
<field name="user.homePage">
<field-validator type="requiredstring">
<message>请输入主页</message>
</field-validator>
<field-validator type="url">
<message>请输入正确的主页格式</message>
</field-validator>
</field>
<validator type="expression">
<param name="expression"><![CDATA[!user.name.equals(user.userName)]]></param>
<message>用户名和真实姓名不能相同</message>
</validator>
</validators>
注意,表达式验证使用的是<validator type="expression">标签,该标签里面是要验证的表达式,我们这里验证当用户名和真实姓名不相同时才能通过。这里一定要注意格式。当表达式验证不通过时,框架会给出<message>中的提示。我们修改一下register.jsp页面,添加一个<s:actionerror/>标签,当表达式验证不正确的话,就会在这个标签里面给出提示信息。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<s:actionerror/>
用户注册
<s:form action="/registerAction" method="post">
<s:textfield name="user.userName" label="用户名"></s:textfield>
<s:textfield name="user.name" label="真实姓名"></s:textfield>
<s:textfield name="user.age" label="年龄"></s:textfield>
<s:textfield name="user.email" label="邮件"></s:textfield>
<s:textfield name="user.homePage" label="主页"></s:textfield>
<s:submit value="注册"></s:submit>
</s:form>
</body>
</html>
9.运行程序:
点击注册按钮:
可以看到,当什么都没有输入的时候给出了验证后的提示信息。只有当输入了正确的格式后才会跳转到success.jsp页面,否则只要有一项的输入值不满足验证条件,就会一直停留在注册界面。