`
wt8414
  • 浏览: 44404 次
  • 性别: Icon_minigender_1
  • 来自: 合肥市
文章分类
社区版块
存档分类
最新评论

使struts2框架与spring时proxool要注意的问题

阅读更多
在我的另一篇文章(struts+spring+hibernate+proxool配置)中已经提到有关使用SSH与proxool数据库连接池配置,当时使用的是struts1.2,并且proxool是使用单独的XML文件来实现,下面使用struts2来实现相关配置.
似乎使用struts2与使用struts1.x没什么区别,只不过是在struts进行整合时在struts.xml中将spring插件增加进去,就可以了,但有个问题,那就struts2与spring进行整合时,web.xml中的spring加载必须使listener来加载,如果使用ContextLoderServlet,则会出空指向异常,报的是Struts2的objectFactory中的某处,因为绝大多数WEB容器的加载顺序是:Listener,Filter,Servlet,所以将会现struts2在spring前加载,它就找不到spring的管理容器,产生异常,解决办法使用ContextLoderListener来加载spring,好,这样一来又有问题了,spring出异常了,它又会找不到我们在applicationContext.xml所提供的数据源的别名,即:proxool.DbPool,无法管理数据库连接池了,看来struts2与proxool是鱼与熊掌,二者不可兼得,貌似我们现在没办法了,怎么办?
方法一:不用proxool(废话,不用它还写这篇文章干嘛);
方法二:将proxool的加载由servlet更改成使用listener加载,但proxool官方并没有提供给我们可用于listener加载的类,我们可以自己写一个listener来实现.
首先我们要去proxool官方下载它的源码,地址:http://nchc.dl.sourceforge.net/sourceforge/proxool/proxool-0.9.1-source.zip
此处需要注意,我没找到0.9RC3的源码,这是最新的源码0.9.1的
下载后解压打开src\java\org\logicalcobwebs\proxool\configuration\ServletConfigurator.java,也就是加载proxool的servlet,复制init()方法中的代码,放入我们自己写的listener的contextInitialized方法中去,导入相应的包,OK,一切搞定,重新启动服务器发现struts2与proxool都被正确加载了.
下面我的代码
package cn.wt.listener;

import java.io.File;
import java.util.Enumeration;
import java.util.Properties;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.logicalcobwebs.proxool.ProxoolException;
import org.logicalcobwebs.proxool.configuration.JAXPConfigurator;
import org.logicalcobwebs.proxool.configuration.PropertyConfigurator;

/**
 * @author wangtao
 */

public class ProxoolListener implements ServletContextListener
{
	private static final Log LOG = LogFactory.getLog(ProxoolListener.class);
    
	private static final String XML_FILE_PROPERTY = "xmlFile";

    private static final String PROPERTY_FILE_PROPERTY = "propertyFile";

    private static final String AUTO_SHUTDOWN_PROPERTY = "autoShutdown";
    
    @SuppressWarnings("unused")
	private boolean autoShutdown = true;
	
    public void contextDestroyed(ServletContextEvent arg0)
	{
		System.out.println("destroy database pool....");
	}

	public void contextInitialized(ServletContextEvent contextEvent)
	{
		ServletContext context = contextEvent.getServletContext(); //对应servlet的init方法中ServletConfig.getServletContext()
		String appDir = contextEvent.getServletContext().getRealPath("/");
        Properties properties = new Properties();

        Enumeration names = context.getInitParameterNames();
        while (names.hasMoreElements()) {
            String name = (String) names.nextElement();
            String value = context.getInitParameter(name);

            if (name.equals(XML_FILE_PROPERTY)) {
                try {
                    File file = new File(value);
                    if (file.isAbsolute()) {
                        JAXPConfigurator.configure(value, false);
                    } else {
                        JAXPConfigurator.configure(appDir + File.separator + value, false);
                    }
                } catch (ProxoolException e) {
                    LOG.error("Problem configuring " + value, e);
                }
            } else if (name.equals(PROPERTY_FILE_PROPERTY)) {
                try {
                    File file = new File(value);
                    if (file.isAbsolute()) {
                        PropertyConfigurator.configure(value);
                    } else {
                        PropertyConfigurator.configure(appDir + File.separator + value);
                    }
                } catch (ProxoolException e) {
                    LOG.error("Problem configuring " + value, e);
                }
            } else if (name.equals(AUTO_SHUTDOWN_PROPERTY)) {
                autoShutdown = Boolean.valueOf(value).booleanValue();
            } else if (name.startsWith("jdbc")) { //此处以前是PropertyConfigurator.PREFIX改为jdbc
                properties.setProperty(name, value);
            }
        }

        if (properties.size() > 0) {
            try {
                PropertyConfigurator.configure(properties);
            } catch (ProxoolException e) {
                LOG.error("Problem configuring using init properties", e);
            }
        }
	}

}

最后想说的是,我是将这个listener放在了spring的listener前面,不知道放在它后面是否会影响加载,没试过.
一句感叹:开源真好!
分享到:
评论
4 楼 toeo 2009-03-11  
herowzz 写道
搞这么复杂干嘛?
直接在application.xml配上
<prop key="hibernate.proxool.xml">proxool.xml</prop>
不就OK了


偶也是这么配置的.没有什么问题..
3 楼 chq32 2008-12-13  
同意楼上,呵呵
2 楼 herowzz 2008-12-11  
搞这么复杂干嘛?
直接在application.xml配上
<prop key="hibernate.proxool.xml">proxool.xml</prop>
不就OK了
1 楼 yongyu_1 2008-12-11  
你好牛啊,太感谢你了!
我花了很多时间去尝试改变加载顺序都没成功,
正准备到proxool官方网站上去查有没有listener的加载方式呢
太感谢你了!

相关推荐

    Spring+proxool+hibernate+struts2+aop整合的完整的简单项目

    在Java Web开发中,Spring、Proxool、Hibernate、Struts2和AOP(面向切面编程)是常用的框架和技术,它们各自承担着不同的职责,组合使用可以构建出高效、可维护的Web应用程序。本文将详细介绍这些技术的整合过程...

    Spring+proxool+hibernate+struts2+aop_Jar包

    在IT行业中,Spring、Proxool、Hibernate、Struts2和AOP是五个非常关键的框架和概念,它们在企业级Java应用开发中扮演着重要角色。这些技术的整合使用可以构建出高效、灵活且可维护的Web应用程序。现在我们逐一深入...

    Struts2 Spring3 Hibernate2 JPA2 Proxool连接池

    本项目采用Struts2、Hibernate3集成JPA2、Spring3和Proxool连接池的集成,对整体SSH框架的数据访问及网站效率都有较大的提升,本项目即时部署即可使用,既满足新手的学习,也对有深层研究的朋友有帮助。

    SSH (Struts2+Spring3+Hibernate3) +Proxool_亲测成功 费大劲了.zip

    SSH(Struts2+Spring3+Hibernate3)是一种常见的Java Web开发框架组合,它整合了MVC框架Struts2、依赖注入容器Spring以及持久层框架Hibernate。这些框架的结合为开发者提供了高效、灵活且可扩展的后端架构。在本项目...

    Struts2+spring+hibernate中的proxool连接池配置

    在Java Web开发中,Struts2、Spring和Hibernate是经典的MVC框架组合,它们共同构建了一个强大且灵活的后端架构。在这个组合中,数据库连接管理是一个关键环节,而Proxool作为一款轻量级的连接池库,常被用来优化...

    struts2.2.3+spring2.5.6+hibernate3.2+proxool0.9.1

    Struts2.2.3、Spring2.5.6、Hibernate3.2和Proxool0.9.1是四个重要的Java技术组件,它们在Web应用程序开发中扮演着关键角色。这个压缩包文件包含了这些技术的集成示例,旨在帮助开发者理解和实践如何将它们有效地...

    自定义PROXOOL监听器整合SSH框架

    1、proxool官网,下载最新的proxool-0.9.1.jar ...4、整合Struts2、Spring和proxool,配置Web服务启动配置文件[web.xml] 5、整合Spring和proxool,配置应用上下文配置文件[applicationContext.xml]

    SSH2全注解整合(spring2.5+hibernate3.3+struts2.1+泛型DAO+proxool连接池)

    SSH2全注解整合是Java Web开发中一种高效且现代化的方法,它将Spring 2.5、Struts 2.1和Hibernate 3.3这三个流行框架的优势结合起来,以简化开发流程并提高代码的可维护性。在这个项目中,开发者通过使用注解,避免...

    truts2+hibernate3.2+spring2.5 proxool成步骤

    在构建企业级Java应用时,整合Struts2、Hibernate3.2和Spring2.5是一个常见的选择,因为这三个框架分别负责MVC模式的展现层、持久层管理和业务层的依赖注入。在这个过程中,使用Proxool作为数据库连接池能够有效地...

    ssh小框架(proxool连接池)

    **Struts框架**:Struts是基于MVC设计模式的Web应用框架,它将业务逻辑、表示逻辑和数据访问逻辑分离,使得开发人员可以独立地进行开发。Struts处理HTTP请求,并通过Action和ActionForm对象与业务逻辑交互,最后将...

    spring3+hibernate3+proxool+mysql 超级企业J2EE DEMO(jar在下一个文件中,jar太大了)

    本项目采用当前主流的MVC和IOC框架spring 3、优秀的ORM框架hibernate和超级厉害的proxool数据库连接池。这个工程demo,是本人在企业应用中的项目缩影,绝对实用于企业的应用。 适合朋友: 1.一直用单独的servlet和...

    struts2 hibernate3.2 spring2.5集成步骤

    ### Struts2、Hibernate3.2与Spring2.5集成步骤详解 在Java Web开发领域,Struts2、Hibernate和Spring三者结合是常见的企业级应用架构方案之一。本篇文章将详细阐述如何在MyEclipse6.5环境下,通过Tomcat6.0服务器...

    Struts2+Spring3+HibernateBBS源码lib2.rar

    Struts2+Spring3+HibernateBBS源码lib2.rar是一个经典的Java Web开发示例,它结合了三个流行的技术框架:Struts2、Spring3和Hibernate,用于构建一个基于论坛的Web应用程序。这个压缩包包含了运行该应用所需的核心库...

    spring3 struts2 JPA

    标题中的“spring3 struts2 JPA”是一个经典的Java企业级开发技术栈组合,它涵盖了Spring框架的第三个主要版本、Struts2行动框架以及Java Persistence API(JPA)的使用。这个组合通常用于构建Web应用程序,提供了一...

    struts2 hibernate spring集成

    ### Struts2、Hibernate与Spring集成详解 #### 一、集成环境搭建 在现代软件开发过程中,特别是Java Web应用开发领域,Struts2、Hibernate与Spring三者的集成使用非常常见。这种集成不仅可以提高应用程序的可维护...

    struts2+spring+hibernate整合

    Struts2、Spring和Hibernate是三个非常流行的Java开发框架,它们各自在Web应用程序的不同层面上发挥作用。Struts2主要用于控制层,提供MVC(模型-视图-控制器)架构;Spring是一个全面的后端框架,提供了依赖注入、...

    struts2+hibernate3.2+spring2.5集成步骤

    Struts2、Hibernate3.2和Spring2.5是经典的Java Web开发框架组合,它们的集成可以帮助开发者构建高效、模块化的应用程序。以下是这些组件的简要介绍和集成步骤: **Struts2** 是一个基于MVC(Model-View-Controller...

    dom4j、common-fileupload、hibernate、jdom、log4j、proxool、spring、struts、webwork等工具、框架源码

    9. **WebWork**: WebWork是另一个流行的Java Web框架,后来演变为Struts 2。它引入了Action和Interceptor的概念,增强了动作的灵活性,并提供了强大的数据绑定和异常处理机制。 源码分析这些框架和工具可以让你深入...

    struts2+hibernate3.2+spring2.5集成方案

    Struts2与Spring的整合则涉及Action类的定义和Spring的DispatcherServlet配置,以及Struts2的struts.xml文件配置,以便Struts2能够识别并调用Spring管理的Action类。 这个集成方案的实现涉及到了多层架构的设计,...

Global site tag (gtag.js) - Google Analytics