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

Access Java / Servlet / JSP / JSTL / EL variables in JavaScript

提问人:Reddy 提问时间:10/1/2010 最后编辑:BalusCReddy 更新时间:5/30/2022 访问量:44816

问:

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

JavaScript JSP servlet 参数传递 EL

评论


答:

24赞 BalusC 10/1/2010 #1

您需要意识到 Java/JSP 只是一个 HTML/CSS/JS 代码生产者。因此,您需要做的就是让 JSP 打印 Java 变量,就好像它是 JavaScript 变量一样,并且生成的 HTML/JS 代码输出在语法上是有效的。

如果 Java 变量在 EL 作用域中可用,则下面是几个如何打印它的示例:${foo}

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

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

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

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

如果变量恰好来自用户控制的输入,那么请记住要考虑 XSS 攻击漏洞JS 转义在我们的 EL wiki 页面的底部附近,您可以找到一个示例,该示例如何创建自定义 EL 函数,该函数对 Java 变量进行转义,以便在 JS 中安全使用。

如果变量稍微复杂一些,例如Java bean,或其列表,或映射,则可以使用许多可用的JSON库之一将Java对象转换为JSON字符串。下面是一个假设 Gson 的示例。

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

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

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

另请参阅:

评论

0赞 Matt 12/14/2016
嗨,@BalusC。我不确定 OP 所说的“来自 servlet 的请求对象”是什么意思。我需要做什么才能在请求对象中拥有属性?
1赞 theyuv 3/18/2018
我使用数据属性来避免内联标签和全局 js 变量。您的解决方案是否比使用?(我正在处理存储一个大变量)。scriptdata-attributeJSON
0赞 theyuv 3/25/2018
@BalusC 我不确定您是否收到了之前评论的通知。只是想确保你看到了它......
6赞 Steve Perkins 10/1/2010 #2

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

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

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

评论

0赞 Steve Perkins 10/1/2010
是的。。。显然,您还需要清理参数,以避免任何类型的 XSS 或注入攻击。
-1赞 Parth Patel 11/17/2017 #3

在 JSP 页面中:

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

在 Javascipt 页面中使用以下命令访问此值:

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

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

0赞 Raj Kundalia 6/13/2019 #4

在 JSP 文件中:

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

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

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

我遇到的情况是,我需要一个属性文件中的常量,所以我没有为 javascript 构造一个属性文件,而是这样做了。

1赞 Vibhor Dube 5/30/2022 #5

将 JSON 从 JSP 传递到 Javascript。

我来这里寻找这个,@BalusC的回答在一定程度上有所帮助,但并没有从根本上解决问题。在深入研究标签后,我遇到了这个解决方案。<script>

<script id="jsonData" type="application/json">${jsonFromJava}</script>

在 JS 中:

var fetchedJson = JSON.parse(document.getElementById('jsonData').textContent);