首先是一些背景。
我正在开发一个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>
答案 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。