struts2学习笔记(三)—— 在用户注冊程序中使用验证框架
实现目标:
详细实现
一、Struts2应用的基础配置
二、将页面显示的文本内容放到资源文件里
#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="{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")}不能为空
三、编写验证文件
<!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类、页面的编写等
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="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>
<%@ 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="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="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应用程序的文件夹结构例如以下图:
Action的doDefault方法之前。验证框架被调用了。
<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,再次測试用户注冊程序。此时一切执行正常
 
                    
                 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号