by agate - Published: 2008-04-08 [2:12 下午] - Category: 程序编码

最近使用struts1.x进行项目开发,发现虽然struts2的设计让功能更为强大,但是struts1.x的开发更好定制!完全servlet体系的扩展,虽然有耦合的嫌疑吧,但是让很多从Servlet/JSP开发转移过来的朋友大概会有很大的亲切感。
以下是我得出的Struts1 + Spring + Hibernate整合开发的一些建议:

1.所有页面都用struts来转发!不能直接访问到资源页面。把所有资源页面放在WEB-INF\pages下

2.虽然很多文档中似乎可以不用在struts-config.xml中以plugin的方式启用spring托管【在web.xml中声明监听器】,但是加载spring框架方式使用struts-plugin的这种老式的方式保守。

3.对此!我们的action的type通通改成org.springframework.web.struts.DelegatingActionProxy这个代理类!交给spring动态获取这个action实例!
对此必须设定对应action的bean配置,此bean的并非配置id标示属性,改为配置name属性其值为struts的action的path值。

4.使用ActionForm的validate方法来验证表单数据的合法性。用代码来控制,不使用xml配置。

5.显示页面部分,我们统一使用el表达式+struts标签形式!不使用scriptlet的脚本形式,保证页面的高可读性!

其他:有可能我们要使用到spring提供的open-session-view的过滤器,来处理持久层的东西,那么我们不得不吧spring的托管放在web.xml中因为这个过滤器要用到那个监听器……注意,事实证明这样是更为优秀的整合手段,可以放心使用!

还有的当然就是我们的编码问题咯!这是一个十分冗长的问题,需要时间来研究【特别是tomcat】的具体运作问题!接下来我会写一个文章来参数这个问题的

Tags: [ , , ] - Comments: View Comments
by agate - Published: 2007-09-13 [8:05 下午] - Category: 程序编码

这几天学习几大框架的整合运用,挺简单的,但是有点搞人耐性……出了一些包啊,tag啊之类的小问题。其中就有这个奇怪的问题,在网上找了些资料贴到这里!

一下引用自"吴星"的MSN空间:

很多人在做webwork+spring+hibernate整合时遇到"严重:Error listenerStart"问题
tomcat启动时报如下错误:

2007-5-31 14:27:13 org.apache.catalina.core.StandardContext start
严重: Error listenerStart
2007-5-31 14:27:13 org.apache.catalina.core.StandardContext start
严重: Context [/testWSH] startup failed due to previous errors

有一种解决方案是把web.xml文件中的
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
<listener-class>
<listener>
改为
<servlet>
<servlet-name>SpringContextServlet<servlet-name>
<servlet-class>.....<servlet-class>
<load-on-startup>1<load-on-startup>
<servlet>

但这种方法可能会出现其他问题(网上又说会导致其他文件无法打开)。

最终解决方案如下:
我用的是tomcat5.5,配置了日志之后打印出下列信息:

ERROR main org.springframework.web.context.ContextLoader - Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Instantiation of bean failed; nested exception is java.lang.NoClassDefFoundError: org/apache/commons/pool/impl/GenericObjectPool
Caused by:
java.lang.NoClassDefFoundError: org/apache/commons/pool/impl/GenericObjectPool
at java.lang.Class.getDeclaredConstructors0(Native Method)
at java.lang.Class.privateGetDeclaredConstructors(Class.java:2328)
at java.lang.Class.getConstructor0(Class.java:2640)
at java.lang.Class.getDeclaredConstructor(Class.java:1953)
……

从日志信息看问题已经很明显了,是applicationContext.xmldataSource问题。

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
改为
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">

出现"Error listenerStart"一般是applicationContext.xml中的bean加载有问题。在用eclipse做webwork + spring + hibernate 的项目时一般都是用Myeclipse自动生成那些配置文件,而有些相关的jar<!--[if !supportEmptyParas]-->或者文件并没有加载在至项目中,以至引出奇怪的问题,又因为是自动生成的东西所以往往会忽略一些文件,而问题确恰恰是这些生成的文件所致,所以自动化的东西也未必一定是正确的,呵呵……

org.springframework.jdbc.datasource.DriverManagerDataSource 不可以使用连接池。org.apache.commons.dbcp.BasicDataSource作为注入的DataSource源,为了使用 DBCP的功能,必须要将commons-dbcp.jar加入CLASSPATH中,另外还需要commons-pool.jar和commons- collections.jar,这些都可以在Spring的lib目录下找到。
org.springframework.jdbc.datasource.DriverManagerDataSource并没有提供连接池的功能,只能作作简单的单机连接测试。
使用org.apache.commons.dbcp.BasicDataSource时缺少commons-pool.jar所以会出现如题的问题。