今天连锁发现两个“差异化实现”的例子——在有号称完备严谨的spec情况下的实现差异。


The Diff Between Tomcat & Weblogic JSP Parser

前些时Falcon Team说发现很多JSP页面在Tomcat下跑好好的,在Oracle iAS和BEA Weblogic下跑莫名其妙的报JPS编译错。大概是这个样子:

eblogic.servlet.jsp.JspException: (line 362): no corresponding open tag for tag extension close: //[ null; Line: 362]

今天用这个出错信息的几种排列组合google,结果捞出这么个页面:

OSP 1.5 – Deploying in Weblogic

有人描述了在Weblogic上部署OSP——一个开源的个人/群体协作软件——出现上面一样的错,而Tomcat上没问题,然后自己回答:

SeanMcTex
Posted on: 2004/10/21 15:30

Ok, further investigation has revealed this to be an issue with quotes not being backslashed, and Tomcat’s apparently more permissive parsing of JSP’s. Here’s an example of the problem in share.jsp:

<logic:iterate offset=”<%= request.getParameter(“offset”) %>” length=”<%= Configuration.get(“share.sharesPerPage”) %>” id=”share” name=”shares” indexId=”row” type=”org.portfolio.model.ShareDefinitionImpl”>

Note that the parameters of the struts logic tag are quoted, but have unbackslashed quotes within them:

offset=”<%= request.getParameter(“offset”) %>”

Inserting a backslash in front of the inner quotes allows weblogic to parse the JSP correctly:

offset=”<%= request.getParameter(\”offset\”) %>”

Tomcat also parses this format just fine, so it may well be worth making this sort of change globally. (There are many pages within the app affected, including the dynamic ones that are created when new hierarchy elements are published.)

这是一个矛盾,Tomcat的做法似乎不错,两种语法都支持,但是再查查JSP 1.2 Spec,在2.6 Quoting and Escape Conventions一节,虽然没有明说,但是举的例子说明,在上面举例的那种上下文下,要么用单、双引号交替使用,要么用escape字符。所以BEA/Oracle们的做法没得话讲——既然它们没得话讲,Tomcat这个就有问题了,因为它的宽容掩盖了潜在的问题,推迟了开发团队发现问题的时间,增加了修正的代价。

那么是不是这事儿就是Tomcat的错呢?不好说,但是我想问:BEA和Oracle的JSPparser到底是怎么编写的?!按常理,显然应该首先检索所有的<%%>,然后处理其中的代码,而其他部分的东西有啥关系呢?为啥这两大巨头居然不约而同的让HTML和JSP两个不同领域里的引号给迷惑了呢?

后来强哥的研究更是诡异了:

<falcon:folderNavigator pageIndex=”<%=(String)request.getParameter(“GoPageNo”)%>” />

上面这个,可以编译,但是运行时出错 -_-bb

The Diff Between Firefox & IE HTML Parser

在论坛上说上面这个事儿,对于<%%&gt忘了用HTML entity转义了,提交后,惊讶的发现Firefox可以正确地显示,看来没把<%%&gt看作HTML parser。不一会儿就有人投诉——在IE下看不到那两行JSP代码。。。

Conclusion

想起马基雅维里同志说的:事实并不像人们想象的那么坚硬。以现在软件行业的稚嫩(和数学这类经典的高度完备的理论体系和记法体系相比),标准,是不是可望不可及的海市蜃楼?