Java, Only Java!

统计

留言簿(19)

积分与排名

好友空间

文档技巧

阅读排行榜

评论排行榜

在Tomcat上开发Web应用如何保证兼容性

最近,协助伙伴将Tomcat上开发的应用向Apusic移植时发现了一个兼容性问题。
应用中代码为:HashMap params = (HashMap) request.getParameterMap();

而getParameterMap()在JCP规范中的定义为:
public java.util.Map getParameterMap()
Returns a java.util.Map of the parameters of this request. Request parameters are extra information sent with the request. For HTTP servlets, parameters are contained in the query string or posted form data.
请求的参数将返回一个java.util.Map。请求参数是请求发送的特别信息。对于HTTP servlets来说,参数包含在查询字符串或者发出的表单数据中。

Returns: an immutable java.util.Map containing parameter names as keys and parameter values as map values. The keys in the parameter map are of type String. The values in the parameter map are of type String array.
一个不可更改的java.util.Map包含参数名称(关键字)和参数值(映射值)。参数映射中的关键字是String类型。参数映射中的值是String数组类型。

可见规范中定义的返回值只是Map类型,而没有强制为HashMap。
Apusic在实现的时候也是Map作为返回值,而Tomcat返回时(参考org.apache.catalina.connector.Request.java)就是一个扩展自HashMap的ParameterMap类,因此开发时如何作为Map来用也不会出现问题,但是如果强制转换成HashMap就可能会与其他应用服务器产品无法正确兼容。

Tomcat是一款非常不错的开源Web服务器,许多公司在软件开发时都使用Tomcat作为Web容器,并且Tomcat也较好的对Servlet和JSP规范进行了支持,因此许多在Tomcat上开发的应用都可以向其他商业应用服务器上进行移植。

但是,Tomcat因为未去通过规范测试,因此可能会存在没有完全参考规范实现的部分,因此在开发中建议开发人员去www.jcp.org上去下载一个规范来进行参考,开发过程中尽可能按照规范给定的参数和返回值来使用系统的核心功能,从而避免在移植中出现不必要的问题。

附注:出现问题也不可怕,总有许多方式可以解决,就如上文出现的Map与HashMap的问题。其实网上有许多Map向HashMap转换的代码,可以增加个过渡参数将得到的Map进行一次转换就可以不修改其他业务代码了。

posted on 2008-08-14 07:42 朱远翔 阅读(1697) 评论(7)  编辑  收藏 所属分类: 1.Java世界

评论

# re: 在Tomcat上开发Web应用如何保证兼容性 2008-08-14 08:38 Hatter Jiang

晕,就是应该使用Map的,为什么要强制类型转换为HashMap呢,要记录依赖上层,而不能依赖下层  回复  更多评论   

# re: 在Tomcat上开发Web应用如何保证兼容性 2008-08-14 08:43 wxm

这是开发者的问题,不能说是Tomcat未通过规范测试,jee上说返回的是Map,开发者强转为HashMap是不对的了  回复  更多评论   

# re: 在Tomcat上开发Web应用如何保证兼容性 2008-08-14 09:05 朱远翔-Apusic技术顾问

呵呵,都认为是开发者的问题。

其实,这篇文章也是想提醒程序员们注意规划,而不仅仅是Map与HashMap

因为还有许多朋友做J2EE开发确从没有了解过规范,希望这篇文章能够帮助他们在开发期就能避免这样的失误,以免后期上线时再来修改代码从而增加项目的成本与风险。  回复  更多评论   

# re: 在Tomcat上开发Web应用如何保证兼容性 2008-08-14 14:32 小高

以用前面 那个兄弟的话 :"希望这篇文章能够帮助他们在开发期就能避免这样的失误,以免后期上线时再来修改代码从而增加项目的成本与风险。"

说的很好.  回复  更多评论   

# re: 在Tomcat上开发Web应用如何保证兼容性 2008-08-14 21:04 Apusic门外汉

在Apusic上开发Web应用如何保证兼容性

最近,协助伙伴将Apusic上开发的应用向Tomcat移植时发现了一个兼容性问题。
应用中代码为:HashMap params = (HashMap) request.getParameterMap();

而getParameterMap()在JCP规范中的定义为:
public java.util.Map getParameterMap()
Returns a java.util.Map of the parameters of this request. Request parameters are extra information sent with the request. For HTTP servlets, parameters are contained in the query string or posted form data.
请求的参数将返回一个java.util.Map。请求参数是请求发送的特别信息。对于HTTP servlets来说,参数包含在查询字符串或者发出的表单数据中。

Returns: an immutable java.util.Map containing parameter names as keys and parameter values as map values. The keys in the parameter map are of type String. The values in the parameter map are of type String array.
一个不可更改的java.util.Map包含参数名称(关键字)和参数值(映射值)。参数映射中的关键字是String类型。参数映射中的值是String数组类型。

可见规范中定义的返回值只是Map类型,而没有强制为HashMap。
Tomcat 在实现的时候也是Map作为返回值,而Apusic返回时(参考 org.apache.catalina.connector.Request.java)就是一个扩展自HashMap的ParameterMap类,因此开发时如何作为Map来用也不会出现问题,但是如果强制转换成HashMap就可能会与其他应用服务器产品无法正确兼容。

Apusic是一款非常不错的开源Web服务器,许多公司在软件开发时都使用Apusic作为Web容器,并且Apusic也较好的对Servlet和JSP规范进行了支持,因此许多在Apusic上开发的应用都可以向其他商业应用服务器上进行移植。

但是,Apusic因为未去通过规范测试,因此可能会存在没有完全参考规范实现的部分,因此在开发中建议开发人员去www.jcp.org上去下载一个规范来进行参考,开发过程中尽可能按照规范给定的参数和返回值来使用系统的核心功能,从而避免在移植中出现不必要的问题。

附注:出现问题也不可怕,总有许多方式可以解决,就如上文出现的Map与HashMap的问题。其实网上有许多Map向HashMap转换的代码,可以增加个过渡参数将得到的Map进行一次转换就可以不修改其他业务代码了。   回复  更多评论   

# re: 在Tomcat上开发Web应用如何保证兼容性 2008-08-15 00:38 隔叶黄莺

Tomcat 不应该受此罪责,它完全没有问题啊

规范是返回 Map,Tomcat 怎么实现 Map 全是它自己的事。

要说规范,那么我在 WAS5.1下的 request 好像还没有 getParameterMap() 这个方法呢?  回复  更多评论   

# re: 在Tomcat上开发Web应用如何保证兼容性 2008-08-15 16:27 朱远翔-Apusic技术顾问

@隔叶黄莺
本文没有指责Tomcat有问题,但是Tomcat在实现的时候确实留下了误用的通道。
就如C/C++用不好会有内存泄漏,当然这个不是语言的问题,而是程序员的问题,而本文也是希望程序员在用Tomcat的时候注意不要因为误用而给未来的移植带来困难。

WAS V5.1不支持getParameterMap()这个方法是因为WAS V5.1只通过了J2EE 1.3的规范,他的WEB容器只需要实现Servlet 2.3规范,这个方法是在J2EE 1.4(Servlet 2.4)中才加入的。
规范认证请参考下面的链接:
http://java.sun.com/j2ee/compatibility_1.3.html

Servlet 2.4认证可以到www.jcp.org上下载servlet-2_4-fr-spec.pdf,在PDF文件的P284有说明增加了这个方法:
Add missing getParameterMap() in the enumerated list (4.1)  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航: