我将尝试将我对您问题的评论拼凑成答案,因为他们似乎已经解决了它。
您首先应该了解的是服务器端代码解析和执行(为您提供 JSP 页面)与客户端代码解析和执行(为您提供 HTML 和 JavaScript)之间的区别。您可以在这个programmers.stackexchange.com 问题的最受好评的答案中阅读简要概述。可以在 Wikipedia 关于服务器端脚本和客户端脚本的文章中找到进一步阅读。从关于服务器端脚本的客户端脚本文章中删除的一个关键概念是:
[服务器端脚本] 以 Web 浏览器可以理解的格式(通常是 HTML)生成输出,然后将其发送到用户的计算机。用户看不到脚本的源代码(除非作者单独发布代码),甚至可能不知道脚本已被执行。反过来,由服务器端脚本生成的文档可能包含客户端脚本。
就您的设置而言,这意味着当您通过浏览器请求 JSP 页面时,您的浏览器会告诉托管 JSP 页面的服务器,浏览器需要该页面。然后,服务器执行 JSP 页面以生成一个纯 HTML 和 JavaScript 的文档(如果您以这种方式编写的话,可能还有一些 CSS)以发送到浏览器。浏览器永远不会看到 JSP 代码。当服务器完成解析和执行 JSP 页面时,${someExpression}
(JSP EL 语句)和其他特定于 JSP 的表达式(例如标记库,类似<spring:xx>
标记)的所有实例都将解析为某些客户端等效项。对于基本的 JSP EL 语句 ( ${...}
),这些语句解析为某个字符串值。如果你碰巧巧妙地将那个 EL 语句放在了 JSP 中的一些 JavaScript 中,比如console.log("${myVariable}");
,那么您将动态生成依赖于 EL 语句输出的 JavaScript 代码(在此示例中,它将解析为类似 的内容console.log("myVariable-value");
)。
至此,服务器刚刚执行了 JSP 代码(否则将 HTML/JS/CSS 原封不动地留在页面中)。没有 JavaScript 被解析或执行。这个最终的“渲染”页面,在服务器执行完 JSP 内容之后,然后作为纯 HTML/JS/CSS 发送到客户端浏览器,客户端浏览器接收并解析/执行它。此时,浏览器会看到类似 的console.log("myVariable-value");
内容,但并不知道或不在乎您的 JSP 代码是否生成了它,并执行它(因为您巧妙地放置了 EL 语句以生成有效的 JS)。
这种冗长的解释意味着您可以执行以下操作:
服务器端 JSP:
alert("${createBehavior.behaviorRevisionAllowed}");
从服务器发送到客户端浏览器的结果代码:
alert("false");
在浏览器中执行代码后的结果:alert
弹出一个框,里面有值false
。
服务器端 JSP:
console.log("${createBehavior.behaviorRevisionAllowed}");
从服务器发送到客户端浏览器的结果代码:
console.log("false");
在浏览器中执行代码后的结果:将值false
记录到控制台。
服务器端 JSP
return [$('#some-id'), "<spring:message code='BH-MS-0070'/>"];
从服务器发送到客户端浏览器的结果代码:
return [$('#some-id'), "some-spring-message-string"];
代码在浏览器中执行后的结果: JavaScriptreturn
语句中的数组是以该值"some-spring-message-string"
作为第二个元素创建的。
根据您在评论中关于“EL 变量”的问题,当我说“EL 变量”时,我的意思是一个 EL 语句,例如${someStatement}
,可以是一个像变量名一样简单的语句,例如${createBehavior.behaviorRevisionAllowed}
. 该 EL 语句将只看到其中的一个变量名,尝试查找该变量并获取其值,然后替换${createBehavior.behaviorRevisionAllowed}
为实际值。
让我知道是否需要进一步解释。