//数据库映射 Hibernate和Spring整合
//1.bean
package org.yeeku.model;
import java.io.Serializable;
public class User implements Serializable
{
private int id;
private String user;
private String pass;
private String email;
public void setId(int id)
{
this.id = id;
}
public int getId()
{
return this.id;
}
public void setUser(String user)
{
this.user = user;
}
public String getUser()
{
return this.user;
}
public void setPass(String pass)
{
this.pass = pass;
}
public String getPass()
{
return this.pass;
}
public void setEmail(String email)
{
this.email = email;
}
public String getEmail()
{
return this.email;
}
}
//2.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping package="org.yeeku.model">
<class name="User" table="user_tabler">
<id name="id" column="user_id">
<generator class="identity"/>
</id>
<property name="user" column="user_name" not-null="true" length="50" unique="true"/>
<property name="pass" column="user_pass" not-null="true" length="50"/>
<property name="email" length="100"/>
</class>
</hibernate-mapping>
//3.applicationContext.xml
<?xml version="1.0" encoding="GBK"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 定义数据源Bean,使用C3P0数据源实现 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<!-- 指定连接数据库的驱动 -->
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
<!-- 指定连接数据库的URL -->
<property name="jdbcUrl" value="jdbc:mysql://localhost/reg_login"/>
<!-- 指定连接数据库的用户名 -->
<property name="user" value="root"/>
<!-- 指定连接数据库的密码 -->
<property name="password" value="root"/>
<!-- 指定连接数据库连接池的最大连接数 -->
<property name="maxPoolSize" value="20"/>
<!-- 指定连接数据库连接池的最小连接数 -->
<property name="minPoolSize" value="1"/>
<!-- 指定连接数据库连接池的初始化连接数 -->
<property name="initialPoolSize" value="1"/>
<!-- 指定连接数据库连接池的连接的最大空闲时间 -->
<property name="maxIdleTime" value="20"/>
</bean>
<!--定义了Hibernate的SessionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="show_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.jdbc.batch_size">20</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>org/yeeku/model/User.hbm.xml</value>
</list>
</property>
</bean>
</beans>
//4.web.xml
<?xml version="1.0" encoding="GBK"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<!-- 用于初始化Spring容器的Listener -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
//添加底层和逻辑层
//5底层DAO interface
package org.yeeku.dao;
import java.util.List;
import org.yeeku.model.*;
public interface UserDao {
/**
* 根据id查找用户
* @param id 需要查找的种类id
*/
User get(int id);
/**
* 增加种类
* @param user 需要增加的种类
*/
void save(User user);
/**
* 修改用户
* @param user 需要修改的用户
*/
void update(User user);
/**
* 删除用户
* @param id 需要删除的用户id
*/
void delete(int id);
/**
* 删除用户
* @param user 需要删除的用户
*/
void delete(User user);
/**
* 查询全部用户
* @return 获得全部用户
*/
List<User> findAll();
/**
* 根据用户名,密码查找用户
* @param user 查询所需的用户名
* @param pass 查询所需的密码
* @return 对应的用户
*/
User findUserByNameAndPass(String user , String pass);
/**
* 根据用户名查找用户
* @param user 查询所需的用户名
* @return 对应的用户
*/
User findUserByName(String user);
}
//6底层DAO impl
package org.yeeku.dao.hibernate;
import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.yeeku.model.*;
import org.yeeku.dao.*;
public class UserDaoHibernate extends HibernateDaoSupport implements UserDao
{
/**
* 根据id查找用户
* @param id 需要查找的用户id
*/
public User get(int id){
return (User)getHibernateTemplate().get(User.class , id);
}
/**
* 增加用户
* @param user 需要增加的用户
*/
public void save(User user){
getHibernateTemplate().save(user);
}
/**
* 修改用户
* @param user 需要修改的用户
*/
public void update(User user){
getHibernateTemplate().saveOrUpdate(user);
}
/**
* 删除用户
* @param id 需要删除的用户id
*/
public void delete(int id){
getHibernateTemplate().delete(getHibernateTemplate().get(User.class , id));
}
/**
* 删除用户
* @param user 需要删除的用户
*/
public void delete(User user){
getHibernateTemplate().delete(user);
}
/**
* 查询全部用户
* @return 获得全部用户
*/
public List<User> findAll(){
return (List<User>)getHibernateTemplate().find("from User");
}
/**
* 根据用户名,密码查找用户
* @param username 查询所需的用户名
* @param pass 查询所需的密码
* @return 对应的用户
*/
public User findUserByNameAndPass(String user , String pass){
List ul = getHibernateTemplate().find("from User au where au.user = ? and au.pass = ?" , new String[]{user , pass});
if (ul != null && ul.size() >= 1){
return (User)ul.get(0);
}
return null;
}
/**
* 根据用户名查找用户
* @param user 查询所需的用户名
* @return 对应的用户
*/
public User findUserByName(String user){
List ul = getHibernateTemplate().find("from User au where au.user = ?" , user);
if (ul != null && ul.size() >= 1){
return (User)ul.get(0);
}
return null;
}
}
//7逻辑层Service interface
package org.yeeku.service;
import java.util.List;
import org.yeeku.dao.*;
public interface UserManager{
/**
* 新增用户
* @param user 新增用户的用户名
* @param pass 新增用户的密码
* @param email 新增用户的电子邮件
* @return 新增用户的主键
*/
int addUser(String user , String pass , String email)
throws Exception;
/**
* 验证用户登陆
* @param user 需要登陆的用户名
* @param pass 需要登陆的密码
* @return 是否登陆成功
*/
int loginValid(String user , String pass)
throws Exception;
/**
* 验证用户名是否可用,如果系统中已有该用户名,则不可用。
* @param user 需要验证的用户名
* @return 用户名是否可用
*/
boolean validateName(String user)
throws Exception;
}
//8逻辑层Service impl
package org.yeeku.service.impl;
import org.yeeku.dao.*;
import org.yeeku.model.*;
import org.yeeku.service.UserManager;
public class UserManagerImpl implements UserManager{
private UserDao userDao;
public void setUserDao(UserDao userDao){
this.userDao = userDao;
}
/**
* 新增用户
* @param user 新增用户的用户名
* @param pass 新增用户的密码
* @param email 新增用户的电子邮件
* @return 新增用户的主键
*/
public int addUser(String user , String pass , String email) throws Exception{
try{
User u = new User();
u.setUser(user);
u.setPass(pass);
u.setEmail(email);
userDao.save(u);
return u.getId();
}catch (Exception e){
e.printStackTrace();
throw new Exception("新增用户时出现异常");
}
}
/**
* 验证用户登陆
* @param user 需要登陆的用户名
* @param pass 需要登陆的密码
* @return 是否登陆成功
*/
public int loginValid(String user , String pass) throws Exception{
try{
User u = userDao.findUserByNameAndPass(user , pass);
if (u != null){
return u.getId();
}
}catch (Exception e){
e.printStackTrace();
throw new Exception("验证用户登陆时出现异常");
}
return -1;
}
/**
* 验证用户名是否可用,如果系统中已有该用户名,则不可用。
* @param user 需要验证的用户名
* @return 用户名是否可用
*/
public boolean validateName(String user) throws Exception{
try{
if (userDao.findUserByName(user) == null){
return true;
}
return false;
}catch (Exception e){
throw new Exception("验证用户名是否有效出错!");
}
}
}
//Struts2和Spring整合 逻辑层和spring整合
//9实现ICO容器,将dao层注入到Service层,将Service层以mgr名放入Spring容器
<?xml version="1.0" encoding="GBK"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 定义数据源Bean,使用C3P0数据源实现 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<!-- 指定连接数据库的驱动 -->
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
<!-- 指定连接数据库的URL -->
<property name="jdbcUrl" value="jdbc:mysql://localhost/reg_login"/>
<!-- 指定连接数据库的用户名 -->
<property name="user" value="root"/>
<!-- 指定连接数据库的密码 -->
<property name="password" value="root"/>
<!-- 指定连接数据库连接池的最大连接数 -->
<property name="maxPoolSize" value="20"/>
<!-- 指定连接数据库连接池的最小连接数 -->
<property name="minPoolSize" value="1"/>
<!-- 指定连接数据库连接池的初始化连接数 -->
<property name="initialPoolSize" value="1"/>
<!-- 指定连接数据库连接池的连接的最大空闲时间 -->
<property name="maxIdleTime" value="20"/>
</bean>
<!--定义了Hibernate的SessionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="show_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.jdbc.batch_size">20</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>org/yeeku/model/User.hbm.xml</value>
</list>
</property>
</bean>
<!-- 事务管理器 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<!-- 事务拦截器 -->
<bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
<!-- 事务拦截器bean需要依赖注入一个事务管理器 -->
<property name="transactionManager" ref="transactionManager"/>
<property name="transactionAttributes">
<!-- 下面定义事务传播属性-->
<props>
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
<!-- 定义BeanNameAutoProxyCreator-->
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<!-- 指定对满足哪些bean name的bean自动生成业务代理 -->
<property name="beanNames">
<!-- 下面是所有需要自动创建事务代理的bean-->
<list>
<value>mgr</value>
</list>
<!-- 此处可增加其他需要自动创建事务代理的bean-->
</property>
<!-- 下面定义BeanNameAutoProxyCreator所需的事务拦截器-->
<property name="interceptorNames">
<list>
<!-- 此处可增加其他新的Interceptor -->
<value>transactionInterceptor</value>
</list>
</property>
</bean>
<bean id="mgr" class="org.yeeku.service.impl.UserManagerImpl">
<property name="userDao" ref="userDao"/>
</bean>
<bean id="userDao" class="org.yeeku.dao.hibernate.UserDaoHibernate">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
</beans>
//Struts2和Spring整合 应用层和spring整合
//10.JSP登陆页面
<%@ page contentType="text/html; charset=GBK"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title>用户登陆</title>
</head>
<body>
<center>
<h3>请输入用户名和密码来登陆</h3>
如果还没有注册,单击此处<a href="Regist.jsp">注册</a>
<s:actionerror/>
<s:form action="Login.action">
<s:textfield name="user" label="用户名"/>
<s:textfield name="pass" label="密码"/>
<s:submit value="登陆"/>
</s:form>
</center>
</body>
</html>
//11.加载Struts2
<?xml version="1.0" encoding="GBK"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<!-- 用于初始化Spring容器的Listener -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>Login.jsp</welcome-file>
</welcome-file-list>
</web-app>
//12从容器中取出名为mgr的Service
package org.yeeku.action.base;
import com.opensymphony.xwork2.ActionSupport;
import org.yeeku.service.UserManager;
public class BaseAction extends ActionSupport
{
protected UserManager mgr;
public void setMgr(UserManager mgr)
{
this.mgr = mgr;
}
}
//13登陆的action 继承取出Service在BaseAction类来调用mgr
package org.yeeku.action;
import com.opensymphony.xwork2.ActionContext;
import java.util.*;
import org.yeeku.action.base.BaseAction;
public class LoginAction extends BaseAction
{
private String user;
private String pass;
public String execute() throws Exception
{
if (null != user && null != pass)
{
int userId = mgr.loginValid(user , pass);
if (userId > 0){
return "input";
}
else{
addActionError("用户名/密码不匹配");
}
}
else{
addActionError("验证码不匹配,请重新输入");
}
return "failure";
}
public void setUser(String user)
{
this.user = user;
}
public String getUser()
{
return this.user;
}
public void setPass(String pass)
{
this.pass = pass;
}
public String getPass()
{
return this.pass;
}
}
//14success.jsp
<%@ page contentType="text/html; charset=utf-8"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title>注册/登陆成功</title>
</style>
</head>
<body>
<center>
注册/登陆成功<br>
</center>
</body>
</html>
//15error.jsp
<%@ page contentType="text/html; charset=GBK"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>出错提示页</title>
</style>
</head>
<body>
<TABLE width="780" align="center" CELLSPACING=0 background="images/bodybg.jpg">
<tr>
<td height="39" valign=top>
<br><div align="center"><font color="#FF0000" size="+1"><b>系统处理过程中发生了一个错误,信息如下:</b></font></div>
</td>
</tr>
<tr>
<td height="100" valign=top>
<s:property value="exception.message"/>
<span style="color:red;font:9pt bold"><s:property value="exception.message"/></span>
</td>
</tr>
<tr>
<td valign=top><div align="center" style="font:10pt">请您先核对输入,如果再次出现该错误,请与站长联系。kongyeeku@163.com 谢谢。</div><br></td>
</tr>
</table>
</body>
</html>
//16注册的页面
<%@ page contentType="text/html; charset=GBK"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title>用户注册</title>
</head>
<body>
<center>
<h3>请输入注册信息</h3>
<s:actionerror/>
<s:form action="Regist.action">
<s:textfield name="user" label="用户名"/>
<s:textfield name="pass" label="密码"/>
<s:textfield name="email" label="电邮"/>
<s:submit value="注册"/>
</s:form>
</center>
</body>
</html>
//17注册的action 继承取出Service在BaseAction类来调用mgr
package org.yeeku.action;
import com.opensymphony.xwork2.ActionContext;
import java.util.*;
import org.yeeku.action.base.BaseAction;
public class RegistAction extends BaseAction
{
private String user;
private String pass;
private String email;
public String execute() throws Exception
{
if (null != user && null != pass){
if (mgr.addUser(user, pass , email) > 0){
return "input";
}else{
addActionError("注册失败,请重试!");
return "failure";
}
}
else{
addActionError("验证码不匹配,请重新输入");
}
return "failure";
}
public void setUser(String user)
{
this.user = user;
}
public String getUser()
{
return this.user;
}
public void setPass(String pass)
{
this.pass = pass;
}
public String getPass()
{
return this.pass;
}
public void setEmail(String email)
{
this.email = email;
}
public String getEmail()
{
return this.email;
}
}
//18struts.xml
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="lee" extends="struts-default">
<action name="Login" class="org.yeeku.action.LoginAction">
<result name="input">/success.jsp</result>
<result name="failure">/error.jsp</result>
</action>
<action name="Regist" class="org.yeeku.action.RegistAction">
<result name="input">/success.jsp</result>
<result name="failure">/error.jsp</result>
</action>
</package>
</struts>