从较旧的Tomcat版本运行标记库

Dav*_*ger 8 java jsp taglib tomcat5.5 tomcat7

首先是一些背景.

我正在开发一个Web应用程序.此应用程序作为第三方商业Web应用程序的扩展安装.第三方为我们的应用程序提供了一个SDK,以便与主Web应用程序进行交互.因此,我们无法控制运行应用程序的环境.我们受第三方申请的支配.

现在为了这个问题.

我们的应用程序打包了JSP使用的自定义标记库.第三方应用程序的一个要求是我们只发布预编译的JSP.编译JSP以及必要的.tag文件没有问题.

第三方推出了他们软件的新版本.我们将支持从旧版本的软件到新版本的平滑升级.

旧版本的第三方软件运行在Tomcat 5.5之上.我们的JSP是使用tomcat 5.5 JSP编译器构建的.新版本在Tomcat 7上运行.升级后,我们的扩展程序仍然运行,但标记未正确评估.

标签会发出正确的HTML,但传递给标签的任何属性似乎都会丢失.

作为一个例子,我创建了一个简单的测试标记:

<%@ attribute name="testValue" required="true" %>

<div name="${testValue}" >
    ${testValue}
</div>
Run Code Online (Sandbox Code Playgroud)

这在JSP中使用如下:

<my:testDiv testValue="myNewTestValue" />
Run Code Online (Sandbox Code Playgroud)

在Tomcat 5.5上,它被评估并产生以下内容:

<div name="myNewTestValue" >
    myNewTestValue
</div>
Run Code Online (Sandbox Code Playgroud)

但是,运行Tomcat 7时的代码相同,HTML是输出,但属性不是.请注意,${testValue}已处理但替换为空值,而不是给定的值.

<div name="" >

</div>
Run Code Online (Sandbox Code Playgroud)

如果我使用Tomcat 7编译器编译相同的代码,它会再次工作.

<div name="myNewTestValue" >
    myNewTestValue
</div>
Run Code Online (Sandbox Code Playgroud)

显然,使用Tomcat 7 JSP编译器构建的版本不会在旧版本上运行.鉴于Tomcat 5.5版本不会在新版本上运行,我们没有平滑过渡.

我一直在网上闲逛几周试图找到这个问题,甚至是类似的东西,并且提出的很少.至少没有任何东西能让我找到解决方案.

在Tomcat 7上运行使用Tomcat 5.5编译器编译的标签是否存在已知问题?我需要吟唱一些神奇的咒语吗?

一些额外的信息:

我们正在和Maven一起建设.pom的相关部分:

        <!-- Precompile JSPs -->
<!--    <dependency> -->
<!--        <groupId>org.apache.tomcat</groupId> -->
<!--        <artifactId>tomcat-jasper</artifactId> -->
<!--        <version>7.0.21</version> -->
<!--        <scope>compile</scope> -->
<!--    </dependency> -->
    <dependency>
        <groupId>tomcat</groupId>
        <artifactId>jasper-compiler</artifactId>
        <version>5.5.23</version>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>tomcat</groupId>
        <artifactId>jasper-runtime</artifactId>
        <version>5.5.23</version>
        <scope>compile</scope>
    </dependency>
Run Code Online (Sandbox Code Playgroud)

使用antrun插件构建:

<execution>
    <id>compile-jspc</id>
    <phase>compile</phase>
    <configuration>
        <target>
            <taskdef classname="org.apache.jasper.JspC" name="jasper">
                <classpath>
                    <pathelement location="${env.JAVA_HOME}\lib\tools.jar"/>
                    <path refid="maven.compile.classpath" />
                </classpath>
            </taskdef>
            <jasper
                caching="false"
                verbose="0"
                uriroot="${project.build.directory}/jsp"
                webXmlFragment="${project.build.directory}/generated_web.xml"
                outputDir="${project.build.directory}/jspc_out" />
        </target>
    </configuration>
    <goals>
        <goal>run</goal>
    </goals>
</execution>
<execution>
    <id>compile-jspc-java</id>
    <phase>compile</phase>
    <configuration>
        <target>
            <javac fork="true" executable="${env.JAVA_HOME}/bin/javac"
                srcdir="${project.build.directory}/jspc_out" destdir="${project.build.directory}/classes"
                deprecation="false" optimize="true">
                <classpath refid="maven.compile.classpath" />
            </javac>
        </target>
    </configuration>
    <goals>
        <goal>run</goal>
    </goals>
</execution>
Run Code Online (Sandbox Code Playgroud)

dev*_*wjk 1

我认为最好的办法可能是安装一个 Tomcat 7 测试盒并按原样将您的应用程序放在上面。让它在 7 上运行,然后用 Tomcat 7 替换旧版本的生产盒。当我这样做时,我还遇到了标签从 Tomcat 5.5 移动到 Tomcat 7 的问题,但问题更简单。

我必须改变:

<jsp:param name="UserID" value="<%=request.getParameter("UserID")%>" />
Run Code Online (Sandbox Code Playgroud)

到:

<jsp:param name="UserID" value='<%=request.getParameter("UserID")%>' />
Run Code Online (Sandbox Code Playgroud)

双引号转单引号,我将请求参数打印到属性值中,显然必须在属性值内的代码中使用双引号。这两种方式都适用于 Tomcat 5.5,但只有第二种适用于 7。