4

为简单起见,我有以下名为 test.jsp 的文件:

<script language="javascript">
    alert("a$b".replace(/\$/g,"k"));
</script>

我将此文件放在本地服务器中,然后使用 firefox 显示它: http://localhost:8080/myproj/test.jsp。它工作正常,结果警报字符串是:

 akb

但是当我把这个文件放在远程服务器上并使用相同的 Firefox 显示时,它的输出是: a$bk 这对我来说是不正确的。

然后我将 test.jsp 内容更改为:

<script language="javascript">
    alert("a$b".replace(/\\$/g,"k"));
</script>

注意这里我添加了两个斜杠而不是一个。在这种情况下,它可以在远程服务器上工作,但不能在本地服务器上工作。

然后我将文件从test.jsp重命名为test.html,但是内容和我的第一种情况一样,即:

<script language="javascript">
    alert("a$b".replace(/\$/g,"k"));
</script>

通过使用相同的 firefox,它在两台服务器上都可以正常工作。

但是我的文件需要将 javascript 嵌入到 jsp 文件中。我的文件不允许使用 .html 后缀。在这种情况下,我应该怎么做才能编写可移植的 javascript?

我的本地服务器使用的是 tomcat-5.5.26;远程服务器使用 tomcat-5.0.28。火狐版本是 3.0.4。

4

3 回答 3

8

JSP 2.0 Spec 说:“当 EL 评估被禁用时,\$ 将不会被识别为引用,而当 EL 评估被启用时,\$ 将被识别为 $ 的引用。” (JSP.3.3.2)

启用或禁用 EL 评估取决于许多因素:

  • 如果应用服务器支持 JSP 2.0(Tomcat 5.0 和更高版本支持)
  • web.xml 描述符文件...如果声明(例如不使用 web-app_2_4.xsd 模式)它使用 Servet 2.3 规范或更早版本,EL 默认禁用。
  • JSP 配置 <el-ignored>
  • 页面指​​令 isELIgnored ( <%@ page isELIgnored=”true|false” %>)

(有关更多详细信息,请参阅JSP Spec 2.0的 JSP.3.3.2 部分)

检查 EL 是否启用/禁用的简单方法是在您的页面上使用 ${request}。如果您在输出中看到“${request}”,则 EL 被禁用。如果您看到不同的内容,则它已启用。

如果您还在页面上使用 EL,您可能希望将\$(一个反斜杠)更改为\\$(两个反斜杠)以获取输出。\$

如果您看到本地/远程服务器之间的差异,则它们与 EL 相关的设置可能不同。您能做的最好的事情是 1) 使用 JSP 2.0、Servlet 2.4 或更高版本(启用 EL),2) 在机器上运行相同的 Web 服务器。(顺便说一句,我建议您至少将 Tomcat 5.0 升级到 5.5)。

于 2009-01-23T11:16:11.890 回答
2

也许您可以将 javascript 代码移动到单独的 .js 文件中?这将防止代码被解释为jsp。

于 2009-01-23T11:37:17.243 回答
0

彼得明白了,西蒙的建议也是个好主意。

此外,您不需要使用正则表达式来进行简单的静态字符串替换。JS 成语是:

alert('a$b'.split('$').join('k'));
于 2009-01-23T12:12:57.780 回答