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对象。
扫描二维码关注公众号,回复:
1436997 查看本文章
<?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; } }
其余的基本一样
后面再讲事务这个内容