开发工具: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);
}
}
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;
}