SpringMVC_Spring_Hibernate模版

开发工具:eclipse MSR.2;

数据库:mysql5;

注:1)web.xml:配置错误页面

2)hibernate.cfg.xml:数据库连接配置,配置model类完整包名

3)applicationContext.xml:配置基础包,配置数据库连接文件

4)Contants.java:添加自己的发件人邮箱和密码

5)BaseController.java:注意发送的邮件的内容的网址连接

6)MyConfig.java:注意配置 basePackages = "com.ssh.controller"

7)MyWebApplicationInitializer.java:注意配置classpath:applicationContext.xml

jar包:

项目模版完整截图:


web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
	id="WebApp_ID" version="3.0">
	<display-name>SpringMVC_Spring_Hibernate</display-name>

	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
		<welcome-file>index.htm</welcome-file>
		<welcome-file>index.jsp</welcome-file>
		<welcome-file>default.html</welcome-file>
		<welcome-file>default.htm</welcome-file>
		<welcome-file>default.jsp</welcome-file>
	</welcome-file-list>

	<!-- 统一错误页面去处 -->
	<error-page>
		<error-code>404</error-code>
		<location>/error.jsp</location>
	</error-page>
	<error-page>
		<error-code>500</error-code>
		<location>/error.jsp</location>
	</error-page>

</web-app>

applicationContext.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:aop="http://www.springframework.org/schema/aop"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc" 
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	 http://www.springframework.org/schema/beans/spring-beans.xsd
     http://www.springframework.org/schema/aop 
     http://www.springframework.org/schema/aop/spring-aop.xsd
     http://www.springframework.org/schema/context  
     http://www.springframework.org/schema/context/spring-context.xsd
     http://www.springframework.org/schema/mvc
     http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
     http://www.springframework.org/schema/tx/spring-tx.xsd">
     
  
    <!-- 开启自动扫描AOP注释 -->
    <aop:aspectj-autoproxy/>
    
    <!-- 开启自动对包扫描 -->
	<context:component-scan base-package="com.ssh"/>
	
	<!--  配置sessionFactory -->
	<bean id="sessionFactory"
		class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
		<property name="configLocations">
			<value>classpath:hibernate.cfg.xml</value>
		</property>
	</bean> 
	
	<bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
	   <property name="sessionFactory">
	       <ref bean="sessionFactory"/>
	   </property>
	</bean>
	
	<mvc:annotation-driven />  
	<mvc:default-servlet-handler/>
</beans>
hibernate.cfg.xml
<?xml version='1.0' encoding='utf-8'?>
<!--
  ~ Hibernate, Relational Persistence for Idiomatic Java
  ~
  ~ License: GNU Lesser General Public License (LGPL), version 2.1 or later.
  ~ See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
  -->
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

    <session-factory>
	    <!-- Database connection settings -->
	    <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
	    <property name="connection.url">jdbc:mysql://localhost:3306/test</property>
	    <property name="connection.username">root</property>
	    <property name="connection.password">123456</property>
	
	    <!-- JDBC connection pool (use the built-in) 
	    <property name="connection.pool_size">3</property>-->
	
	    <property name="hibernate.c3p0.max_size">20</property>
		<property name="hibernate.c3p0.min_size">5</property>
		<property name="hibernate.c3p0.timeout">120</property>
		<property name="hibernate.c3p0.max_statements">100</property>
		<property name="hibernate.c3p0.idle_test_period">120</property>
		<property name="hibernate.c3p0.acquire_increment">2</property>
		<property name="hibernate.c3p0.validate">false</property>
		
		<property name="hibernate.temp.use_jdbc_metadata_defaults">false</property>
	    <!-- SQL dialect -->
	    <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
	
	    <!-- Disable the second-level cache  -->
	    <property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property>
	
	    <!-- Echo all executed SQL to stdout -->
	    <property name="show_sql">true</property>
	
	    <!-- Drop and re-create the database schema on startup -->
	    <property name="hbm2ddl.auto">update</property>
	    
	    <property name="hibernate.connection.autocommit">true</property>
	    
	    <property name="dynamic-update">true</property>
	    
	    <mapping class="com.ssh.model.Users" />

  	</session-factory>
</hibernate-configuration>
log4j.properties(可删除)
### setting
#log4j.rootLogger = debug,stdout,D,E
log4j.rootLogger = OFF,stdout,D,E

### print out information to Console
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n

###  DEBUG to = E://logs/error.log ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = C://logs/log.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG 
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

### ERROR to = E://logs/error.log ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File =C://logs/error.log 
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR 
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

error.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" isErrorPage="true"%>
<!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">
<link href="images/favicon.ico" type="image/x-icon" rel="shortcut icon" />
<title>ERROR</title>
<style type="text/css">
	img {
		display:block;
		margin:auto;
		vertical-align:middle;
	}
	a {
		display:block;
		margin:auto;
		text-align:center;
		vertical-align:middle;
		margin-top:-90px;
	}
</style>
</head>
<body>
	<div style="margin-top:100px; width: 100%; height: 100%;">
		<img src="images/error.png"/>
		<a href="index.jsp">返回登陆页面吧,ZZ!</a>
	</div>
</body>
</html>
forgetPwd.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!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">
<link href="images/favicon.ico" type="image/x-icon" rel="shortcut icon" />
<title>忘记密码</title>

	<script src="js/jquery-1.11.3.min.js"></script>
	<script src="js/bootstrap.min.js"></script>
	<script src="js/jquery-ui.min.js"></script>
	<script src="js/jquery.validate.min.js"></script>
	<script src="js/messages_zh.js"></script>
	<script type="text/javascript" src="js/login.js"></script>
	
<link rel="stylesheet" href="css/jquery-ui.min.css"> 
<link href="css/bootstrap.min.css" rel="stylesheet">
<link href="css/styles.css" rel="stylesheet">

<style>
.error{
	font-family: '微软雅黑';
	font-size: 13px;
	font-weight: normal;
	color: red;
}
</style>
</head>
<body>
	<div class="col-xs-10 col-xs-offset-1 col-sm-8 col-sm-offset-2 col-md-4 col-md-offset-4">
		<div class="login-panel panel panel-default">
			<div class="panel-heading">邮箱验证</div>
			<div class="panel-body">
				<form action="forgetUpwd" method="post" role="form" id="loginForm">
					<div class="form-group">
					注册邮箱:<input class="form-control" type="email" name="uemail" placeholder="请输入注册邮箱:">
					</div>
					<div class="modal-footer">
						<a href="index.jsp"><button class="btn btn-primary" type="button">取消</button></a>
						<button class="btn btn-primary" type="submit">发送</button>
					</div>
				</form>
			</div>
		</div>
	</div>
</body>
</html>
head.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" errorPage="error.jsp"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!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" />
	
<link rel="stylesheet" type="text/css" href="jedate/skin/jedate.css" />
<link rel="stylesheet" type="text/css" href="css/edit/default.css" />
<link rel="stylesheet" type="text/css" href="css/bootstrap.min.css" />
<link rel="stylesheet" type="text/css" href="css/styles.css" />
<link href="images/favicon.ico" type="image/x-icon" rel="shortcut icon" />

<script src="js/jquery-1.11.3.min.js"></script>
<script src="jedate/jedate.js"></script>
<script src="js/kindeditor-min.js"></script>
<script src="js/zh_CN.js"></script>
<script src="js/bootstrap.min.js"></script>
<script src="js/index_date.js"></script>
<script src="js/jquery-ui.min.js"></script>
<script src="js/jquery.validate.min.js"></script>
<script src="js/messages_zh.js"></script>
	
<style type="text/css">
	.footer {
		position: absolute;
		height: 30px;
		width: 100%;
	 	bottom: 0; 
		text-align: center;
		line-height: 30px;
		border-top: 1px solid #c0c0c0;
	}
	.error{
		font-family: '微软雅黑';
		font-size: 13px;
		font-weight: normal;
		color: red;
	}
</style>

<title>head</title>
</head>
<body οnlοad="getNowFormatDate()">
	<div class="navbar navbar-inverse navbar-fixed-top" role="navigation">
		<img src="images/head.jpg" style="height: 80px;"/>
		<h2 style="position: absolute; top: 10px; left: 100px;"><!-- SpringMVC_Spring_Hibernate模版 --></h2>
		<ul class="user-menu">
			<li class="dropdown pull-right">
				<a href="" class="dropdown-toggle" data-toggle="dropdown" style="color: black;">
					<span class="glyphicon glyphicon-user"></span> 欢迎您, ${user.uname} <span class="caret"></span></a>
				<ul class="dropdown-menu" role="menu">
					<!-- 模态框形式实现 -->
					<li><a href="#" data-toggle="modal" data-target="#" data-placement="bottom">
						<span class="glyphicon glyphicon-user"></span> 下拉菜单1</a></li>
					<li><a href="#" data-toggle="modal" data-target="#" data-placement="bottom">
						<span class="glyphicon glyphicon-pencil"></span> 下拉菜单2</a></li>
					<li><a href="index.jsp"><span class="glyphicon glyphicon-log-out"></span> 退出</a></li>
				</ul>
			</li>
		</ul>
		<div id="time" style="position: fixed; top: 55px; right: 15px;"></div>
	</div>

	<!-- 左侧菜单栏 -->
	<div id="sidebar-collapse" class="col-sm-3 col-lg-2 sidebar">
		<ul class="nav menu">
			<li class="active" id="home"><a href="home?uid=${user.uid}">
				<span class="glyphicon glyphicon-home"></span>首页</a></li>
			<li class="parent">
				<a href="#">
				<span class="glyphicon glyphicon-hdd"></span>
				菜单1
				<span data-toggle="collapse" href="#sub-item-checkMeeting" class="glyphicon glyphicon-list pull-right">
				</span></a>
				<ul class="children collapse" id="sub-item-checkMeeting">
					<li><a href="toAddBookMeeting?uid=${user.uid}">
							<span class="glyphicon glyphicon-share-alt"></span> 菜单11
						</a>
					</li>
					<li><a href="#">
						<span class="glyphicon glyphicon-share-alt"></span>
						 菜单12
						<span class="badge">菜单12</span>
						</a>
					</li>
					<li><a href="#">
							<span class="glyphicon glyphicon-share-alt"></span> 菜单13
						</a>
					</li>
				</ul>
			</li>
			<li class="parent">
				<a href="#">
				<span class="glyphicon glyphicon-info-sign"></span>
				菜单2
				<span class="badge">${apprSize}</span>
				<span data-toggle="collapse" href="#sub-item-checkApproval" class="glyphicon glyphicon-list pull-right">
				</span></a>
				<ul class="children collapse" id="sub-item-checkApproval">
					<li><a class="" href="checkApprovalHistory?uid=${user.uid}">
							<span class="glyphicon glyphicon-share-alt"></span> 审批记录
						</a>
					</li>
				</ul>
			</li>
			<li class="parent ">
				<a href="#">
				<span class="glyphicon glyphicon-tasks"></span>菜单3
				<span data-toggle="collapse" href="#sub-item-more" class="glyphicon glyphicon-list pull-right">
				</span></a>
				<ul class="children collapse" id="sub-item-more">
					<li><a href="#">
							<span class="glyphicon glyphicon-share-alt"></span> 发送邮件
						</a>
					</li>
				</ul>
			</li>
		</ul>
	</div><!--/.sidebar-->

	<div class="footer">
		<p>Copyright © 2017-2018 SpringMVC_Spring_Hibernate模版(CCIT) All Rights Reserved. </p>
	</div>
</body>
</html>
home.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!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>home</title>
</head>
<body>
	<%@ include file="head.jsp" %>
	<div class="col-sm-9 col-sm-offset-3 col-lg-10 col-lg-offset-2 main" >			
		<div class="form-group">
			<h1>home</h1>
		</div>	<!--/.main-->
	</div>
</body>
</html>
index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8" errorPage="error.jsp"%>
<!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">
<link href="images/favicon.ico" type="image/x-icon" rel="shortcut icon" />
<title>login</title>

	<script src="js/jquery-1.11.3.min.js"></script>
	<script src="js/bootstrap.min.js"></script>
	<script src="js/jquery-ui.min.js"></script>
	<script src="js/jquery.validate.min.js"></script>
	<script src="js/messages_zh.js"></script>
	<script type="text/javascript" src="js/login.js"></script>
	
<link rel="stylesheet" href="css/jquery-ui.min.css"> 
<link href="css/bootstrap.min.css" rel="stylesheet">
<link href="css/styles.css" rel="stylesheet">

<style>
.error{
	font-family: '微软雅黑';
	font-size: 13px;
	font-weight: normal;
	color: red;
}
</style>
</head>
<body>

	<div class="col-xs-10 col-xs-offset-1 col-sm-8 col-sm-offset-2 col-md-4 col-md-offset-4">
		<div class="login-panel panel panel-default">
			<div class="panel-heading">欢迎登陆系统</div>
			<div class="panel-body">
				<form action="login" method="post" role="form" id="loginForm">
						<div class="form-group">
							邮箱:<input type="email" class="form-control" id="loginUemail" name="uemail" placeholder="邮箱:">
							</div>
							<div class="form-group">
							密码:<input type="password" class="form-control" id="loginUpwd" name="upwd" placeholder="密码:">
							</div>
							<div class="checkbox">
								<label>
									<input name="remember" value="remember" type="checkbox">记住密码
								</label>
							</div>
							<div class="form-group">
								<button type="submit" id="login" class="btn btn-primary">登陆</button>
								<!-- 按钮触发用户注册模态框 -->
								<button type="button" class="btn btn-primary" data-toggle="modal" data-target="#register" data-placement="bottom">注册</button>
								<a href="forgetPwd.jsp" style="float: right;">忘记密码?</a>
							</div>
					</form>
				</div>
			</div>
		</div>

	<!-- 用户注册模态框(Modal) -->
	<div class="modal fade" id="register" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
		<div class="modal-dialog">
			<div class="modal-content">
				<div class="modal-header">
					<button type="button" class="close" data-dismiss="modal" aria-hidden="true">
						×
					</button>
					<h4 class="modal-title" id="myModalLabel">用户注册</h4>
				</div>
				<div class="modal-body">
					<form action="register" method="post" class="form-horizontal cmxform" role="form" id="registerForm" >
						 <div class="form-group">
							<label for="uemail" class="col-sm-2 control-label">Email:</label>
								<div class="col-sm-10"> 
									<input type="email" class="form-control" id="uemail" name="uemail" placeholder="请输入有效邮箱">
								 </div>
						</div>
						 <div class="form-group">
							<label for="uname" class="col-sm-2 control-label">用户名</label>
								<div class="col-sm-10"> 
									<input type="text" class="form-control" name="uname" placeholder="请输入用户名">
								 </div>
						</div>
						 <div class="form-group">
							<label for="upwd" class="col-sm-2 control-label">密码</label>
								<div class="col-sm-10"> 
									<input type="password" class="form-control" id="upwd" name="upwd" placeholder="请输入密码">
								 </div>
						</div>
						 <div class="form-group">
							<label for="confirmPwd" class="col-sm-2 control-label">确认密码</label>
								<div class="col-sm-10"> 
									<input type="password" class="form-control" name="confirmPwd" placeholder="请再次输入密码">
								 </div>
						</div>
						<div class="modal-footer">
							<button type="button" class="btn btn-default" data-dismiss="modal">取消
							</button>
							<button type="submit" class="btn btn-default">注册
							</button>
						</div>
					</form>
				</div>
			</div><!-- /.modal-content -->
		</div><!-- /.modal -->
	</div>
</body>
</html>
Log.java(可删除)

package com.ssh.anno;

import java.lang.annotation.*;

@Target({ ElementType.PARAMETER, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Log {

	/** 要执行的操作类型比如:add操作 **/
	public String operationType() default "";

	/** 要执行的具体操作比如:添加用户 **/
	public String add() default "";

}
MyConfig.java

package com.ssh.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.JstlView;

/**
 * 配置类 视图解析器
 *
 */
@Configuration
@Profile(value = { "default" })
@EnableWebMvc
@ComponentScan(basePackages = "com.ssh.controller")
public class MyConfig extends WebMvcConfigurerAdapter {

	@Bean
	public ViewResolver viewResolver() {
		InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
		viewResolver.setViewClass(JstlView.class);
//		viewResolver.setPrefix("/");
//		viewResolver.setSuffix(".jsp");
		viewResolver.setOrder(1);
		return viewResolver;
	}

}
MyWebApplicationInitializer.java

package com.ssh.config;

import javax.servlet.FilterRegistration;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;

import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.ContextLoaderListener;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.servlet.DispatcherServlet;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

/**
 * 初始化类 该类添加监听用于启动spring容器,注册配置类以及添加映射器
 * 
 */
public class MyWebApplicationInitializer extends WebMvcConfigurerAdapter implements WebApplicationInitializer {

	@Override
	public void onStartup(ServletContext context) throws ServletException {

		// 添加Listener 完成Spring容器建立
		context.setInitParameter("contextConfigLocation", "classpath:applicationContext.xml");
		context.addListener(new ContextLoaderListener());

		AnnotationConfigWebApplicationContext webContext = new AnnotationConfigWebApplicationContext();
		webContext.register(MyConfig.class);

		CharacterEncodingFilter filter = new CharacterEncodingFilter("UTF-8");
		FilterRegistration.Dynamic register2 = context.addFilter("encodingFilter", filter);
		register2.addMappingForUrlPatterns(null, false, "/*");

		ServletRegistration.Dynamic dispatcher = context.addServlet("dispatcher", new DispatcherServlet(webContext));
		dispatcher.addMapping("/");

	}

	@Override
	public void addResourceHandlers(ResourceHandlerRegistry registry) {
		// 注册静态文件目录,防止静态文件被Spring MVC拦截
		registry.addResourceHandler("/js/**").addResourceLocations("/js/");
		registry.addResourceHandler("/css/**").addResourceLocations("/css/");
	}

}
ChineseCodeFilter.java

package com.ssh.util;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;

@WebFilter(filterName = "ChineseCodeFilter", urlPatterns = "/*")
public class ChineseCodeFilter implements Filter {

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {

	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {

		request.setCharacterEncoding("UTF-8"); //
		response.setContentType("text/html;charsset=utf-8");
		chain.doFilter(request, response);
	}

	@Override
	public void destroy() {

	}

}
Contants.java

package com.ssh.util;

/**
 * 常量
 * 
 * @author xingyang
 *
 */
public class Contants {

	/**
	 * SMTP Host 简单邮件传送协议服务器
	 */
	public static final String HOST = "smtp.163.com";

	/**
	 * 邮局协议,用于电子邮件的接收
	 */
	public static final String PROTOCOL = "smtp";

	/**
	 * 邮箱服务端口号
	 */
	public static final int PORT = 25;

	/**
	 * 发件人的email
	 */
	public static final String FROM = "";

	/**
	 * 发件人显示名称
	 */
	public static final String MAIL_USER = "用户注册帐号激活";
	
	/**
	 * 发件人密码
	 */
	public static final String PWD = "";

}
SessionFactoryHelper.java
package com.ssh.util;

import org.hibernate.SessionFactory;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;

/**
 * 
 * 尝试获取SessionFactory
 * 
 * @author xingyang
 *
 */
public class SessionFactoryHelper {

	private static SessionFactory sessionFactory;

	public static SessionFactory getSessionFactory() {

		// 建立一个标准的服务 和注册, 用户可以定制
		final StandardServiceRegistry registry = new StandardServiceRegistryBuilder().configure().build();
		try {
			sessionFactory = new MetadataSources(registry).buildMetadata().buildSessionFactory();
		} catch (Exception e) {
			StandardServiceRegistryBuilder.destroy(registry);
		}
		return sessionFactory;
	}

	// 关闭连接
	public static void closeSessionFactory() {
		if (sessionFactory != null) {
			sessionFactory.close();
		}
	}

}
SessionManager.java

package com.ssh.util;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;

/**
 * 线程安全箱
 * 
 * @author xingyang
 */
public class SessionManager {

	public static SessionFactory sessionFactory;

	@Autowired
	public void setSessionFactory(SessionFactory sessionFactory) {
		SessionManager.sessionFactory = sessionFactory;
	}

	private static ThreadLocal<Session> sessionHolder = new ThreadLocal<Session>() {
		protected Session initialValue() {

			Session session = sessionFactory.openSession();
			sessionHolder.set(session);
			return session;
		}
	};

	public Session getSession() {
		return sessionHolder.get();
	}

	/**
	 * close connection and put it back to connection pool
	 */
	public void closeSession() {
		Session session = sessionHolder.get();
		if (session != null) {
			session.flush();
			session.close();
			sessionHolder.remove();
		}
	}

}

FromEmail.java

package com.ssh.mail;

import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;

/**
 * 认证器
 * 
 * @author xingyang
 *
 */
public class FromEmail extends Authenticator {

	private String fromEmail;
	private String password;

	public FromEmail(String fromEmail, String password) {
		this.fromEmail = fromEmail;
		this.password = password;
	}

	@Override
	protected PasswordAuthentication getPasswordAuthentication() {
		return new PasswordAuthentication(fromEmail, password);
	}
}
MD5Util.java

package com.ssh.mail;

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * 激活码验证和处理
 * 
 * @author xingyang
 * 
 */
public class MD5Util {

	/**
	 * 将源字符串使用MD5加密为字节数组
	 * 
	 * @param source
	 * @return
	 */
	public static byte[] encode2bytes(String source) {
		byte[] result = null;
		try {
			MessageDigest md = MessageDigest.getInstance("MD5");
			md.reset();
			md.update(source.getBytes("UTF-8"));
			result = md.digest();
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}

		return result;
	}

	/**
	 * 将源字符串使用MD5加密为32位16进制数
	 * 
	 * @param source
	 * @return
	 */
	public static String encode2hex(String source) {
		byte[] data = encode2bytes(source);
		StringBuffer hexString = new StringBuffer();
		for (int i = 0; i < data.length; i++) {
			String hex = Integer.toHexString(0xff & data[i]);

			if (hex.length() == 1) {
				hexString.append('0');
			}

			hexString.append(hex);
		}

		return hexString.toString();
	}

	/**
	 * 验证字符串是否匹配
	 * 
	 * @param unknown
	 *            待验证的字符串
	 * @param okHex
	 *            使用MD5加密过的16进制字符串
	 * @return 匹配返回true,不匹配返回false
	 */
	public static boolean validate(String unknown, String okHex) {
		return okHex.equals(encode2hex(unknown));
	}

}
SendEmail.java
package com.ssh.mail;

import java.util.Date;
import java.util.Properties;

import javax.mail.Address;
import javax.mail.Authenticator;
import javax.mail.Message.RecipientType;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

import com.ssh.util.Contants;

/**
 * 发送邮件
 * 
 * @author xingyang
 *
 */
public class SendEmail {

	public static void send(String toEmail, String content) {

		Session session = SendEmail.getSession(); // 用本类方法中获取session

		try {
			Address from = new InternetAddress(Contants.FROM);
			InternetAddress[] to = { new InternetAddress(toEmail) };

			MimeMessage msg = new MimeMessage(session);
			msg.setFrom(from);

			msg.setSubject("账号激活邮件");
			msg.setSentDate(new Date());
			msg.setContent(content, "text/html;charset=utf-8");
			msg.setRecipients(RecipientType.TO, to);

			Transport.send(msg);
		} catch (MessagingException e) {
			e.printStackTrace();
		}

	}

	/**
	 *  获取Session
	 * 
	 * @return
	 */
	private static Session getSession() {

		Properties props = new Properties();
		props.put("mail.smtp.host", Contants.HOST);// 设置服务器地址
		props.put("mail.store.protocol", Contants.PROTOCOL);// 设置协议
		props.put("mail.smtp.port", Contants.PORT);// 设置端口
		props.setProperty("mail.smtp.auth", "true");
		props.setProperty("mail.user", Contants.MAIL_USER);

		Authenticator authenticator = new FromEmail(Contants.FROM, Contants.PWD);

		Session session = Session.getDefaultInstance(props, authenticator);
		session.setDebug(true);

		return session;
	}

}
ServiceException.java
package com.ssh.mail;

/**
 * 邮箱服务异常处理
 * 
 * @author xingyang
 *
 */
public class ServiceException extends Exception {
	private static final long serialVersionUID = -1708015121235851228L;

	public ServiceException(String message) {
		super(message);
	}
}


Users.java

package com.ssh.model;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

/**
 * 用户类
 * 
 * @author xingyang
 * 
 */
@Entity
@Table(name = "USERS")
public class Users implements Serializable {

	private static final long serialVersionUID = 1L;

	private Integer uid;
	private String uemail; // 邮箱
	private String uname; // 用户名
	private String upwd; // 密码
	private Integer isLogin; // 是否登录

	public static long getSerialversionuid() {
		return serialVersionUID;
	}

	public Users() {
		super();
	}

	// login
	public Users(String uemail, String upwd) {
		super();
		this.uemail = uemail;
		this.upwd = upwd;
	}

	// register
	public Users(Integer uid, String uemail, String uname, String upwd, Integer isLogin) {
		super();
		this.uid = uid;
		this.uemail = uemail;
		this.uname = uname;
		this.upwd = upwd;
		this.isLogin = isLogin;
	}

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "UID")
	public Integer getUid() {
		return uid;
	}

	public void setUid(Integer uid) {
		this.uid = uid;
	}

	@Column(name = "UEMAIL")
	public String getUemail() {
		return uemail;
	}

	public void setUemail(String uemail) {
		this.uemail = uemail;
	}

	@Column(name = "UNAME")
	public String getUname() {
		return uname;
	}

	public void setUname(String uname) {
		this.uname = uname;
	}

	@Column(name = "UPWD")
	public String getUpwd() {
		return upwd;
	}

	public void setUpwd(String upwd) {
		this.upwd = upwd;
	}

	@Column(name = "is_login")
	public Integer getIsLogin() {
		return isLogin;
	}

	public void setIsLogin(Integer isLogin) {
		this.isLogin = isLogin;
	}

	@Override
	public String toString() {
		return "Users [uid=" + uid + ", uemail=" + uemail + ", uname=" + uname + ", upwd=" + upwd + ", isLogin="
				+ isLogin + "]";
	}

}
UserDao.java
package com.ssh.dao;

import com.ssh.model.Users;

/**
 * 用户信息Dao层
 * 
 * @author xingyang
 * 
 */
public interface UserDao {

	/**
	 * 用户登陆
	 * 
	 * @param user
	 * @return boolean
	 */
	public boolean login(Users user);

	/**
	 * 用户注册
	 * 
	 * @param user
	 * @return boolean
	 */
	public boolean register(Users user);

	/**
	 * 删除用户
	 * 
	 * @param uid
	 * @return boolean
	 */
	public boolean delUser(Integer uid);

	/**
	 * 修改用户信息
	 * 
	 * @param newUser
	 * @return boolean
	 */
	public boolean updateUsers(Users newUser);

	/**
	 * 根据用户id查询
	 * 
	 * @param uid
	 * @return Users
	 */
	public Users checkUsersById(Integer uid);

	/**
	 * 根据用户email查询
	 * 
	 * @param uemail
	 * @return Users
	 */
	public Users checkUsersByEmail(String uemail);

}
UserDaoImpl.java

package com.ssh.dao.impl;

import java.util.List;

import org.hibernate.Query;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import com.ssh.dao.UserDao;
import com.ssh.model.Users;
import com.ssh.util.SessionManager;

@Repository(value = "udao")
@Transactional
public class UserDaoImpl extends SessionManager implements UserDao {

	@Override
	public boolean login(Users user) {
		Users users = checkUsersByEmail(user.getUemail());
		String upwd = users.getUpwd();
		String inPwd = user.getUpwd();
		if (upwd.equals(inPwd)) {
			return true;
		}
		return false;
	}

	@Override
	public boolean register(Users user) {
		if (user.getUemail() != null && (!user.getUemail().equals(""))) {
			getSession().save(user);
		}
		closeSession();
		return true;
	}

	@Override
	public boolean delUser(Integer uid) {
		Users user = getSession().get(Users.class, uid);
		getSession().delete(user);
		closeSession();
		return getSession().get(Users.class, uid) == null;
	}

	@Override
	public boolean updateUsers(Users newUser) {
		Integer uid = newUser.getUid();
		String uname = newUser.getUname();
		String upwd = newUser.getUpwd();
		Users user = this.checkUsersById(uid);
		if (uname != null) {
			user.setUname(uname);
		}
		if (upwd != null) {
			user.setUpwd(upwd);
		}
		getSession().update(user);
		closeSession();
		return true;
	}

	@Override
	public Users checkUsersById(Integer uid) {
		String hql = "from Users as u where u.uid=:uid";
		Query query = getSession().createQuery(hql);
		query.setParameter("uid", uid);
		List<Users> list = query.list();
		return (list.size() != 0) ? list.get(0) : null;
	}

	@Override
	public Users checkUsersByEmail(String uemail) {
		String hql = "from Users as u where u.uemail=:uemail";
		Query query = getSession().createQuery(hql);
		query.setParameter("uemail", uemail);
		List<Users> list = query.list();
		return (list.size() != 0) ? list.get(0) : null;
	}

}

UserService.java

package com.ssh.service;

import com.ssh.model.Users;

/**
 * 用户Service层
 * 
 * @author xingyang
 * 
 */
public interface UserService {

	/**
	 * 注册
	 * 
	 * @param user
	 * @return boolean
	 */
	public boolean register(Users user);

	/**
	 * 登录
	 * 
	 * @param user
	 * @return boolean
	 */
	public boolean login(Users user);

	/**
	 * 删除用户
	 * 
	 * @param user
	 * @return boolean
	 */
	public boolean delUser(Users user);

	/**
	 * 更改个人资料
	 * 
	 * @param newUsers
	 * @return boolean
	 */
	public boolean updateUsers(Users newUsers);

	/**
	 * 根据用户id查询
	 * 
	 * @param uid
	 * @return Users
	 */
	public Users checkUsersById(Integer uid);

	/**
	 * 根据用户email查询
	 * 
	 * @param uemail
	 * @return Users
	 */
	public Users checkUsersByEmail(String uemail);

}

UserServiceImpl.java
package com.ssh.service.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.ssh.dao.UserDao;
import com.ssh.model.Users;
import com.ssh.service.UserService;

/**
 * Service层-事务实现类,可对该类实现AOP事务管理
 * 
 */
@Service("uService")
public class UserServiceImpl implements UserService {

	@Autowired
	private UserDao udao;

	@Override
	public boolean register(Users user) {
		Users users = new Users(null, user.getUemail(), user.getUname(), user.getUpwd(), 0);
		return udao.register(users);
	}

	@Override
	public boolean login(Users user) {
		return udao.login(user);
	}

	@Override
	public boolean delUser(Users user) {
		return udao.delUser(user.getUid());
	}

	@Override
	public boolean updateUsers(Users newUser) {
		return udao.updateUsers(newUser);
	}

	@Override
	public Users checkUsersById(Integer uid) {
		return udao.checkUsersById(uid);
	}

	@Override
	public Users checkUsersByEmail(String uemail) {
		return udao.checkUsersByEmail(uemail);
	}

}
BaseController.java
package com.ssh.controller;

import javax.annotation.Resource;

import org.springframework.ui.Model;

import com.google.gson.Gson;
import com.ssh.mail.SendEmail;
import com.ssh.model.Users;
import com.ssh.service.UserService;

/**
 * 这是一个整合SpringMVC,Hibernate,Spring基于注解的框架 该类为所有controller提供共同的功能,如json数据的转换
 * 
 * @author xingyang
 */
public class BaseController {

	@Resource
	protected UserService uService;

	private Gson gson = new Gson();

	/**
	 * 将对象转换成json数据
	 * 
	 * @param object
	 * @return json
	 */
	public String toJson(Object object) {
		return gson.toJson(object);
	}

	/**
	 * 将对象转换成json数据(2)
	 * 
	 * @param object
	 * @return json
	 */
	public String toJsonp(Object object) {
		return "jsonp(" + gson.toJson(object) + ")";
	}

	// 获取用户信息
	protected void getUsers(Model model, Integer uid) {
		Users user = uService.checkUsersById(uid);
		model.addAttribute("user", user);
	}

	// 获取首页信息
	protected void getHome(Model model, Users user) {
		Users u = uService.checkUsersByEmail(user.getUemail());
		getUsers(model, u.getUid());
	}

	/**
	 * 忘记密码处理
	 */
	protected void processForgetPwd(String email, String validateCode) {

		// 邮件的内容
		StringBuffer sb = new StringBuffer("<h2>");
		sb.append(email);
		sb.append(", 您好!</h2><br>");
		sb.append("<h3>邮箱账号:");
		sb.append(email);
		sb.append(",临时密码:");
		sb.append(validateCode);
		sb.append("</h3><br>请尽快登陆系统进行密码修改!<br><h3>系统网址:</h3><br>");
		sb.append("<a href='http://localhost:8080/SpringMVC_Spring_Hibernate/index.jsp'>");
		sb.append("http://localhost:8080/SpringMVC_Spring_Hibernate/index.jsp</a>");

		SendEmail.send(email, sb.toString());
		System.out.println("发送邮件");
	}

}
UserController.java
package com.ssh.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import com.ssh.mail.MD5Util;
import com.ssh.model.Users;

/**
 * 处理用户信息的控制器类
 * 
 * @author xingyang
 *
 */
@Controller
public class UserController extends BaseController {

	/**
	 * 登录
	 * 
	 * @param user
	 * @return String
	 * 
	 */
	@RequestMapping(value = "/login", produces = "text/html;charset=UTF-8")
	public String login(Model model, @ModelAttribute Users user) {
		Users users = uService.checkUsersByEmail(user.getUemail());
		getHome(model, users);
		return "/home.jsp";
	}

	/**
	 * 注册
	 * 
	 * @param user
	 * @return String
	 * 
	 */
	@RequestMapping(value = "/register", produces = "text/html;charset=UTF-8")
	public String register(Model model, @ModelAttribute Users user) {
		uService.register(user);
		getHome(model, user);
		return "/home.jsp";
	}

	/**
	 * 登录验证
	 * 
	 * @param user
	 * @return json
	 * 
	 */
	@ResponseBody
	@RequestMapping(value = "/loginUser", produces = "text/html;charset=UTF-8")
	public Object loginUser(@RequestParam("uemail") String uemail, @RequestParam("upwd") String upwd) {
		Users user = new Users(uemail, upwd);
		return toJson(uService.login(user));
	}

	/**
	 * 注册验证
	 * 
	 * @param uemail
	 * @return json
	 * 
	 */
	@ResponseBody
	@RequestMapping(value = "/registerEmail", produces = "text/html;charset=UTF-8")
	public Object registerEmail(@RequestParam("uemail") String uemail) {
		Users user = uService.checkUsersByEmail(uemail);
		return toJson(user == null);
	}

	/**
	 * 回到首页
	 * 
	 * @param uid
	 * @return String
	 * 
	 */
	@RequestMapping(value = "/home", produces = "text/html;charset=UTF-8")
	public String home(Model model, @RequestParam("uid") Integer uid) {
		Users user = uService.checkUsersById(uid);
		getHome(model, user);
		return "/home.jsp";
	}

	/**
	 * 删除用户
	 * 
	 * @param user
	 * @return json
	 * 
	 */
	@ResponseBody
	@RequestMapping(value = "/delUser", produces = "text/html;charset=UTF-8")
	public Object delUser(@ModelAttribute Users user) {
		return toJson(uService.delUser(user));
	}

	/**
	 * 修改用户个人资料
	 * 
	 * @param user
	 * @return String
	 */
	@RequestMapping(value = "/updateUsers", produces = "text/html;charset=UTF-8")
	public Object updateUsers(Model model, @ModelAttribute Users user) {
		uService.updateUsers(user);
		getHome(model, user);
		return "/home.jsp";
	}

	/**
	 * 忘记密码
	 * 
	 * @param user
	 * @return String
	 */
	@RequestMapping(value = "/forgetUpwd", produces = "text/html;charset=UTF-8")
	public String forgetUpwd(@ModelAttribute Users user) {
		Integer uid = user.getUid();
		String uemail = user.getUemail();
		String uname = user.getUname();
		String validateCode = MD5Util.encode2hex(uemail);// 临时密码
		processForgetPwd(uemail, validateCode);
		Users users = new Users(uid, uemail, uname, validateCode, 0);
		uService.updateUsers(users);
		return "/home.jsp";
	}

}

login.js(登录注册验证,自定义)

$(document).ready(function() {

	// 登陆提交后验证表单
	$("#loginForm").validate({
		rules : {
			uemail : {
				required : true,
				email : true
			},
			upwd : {
				required : true,
				remote : {
					type : "POST",
					url : "loginUser",
					data : {
						uemail : function() {
							return $("#loginUemail").val();
						},
						upwd : function() {
							return $("#loginUpwd").val();
						}
					}
				}
			}
		},

		messages : {
			uemail : {
				required : "请输入一个正确的邮箱",
				remote : "此邮箱已经被注册"
			},
			upwd : {
				required : "请输入密码",
				remote : "密码不正确"
			}
		}
	});

	// 注册提交后验证表单
	$("#registerForm").validate({
		rules : {
			uemail : {
				required : true,
				email : true,
				remote : { // 验证邮箱是否存在
					type : "POST",
					url : "registerEmail", // controller
					data : {
						uemail : function() {
							return $("#uemail").val();
						}
					}
				}
			},
			uname : {
				required : true,
				minlength : 2
			},
			upwd : {
				required : true,
				minlength : 6,
				maxlength : 20
			},
			confirmPwd : {
				required : true,
				rangelength : [ 6, 20 ],
				equalTo : "#upwd"
			},
		},

		messages : {
			uemail : {
				required : "请输入一个正确的邮箱",
				remote : "此邮箱已经被注册"
			},
			uname : "请输入用户名",
			upwd : {
				required : "请输入密码",
				minlength : "密码不得小于6位(6-20位)",
				maxlength : "密码不得大于20位(6-20位)"
			},
			confirmPwd : {
				required : "请输入密码",
				rangelength : "密码为6-20位",
				equalTo : "两次密码输入不一致"
			}
		}
	});
	
	$("#login").click(function(){

		var flag = document.getElementsByName("remember")[0].checked;  // 取到是否记住密码
		setCookie("flag", flag, 1); // 标记选择
		
		var uemail = $("#loginUemail").val();
		var upwd = $("#loginUpwd").val();
		
		if(flag && uemail!=null && uemail!="") {
			setCookie("uemail", uemail, 7);  // 保存七天
			setCookie("upwd", upwd, 7);
		} else {
			setCookie("uemail", "", 365);
			setCookie("upwd", "", 365);
		}
	});

	checkCookie();  // 设置cookie
	
});

// 检测 cookie 值的函数
function checkCookie(){
	var uemail = getCookie("uemail"); // 取到uname的cookie
	var upwd = getCookie("upwd");
	var flag = getCookie("flag"); // 取到记住密码标记

	document.getElementById("loginUemail").value = uemail; // 给email输入框赋值
	document.getElementById("loginUpwd").value = upwd;
	document.getElementsByName("remember")[0].checked = flag;
}

// 获取 cookie 值的函数
function getCookie(cname){
	var name = cname + "=";
	var ca = document.cookie.split(';');
	for(var i=0; i<ca.length; i++) {
	  var c = ca[i].trim();
	  if (c.indexOf(name)==0) return c.substring(name.length,c.length);
	}
	return "";
}

// 设置 cookie 值的函数
function setCookie(cname,cvalue,exdays)
{
	var d = new Date();
	d.setTime(d.getTime()+(exdays*24*60*60*1000));
	var expires = "expires="+d.toGMTString();
	document.cookie = cname + "=" + cvalue + "; " + expires;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值