将程序从一个容器换到另一个容器,总会有各种意料之外的困难需要解决,近日本人需要将一个Web工程从Tomcat环境转移到WebSphere环境,经历了一番周折,特地将此经过记录下来,也许它能对将要进行如此经历的人其一点帮助作用,另外在此也向网络同仁和工作中的同事表示感谢。
原环境:
程序:SSH
容器:Tomcat6.0
数据库:MySql5
新环境:
程序:SSH
容器:WebSphere6.1
数据库:Oracle10g
移植过程中的第一个困难,是WebSphere不认识Web.xml中的Struts taglib.原文字(适用于Tomcat)如下:
<!-- Struts的TLDS -->
<taglib>
<taglib-uri>/WEB-INF/tld/app.tld</taglib-uri>
<taglib-location>/WEB-INF/tld/app.tld</taglib-location>
</taglib>
<!-- Struts Tag Library Descriptors -->
<taglib>
<taglib-uri>/WEB-INF/tld/struts-bean.tld</taglib-uri>
<taglib-location>/WEB-INF/tld/struts-bean.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/WEB-INF/tld/struts-html.tld</taglib-uri>
<taglib-location>/WEB-INF/tld/struts-html.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/WEB-INF/tld/struts-logic.tld</taglib-uri>
<taglib-location>/WEB-INF/tld/struts-logic.tld</taglib-location>
</taglib>
这个问题因为之前有所准备,在网络上找到了答案,将上述文字包在<jsp-config>节点中即可,修改后(对Tomcat和WebSphere均适用)的文字如下:
<!-- Struts的TLDS -->
<jsp-config>
<taglib>
<taglib-uri>/WEB-INF/tld/app.tld</taglib-uri>
<taglib-location>/WEB-INF/tld/app.tld</taglib-location>
</taglib>
<!-- Struts Tag Library Descriptors -->
<taglib>
<taglib-uri>/WEB-INF/tld/struts-bean.tld</taglib-uri>
<taglib-location>
/WEB-INF/tld/struts-bean.tld
</taglib-location>
</taglib>
<taglib>
<taglib-uri>/WEB-INF/tld/struts-html.tld</taglib-uri>
<taglib-location>
/WEB-INF/tld/struts-html.tld
</taglib-location>
</taglib>
<taglib>
<taglib-uri>/WEB-INF/tld/struts-logic.tld</taglib-uri>
<taglib-location>
/WEB-INF/tld/struts-logic.tld
</taglib-location>
</taglib>
</jsp-config>
如此处理后,首页显示出来了,随即翻页遇到了问题,在IE中是翻页出现404错误,在FF中好一点,它告诉我WebSphere无法解析struts配置文件struts-config.xml。
起初我以为是中文问题,删除struts-config.xml中所有中文注释问题依旧,接下来在网络中寻找,还真有和我遇到一样问题的难友,但没人提出解决方案,正在挠头之际,我们的PM忽然说是否JDK不一致,检查一下,本机用的是1.6,而WebSphere自带1.5的,将本机也调成1.5后,问题解决! 真是只有咒语能解开咒语。
再下来,在表单提交时遇到了乱码问题,这是因为之前听信网络意见,将Web.xml中的filter都去掉了,结果自然乱码。此时感觉网络传闻未必可信,于是将filter又重新加上,乱码没有了。看来不经亲自尝试而盲从网络传闻是要吃亏的。
再下来,程序要访问数据库了,于是在WebSphere6.1中设置了数据源,再在Spring配置文件中进行了设置,如下:
<bean id="dataSource"
class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName"
value="java:comp/env/jdbc/*******DS">
</property>
</bean>
这样写在Tomcat中好用,在WebSphere不好用,正在挠头之际,PM告我别的项目有同样的写法,于是一看,java:comp/env/这部分是不需要的,直接把数据源JNDI名写在Value中就可以了。
<bean id="dataSource"
class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName"
value="jdbc/*******DS">
</property>
</bean>
其它数据库移植的问题就交给了Hibernate。至此问题全部解决。
事后来看,WebSphere6.1对中文,SSH的支持还是很好的,只是有些特定的地方和传统的Tomcat中的项目不太一样,注意一下就好了,未必有想象中的困难。遇到困难时,向有同样经历的人请教比自己在网络上搜寻要快很多。