频道栏目
首页 > 资讯 > Java > 正文

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

14-08-09        来源:[db:作者]  
收藏   我要投稿

实现目标:

1.使用验证框架对用户注册信息进行验证 2.验证用户名、密码、邮箱不能为空 3.验证用户名、密码长度 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}
重新注册 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类位于同一个包
 



	
	
		
		
			
		
		
		
		  
			
			4
			12
			
		
	
	
	
	
		
			
		
			
		
			4
			12
			
		
	
	
	
	
		
			
		
		
			
		
	
 
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文件的配置




	
		
	 		
		
			
			/register.jsp
			/success.jsp
			/error.jsp
		
		
	

register.jsp注册页面的编写
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>




<s:text name="title"/>





succes.jsp注册成功页面的编写
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>




欢迎界面


,欢迎


error.jsp注册失败页面的编写
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>

<%
	//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+"/";
%>



<s:text name="failure"/>



<%=basePath %>register!default.action




该Struts2应用程序的目录结构如下图:
测试截图:
1.启动Tomcat服务器,在地址栏中输入http://localhost:8080/struts2-RegisterValidate/register!default.action,出现下列显示内容: 显然,这不是我们想要的结果,当用户访问注册页面而不是提交注册表单时,是不需要进行验证的。出现以上的原因是,在调用Register。Action的doDefault方法之前,验证框架被调用了。 由于调用验证框架的拦截器是validation,而不是workflow,因此我们可以为validation拦截器配置排除方法,更改如下:

			
			
				default
			
			/register.jsp
			/success.jsp
			/error.jsp
重启Tomcat,再次测试用户注册程序,此时一切运行正常






相关TAG标签
上一篇:实战程序化处理Struts1针对zh_HANS_CN国际化问题
下一篇:css sprite 调整大张图片中小图标的大小
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站