最近,協(xié)助伙伴將Tomcat上開發(fā)的應(yīng)用向Apusic移植時(shí)發(fā)現(xiàn)了一個(gè)兼容性問題。
應(yīng)用中代碼為:HashMap params = (HashMap) request.getParameterMap();
而getParameterMap()在JCP規(guī)范中的定義為:
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.
請(qǐng)求的參數(shù)將返回一個(gè)java.util.Map。請(qǐng)求參數(shù)是請(qǐng)求發(fā)送的特別信息。對(duì)于HTTP servlets來說,參數(shù)包含在查詢字符串或者發(fā)出的表單數(shù)據(jù)中。
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.
一個(gè)不可更改的java.util.Map包含參數(shù)名稱(關(guān)鍵字)和參數(shù)值(映射值)。參數(shù)映射中的關(guān)鍵字是String類型。參數(shù)映射中的值是String數(shù)組類型。
可見規(guī)范中定義的返回值只是Map類型,而沒有強(qiáng)制為HashMap。
Apusic在實(shí)現(xiàn)的時(shí)候也是Map作為返回值,而Tomcat返回時(shí)(參考o(jì)rg.apache.catalina.connector.Request.java)就是一個(gè)擴(kuò)展自HashMap的ParameterMap類,因此開發(fā)時(shí)如何作為Map來用也不會(huì)出現(xiàn)問題,但是如果強(qiáng)制轉(zhuǎn)換成HashMap就可能會(huì)與其他應(yīng)用服務(wù)器產(chǎn)品無法正確兼容。
Tomcat是一款非常不錯(cuò)的開源Web服務(wù)器,許多公司在軟件開發(fā)時(shí)都使用Tomcat作為Web容器,并且Tomcat也較好的對(duì)Servlet和JSP規(guī)范進(jìn)行了支持,因此許多在Tomcat上開發(fā)的應(yīng)用都可以向其他商業(yè)應(yīng)用服務(wù)器上進(jìn)行移植。
但是,Tomcat因?yàn)槲慈ネㄟ^規(guī)范測(cè)試,因此可能會(huì)存在沒有完全參考規(guī)范實(shí)現(xiàn)的部分,因此在開發(fā)中建議開發(fā)人員去
www.jcp.org上去下載一個(gè)規(guī)范來進(jìn)行參考,開發(fā)過程中盡可能按照規(guī)范給定的參數(shù)和返回值來使用系統(tǒng)的核心功能,從而避免在移植中出現(xiàn)不必要的問題。
附注:出現(xiàn)問題也不可怕,總有許多方式可以解決,就如上文出現(xiàn)的Map與HashMap的問題。其實(shí)網(wǎng)上有許多Map向HashMap轉(zhuǎn)換的代碼,可以增加個(gè)過渡參數(shù)將得到的Map進(jìn)行一次轉(zhuǎn)換就可以不修改其他業(yè)務(wù)代碼了。