使用Struct2验证框架实现用户博客注册时的输入信息正确性校验功能。
上代码:
register.jsp
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<title>新博客系统注册</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link type="text/css" rel="stylesheet" href="css/main.css" media="all" />
<!--[if IE 6]><link type="text/css" rel="stylesheet" href="css/ie6.css" media="all" /><![endif]-->
<script type="text/javascript" src="js/mootools.js"></script>
<script type="text/javascript" src="js/site.js"></script>
</head>
<body>
<div id="wrapper">
<div id="container">
<div id="scene"> <img src="images/scene.jpg" alt="" />
<h1>博客网站系统</h1>
<div id="scale_area">
<div id="scale_knob">» Font Size «</div>
</div>
<div id="menu">
<div class="holder"> <a href="showAllArticle.action">博客首页</a> </div>
<div class="holder"> <a href="register.jsp">新博客注册</a> </div>
<div class="holder"> <a href="login.jsp">博客登录</a> </div>
</div>
</div>
<div id="content">
<div id="col_left">
<div class="post">
<div class="meta"></div>
<div class="comments"><div class="comment"></div>
<h2>新博客注册</h2>
<form class="h" action="register.action" method="post">
<div>
<label>帐号:</label>
<input type="text" name="username"/>*
<s:fielderror><s:param>username</s:param></s:fielderror>
</div>
<div>
<label>密码:</label>
<input type="password" name="password"/>*
<s:fielderror><s:param>password</s:param></s:fielderror>
</div>
<div>
<label>确认密码:</label>
<input type="password" name="repassword"/>*
<s:fielderror><s:param>repassword</s:param></s:fielderror>
</div>
<div>
<label>昵称:</label>
<input type="text" name="nickname"/>*
<s:fielderror><s:param>nickname</s:param></s:fielderror>
</div>
<div>
<label>密码保护问题:</label>
<input type="text" name="question"/>*
<s:fielderror><s:param>question</s:param></s:fielderror>
</div>
<div>
<label>密码保护的答案:</label>
<input type="text" name="answer"/>*
<s:fielderror><s:param>answer</s:param></s:fielderror>
</div>
<div>
<label></label>
<div class="clear"> </div>
</div>
<div class="button_wrapper">
<input name="提交" type="submit" class="button" value="注册" />
</div>
</form>
</div>
</div>
</div>
<div id="col_right">
<div id="search_box">
<form action="" method="post">
<div>
<input type="text" name="search" />
</div>
<div class="button_wrapper">
<input type="submit" value="Search" class="button" />
</div>
<div class="clear"> </div>
</form>
</div>
<div id="sidebar">
<h2>页面导航</h2>
<ul>
<li><a href="showAllArticle.action">博客首页</a></li>
<li><a href="register.jsp">新博客注册</a></li>
<li><a href="login.jsp">博客登录</a></li>
</ul>
</div>
</div>
<div class="clear"> </div>
</div>
<div id="footer">
<div class="clear"> </div>
<hr />
<p class="credit">博客网站系统</p>
</div>
</div>
</div>
</body>
</html>
然后就是action类:Register.java
package com.sanqing.action;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.sanqing.po.User;
import com.sanqing.service.UserService;
public class Register extends ActionSupport{
private String username;
private String password;
private String repassword;
private String nickname;
private String question;
private String answer;
private UserService userService;
public UserService getUserService() {
return userService;
}
public void setUserService(UserService userService) {
this.userService = userService;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getRepassword() {
return repassword;
}
public void setRepassword(String repassword) {
this.repassword = repassword;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public String getQuestion() {
return question;
}
public void setQuestion(String question) {
this.question = question;
}
public String getAnswer() {
return answer;
}
public void setAnswer(String answer) {
this.answer = answer;
}
public String execute() throws Exception {
//封装一个user对象
User user = new User();
user.setUsername(username);
user.setPassword(password);
user.setNickname(nickname);
user.setQuestion(question);
user.setAnswer(answer);
//获得request
HttpServletRequest request = ServletActionContext.getRequest();
if(userService.registerUser(user)) {
request.setAttribute("url", "login.jsp");
request.setAttribute("info", "注册成功");
return SUCCESS;
}else {
request.setAttribute("url", "register.jsp");
request.setAttribute("info", "注册失败");
return ERROR;
}
}
}
验证配置文件:Register-validation.xml。
需要注意的是,配置文件命名格式必须为<ActionName> - validation.xml。并且该文件必须与Action类放于同一目录下。
<?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>
<param name="trim">true</param>
<message>必须输入用户名</message>
</validator>
<validator type="regex">
<param name="fieldName">username</param>
<param name="expression"><![CDATA[(\w{6,20})]]></param>
<message>用户名长度必须为6至20之间</message>
</validator>
<validator type="requiredstring">
<param name="fieldName">password</param>
<param name="trim">true</param>
<message>必须输入密码</message>
</validator>
<validator type="regex">
<param name="fieldName">password</param>
<param name="expression"><![CDATA[(\w{6,20})]]></param>
<message>密码长度必须为6至20之间</message>
</validator>
<validator type="requiredstring">
<param name="fieldName">repassword</param>
<param name="trim">true</param>
<message>必须输入确认密码</message>
</validator>
<validator type="regex">
<param name="fieldName">repassword</param>
<param name="expression"><![CDATA[(\w{6,20})]]></param>
<message>确认密码长度必须为6至20之间</message>
</validator>
<validator type="fieldexpression">
<param name="fieldName">repassword</param>
<param name="expression"><![CDATA[(repassword==password)]]></param>
<message>密码和确认密码必须一致</message>
</validator>
<validator type="requiredstring">
<param name="fieldName">nickname</param>
<param name="trim">true</param>
<message>必须输入昵称</message>
</validator>
<validator type="regex">
<param name="fieldName">nickname</param>
<param name="expression"><![CDATA[([\u4e00-\u9fa5]{2,20})]]></param>
<message>昵称长度必须为2至20之间</message>
</validator>
<validator type="requiredstring">
<param name="fieldName">answer</param>
<param name="trim">true</param>
<message>必须输入密码保护答案</message>
</validator>
<validator type="regex">
<param name="fieldName">answer</param>
<param name="expression"><![CDATA[([\u4e00-\u9fa5]{5,50})]]></param>
<message>密码保护答案长度必须为5至50之间</message>
</validator>
</validators>
其实message的信息还有可以配置国际化:配置方法也极其简单就是<message key="pass.require"></message>,key对应的是国际化配置文件中的国际化信息。
<validator type='校验器名称'>
<param name='fieldName'>需要被校验的字段</param>
<param name="参数名">参数值</param>
<message> 校验错误信息</message>
</validator>
Struts2 的验证规则(校验器名称)大概有以下数种:
required:必填校验器
requiredstring:必填字符串校验器
int:整数校验器
double:双精度浮点数校验器
date:日期校验器
expression:表达式校验器
fieldexpression:字段表达式校验器
email:电子邮件校验器
url:网址校验器
visitor:Visitor校验器
conversion:转换校验器
stringlength:字符串长度校验器
regex:正则表达式校验器
<action name="register" class="com.sanqing.action.registerAction">
<result name="success">/success.jsp</result>
<result name="error">/error.jsp</result>
<result name="input">/register.jsp</result>
</action>
验证执行时间:验证发生在execute方法运行之前,在Struts2的params拦截器已经把请求的参数反射的设置到Action的属性之后,所以,验证框架实际上验证的是值栈里面的内容。
验证的结果:如果用户输入的参数完全满足验证条件,则会继续执行execute方法,如果用户输入的参数不满足验证条件,注意:验证条件只要有一个验证通不过,就会跳转到这个Action所配置的名为input的Result,所以在struts.xml里最好配置一个名为input的result
验证框架运行流程如下图所示: