java - 从旧版 Tomcat 运行标签库

标签 java jsp tomcat7 taglib tomcat5.5

首先是一些背景。

我正在开发一个网络应用程序。此应用程序作为第三方商业 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>

最佳答案

我认为最好的办法可能是安装一个 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。

关于java - 从旧版 Tomcat 运行标签库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23302023/

相关文章:

java - 如何在处于接收状态时关闭 DatagramSocket

html - 为什么 CSS 在 JSP 上不起作用?

javax.el.PropertyNotFoundException : Property 'tname' not found on type java. lang.String

java - jSTL <c :if> tags not working in jsp file, 在 tomcat 7 中出现错误

java - ThreadPoolExecutor.run 和 Servlet 重新初始化

apache - 安装了基于 APR 的 Apache Tomcat Native 库的不兼容版本 1.1.22,而 Tomcat 需要版本 1.1.24

java - 通过页面搜索已使用的资源并将其删除

java - 错误 :(9, 0): 'google()' Gradle DSL 方法未找到

java - XML + 写入相对路径

java - 为什么我的 sql 调用在 MySQL 中有效,但在我的 Java 类中无效