3 没有Spring参与到系统存在主要问题
a:需要构建大量的service和dao的实例,成本高昂,抗压能力不足,JVM压力大。
b.存在着一定程度上的层泄露问题(layer leakage)
c 方法代码存在大量冗余,需要消除,Spring通过AOP技术解决了这个问题
d 事务不支持,系统不完整
4 spring 历史
EJB(Enterprise Javabean)=普通的javabean+四个接口实现
state bean,Message-driven-bean ,entity bean
5 spring 的启动
spring有一个超级对象缓存池(上下文容器context container),当应用程序启动的时候,这个缓存池就会自动启动
spring课程需要导入spring基础包。这个网上可以下载。
然后我们在原来的Struts+Hibernate基础上。在添加spring元素进入。
spring基础配置文件步骤:
第一步:导入spring.jar包最好是配套的。或者分开导入也可以,但是需要与struts配套的spring-struts-pluging.jar包。这个是将struts.xml中的属性可以使用spring生成的bean方案。
第二部:配置web.xml文件:添加上下文参数(也就是容器)以及监听器。这是启动spring的入口点。
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:edu/fjnu/training/config/*.xml</param-value>
</context-param>
<!-- 该监听器主要监听应用程序启动事件,只要应用程序启动,他就开始启动读取spring配置文件 -->
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
第三部:
配置配置spring文件:
a 数据源dataSource
b sessionFactory
c bean对象。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd" [
<!ENTITY contextInclude SYSTEM "org/springframework/web/portlet/context/WEB-INF/contextInclude.xml">
]>
<beans>
<!-- Spring提供了一个数据源,类似连接池的功能 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/test"></property>
<property name="username" value="tester"></property>
<property name="password" value="123456"></property>
</bean>
<!-- hibernate session factory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource"/>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>edu/fjnu/training/domain/User.hbm.xml</value>
<value>edu/fjnu/training/domain/Student.hbm.xml</value>
<value>edu/fjnu/training/domain/Clazz.hbm.xml</value>
</list>
</property>
</bean>
<!-- ====================================== -->
<!-- ClazzAction对象 -->
<bean id="clazzAction" class="edu.fjnu.training.action.ClazzAction" scope="prototype">
<property name="clazzService" ref="clazzService"></property>
</bean>
<!-- ClazzService对象 -->
<bean id="clazzService" class="edu.fjnu.training.service.ClazzServiceImpl">
<property name="clazzDao" ref="clazzDao"></property>
</bean>
<!-- ClazzDao对象 -->
<bean id="clazzDao" class="edu.fjnu.training.dao.ClazzDaoHibernateImpl">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<!-- ====================================== -->
<!-- 安全登录SecurityAction对象 scope="prototype" 表示这个Action-->
<bean id="securityAction" class="edu.fjnu.training.action.SecurityAction" scope="prototype">
<property name="userService" ref="userService"></property>
</bean>
<!-- UserService对象服务 -->
<bean id="userService" class="edu.fjnu.training.service.UserServiceImpl">
<property name="userDao" ref="userDao"></property>
</bean>
<!-- UserDao对象 -->
<bean id="userDao" class="edu.fjnu.training.dao.UserDaoHibernateImpl">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<!-- ====================================== -->
<bean id="studentAction" class="edu.fjnu.training.action.StudentAction">
<property name="studentService" ref="studentService"></property>
<property name="clazzService" ref="clazzService"></property>
</bean>
<bean id="studentService" class="edu.fjnu.training.service.StudentServiceImpl">
<property name="studentDao" ref="studentDao"></property>
<property name="clazzDao" ref="clazzDao"></property>
</bean>
<bean id="studentDao" class="edu.fjnu.training.dao.StudentDaoHibernateImpl">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
</beans>
第五部:修改dao层代码:需要继承HibernateDaoSupport类。然后实现的话,代码如下:
UserDaoHibernateImpl.java
/**
* 工 程 名:SMS-SSH-20180524 <br>
* 文 件 名:UserDaoHibernateImpl.java <br>
* 工具包名:edu.fjnu.training.dao <br>
* 功能描述:TODO <br>
* 创建时间:2018年5月26日 下午7:25:47 <br>
* 版本信息:V1.0
* @创建人:Zhou Kailun
*/
package edu.fjnu.training.dao;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.TransactionException;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import edu.fjnu.training.domain.User;
import edu.fjnu.training.exception.DataAccessException;
import edu.fjnu.training.utils.HibernateUtils;
/**
* 类名:UserDaoHibernateImpl <br>
* 功能描述: <br>
* 创建日期:2018年5月26日 下午7:25:47 <br>
* 修改备注:
* @作者信息:Zhou kailun <br>
*/
public class UserDaoHibernateImpl extends HibernateDaoSupport implements UserDao {
/**<p>构造函数:</p><br><br>
* <p>描述:</p><br>
*/
public UserDaoHibernateImpl() {
// TODO Auto-generated constructor stub
}
/* (非 Javadoc)
* <p>Title:getUserByNo</p>
* <p>描 述:</p>
* @param userNo
* @return
* @see edu.fjnu.training.dao.UserDao#getUserByNo(java.lang.String)
*/
@Override
public User getUserByNo(String userNo) {
// Session session=HibernateUtils.createSession();
// Transaction trans=null;
// trans=session.beginTransaction();
// User user=null;
// try{
// user=(User)session.get(User.class, userNo);
// trans.commit();
// }catch(TransactionException e){
// e.printStackTrace();
// trans.rollback();
// }finally{
// if(session.isOpen()){
// session.close();
// }
// }
// if(user==null)
// throw new DataAccessException("账号不存在");
// return user;
return (User)this.getHibernateTemplate().get(User.class, userNo);
}
@Override
public void delUser(String userNo) {
// Session session=HibernateUtils.createSession();
// Transaction trans=null;
// trans=session.beginTransaction();
//
// try{
// session.delete(userNo);
// trans.commit();
// }catch(TransactionException e){
// e.printStackTrace();
// trans.rollback();
// }
User user=(User)this.getHibernateTemplate().load(User.class, userNo);
this.getHibernateTemplate().delete(user);
}
}
UserServiceImpl.java
/**
* 工 程 名:SMS-20180522 <br>
* 文 件 名:UserServiceJDBCImpl.java <br>
* 工具包名:edu.fjnu.training.service <br>
* 功能描述:TODO <br>
* 创建时间:2018年5月22日 下午8:06:53 <br>
* 版本信息:V1.0
* @创建人:周开伦
*/
package edu.fjnu.training.service;
import edu.fjnu.training.dao.UserDao;
import edu.fjnu.training.dao.UserDaoHibernateImpl;
import edu.fjnu.training.dao.UserDaoJDBCImpl;
import edu.fjnu.training.domain.User;
import edu.fjnu.training.exception.SMSException;
/**
* 类名:UserServiceJDBCImpl <br>
* 功能描述: <br>
* 创建日期:2018年5月22日 下午8:06:53 <br>
* 修改备注:
* @作者信息:Zhou kailun <br>
*/
public class UserServiceImpl implements UserService {
/**UserDao实例*/
private UserDao userDao;
/* (非 Javadoc)
* <p>Title:checkUser</p>
* <p>描 述:</p>
* @param userNo
* @param userPwd
* @return
* @see edu.fjnu.training.service.UserService#checkUser(java.lang.String, java.lang.String)
*/
@Override
public User checkUser(String userNo, String userPwd) {
// UserDao userDao=new UserDaoHibernateImpl();
User user=userDao.getUserByNo(userNo);
//校验密码
if(userPwd.equals(user.getUserPwd())!=true){
throw new SMSException("密码不正确,请检查");
}
return user;
}
public UserDao getUserDao() {
return userDao;
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
}
SecurityeSAction.java
/**
* 工 程 名:SMS-SSH-20180524 <br>
* 文 件 名:UserAction.java <br>
* 工具包名:edu.fjnu.training.action <br>
* 功能描述:TODO <br>
* 创建时间:2018年5月25日 下午2:01:01 <br>
* 版本信息:V1.0
* @创建人:Zhou Kailun
*/
package edu.fjnu.training.action;
import java.util.Map;
import org.apache.struts2.interceptor.SessionAware;
import edu.fjnu.training.domain.User;
import edu.fjnu.training.exception.SMSException;
import edu.fjnu.training.service.UserService;
import edu.fjnu.training.service.UserServiceImpl;
/**
* 类名:SecurityAction <br>
* 功能描述: <br>
* 创建日期:2018年5月25日 下午2:01:01 <br>
* 修改备注:
* @作者信息:Zhou kailun <br>
*/
public class SecurityAction extends BaseAction implements SessionAware{
/**UserService实例*/
private UserService userService;
/**登录用户信息:User对象*/
private User user;
/**获得全文Session范围:这种做法叫做注入依赖,也叫反转依赖*/
Map<String, Object> session=null;
public String toLogin()throws Exception{
return "login_page";
}
public String login()throws Exception{
// UserService userService=new UserServiceImpl();
try{
user=userService.checkUser(user.getUserNo(), user.getUserPwd());
}catch(SMSException e ){
this.addActionError(e.getMessage());
return "login_page";
}
session.put("loginedUser", user);
return "mainAction";
}
public String logout() throws Exception{
session.remove("loginedUser");
return "toLoginAction";
}
public String main()throws Exception{
return "main_page";
}
/**<p>构造函数:</p><br><br>
* <p>描述:</p><br>
*/
public SecurityAction() {
// TODO Auto-generated constructor stub
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@Override
public void setSession(Map<String, Object> session) {
this.session=session;
}
public UserService getUserService() {
return userService;
}
public void setUserService(UserService userService) {
this.userService = userService;
}
}
struts.xml添加如下两个属性:
<!-- 告诉struts对象生成策略是由spring生成。并且是根据名字生成策 -->
<constant name="struts.objectFactory" value="spring" />
<constant name="struts.objectFactory.spring.autoWire" value="name" />
对应的Struts-user.xml配置文件中变化如下:需要将action中的class=“edu.fjnu.cse......UserAction”改为:class="userAction".
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
"http://struts.apache.org/dtds/struts-2.1.7.dtd">
<struts>
<package name="securityPkg" namespace="/security" extends="smsPkg" >
<action name="*" class="edu.fjnu.training.action.SecurityAction" method="{1}">
<result name="login_page" >../jsps/security/login.jsp</result>
<result name="mainAction" type="redirectAction">main</result>
<result name="main_page" >../jsps/main.jsp</result>
<result name="toLoginAction" type="redirectAction">toLogin</result>
<interceptor-ref name="guess"></interceptor-ref>
</action>
</package>
</struts>
然后看一下ClazzDaoHibernateImpl.java的实现
/**
* @Title: ClazzDaoHibernateImpl.java
* @package: edu.fjnu.training.dao
* @author: Zhou kailun
* @date: 2018年5月30日 下午7:54:26
* @version: V1.0
*/
package edu.fjnu.training.dao;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import edu.fjnu.training.domain.Clazz;
import edu.fjnu.training.utils.HibernateUtils;
/**
* ClassName: ClazzDaoHibernateImpl
* Description: TODO
* Author: Zhou kailun
*
*/
public class ClazzDaoHibernateImpl extends HibernateDaoSupport implements ClazzDao {
/**
* <p>Title: </p>
* <p>Description: </p>
*/
public ClazzDaoHibernateImpl() {
// TODO Auto-generated constructor stub
}
/* (non-Javadoc)
* <p>Title: addClazz </p>
* <p>Description: </p>
* @param clazz
* @see edu.fjnu.training.dao.ClazzDao#addClazz(edu.fjnu.training.domain.Clazz)
*/
@Override
public void addClazz(Clazz clazz) {
// Session session=HibernateUtils.createSession();
// Transaction trans=null;
//
// try{
// trans=session.beginTransaction();
//
// session.save(clazz);
// trans.commit();
// }catch(HibernateException e){
// e.printStackTrace();
// trans.rollback();
// }finally{
// if(session.isOpen()){
// session.close();
// }
// }
//spring 后只需要这一行
this.getHibernateTemplate().save(clazz);
}
/* (non-Javadoc)
* <p>Title: listClazz </p>
* <p>Description: </p>
* @return
* @see edu.fjnu.training.dao.ClazzDao#listClazz()
*/
@Override
public List<Clazz> listClazz() {
String hql="from Clazz c order by c.clazzNo";
// Session session=HibernateUtils.createSession();
// Transaction trans=null;
// List<Clazz> clazzList=null;
//
// try{
//
// clazzList=session.createQuery(hql).list();
// trans=session.beginTransaction();
//
// trans.commit();
// }catch(HibernateException e){
// e.printStackTrace();
// trans.rollback();
// }finally{
// if(session.isOpen()){
// session.close();
// }
// }
//
// return clazzList;
return this.getHibernateTemplate().find(hql);
}
@Override
public void updateClazz(Clazz clazz) {
// Session session=HibernateUtils.createSession();
// Transaction trans=null;
//
// try{
// trans=session.beginTransaction();
//
// session.saveOrUpdate(clazz);
// trans.commit();
// }catch(HibernateException e){
// e.printStackTrace();
// trans.rollback();
// }finally{
// if(session.isOpen()){
// session.close();
// }
// }
this.getHibernateTemplate().update(clazz);
}
@Override
public Clazz loadClazzByNo(Integer clazzNo) {
// Session session=HibernateUtils.createSession();
// Transaction trans=null;
// Clazz clazz=null;
// try{
// trans=session.beginTransaction();
// try{
// clazz=(Clazz)session.get(Clazz.class,clazzNo);
// }catch(Exception e){}
// trans.commit();
// }catch(HibernateException e){
// e.printStackTrace();
// trans.rollback();
// }finally{
// if(session.isOpen()){
// session.close();
// }
// }
// return clazz;
return (Clazz)this.getHibernateTemplate().get(Clazz.class, clazzNo);
}
}
StudentDaoHibernateImpl.java
/**
* 工 程 名:SMS-SSH-20180524 <br>
* 文 件 名:StudentDaoHibernateImpl.java <br>
* 工具包名:edu.fjnu.training.dao <br>
* 功能描述:TODO <br>
* 创建时间:2018年5月26日 下午8:28:07 <br>
* 版本信息:V1.0
* @创建人:Zhou Kailun
*/
package edu.fjnu.training.dao;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import edu.fjnu.training.domain.Student;
import edu.fjnu.training.service.StudentQueryHelper;
import edu.fjnu.training.utils.HibernateUtils;
/**
* 类名:StudentDaoHibernateImpl <br>
* 功能描述: <br>
* 创建日期:2018年5月26日 下午8:28:07 <br>
* 修改备注:
* @作者信息:Zhou kailun <br>
*/
public class StudentDaoHibernateImpl extends HibernateDaoSupport implements StudentDao {
/**<p>构造函数:</p><br><br>
* <p>描述:</p><br>
*/
public StudentDaoHibernateImpl() {
// TODO Auto-generated constructor stub
}
/* (非 Javadoc)
* <p>Title:addStudent</p>
* <p>描 述:</p>
* @param stu
* @see edu.fjnu.training.dao.StudentDao#addStudent(edu.fjnu.training.domain.Student)
*/
@Override
public void addStudent(Student stu) {
// Session session=HibernateUtils.createSession();
// Transaction trans=null;
// trans=session.beginTransaction();;
// try{
// session.saveOrUpdate(stu);
// trans.commit();
// }catch(HibernateException e){
// e.printStackTrace();
// trans.rollback();
// }finally{
// if(session.isOpen()){
// session.close();
// }
// }
this.getHibernateTemplate().save(stu);
}
/* (非 Javadoc)
* <p>Title:removeStudent</p>
* <p>描 述:</p>
* @param stuNo
* @see edu.fjnu.training.dao.StudentDao#removeStudent(java.lang.String)
*/
@Override
public void removeStudent(String stuNo) {
// Session session=HibernateUtils.createSession();
// Transaction trans=null;
// trans=session.beginTransaction();;
// try{
// Student stu=(Student)session.load(Student.class, stuNo);
//
// session.delete(stu);
// trans.commit();
// }catch(HibernateException e){
// e.printStackTrace();
// trans.rollback();
// }finally{
// if(session.isOpen()){
// session.close();
// }
// }
Student stu = (Student)this.getHibernateTemplate().load(Student.class, stuNo);
this.getHibernateTemplate().delete(stu);
}
/* (非 Javadoc)
* <p>Title:loadAllStudent</p>
* <p>描 述:</p>
* @return
* @see edu.fjnu.training.dao.StudentDao#loadAllStudent()
*/
@Override
public List<Student> loadAllStudent() {
String hql="from Student s order by s.stuNo desc";//查询语句
// Session session=HibernateUtils.createSession();
// Transaction trans=null;
// List<Student> stuList=null;
//
// trans=session.beginTransaction();
// try{
//
// stuList=session.createQuery(hql).list();
// trans.commit();
// }catch(HibernateException e){
// e.printStackTrace();
// trans.rollback();
// }finally{
// if(session.isOpen()){
// session.close();
// }
// }
// return stuList;
return this.getHibernateTemplate().find(hql);
}
/* (非 Javadoc)
* <p>Title:getStudentByStuNo</p>
* <p>描 述:</p>
* @param stuNo
* @return
* @see edu.fjnu.training.dao.StudentDao#getStudentByStuNo(java.lang.String)
*/
@Override
public Student getStudentByStuNo(String stuNo) {
// Session session=HibernateUtils.createSession();
// Transaction trans=null;
// Student stu=null;
//
// trans=session.beginTransaction();
// try{
// stu=(Student)session.get(Student.class, stuNo);
// trans.commit();
// }catch(HibernateException e){
// e.printStackTrace();
// trans.rollback();
// }finally{
// if(session.isOpen()){
// session.close();
// }
// }
// return stu;
return (Student)this.getHibernateTemplate().get(Student.class, stuNo);
}
/* (非 Javadoc)
* <p>Title:updateStudent</p>
* <p>描 述:</p>
* @param stu
* @see edu.fjnu.training.dao.StudentDao#updateStudent(edu.fjnu.training.domain.Student)
*/
@Override
public void updateStudent(Student stu) {
if(stu.getStuPic()==null || stu.getStuPic().length==0){
stu.setStuPic(this.loadStuPicByNo(stu.getStuNo()));
}
//
// Session session=HibernateUtils.createSession();
// Transaction trans=null;
//
// trans=session.beginTransaction();
// try{
// session.saveOrUpdate(stu);;
// trans.commit();
// }catch(HibernateException e){
// e.printStackTrace();
// trans.rollback();
// }finally{
// if(session.isOpen()){
// session.close();
// }
// }
this.getHibernateTemplate().update(stu);
}
/* (非 Javadoc)
* <p>Title:loadStuPicByNo</p>
* <p>描 述:</p>
* @param stuNo
* @return
* @see edu.fjnu.training.dao.StudentDao#loadStuPicByNo(java.lang.String)
*/
@Override
public byte[] loadStuPicByNo(String stuNo) {
return this.getStudentByStuNo(stuNo).getStuPic();
}
@Override
public List<Student> loadStudents(StudentQueryHelper helper) {
DetachedCriteria criteria=this.genCriteriaByHelper(helper);
// Session session=HibernateUtils.createSession();
Session session=this.getSession();
Transaction trans=null;
List<Student> stuList=null;
trans=session.beginTransaction();
try{
criteria.addOrder(Order.asc("stuNo"));
stuList=criteria.getExecutableCriteria(session).list();
trans.commit();
}catch(HibernateException e){
e.printStackTrace();
trans.rollback();
}finally{
if(session.isOpen()){
session.close();
}
}
return stuList;
}
/**
* Title:获得(生成)DetachedCriteria对象(条件分离对象) <br>
* Description:根据传入的Helper生成DetachedCriteria对象<br>
* @param helper 查询条件
* @return DetachedCriteria 条件分离对象
* @throws
*/
private DetachedCriteria genCriteriaByHelper(StudentQueryHelper helper){
DetachedCriteria criteria=DetachedCriteria.forClass(Student.class);
if(StringUtils.isNotEmpty(helper.getQryStuNo())){
criteria.add(Restrictions.eq("stuNo", helper.getQryStuNo()));
}
if(StringUtils.isNotEmpty(helper.getQryStuName())){
criteria.add(Restrictions.like("stuName","%"+helper.getQryStuName()+"%"));
}
if(helper.getQryMinStuMark()!=null){
criteria.add(Restrictions.ge("stuMark", helper.getQryMinStuMark()));
}
if(helper.getQryMaxStuMark()!=null){
criteria.add(Restrictions.le("stuMark", helper.getQryMaxStuMark()));
}
if(StringUtils.isNotEmpty(helper.getQryStuSex())){
criteria.add(Restrictions.eq("stuSex", helper.getQryStuSex()));
}
if(StringUtils.isNotEmpty(helper.getQryStuOrigin())){
criteria.add(Restrictions.eq("stuOrigin", helper.getQryStuOrigin()));
}
if(helper.getQryClazzNo()!=null){
criteria.createCriteria("clazz").add(Restrictions.eq("clazzNo", helper.getQryClazzNo()));
}
return criteria;
}
@Override
public Long cntStudentsByHelper(StudentQueryHelper helper) {
DetachedCriteria detachedCriteria=this.genCriteriaByHelper(helper);
//增加投影运算。就是我要做的事情类型
detachedCriteria.setProjection(Projections.rowCount());
long cnt=0;
// Session session=HibernateUtils.createSession();
Session session=this.getSession();
Transaction trans = session.beginTransaction();
try{
cnt = Long.parseLong(detachedCriteria.getExecutableCriteria(session).list().get(0).toString());
trans.commit();
}catch(HibernateException e){
e.printStackTrace();
trans.rollback();
}finally{
if(session.isOpen()){
session.close();
}
}
return cnt;
}
@Override
public List<Student> loadScopeStudentsByHelper(StudentQueryHelper helper,int beginIndex,int fetchSize) {
DetachedCriteria detachedCriteria = this.genCriteriaByHelper(helper);
detachedCriteria.addOrder(Order.asc("stuNo"));
List<Student> stuList = null;
// Session session = HibernateUtils.createSession();
Session session=this.getSession();
Transaction trans = session.beginTransaction();
try{
stuList = detachedCriteria.getExecutableCriteria(session)
.setFirstResult(beginIndex)
.setMaxResults(fetchSize)
.list();
trans.commit();
}catch(HibernateException e)
{
e.printStackTrace();
trans.rollback();
}finally{
if(session.isOpen()){
session.close();
}
}
return stuList;
}
}
其余的基本一样
后面再讲事务这个内容