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

时间:2014-04-25 20:04:39

标签: java jsp tomcat7 taglib tomcat5.5

首先是一些背景。

我正在开发一个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>

这在JSP中使用:

<my:testDiv testValue="myNewTestValue" />

在Tomcat 5.5上,对其进行评估并生成以下内容:

<div name="myNewTestValue" >
    myNewTestValue
</div>

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

<div name="" >

</div>

如果我使用Tomcat 7编译器编译相同的代码,它会再次运行。

<div name="myNewTestValue" >
    myNewTestValue
</div>

显然,使用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>

使用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>

1 个答案:

答案 0 :(得分:1)

我认为最好的办法是安装一个Tomcat 7测试盒并按原样放置你的应用程序。让它工作7,然后用Tomcat 7替换旧版本的生产盒。当我这样做时,我也遇到了从Tomcat 5.5迁移到Tomcat 7的问题,但更简单。

我不得不改变:

<jsp:param name="UserID" value="<%=request.getParameter("UserID")%>" />

为:

<jsp:param name="UserID" value='<%=request.getParameter("UserID")%>' />

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