在 JavaScript 中访问 Java / Servlet / JSP / JSTL / EL 变量

Posted

技术标签:

【中文标题】在 JavaScript 中访问 Java / Servlet / JSP / JSTL / EL 变量【英文标题】:Access Java / Servlet / JSP / JSTL / EL variables in JavaScript 【发布时间】:2020-06-04 08:20:26 【问题描述】:

我在 JSP 中有一个表单。我必须根据请求对象(来自 servlet)来填充它。如何使用 Java Script 访问请求对象属性,或者您能否建议我使用其他更好的方法来动态填充表单?

【问题讨论】:

【参考方案1】:

您需要意识到 Java/JSP 仅仅是 html/CSS/JS 代码生成器。所以你需要做的就是让 JSP 打印 Java 变量,就好像它是一个 javascript 变量一样,并且生成的 HTML/JS 代码输出在语法上是有效的。

假设Java变量在$foo的EL范围内可用,这里有几个如何打印它的例子:

<script>var foo = '$foo';</script>
<script>someFunction('$foo');</script>
<div onclick="someFunction('$foo')">...</div>

假设 Java 变量的值是 "bar",那么 JSP 最终会生成这个 HTML,您可以通过右键单击来验证它,在网络浏览器中查看源代码

<script>var foo = 'bar';</script>
<script>someFunction('bar');</script>
<div onclick="someFunction('bar')">...</div>

请注意,这些单引号是必需的,以便在 JS 中表示字符串类型的变量。如果您改用了var foo = $foo;,那么它将打印var foo = bar;,当您尝试在JS代码中进一步访问它时,可能会出现“bar未定义”错误(您可以在JS控制台中看到JS错误浏览器的 Web 开发工具集,您可以在 Chrome/FireFox23+/IE9+ 中按 F12 打开)。另请注意,如果变量表示不需要引用的数字或布尔值,那么它就可以正常工作。

如果变量恰好来自用户控制的输入,请记住考虑XSS attack holes 和JS escaping。在our EL wiki page 的底部附近,您可以找到一个示例如何创建自定义 EL 函数,该函数转义 Java 变量以便在 JS 中安全使用。

如果变量有点复杂,例如一个 Java bean 或其列表或映射,那么您可以使用许多可用的JSON libraries 之一将 Java 对象转换为 JSON 字符串。这是假设 Gson 的示例。

String someObjectAsJson = new Gson().toJson(someObject);

请注意,这样您就不再需要将其打印为带引号的字符串了。

<script>var foo = $someObjectAsJson;</script>

另见:

Our JSP wiki page - 请参阅“JavaScript”一章。 How to escape JavaScript in JSP? Call Servlet and invoke Java code from JavaScript along with parameters How to use Servlets and Ajax?

【讨论】:

嗨@BalusC。我不确定 OP 所说的“来自 servlet 的请求对象”是什么意思。我需要做什么才能在请求对象中包含属性? 我使用数据属性来避免内联script标签和全局js变量。您的解决方案是否比使用data-attribute 更可取? (我正在处理存储一个大的JSON 变量)。 @BalusC 我不确定你是否收到了关于之前评论的通知。只是想确保你看到它......【参考方案2】:

如果您要根据 HTTP 请求中的参数预先填充表单字段,那么为什么不简单地在 JSP 中的服务器端执行此操作……而不是在客户端使用 JavaScript 呢?在 JSP 中,它看起来像这样:

<input type="text" name="myFormField1" value="<%= request.getParameter("value1"); %>"/>

在客户端,JavaScript 实际上并没有“请求对象”的概念。您几乎必须自己手动解析查询字符串才能获取 CGI 参数。我怀疑这不是你真正想要做的。

【讨论】:

是的...显然您还想清理参数,以避免任何类型的 XSS 或注入攻击。【参考方案3】:

在 JSP 文件中:

<head>
...
<%@ page import="com.common.Constants" %>
...
</head>
<script type="text/javascript"> 
        var constant = "<%=Constants.CONSTANT%>"
</script>

此常量变量将可用于在上述代码之后声明的 .js 文件。

Constants.java 是一个 java 文件,其中包含一个名为 CONSTANT 的静态常量。

我的场景是,我需要一个属性文件中的常量,所以我没有为 javascript 构建一个属性文件,而是这样做了。

【讨论】:

【参考方案4】:

在 JSP 页面中:

<c:set var="list_size" value="$list1.size() "></c:set>

在 Javascipt 页面中访问这个值:

var list_size = parseInt($('#list_size').val());

我在外部项目中添加了 javascript 页面。

【讨论】:

以上是关于在 JavaScript 中访问 Java / Servlet / JSP / JSTL / EL 变量的主要内容,如果未能解决你的问题,请参考以下文章

在 JavaScript 中访问 Java / Servlet / JSP / JSTL / EL 变量

在 JavaScript 中访问 Java / Servlet / JSP / JSTL / EL 变量

java与javascript

Java 之 web 相关概念

在 CSS 中访问 JavaScript 变量

如何理解 JavaScript 中的 this 关键字