- 浏览: 222997 次
- 性别:
文章分类
最新评论
-
hzy20113751:
请问一下码友:DocumentConverter conver ...
Java跨平台将word转为pdf(结合Jodconverter 和OpenOffice.org) -
哇哈哈1:
楼主 你好 看了你的文章顿时收益颇深 可以提问吗?htm ...
Java HTML直接导出PDF -
xlshl43:
首先,第一种、第二种方法基本一样。第三种方法我正在用,大伙下不 ...
Java跨平台将word转为pdf(结合Jodconverter 和OpenOffice.org) -
大海你好:
错误:“Stream closed”楼主,没找到哪里有哦错
Java HTML直接导出PDF -
微站题:
能给我发下jar包吗,有3个没有下载到 297196894@q ...
Java HTML直接导出PDF
本人学习了一个新项目,总结了一下。有很多不足的地方,希望高手指点:
首先,在dao包下新建abstractDAO.java文件,如下:
package com.huangt.dao;
import java.util.Collection; import java.util.Iterator; import java.util.List; import org.hibernate.Criteria; import org.hibernate.LockMode; import org.hibernate.criterion.DetachedCriteria; @SuppressWarnings("unchecked") public interface AbstractDAO<T, PK> { // 根据主键获取实体。如果没有相应的实体,返回 null。 public T get(PK id); // 根据主键获取实体并加锁。如果没有相应的实体,返回 null。 public T getWithLock(PK id, LockMode lock); // 根据主键获取实体。如果没有相应的实体,抛出异常。 public T load(PK id); // 根据主键获取实体并加锁。如果没有相应的实体,抛出异常。 public T loadWithLock(PK id, LockMode lock); // 获取全部实体。 public List<T> loadAll(); // 更新实体 public void update(T entity) throws Exception; // 更新实体并加锁 public void updateWithLock(T entity, LockMode lock); // 存储实体到数据库 public void save(T entity) throws Exception; // 增加或更新实体 public void saveOrUpdate(T entity); // 增加或更新集合中的全部实体 public void saveOrUpdateAll(Collection<T> entities); // 删除指定的实体 public void delete(T entity); // 加锁并删除指定的实体 public void deleteWithLock(T entity, LockMode lock); // 根据主键删除指定实体 public void deleteByKey(PK id); // 根据主键加锁并删除指定的实体 public void deleteByKeyWithLock(PK id, LockMode lock); // 删除集合中的全部实体 public void deleteAll(Collection<T> entities); // 使用HSQL语句直接增加、更新、删除实体 public int bulkUpdate(String queryString); // 使用带参数的HSQL语句增加、更新、删除实体 public int bulkUpdate(String queryString, Object[] values); // 使用HSQL语句检索数据 public List find(String queryString); // 使用带参数的HSQL语句检索数据 public List<T> find(String queryString, Object[] values) throws Exception; // 使用带命名的参数的HSQL语句检索数据 public List findByNamedParam(String queryString, String[] paramNames, Object[] values); // 使用命名的HSQL语句检索数据 public List findByNamedQuery(String queryName); // 使用带参数的命名HSQL语句检索数据 public List findByNamedQuery(String queryName, Object[] values); // 使用带命名参数的命名HSQL语句检索数据 public List findByNamedQueryAndNamedParam(String queryName, String[] paramNames, Object[] values); // 使用HSQL语句检索数据,返回 Iterator public Iterator iterate(String queryString); // 使用带参数HSQL语句检索数据,返回 Iterator public Iterator iterate(String queryString, Object[] values); // 关闭检索返回的 Iterator public void closeIterator(Iterator it); // 创建与会话无关的检索标准 public DetachedCriteria createDetachedCriteria(); // 创建与会话绑定的检索标准 public Criteria createCriteria(); // 检索满足标准的数据 public List findByCriteria(DetachedCriteria criteria); // 检索满足标准的数据,返回指定范围的记录 public List findByCriteria(DetachedCriteria criteria, int firstResult, int maxResults); // 使用指定的实体及属性检索(满足除主键外属性=实体值)数据 public List<T> findEqualByEntity(T entity, String[] propertyNames); // 使用指定的实体及属性检索(满足属性 like 串实体值)数据 public List<T> findLikeByEntity(T entity, String[] propertyNames); // 使用指定的检索标准获取满足标准的记录数 public Integer getRowCount(DetachedCriteria criteria); // 使用指定的检索标准检索数据,返回指定统计值(max,min,avg,sum) public Object getStatValue(DetachedCriteria criteria, String propertyName, String StatName); // 加锁指定的实体 public void lock(T entity, LockMode lock); // 强制初始化指定的实体 public void initialize(Object proxy); // 强制立即更新缓冲数据到数据库(否则仅在事务提交时才更新) public void flush(); /************以下为分页代码可根据个人需求而定***************/ public List queryForPage(final String hql, final int offset, final int length); public int getAllRowCount(String hql) throws Exception; }
接着实现该类接口,在包dao.impl下,AbstractHibernateDAOImpl.java。如下:
package com.huangt.dao.impl;
import java.io.Serializable; import java.sql.SQLException; import java.util.Collection; import java.util.Iterator; import java.util.List; import org.apache.log4j.Logger; import org.hibernate.Criteria; import org.hibernate.HibernateException; import org.hibernate.LockMode; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.criterion.DetachedCriteria; import org.hibernate.criterion.Example; import org.hibernate.criterion.MatchMode; import org.hibernate.criterion.Order; import org.hibernate.criterion.Projections; import org.hibernate.criterion.Restrictions; import org.springframework.orm.hibernate3.HibernateCallback; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; import com.sun.org.apache.commons.beanutils.PropertyUtils; import com.zjsoft.dao.AbstractDAO; @SuppressWarnings("unchecked") public abstract class AbstractHibernateDAOImpl<T extends Serializable, PK extends Serializable> extends HibernateDaoSupport implements AbstractDAO <T, PK>{ protected final Logger log = Logger.getLogger(getClass()); protected Class<T> domainClass = getDomainClass(); /** * Method to return the class of the domain object */ protected abstract Class<T> getDomainClass(); // -------------------- 基本检索、增加、修改、删除操作 -------------------- // 根据主键获取实体。如果没有相应的实体,返回 null。 public T get(PK id) { log.info("操作实体:" + domainClass.getName()); return (T) getHibernateTemplate().get(domainClass.getName(),id); } // 根据主键获取实体并加锁。如果没有相应的实体,返回 null。 public T getWithLock(PK id, LockMode lock) { T t = (T) getHibernateTemplate().get(domainClass.getName(), id, lock); if (t != null) { this.flush(); // 立即刷新,否则锁不会生效。 } return t; } // 根据主键获取实体。如果没有相应的实体,抛出异常。 public T load(PK id) { return (T) getHibernateTemplate().load(domainClass.getName(), id); } // 根据主键获取实体并加锁。如果没有相应的实体,抛出异常。 public T loadWithLock(PK id, LockMode lock) { T t = (T) getHibernateTemplate().load(domainClass.getName(), id, lock); if (t != null) { this.flush(); // 立即刷新,否则锁不会生效。 } return t; } // 获取全部实体。 public List<T> loadAll() { return (List<T>) getHibernateTemplate().loadAll(domainClass); } // loadAllWithLock() ? // 更新实体 public void update(T entity) throws Exception { log.info("操作实体:" + entity); getHibernateTemplate().update(entity); } // 更新实体并加锁 public void updateWithLock(T entity, LockMode lock) { getHibernateTemplate().update(entity, lock); this.flush(); // 立即刷新,否则锁不会生效。 } // 存储实体到数据库 public void save(T entity) throws Exception { getHibernateTemplate().save(entity); } // saveWithLock()? // 增加或更新实体 public void saveOrUpdate(T entity) { getHibernateTemplate().saveOrUpdate(entity); } // 增加或更新集合中的全部实体 public void saveOrUpdateAll(Collection<T> entities) { getHibernateTemplate().saveOrUpdateAll(entities); } // 删除指定的实体 public void delete(T entity) { getHibernateTemplate().delete(entity); } // 加锁并删除指定的实体 public void deleteWithLock(T entity, LockMode lock) { getHibernateTemplate().delete(entity, lock); this.flush(); // 立即刷新,否则锁不会生效。 } // 根据主键删除指定实体 public void deleteByKey(PK id) { this.delete(this.load(id)); } // 根据主键加锁并删除指定的实体 public void deleteByKeyWithLock(PK id, LockMode lock) { this.deleteWithLock(this.load(id), lock); } // 删除集合中的全部实体 public void deleteAll(Collection<T> entities) { getHibernateTemplate().deleteAll(entities); } // -------------------- HSQL ---------------------------------------------- // 使用HSQL语句直接增加、更新、删除实体 public int bulkUpdate(String queryString) { return getHibernateTemplate().bulkUpdate(queryString); } // 使用带参数的HSQL语句增加、更新、删除实体 public int bulkUpdate(String queryString, Object[] values) { return getHibernateTemplate().bulkUpdate(queryString, values); } // 使用HSQL语句检索数据 public List find(String queryString) { return getHibernateTemplate().find(queryString); } // 使用带参数的HSQL语句检索数据 public List<T> find(String queryString, Object[] values) { return getHibernateTemplate().find(queryString, values); } // 使用带命名的参数的HSQL语句检索数据 public List findByNamedParam(String queryString, String[] paramNames, Object[] values) { return getHibernateTemplate().findByNamedParam(queryString, paramNames, values); } // 使用命名的HSQL语句检索数据 public List findByNamedQuery(String queryName) { return getHibernateTemplate().findByNamedQuery(queryName); } // 使用带参数的命名HSQL语句检索数据 public List findByNamedQuery(String queryName, Object[] values) { return getHibernateTemplate().findByNamedQuery(queryName, values); } // 使用带命名参数的命名HSQL语句检索数据 public List findByNamedQueryAndNamedParam(String queryName, String[] paramNames, Object[] values) { return getHibernateTemplate().findByNamedQueryAndNamedParam(queryName, paramNames, values); } // 使用HSQL语句检索数据,返回 Iterator public Iterator iterate(String queryString) { return getHibernateTemplate().iterate(queryString); } // 使用带参数HSQL语句检索数据,返回 Iterator public Iterator iterate(String queryString, Object[] values) { return getHibernateTemplate().iterate(queryString, values); } // 关闭检索返回的 Iterator public void closeIterator(Iterator it) { getHibernateTemplate().closeIterator(it); } // -------------------------------- Criteria ------------------------------ // 创建与会话无关的检索标准 public DetachedCriteria createDetachedCriteria() { return DetachedCriteria.forClass(domainClass); } // 创建与会话绑定的检索标准 public Criteria createCriteria() { return this.createDetachedCriteria().getExecutableCriteria(this.getSession()); } // 检索满足标准的数据 public List findByCriteria(DetachedCriteria criteria) { return getHibernateTemplate().findByCriteria(criteria); } // 检索满足标准的数据,返回指定范围的记录 public List findByCriteria(DetachedCriteria criteria, int firstResult, int maxResults) { return getHibernateTemplate().findByCriteria(criteria, firstResult, maxResults); } // 使用指定的实体及属性检索(满足除主键外属性=实体值)数据 public List<T> findEqualByEntity(T entity, String [] propertyNames) { Criteria criteria = this.createCriteria(); Example exam = Example.create(entity); exam.excludeZeroes(); String [] defPropertys = getSessionFactory().getClassMetadata(domainClass.getName()).getPropertyNames(); for(String defProperty : defPropertys) { int ii = 0; for(ii = 0; ii < propertyNames.length; ++ii) { if(defProperty.equals(propertyNames[ii])) { criteria.addOrder(Order.asc(defProperty)); break; } } if(ii == propertyNames.length) { exam.excludeProperty(defProperty); } } criteria.add(exam); return (List<T>) criteria.list(); } // 使用指定的实体及属性检索(满足属性 like 串实体值)数据 public List<T> findLikeByEntity(T entity, String [] propertyNames) { Criteria criteria = this.createCriteria(); for(String property : propertyNames) { try { Object value = PropertyUtils.getProperty(entity, property); if(value instanceof String) { criteria.add(Restrictions.like(property, (String) value, MatchMode.ANYWHERE)); criteria.addOrder(Order.asc(property)); } else { criteria.add(Restrictions.eq(property, value)); criteria.addOrder(Order.asc(property)); } } catch(Exception ex) { // 忽略无效的检索参考数据。 } } return (List<T>) criteria.list(); } // 使用指定的检索标准获取满足标准的记录数 public Integer getRowCount(DetachedCriteria criteria) { criteria.setProjection(Projections.rowCount()); List list = this.findByCriteria(criteria, 0, 1); return (Integer) list.get(0); } // 使用指定的检索标准检索数据,返回指定统计值(max,min,avg,sum) public Object getStatValue(DetachedCriteria criteria, String propertyName, String StatName) { if (StatName.toLowerCase().equals("max")) criteria.setProjection(Projections.max(propertyName)); else if(StatName.toLowerCase().equals("min")) criteria.setProjection(Projections.min(propertyName)); else if(StatName.toLowerCase().equals("avg")) criteria.setProjection(Projections.avg(propertyName)); else if(StatName.toLowerCase().equals("sum")) criteria.setProjection(Projections.sum(propertyName)); else return null; List list = this.findByCriteria(criteria, 0, 1); return list.get(0); } // -------------------------------- Others -------------------------------- // 加锁指定的实体 public void lock(T entity, LockMode lock) { getHibernateTemplate().lock(entity, lock); } // 强制初始化指定的实体 public void initialize(Object proxy) { getHibernateTemplate().initialize(proxy); } // 强制立即更新缓冲数据到数据库(否则仅在事务提交时才更新) public void flush() { getHibernateTemplate().flush(); } //=========================== 分页代码=========================================== public List queryForPage(final String hql, final int offset,final int length) { List list = getHibernateTemplate().executeFind(new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query query = session.createQuery(hql); query.setFirstResult(offset); query.setMaxResults(length); List list = query.list(); return list; } }); return list; } public int getAllRowCount(String hql) throws Exception { return this.getHibernateTemplate().find(hql).size(); } }
好的,现在开始编写service。首先编写接口类,BaseService.java 如下:
package com.zjsoft.service; import java.io.Serializable; import java.util.List; import com.zjsoft.bean.Page; @SuppressWarnings("unchecked") public interface BaseService<T extends Serializable> { public void save(T t) throws Exception; public void saveAll(List objs) throws Exception; public void delete(T t); public void deleteAll(List objs); public void update(T t) throws Exception; public void updateAll(List objs) throws Exception; public void deleteById(Serializable id) throws Exception; public void deleteByIDS(Serializable[] ids) throws Exception; public T getByID(Serializable id) throws Exception; public Page listAll(int pageNum, int pageSize) throws Exception; public List<T> listAll() throws Exception; public Page queryPage(int pageSize, int page, String hql) throws Exception; public List listByIDs(Serializable[] ids) throws Exception; }
根据需求选择所要用到的方法,以上只是选择了一部分。
接着实现该接口,BaseServiceImpl.java ,如下:
package com.zjsoft.service.impl;
import java.io.Serializable; import java.util.ArrayList; import java.util.List; import com.zjsoft.bean.Page; import com.zjsoft.dao.AbstractDAO; import com.zjsoft.service.BaseService; @SuppressWarnings("unchecked") public abstract class BaseServiceImpl<T extends Serializable> implements BaseService<T>{ private AbstractDAO abstractDAO ; public AbstractDAO getAbstractDAO() { return abstractDAO; } public void setAbstractDAO(AbstractDAO abstractDAO) { this.abstractDAO = abstractDAO; } public abstract AbstractDAO getDAO(); public void save(T t) throws Exception { getDAO().save(t); } public void saveAll(List objs) throws Exception { getDAO().saveOrUpdateAll(objs); } public void delete(T t) { getDAO().delete(t); } public void update(T t) throws Exception { getDAO().update(t); } public void updateAll(List objs) throws Exception { for (int i = 0; i < objs.size(); i++) { this.getDAO().update(objs.get(i)) ; } } public void deleteById(Serializable id) throws Exception { Object obj = getDAO().load(id); getDAO().delete(obj); } public void deleteByIDS(Serializable[] ids) throws Exception{ for(int i = 0; i < ids.length; i ++){ getDAO().deleteByKey(ids[i]); } } public void deleteAll(List objs) { for (int i = 0; i < objs.size(); i++) { getDAO().delete(objs.get(i)); } } public T getByID(Serializable id) throws Exception { return (T) getDAO().get(id); } public List<T> listAll() throws Exception{ return getDAO().loadAll(); } public Page queryPage(int pageSize, int page, String hql) throws Exception { int allRow = getDAO().getAllRowCount(hql); int totalPage = Page.countTotalPage(pageSize, allRow); final int offset = Page.countOffset(pageSize, page); final int length = pageSize; final int currentPage = Page.countCurrentPage(page); List<?> list = getDAO().queryForPage(hql, offset, length); //封装Page对象 Page pageBean = new Page(); pageBean.setPageSize(pageSize); pageBean.setCurrentPage(currentPage); pageBean.setAllRow(allRow); pageBean.setTotalPage(totalPage); pageBean.setList(list); pageBean.init(); return pageBean; } /** * 根据id查询,返回list * list封装了对象 * */ public List listByIDs(Serializable[] ids) throws Exception{ List<T> sysList = new ArrayList<T>() ; for (int i = 0; i < ids.length; i++) { T t = (T) getDAO().get(ids[i]) ; sysList.add(t); } return sysList; } }
注意:此BaseServiceImpl.java.为抽象类,需要真正的业务逻辑类去继承。其中类中用到了getDAO()方法。直接返回 该DAO。
<!--EndFragment--> 以上的基础类已经写好了,下面开始真实的DAO跟service。
下面的DAO接口就比较简单了,只需继承AbstractDAO接口就好了,对于DAO的实现类了要继承AbstractDAOImpl,还得实现自身的DAO。 SystemUserDAOImp.javal
如下:
package com.huangt.dao.impl; import com.huangt.bean.SystemUser; import com.huangtt.dao.SystemUserDAO; public class SystemUserDAOImpl extends AbstractHibernateDAOImpl<SystemUser, Integer> implements SystemUserDAO { @Override protected Class<SystemUser> getDomainClass() { return SystemUser.class; } }
以上@Override getDomainClass()的方法。以便service的调用。
service接口也很简单,只需继承BaseService即可。对于该实现类SystemUserServiceImpl.java
如下:
package com.huangt.service.impl; import java.io.Serializable; import java.util.ArrayList; import java.util.List; import com.huangt.bean.SystemUser; import com.huangt.dao.AbstractDAO; import com.huangt.dao.SystemUserDAO; import com.huangt.service.SystemUserService; @SuppressWarnings("unchecked") public class SystemUserServiceImpl extends BaseServiceImpl implements SystemUserService { private SystemUserDAO systemuserDAO; public SystemUserDAO getSystemUserDAO() { return systemuserDAO; } public void setSystemUserDAO(SystemUserDAO systemUserDAO) { this.systemuserDAO = systemUserDAO; } @Override public AbstractDAO getDAO() { return systemuserDAO; } //加载所有系统用户 public List<SystemUser> loadAll() throws Exception { return this.getDAO().loadAll() ; } }
注意:以上需要Override getDAO()方法,提供下面的loadAll()调用。
<!--EndFragment-->
发表评论
-
Hibernate数据加载方式
2011-12-05 09:20 840Hibernat ... -
Hibernate实体对象的三种状态
2011-12-02 15:51 799Hibernate实体对象的三种 ... -
Sping的配置文件中bean元素的scope属性值
2011-11-28 08:57 1263(1) singleton(单例),只管理一个 ... -
Hibernate配置知识点
2011-11-28 08:47 783(1) lazy 默认为true,表示使用延时加 ... -
配置ProviderManager
2011-11-25 14:47 1590Spring 配置文件中ProviderManger的一种典型 ... -
Spring事务配置
2011-11-17 10:56 764总结一下在Spring中的事务配置。 <? ... -
struts2 + hibernate + spring构建J2EE框架
2011-11-14 09:28 872最近学了三大主流框架,自己弄了一个练习项目。总结一下,以 ...
相关推荐
总结,Hibernate与Spring的整合是Java开发中的常见实践,它将ORM的强大功能与Spring的全面管理相结合,为开发者带来了极大的便利。理解和掌握这种整合方式,对于提升Java EE应用开发的效率和质量至关重要。
Struts2、Hibernate和Spring是Java企业级应用中三大核心框架,它们的整合使用能够构建出高效、可维护性高的Web应用程序。本篇将深入剖析这三者如何协同工作,并提供实际范例应用。 首先,Struts2作为MVC(模型-视图...
Struts 2+Hibernate+Spring整合开发技术详解sample.pdf
Struts2+Hibernate+Spring整合开发技术详解19章网上书店完整源码(内附数据库导出文件) 与书上最后一章内容完全对应 可以结合书上教程进行最后一章学习
《精通J2EE--Eclipse、Struts、Hibernate及Spring整合应用案例全书》是一本深入探讨J2EE Web应用程序开发的专业书籍。J2EE,全称Java 2 Platform, Enterprise Edition,是Java平台上用于构建企业级分布式应用程序的...
Struts技术资料 hibernate技术资料 spring技术资料 ssh整合技术(struts与hibernate整合,struts与spring整合,hibernate与spring整合,struts,hibernate,spring整合)
总的来说,"SpringMVC+Hibernate+Spring整合实例"提供了一个全面的学习平台,帮助开发者深入理解Java企业级应用的开发模式和最佳实践。通过这个实例,你可以提升自己的技能,为未来的项目开发打下坚实的基础。
精通J2EE——Eclipse+Struts+Hibernate+Spring整合应用案例 pdf电子书, 包含所有18个章节的完整版, 美中不足的是扫描质量不是很高,且是第一版的,不是目前最新的第二版! 请看清楚了再下,免得后悔! 共有两个部分-这...
这个"Struts2+Hibernate+Spring整合开发深入剖析与范例应用02"的学习资源,很可能是关于这三大框架集成使用的详细教程或案例集。02这个文件名可能代表系列的第二部分,意味着它可能在前一部分的基础上进一步深入讲解...
3. **整合Hibernate和Spring**:在applicationContext.xml中配置SessionFactory,并声明User实体类的映射文件,让Spring管理SessionFactory。 4. **编写Action**:创建登录Action,处理用户提交的登录请求,通过...
本文将深入探讨Hibernate与Spring的整合过程,以及在项目中的实际应用。 一、Hibernate简介 Hibernate是一个强大的ORM框架,它为Java开发者提供了一种方便的方式来管理数据库操作。通过使用Hibernate,我们可以将...
- **Spring与Hibernate整合**:配置Spring管理Hibernate SessionFactory,实现声明式事务管理。 4. **整合开发**: - **Struts 2与Spring的整合**:通过Spring插件使Struts 2的动作类能够利用Spring的依赖注入...
在"Struts2+Hibernate+Spring整合开发深入剖析与范例应用06"中,我们可能涉及以下几个关键知识点: 1. **Struts2框架**:Struts2是一个强大的MVC框架,用于构建动态Web应用。它的核心是Action类,它处理HTTP请求并...
**标题:“Hibernate与Spring整合”** 在Java开发中,Hibernate和Spring都是不可或缺的框架。Hibernate是一个优秀的对象关系映射(ORM)工具,它简化了数据库操作,而Spring框架则提供了全面的应用程序管理,包括...
4. **整合流程**:整合Struts 2、Hibernate和Spring,首先需要配置Spring的IoC容器来管理所有组件,包括Action、DAO和Service。然后,使用Spring的HibernateTemplate或JdbcTemplate进行数据访问。接着,将Struts 2与...
Struts 2、Hibernate 和 Spring 是Java开发中最流行的三大开源框架,它们的整合使用被称为SSH(Struts2、Spring、Hibernate)集成开发。这三大框架分别解决了Web应用中的不同问题,Struts 2负责表现层,Spring处理...
SSH(Struts2+Spring+Hibernate)框架整合是Java Web开发中常见的一种技术栈,能有效地提高开发效率和代码质量。 Struts2作为MVC框架,主要负责处理HTTP请求,控制应用程序的流程,提供视图和控制器的分离。它的...
在"Struts2+Hibernate+Spring整合开发深入剖析与范例应用05"的源码中,我们可以看到具体的配置文件(如struts.xml、spring-context.xml、hibernate.cfg.xml)、Action类、Service类、DAO类以及实体类等。通过对这些...
在这个"Struts2+Hibernate+Spring整合开发深入剖析与范例应用04"的主题中,我们将探讨这三大框架的集成过程、关键概念以及实际应用。 首先,Struts2是基于MVC(Model-View-Controller)设计模式的Web框架,它负责...
整合过程中,通常会使用Spring来管理Struts2和Hibernate的bean,实现依赖注入。Action类可以在Spring容器中声明,通过@Autowired注解注入所需的Service层对象。Hibernate的SessionFactory和Transaction可以通过...