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