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

在我的另一篇文章([url=http://wt8414.iteye.com/blog/242628]struts+spring+hibernate+proxool配置[/url])中已经提到有关使用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官方下载它的源码,地址:[url=http://nchc.dl.sourceforge.net/sourceforge/proxool/proxool-0.9.1-source.zip]http://nchc.dl.sourceforge.net/sourceforge/proxool/proxool-0.9.1-source.zip[/url]
此处需要注意,我没找到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前面,不知道放在它后面是否会影响加载,没试过.
一句感叹:开源真好!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值