1)Model层:
package com.sdc.model;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
/**
* @author shaodachang
*
*/
//用户实体类User
@Entity
@Table(name="t_user")
public class User {
private int id;
private String username;//用户名
private String password;//密码
private String email;//电子邮件
@Id
@GeneratedValue
public int getId() {
return id;
}
public void setId(int 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 String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
2)Vo值传递:
package com.sdc.vo;
import org.springframework.stereotype.Component;
/**
* @author shaodachang
*
*/
//用户vo值传递类UserVo
@Component("userVo")
public class UserVo {
private int id;
private String username;//用户名
private String password;//密码
private String repassword;//确认密码
private String email;//电子邮件
public int getId() {
return id;
}
public void setId(int 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 String getRepassword() {
return repassword;
}
public void setRepassword(String repassword) {
this.repassword = repassword;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
3)Dao层:
package com.sdc.dao;
import com.sdc.model.User;
//用户接口UserDao
public interface UserDao {
public void addUser(User u);//添加用户
public boolean checkUserExistsWithName(String username);//检查注册用户是否存在数据库
}
4)DaoImpl实现层:
package com.sdc.dao.impl;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.stereotype.Component;
import com.sdc.dao.UserDao;
import com.sdc.model.User;
//用户实现类UserDaoImpl
@Component("userDao")
public class UserDaoImpl implements UserDao {
private HibernateTemplate hibernateTemplate;
public HibernateTemplate getHibernateTemplate() {
return hibernateTemplate;
}
@Resource
public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
this.hibernateTemplate = hibernateTemplate;
}
//添加用户
public void addUser(User u) {
this.hibernateTemplate.save(u);
}
//检查注册用户是否存在数据库
@SuppressWarnings("unchecked")
public boolean checkUserExistsWithName(String username) {
List<User> users = hibernateTemplate.find("from User u where u.username = '" + username + "'");
if(users != null && users.size() > 0) {
return true;
}
return false;
}
}
5)Action层:
- 图片验证码生成类ValidateCodeAction:
package com.sdc.action;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Map;
import java.util.Random;
import javax.imageio.ImageIO;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.interceptor.RequestAware;
import org.apache.struts2.interceptor.SessionAware;
import org.springframework.stereotype.Component;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
/**
* @author shaodachang
*
*/
//图片验证码生成类ValidateCodeAction
@SuppressWarnings("serial")
@Component("validateCodeAction")
public class ValidateCodeAction extends ActionSupport implements ModelDriven,RequestAware,SessionAware{
private double rand;
private Map<String,Object> request;
private Map<String,Object> session;
private ByteArrayInputStream inputStream;
/**
* @return inputStream
*/
public ByteArrayInputStream getInputStream() {
return inputStream;
}
/**
* @param inputStream
*/
public void setInputStream(ByteArrayInputStream inputStream) {
this.inputStream = inputStream;
}
public String execute() {
try {
this.setInputStream(generateImage());
} catch (IOException e) {
e.printStackTrace();
}
return "success";
}
/**
* build:picture code
*/
private ByteArrayInputStream generateImage() throws IOException{
BufferedImage image = new BufferedImage(100,20,BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics();
g.setColor(Color.WHITE);
g.fillRect(0, 0, 100, 20);
drawbg(g);
drawValidateCode(g);
ByteArrayInputStream input = null;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ImageIO.write(image,"JPEG",bos);
byte [] buf = bos.toByteArray();
input = new ByteArrayInputStream(buf);
return input;
}
/**
* code backGround Draw
*/
private void drawbg(Graphics g) {
Random rand = new Random();
int randx;
int randy;
for (int i = 0; i < rand.nextInt(100) + 500; i++) {
g.setColor(new Color(rand.nextInt(255), rand.nextInt(255), rand
.nextInt(255)));
randx = rand.nextInt(100);
randy = rand.nextInt(20);
g.drawLine(randx, randy, randx, randy);
}
}
/**
* code draw
*/
private void drawValidateCode(Graphics g) {
String code = generateCode();
Random rand = new Random();
int x = 0;
Font font = new Font("Times New Roman", Font.PLAIN, 18);
g.setFont(font);
for (int i = 0; i < code.length(); i++) {
int y = 20 - rand.nextInt(4);
g.setColor(new Color(rand.nextInt(150), rand.nextInt(150), rand
.nextInt(150)));
g.drawString(code.substring(i, i + 1), x, y);
x += 20;
}
}
/**
* code generate
*/
private String generateCode() {
Random rand = new Random();
StringBuffer sbr = new StringBuffer(
"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789");
int codeLen = 5;
StringBuffer codeSbr = new StringBuffer();
for (int i = 0; i < codeLen; i++) {
int select = rand.nextInt(sbr.length());
codeSbr.append(sbr.charAt(select));
sbr.deleteCharAt(select);
}
System.out.println("serverValidateCode--------------" + codeSbr.toString().toLowerCase());
session.put("validateCode",codeSbr.toString().toLowerCase());
//ServletActionContext.getRequest().getSession().setAttribute("validateCode",codeSbr.toString().toLowerCase());
return codeSbr.toString();
}
public Object getModel() {
return null;
}
public void setRequest(Map<String, Object> request) {
this.request = request;
}
public void setSession(Map<String, Object> session) {
this.session = session;
}
}
- 用户业务逻辑类UserAction:
package com.sdc.action;
import java.util.HashMap;
import java.util.Map;
import javax.annotation.Resource;
import net.sf.json.JSONObject;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.interceptor.RequestAware;
import org.apache.struts2.interceptor.SessionAware;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.sdc.dao.UserDao;
import com.sdc.model.User;
import com.sdc.vo.UserVo;
/**
* @author shaodachang
*
*/
//用户业务逻辑类UserAction
@Component("userAction")
@Scope("prototype")
public class UserAction extends ActionSupport implements ModelDriven,RequestAware,SessionAware {
private UserDao userDao;
private UserVo userVo;
private User user;
private Map<String,Object> request;
private Map<String,Object> session;
private String result;
private String inputValidateCode;
public UserDao getUserDao() {
return userDao;
}
@Resource
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public UserVo getUserVo() {
return userVo;
}
@Resource
public void setUserVo(UserVo userVo) {
this.userVo = userVo;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public UserAction(){
System.out.println("userAction start!");
}
public String getInputValidateCode() {
return inputValidateCode;
}
public void setInputValidateCode(String inputValidateCode) {
this.inputValidateCode = inputValidateCode;
}
public String getResult() {
return result;
}
public void setResult(String result) {
this.result = result;
}
public Map<String, Object> getRequest() {
return request;
}
public Object getModel() {
return userVo;
}
public void setRequest(Map<String, Object> request) {
this.request = request;
}
public void setSession(Map<String, Object> session) {
this.session = session;
}
//检查用户是否存在,返回json对象
public String isExist(){
Map<String, String> map = new HashMap<String, String>();
if(userDao.checkUserExistsWithName(userVo.getUsername().toLowerCase())){
map.put("isExist", "true");
}else{
map.put("isExist", "false");
}
map.put("username", userVo.getUsername().toLowerCase());
JSONObject jo = JSONObject.fromObject(map);
result = jo.toString();
System.out.println(result);
return "isExist";
}
//添加用户
public String add(){
User u = new User();
System.out.println("add()");
u.setUsername(userVo.getUsername().toLowerCase());
u.setPassword(userVo.getPassword().toLowerCase());
u.setEmail(userVo.getEmail().toLowerCase());
session.put("username", userVo.getUsername().toLowerCase());
System.out.println(userVo.getUsername().toLowerCase()+userVo.getPassword().toLowerCase());
userDao.addUser(u);
return "add_success";
}
//检查输入验证码与图片验证码是否一致,返回json对象
public String isValid(){
Map<String, String> map2 = new HashMap<String, String>();
//String inputValidateCode = ServletActionContext.getRequest().getParameter("validateCode");
//String serverValidateCode = ServletActionContext.getRequest().getSession().getAttribute("validateCode").toString();
String serverValidateCode = (String)session.get("validateCode");
System.out.println("serverValidateCode------" + serverValidateCode + "==========inputValidateCode------" + inputValidateCode);
if(!inputValidateCode.equals(serverValidateCode)){
map2.put("isValid", "invalid");
}else{
map2.put("isValid", "valid");
}
JSONObject jo = JSONObject.fromObject(map2);
result = jo.toString();
System.out.println(result);
return "isValid";
}
}
6)bean.xml配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
<context:annotation-config />
<context:component-scan base-package="com.sdc" />
<bean
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<value>classpath:jdbc.properties</value>
</property>
</bean>
<bean id="dataSource" destroy-method="close"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName"
value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
<bean id="sf"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="packagesToScan">
<list>
<value>com.sdc.model</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
</bean>
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory" ref="sf"></property>
</bean>
<bean id="txManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sf" />
</bean>
<aop:config>
<aop:pointcut id="bussinessService"
expression="execution(public * com.sdc.dao.*.*(..))" />
<aop:advisor pointcut-ref="bussinessService"
advice-ref="txAdvice" />
</aop:config>
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="add*" propagation="REQUIRED" />
<tx:method name="delete*" propagation="REQUIRED" />
<tx:method name="update*" propagation="REQUIRED" />
<tx:method name="*" read-only="true "/>
</tx:attributes>
</tx:advice>
</beans>
7)struts.xml配置文件:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
"http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<constant name="struts.ui.theme" value="mytheme" />
<package name="userAjax" extends="json-default">
<action name="uAjax" class="userAction">
<result name="isExist" type="json">
<param name="root">result</param>
</result>
<result name="isValid" type="json">
<param name="root">result</param>
</result>
<result name="add_success">/index.jsp</result>
<result name="register">/register.jsp</result>
</action>
</package>
<package name="default" namespace="/" extends="struts-default">
<action name="generateValidateCode" class="validateCodeAction">
<result type="stream">
<param name="contentType">image/jpeg</param>
<param name="inputName">inputStream</param>
</result>
</action>
</package>
</struts>
8)jdbc.properties数据库连接配置信息:
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssh2
jdbc.username=root
jdbc.password=1234
9)用户注册页面register.jsp:
<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>用户注册实例演示</title>
<script language="javascript" src="js/jquery-1.3.2.min-vsdoc.js"></script>
<script type="text/javascript">
//标志表单信息是否完整
var ub = new Boolean(false);//追踪用户名是否有效
var pb = new Boolean(false);//追踪密码是否有效
var rpb = new Boolean(false);//追踪确认密码是否有效
var eb = new Boolean(false);//追踪电子邮件是否有效
var cb = new Boolean(false);//追踪图片验证码是否有效
function check(){
var englishDigit = //w+/W+/;//匹配英文数字
var invalidChars = //W/;//不匹配非字符
var digit = //d+/;//匹配数字一个以上
var english = /[a-zA-Z]+/;//匹配26个英文字母
var validEmail = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((/.[a-zA-Z0-9_-]{2,3}){1,2})$/;
var username = $.trim($("#username").val());
var password = $.trim($("#password").val());
var repassword = $.trim($("#repassword").val());
var email = $.trim($("#email").val());
//密码验证
if(password != ""){
if(password.length < 6 || password.length > 15){
if(password.length < 6){
pb = false;
$('#showpassword').html("密码不能少于6位数!" + "<img src=img/worng.bmp />");
}else{
if(password.length > 15){
pb = false;
$('#showpassword').html("密码不能大于15位数!" + "<img src=img/worng.bmp />");
}
}
}else{
if(password.length >= 6 && password.length <= 15){
if(digit.test(password) && english.test(password)){
pb = true;
$('#showpassword').html("<img src=img/right.bmp />");
}else{
pb = false;
$('#showpassword').html("密码只能输入由数字、26个英文字母或者下划线组成的字符串!" + "<img src=img/worng.bmp />");
}
}
}
}else{
pb = false;
$('#showpassword').html("密码不能为空!" + "<img src=img/worng.bmp />");
}
//确认密码验证
if(repassword == ""){
rpb = false;
$('#showrepassword').html("确认密码不能为空!" + "<img src=img/worng.bmp />");
}else{$('#showrepassword').html("<img src=img/right.bmp />");}
//两次输入密码是否一致
if(password != repassword){
rpb = false;
$('#showrepassword').html("两次输入的密码不一致!" + "<img src=img/worng.bmp />");
}else{rpb = true;$('#showrepassword').html("<img src=img/right.bmp />");}
//当密码不为空和确认密码为空时,输出提示:确认密码不能空!
if(password != "" && repassword == ""){
rpb = false;
$('#showrepassword').html("确认密码不能为空!" + "<img src=img/worng.bmp />");
}
//当密码为空和确认密码不为空时,输出提示:密码不能为空!
if(password == "" && repassword != ""){
rpb = true;
$('#showpassword').html("密码不能为空!" + "<img src=img/worng.bmp />");
$('#showrepassword').html("<img src=img/right.bmp />");
}
//当密码和确认密码同时为空,输出提示:密码和确认密码分别不能为空!
if(password == "" && repassword == ""){
pb = false;rpb = false;
$('#showpassword').html("密码不能为空!" + "<img src=img/worng.bmp />");
$('#showrepassword').html("确认密码不能为空!" + "<img src=img/worng.bmp />");
}
//电子邮件验证
if(email != ""){
if(validEmail.test(email)){
eb = true;
$('#showemail').html("<img src=img/right.bmp />");
}else{
eb = false;
$('#showemail').html("电子邮件格式不对!" + "<img src=img/worng.bmp />");
}
}else{
eb = false;
$('#showemail').html("电子邮件不能为空!" + "<img src=img/worng.bmp />");
}
//用户名验证
if(username != ""){
if(username.length < 6 || username.length > 15){
if(username.length < 6){
ub = false;
$('#showusername').html("用户名不能少于6位数!" + "<img src=img/worng.bmp />");
}else{
if(username.length >15){
ub = false;
$('#showusername').html("用户名不能大于15位数!" + "<img src=img/worng.bmp />");
}
}
}else{
if(username.length >= 6 && username.length <= 15){
if(!englishDigit.test(username) && !invalidChars.test(username)){
//ajax-begin
var url = 'uAjax!isExist';
//获取表单值,并以json的数据形式保存到params中
var params = {
username:username,
};
//使用$.post方式
$.post(url,params,function cbf(data){
var user = eval("("+data+")");//包数据解析为json 格式
//ajax以json格式返回信息:验证用户是否存在
if(user.isExist == "true"){
ub = false;
$('#showusername').html("该用户" + user.username + "已被使用!" + "<img src=img/worng.bmp />");
}else{ub = true;$('#showusername').html("<img src=img/right.bmp />");}
}, 'json' //数据传递的类型 json
);
//ajax-end
}else{
ub = false;
$('#showusername').html("包含非法字符!" + "<img src=img/worng.bmp />");
}
}
}
}else{
ub = false;
$('#showusername').html("用户名不能为空!" + "<img src=img/worng.bmp />");
}
}
//根据表单验证信息判断form表单是否提交
function submitTest(){
alert("ub=" + ub);
alert("pb=" + pb);
alert("rpb=" + rpb);
alert("eb=" + eb);
alert("cb=" + cb);
if(ub && pb && rpb && eb && cb){
alert("T");
return true;
}else{
alert("F");
return false;
}
}
//单击验证码图片重新获取验证码
function reloadValidate(image){
image.src = "generateValidateCode.action?rand=" + Math.random();
}
//检查输入验证码是否与图片上的验证码一致
function verifyCode(){
//ajax-begin
var url = 'uAjax!isValid';
//获取表单值,并以json的数据形式保存到params中
var params = {
inputValidateCode:$.trim($("#validateCode").val()),
};
//使用$.post方式
$.post(url,params,function cbf(data){
var code = eval("("+data+")");//包数据解析为json 格式
//ajax以json格式返回信息:验证用户是否存在
if(code.isValid == "invalid"){
cb = false;
$('#showvalidateCode').html("输入验证码错误!" + "<img src=img/worng.bmp />");
}else{cb = true;$('#showvalidateCode').html("<img src=img/right.bmp />");}
}, 'json' //数据传递的类型 json
);
//ajax-end
}
</script>
</head>
<body>
<form action="uAjax!add" method="post" οnsubmit="return submitTest();">
用户名:<input type="text" id="username" name="username" οnblur="check()"/><span id="showusername"></span><br />
密码:<input type="password" id="password" name="password" οnblur="check()" /><span id="showpassword"></span><br />
确认密码:<input type="password" id="repassword" name="repassword" οnblur="check()"/><span id="showrepassword"></span><br />
电子邮件:<input type="text" id="email" name="email" οnblur="check()"/><span id="showemail"></span><br />
验证码:<input id="validateCode" name="validateCode" οnchange="verifyCode()" />
<img οnclick="reloadValidate(this);" src="generateValidateCode.action?rand=<%= Math.random() %>>" /><span id="showvalidateCode"></span><br />
<input type="submit" id="btn_login" value="register" />
</form>
</body>
</html>
10)用户注册成功返回index.jsp页面:
<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
用户名<s:property value="#session.username"/>已成功添加!
</body>
</html>
11)用户注册校验效果图: