大家都知道的一件事情,Hibernate启动时需要加载配置文件,连接数据库并映射对象,这一过程需要大量时间,每次运行测试文件时控制台的反馈已经可以看出来了,那么在整合开发时,必然不能每次数据操作都让Hibernate执行一次这个过程,需要在程序初始化时一并完成,完成这件事情需要单例模式的实现,这一过程是简单的。我们可以如下进行:
package demo;
import java.io.Serializable;
import org.hibernate.*;
import org.hibernate.cfg.Configuration;
public final class HibernateUtil {
private static SessionFactory sessionFactory;
// 单例模式,只创建一次对象
private HibernateUtil() {
}
// 初始化,开销很大,只做一次
static {
Configuration cfg = new Configuration();
cfg.configure();// 不是hibernate.cfg.xml时将文件名传入
sessionFactory = cfg.buildSessionFactory();
}
/**
* 相当于JDBC的注册驱动
*/
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
/**
* 相当于JDBC的getConnection<BR>
* 注意:和HttpSession无关
*/
public static Session getSession() {
return sessionFactory.openSession();
}
/**
* 保存对象
*/
public static void add(Object entity) {
Session s = null;
Transaction tx = null;
try {
s = HibernateUtil.getSession();
tx = s.beginTransaction();
s.save(entity);
tx.commit();
} finally {
if (s != null) {
s.close();
}
}
}
/**
* 更新对象
*/
public static void update(Object entity) {
Session s = null;
Transaction tx = null;
try {
s = HibernateUtil.getSession();
tx = s.beginTransaction();
s.update(entity);
tx.commit();
} finally {
if (s != null) {
s.close();
}
}
}
/**
* 删除对象
*/
public static void delete(Object entity) {
Session s = null;
Transaction tx = null;
try {
s = HibernateUtil.getSession();
tx = s.beginTransaction();
s.delete(entity);
tx.commit();
} finally {
if (s != null) {
s.close();
}
}
}
/**
* 获得对象
*/
public static Object get(Class clazz, Serializable id) {
Session s = null;
try {
s = HibernateUtil.getSession();
Object obj = s.get(clazz, id);
return obj;
} finally {
if (s != null) {
s.close();
}
}
}
}
单例模式实现的基本方法是:构造方法私有,这是为了只能是类本身来实例化自己,而不能让其他对象来二次调用;给外部一个方法来获取需要单例运行的那个对象;类内控制只运行一次单例对象的初始化。这样的三个限制就实现了单例模式,非常简单。
本例中构造方法内没有做任何事情,初始化工作在static块中完成,static的执行是在构造方法调用之前完成的,从而保证读取配置,创建sessionFactory在程序运行期间只执行了一次,就是在程序加载时完成。后面的四个方法简单实现了CRUD操作,非常简单,这里不做过多说明。
下面来介绍Struts1和Hibernate框架的简单整合。要把二者结合起来,必然有一种机制实现了二者之间的互认。Hibernate本身只是ORM框架,工作比较专一,而Struts是负责Web控制层的框架,自然要Struts来认识Hibernate。这里不绕弯子了,就是Struts的plug-in(插件)功能来实现的。
在struts的配置文件中最后一项是<plug-in>,是Struts的插件选项,插件可以是和Struts整合的第三方类库提供的,也可以是用户自定义的。用户自定义时,插件类需要实现org.apache.struts.action.PlugIn接口,覆盖init()和destroy()两个生命周期方法。
package test.plugin;
import javax.servlet.ServletException;
import org.apache.struts.action.ActionServlet;
import org.apache.struts.action.PlugIn;
import org.apache.struts.config.ModuleConfig;
public class HibernatePlugIn implements PlugIn {
@Override
public void destroy() {
System.out.println("destroy method in hibernate plugin");
SessionFactoryManager.closeSessionFactory();
}
@Override
public void init(ActionServlet actionServlet, ModuleConfig config)
throws ServletException {
System.out.println("init method in hibernate plugin");
SessionFactoryManager.openSessionFactory();
}
}
Hibernate单例实现类如下:
package test.plugin;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class SessionFactoryManager {
private static Configuration configuration = null;
private static SessionFactory sessionFactory = null;
private SessionFactoryManager() {
}
static {
configuration = new Configuration();
configuration.configure();
sessionFactory = configuration.buildSessionFactory();
}
public static SessionFactory openSessionFactory() {
return sessionFactory;
}
public static Session getSession() {
return sessionFactory.openSession();
}
public static void closeSessionFactory() {
if (sessionFactory != null && sessionFactory.isClosed() == false) {
sessionFactory.close();
}
}
}
Struts配置文件如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"
"http://struts.apache.org/dtds/struts-config_1_3.dtd">
<struts-config>
… … …
<plug-in className="test.plugin.HibernatePlugIn">
</plug-in>
</struts-config>
需要说明的是plug-in标签的配置是最后一个,Struts配置文件标签需要按顺序进行,否则可能出现前后依赖的错误。在程序启动时,我们可以在Tomcat控制台看到如下内容:
这里我们看到了写在插件实现类中的输出语句,可以说明插件类执行后就开始初始化Hibernate了,这说明Struts已经知道Hibernate了。
写一个测试Action,就可以这样进行:
package test.action;
import java.io.PrintWriter;
import java.util.List;
import javax.servlet.http.*;
import org.apache.struts.action.*;
import org.hibernate.*;
import org.hibernate.criterion.Restrictions;
import test.bean.User;
import test.plugin.SessionFactoryManager;
public class HibernateTestAction extends Action {
@Override
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
PrintWriter out = response.getWriter();
Session s = SessionFactoryManager.getSession();
try {
// 使用Criteria进行条件查询,参数是实体Bean
Criteria c = s.createCriteria(User.class);
//条件是name=?
c.add(Restrictions.eq("name", "Sarin"));
List<User> list = c.list();
for (User user : list) {
out.println(user.getId() + "<br>");
}
} finally {
if (s != null) {
s.close();
}
}
return null;
}
}
测试实例中的表可以参照
http://sarin.iteye.com/admin/blogs/593991中的结构进行设置,也可以应用于自定义的表结构中,id和name字段还是很普遍的。
最后再说一点就是再整合Spring时就可以不用插件方式将Spring给注册进来,而是把Struts1交给Spring管理,为什么?Struts1的Action默认是单例的,会有线程安全问题,而交给Spring后,可以将单例Action多实例化,在一定程度上解决线程安全的问题,而且业务层交给Spring处理后,Spring容器对bean的管理和配置相对方便的多。
- 大小: 106 KB
分享到:
相关推荐
《轻量级Java EE企业应用实战——Struts 2+Spring+Hibernate整合开发电子书1》是一本专注于Java EE企业级应用开发的书籍,主要涵盖了Struts 2、Spring和Hibernate这三个流行开源框架的整合应用。这本书对于Java...
在整合Struts2、Spring3和Hibernate4时,通常会利用Spring的AOP功能来实现事务管理,保证数据操作的一致性。Struts2的Action可以通过Spring的依赖注入获取到Spring管理的服务层对象,从而调用业务方法。此外,...
### SSH整合 struts+hibernate+spring #### 一、SSH整合概述 在软件开发领域,特别是Java Web开发中,Struts、Spring 和 Hibernate 被广泛地应用于构建复杂的应用程序。这三大框架各有所长,分别在不同的层面发挥...
### Struts2+Spring+Hibernate整合策略 #### 一、企业应用开发的挑战与思考方式 企业级应用的开发面临着诸多挑战,其中包括但不限于业务逻辑的复杂性、系统的可扩展性、安全性和性能等方面的需求。为了应对这些...
Struts2、Hibernate和Spring是Java Web开发中的三大框架,它们各自负责不同的职责,并通过合理的整合,能够构建出高效、可维护的Web应用程序。本文将详细介绍这三个框架的整合过程及注意事项。 首先,我们来看...
在这个SSH整合项目中,开发者首先需要配置三个框架的环境,包括添加相应的库到项目的类路径,配置Struts2的struts.xml,Spring4的spring-context.xml以及Hibernate4的hibernate.cfg.xml。然后,创建实体类(Entity)...
SSH整合是Java Web开发中的一个经典组合,由Struts、Spring和Hibernate三个开源框架组成,它们各自负责Web应用的不同层面,协同工作以提高开发效率和应用的可维护性。Struts处理请求和视图,Spring提供依赖注入和...
了解这些知识点后,结合提供的"Struts2+hibernate3包文件",开发者可以快速搭建一个整合Struts2和Hibernate的开发环境,开始构建基于这两者的企业级Web应用。在具体使用过程中,可能还需要根据实际需求调整配置、...
Struts、Spring和Hibernate是Java开发中非常经典的三大框架,它们各自解决了一部分软件开发中的问题...学习和掌握Struts+Spring+Hibernate整合教程,对于Java开发者来说,是提升专业技能、适应复杂项目需求的重要途径。
这个属于与Spring整合的问题,Spring容器在初始化对象的时候会根据bean的scope配置来考虑是重新建立一个对象,还是继续使用原来的对象,拿struts2的action的bean来说,如果scope这个参数没有配置,默认就是单例,即...
在JavaSE11环境中,Struts2和Hibernate的整合需要以下jar包: 1. **Struts2核心库**:如struts2-core.jar,包含核心框架组件。 2. **Struts2插件**:如struts2-hibernate-plugin.jar,支持与Hibernate的集成。 3. *...
### Struts+Hibernate框架整合开发知识点详解 #### 一、Struts+Hibernate框架整合开发概述 **Struts+Hibernate框架整合开发**是一种常见的Java Web应用开发模式,它结合了Struts作为前端MVC(Model-View-...
首先,我们来看Struts2和Hibernate的整合过程。整合这两者主要是为了方便地实现业务逻辑与数据访问的解耦。整合步骤包括:(1)配置用户类库,导入所需JAR包;(2)在`web.xml`中配置Struts2的过滤器;(3)创建`...
**Spring+Hibernate+Struts2整合详解** Spring、Hibernate和Struts2是Java Web开发中的三大框架,它们各自负责不同的职责,共同构建了一个强大的企业级应用开发环境。Spring作为核心容器,管理对象的生命周期和依赖...
2. **配置Struts2**:在struts.xml中配置Action,设置结果类型,通常使用Spring插件实现Action的实例化,避免单例模式下的线程安全问题。 3. **配置iBatis**:配置SqlMapConfig.xml,定义数据源、事务管理器,编写...
本项目"spring+springmvc+hibernate+thymeleaf 练习demo"是一个整合了这四个框架的实践示例,旨在帮助学习者理解它们如何协同工作。下面我们将深入探讨这些技术及其在项目中的应用。 1. Spring框架: - **依赖注入...
Spring、Hibernate和Struts是Java开发中的三大主流框架,它们分别负责不同的职责,共同构建了企业级应用的基础架构。Spring作为一个全面的轻量级容器,提供了依赖注入(DI)和面向切面编程(AOP)的功能,使得代码...
1. **依赖注入**:Spring可以通过setter方法或构造函数对Struts2的Action和Hibernate的SessionFactory进行注入,避免硬编码和单例模式,使得组件之间松耦合。 2. **事务管理**:Spring提供了一流的事务管理服务,...
Spring、Struts1.x 和 Hibernate 是经典的 Java Web 开发框架,它们的整合是构建企业级应用的常见方式。这三个框架分别负责不同的职责:Spring 提供依赖注入和事务管理,Struts1.x 负责视图和控制层,而 Hibernate ...
这个属于与Spring整合的问题,Spring容器在初始化对象的时候会根据bean的scope配置来考虑是重新建立一个对象,还是继续使用原来的对象,拿struts2的action的bean来说,如果scope这个参数没有配置,默认就是单例,即...