首页 > 代码库 > struts2学习笔记(三)—— 在用户注冊程序中使用验证框架

struts2学习笔记(三)—— 在用户注冊程序中使用验证框架

实现目标:

      1.使用验证框架对用户注冊信息进行验证
      2.验证username、password、邮箱不能为空
      3.验证username、password长度
      4.验证邮件地址格式

详细实现

一、Struts2应用的基础配置

      这里不做具体阐述,具体为web.xml、相关jar包的配置

二、将页面显示的文本内容放到资源文件里

      1.查看用户注冊程序中的全部页面,找到全部能够显示的文本内容,将它们分离出来放到资源文件里。
      2.与相关的Action类同名,以.preperties为扩展名,与Action类位于同一个包中,仅仅能由该Action訪问

RegisterAction_zh_CN.properties

#register.jsp页面所需的字符串资源
title=用户注冊
username=用户名
password=密码
sex=性别
sex.male=男
sex.female=女
email=邮件地址
pwdQuestion=密码问题
pwdAnswer=密码答案
submit=注冊
reset=重置

#success.jsp页面所需的字符串资源
success=注冊成功
success.info=${user.username},恭喜你注冊成功

#error.jsp页面所需的字符串资源
failure=注冊失败
failure.info=注冊失败,原因是:${exception}<br>请<a href="http://www.mamicode.com/{0}">又一次注冊</a>
error.username.exist=用户名已经存在

error.username.length=${getText("username")}长度必须在${minLength}到${maxLength}个字符之间
error.password.length=${getText("password")}长度必须在${minLength}到${maxLength}个字符之间
error.email.invalid=${getText("email")}格式不正确

error.username.required=${getText("username")}不能为空
error.password.required=${getText("password")}不能为空
error.email.required=${getText("mail")}不能为空
      最后两段代码是加入的错误消息,使用OGNL表达式作为消息文本的參数

三、编写验证文件

      RegisterAction-validation.xml,相同,与相关Action类位于同一个包
<!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.2//EN"   
  "http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd"> 


<validators>
	<!-- 针对user.username字段的验证规则 -->
	<field name="user.username">
		<!-- 使用requiredstring验证器。确保user.username字段值不为null,也不为“” -->
		<field-validator type="requiredstring">
			<message key="error.username.required"/>
		</field-validator>
		
		<!-- 使用stringlength验证器。确保user.username字段值的字符长在4到12之间 -->
		<field-validator type="stringlength">  
			<!-- 向stringlength验证器实例传递minLength和maxLength參数 -->
			<param name="minLength">4</param>
			<param name="maxLength">12</param>
			<message key="error.username.length"/>
		</field-validator>
	</field>
	
	<!-- 针对user.password字段的验证规则 -->
	<field name="user.password">
		<field-validator type="requiredstring">
			<message key="error.password.required"/>
		</field-validator>
			
		<field-validator type="stringlength">
			<param name="minLength">4</param>
			<param name="maxLength">12</param>
			<message key="error.password.length"/>
		</field-validator>
	</field>
	
	<!-- 针对user.email字段的验证规则 -->
	<field name="user.email">
		<field-validator type="requiredstring">
			<message key="error.email.required"/>
		</field-validator>
		<field-validator type="email">
			<message key="error.email.invalid"/>
		</field-validator>
	</field>
</validators> 
      1).在编写验证文件时要注意。DTD的声明,我一開始对着教材上的DTD版本号输入,运行的时候发现提示了一个错误例如以下:
The file cannot be validated as the XML definition "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd" that is specified as describing the syntax of the file cannot be located.
      后来在网上找到了解决方式,替换成上面正确的版本号就能够了。


四、其它相关Action类、页面的编写等

RegisterAction
package register.action;



import java.sql.SQLException;
import java.util.Date;

import register.dao.UserDao;
import register.entity.User;
import register.exceptions.UsernameExistException;

import com.opensymphony.xwork2.ActionSupport;

public class RegisterAction extends ActionSupport {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private User user;
	private UserDao userdao;
	public RegisterAction(){
		userdao=new UserDao();
	}
	@Override
	public String doDefault()throws Exception{
		return INPUT;
	}
	@Override
	public String execute() throws SQLException, UsernameExistException{
		
		user.setRegDate(new Date());
		try{
		userdao.register(user);
		}catch(UsernameExistException e){
			addFieldError("user.username",getText("error.username.exist"));
			return INPUT;
		}
		return SUCCESS;
	}
	public User getUser() {
		return user;
	}
	public void setUser(User user) {
		this.user = user;
	}
	
}

用户实体类:User
package register.entity;

import java.io.Serializable;
import java.util.Date;

public class User implements Serializable {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private Integer id;
	private String username;
	private String password;
	private Boolean sex;
	private String email;
	private String pwdQuestion;
	private String pwdAnswer;
	private Date regDate;
	private Date lastLoginDate;
	private String lastLoginIp;
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	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 Boolean getSex() {
		return sex;
	}
	public void setSex(Boolean sex) {
		this.sex = sex;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public String getPwdQuestion() {
		return pwdQuestion;
	}
	public void setPwdQuestion(String pwdQuestion) {
		this.pwdQuestion = pwdQuestion;
	}
	public String getPwdAnswer() {
		return pwdAnswer;
	}
	public void setPwdAnswer(String pwdAnswer) {
		this.pwdAnswer = pwdAnswer;
	}
	public Date getRegDate() {
		return regDate;
	}
	public void setRegDate(Date regDate) {
		this.regDate = regDate;
	}
	public Date getLastLoginDate() {
		return lastLoginDate;
	}
	public void setLastLoginDate(Date lastLoginDate) {
		this.lastLoginDate = lastLoginDate;
	}
	public String getLastLoginIp() {
		return lastLoginIp;
	}
	public void setLastLoginIp(String lastLoginIp) {
		this.lastLoginIp = lastLoginIp;
	}
	
	
}

对注冊用户的数据库操作.UserDao
package register.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import register.entity.User;
import register.exceptions.UsernameExistException;

public class UserDao {
	public UserDao(){
		String driverClass="com.mysql.jdbc.Driver";
		
		try{
			Class.forName(driverClass);
		}catch(ClassNotFoundException ce){
			ce.printStackTrace();
		}
	}
	public Connection getConnection() throws SQLException{
		String	url="jdbc:mysql://localhost:3307/user";
		String	user="tankcat_2";
		String	pw="wxt222$$$";
		return DriverManager.getConnection(url,user,pw);
	}
	
	public User register(User user) throws SQLException, UsernameExistException{
		Connection conn=null;
		PreparedStatement pstmt=null;
		ResultSet rs=null;
		try{
		conn=getConnection();
		String sql="select * from reg_user where username = ?

"; pstmt=conn.prepareStatement(sql); pstmt.setString(1, user.getUsername()); rs=pstmt.executeQuery(); if(rs.next()){ throw new UsernameExistException(); } sql="insert into reg_user(username,password,sex,email,pwd_question,pwd_answer,reg_date) values(?,?

,?

,?,?

,?,?)"; pstmt=conn.prepareStatement(sql); pstmt.setString(1, user.getUsername()); pstmt.setString(2, user.getPassword()); pstmt.setBoolean(3, user.getSex()); pstmt.setString(4, user.getEmail()); pstmt.setString(5, user.getPwdQuestion()); pstmt.setString(6,user.getPwdAnswer()); pstmt.setTimestamp(7, new java.sql.Timestamp(user.getRegDate().getTime())); pstmt.execute(); rs=pstmt.executeQuery("select last_insert_id()"); if(rs.next()){ user.setId(rs.getInt(1)); }else{ return null; } }catch(SQLException se){ throw se; }finally{ closeResultSet(rs); closePreparedStatement(pstmt); closeConnection(conn); } return user; } private void closeResultSet(ResultSet rs) { // TODO Auto-generated method stub if(rs!=null){ try{ rs.close(); }catch(SQLException se){ se.printStackTrace(); } rs=null; } } private void closePreparedStatement(PreparedStatement pstmt) { // TODO Auto-generated method stub if(pstmt!=null){ try{ pstmt.close(); }catch(SQLException se){ se.printStackTrace(); } pstmt=null; } } private void closeConnection(Connection conn) { // TODO Auto-generated method stub if(conn!=null){ try{ conn.close(); }catch(SQLException se){ se.printStackTrace(); } conn=null; } } }


struts.xml文件的配置
<?xml version="1.0" encoding="UTF-8" ?

> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <constant name="struts.enable.DynamicMethodInvocation" value="http://www.mamicode.com/true" /> <package name="default" extends="struts-default"> <action name="register" class="register.action.RegisterAction"> <exception-mapping result="error" exception="java.lang.Exception"/> <result name="input">/register.jsp</result> <result name="success">/success.jsp</result> <result name="error">/error.jsp</result> </action> </package> </struts>


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><s:text name="title"/></title>
</head>
<body>

<hr color="#ededed"/>
<s:fielderror/>
<s:form action="register.action">
	<s:textfield name="user.username" key="username"/>
	<s:password name="user.password" key="password"/>
	<s:radio name="user.sex" value="http://www.mamicode.com/true"
		list="#{true:getText(‘sex.male‘),false:getText(‘sex.female‘)}" key="sex"/>
	<s:textfield name="user.email" key="email"/>
	<s:textfield name="user.pwdQuestion" key="pwdQuestion"/>
	<s:textfield name="user.pwdAnswer" key="pwdAnswer"/>
	<s:submit key="submit"/>
	<s:reset key="reset"/>
</s:form>
</body>
</html>

succes.jsp注冊成功页面的编写
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!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>欢迎界面</title>
</head>
<body>
<s:property value="http://www.mamicode.com/user.username"/>。欢迎
</body>
</html>

error.jsp注冊失败页面的编写
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%
	//String path = request.getContextPath();
	//String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
	//得到Web应用程序的上下文路径
	String path=request.getContextPath();
	//构建Web应用程序上下文路径的完整URL
	String basePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title><s:text name="failure"/></title>
</head>
<body>
<s:text name="failure.info">
<s:param><%=basePath %>register!default.action</s:param>
</s:text>
</body>
</html>


该Struts2应用程序的文件夹结构例如以下图:
    技术分享

測试截图:

      1.启动Tomcatserver。在地址栏中输入http://localhost:8080/struts2-RegisterValidate/register!default.action,出现下列显示内容:
       技术分享
      显然。这不是我们想要的结果,当用户訪问注冊页面而不是提交注冊表单时,是不须要进行验证的。出现以上的原因是,在调用Register。

Action的doDefault方法之前。验证框架被调用了。

      因为调用验证框架的拦截器是validation。而不是workflow。因此我们能够为validation拦截器配置排除方法,更改例如以下:
<action	name="register" class="register.action.RegisterAction">
			<exception-mapping result="error" exception="java.lang.Exception"/>
			<interceptor-ref name="defaultStack">
				<param name="validation.excludeMethods">default</param>
			</interceptor-ref>
			<result name="input">/register.jsp</result>
			<result name="success">/success.jsp</result>
			<result name="error">/error.jsp</result>
</action>
      重新启动Tomcat,再次測试用户注冊程序。此时一切执行正常
      技术分享

      技术分享

      技术分享
      
      技术分享




struts2学习笔记(三)—— 在用户注冊程序中使用验证框架