使用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
驗證框架運行流程如下圖所示: