hibernate3+struts2+spring2+ajax+json用户注册实例

来源:互联网 发布:mac p ro u盘读不出来 编辑:程序博客网 时间:2024/06/05 23:57

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" onsubmit="return submitTest();">
用户名:<input type="text" id="username" name="username" onblur="check()"/><span id="showusername"></span><br />
密码:<input type="password" id="password" name="password" onblur="check()" /><span id="showpassword"></span><br />
确认密码:<input type="password" id="repassword" name="repassword" onblur="check()"/><span id="showrepassword"></span><br />
电子邮件:<input type="text" id="email" name="email" onblur="check()"/><span id="showemail"></span><br />
验证码:<input id="validateCode" name="validateCode" onchange="verifyCode()" />
         <img onclick="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)用户注册校验效果图: