提问人:Reddy 提问时间:10/1/2010 最后编辑:BalusCReddy 更新时间:5/30/2022 访问量:44816
在 JavaScript 中访问 Java / Servlet / JSP / JSTL / EL 变量
Access Java / Servlet / JSP / JSTL / EL variables in JavaScript
问:
我在JSP中有一个表格。我必须根据请求对象(来自 servlet)填充它。如何使用 Java 脚本访问请求对象属性,或者您是否可以建议我任何其他更好的动态填充表单的方法?
答:
您需要意识到 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>
另请参阅:
- 我们的 JSP wiki 页面 - 参见 “JavaScript” 一章。
- 如何在JSP中转义JavaScript?
- 调用 Servlet 并从 JavaScript 调用 Java 代码以及参数
- 如何使用 Servlet 和 Ajax?
评论
script
data-attribute
JSON
如果您要根据 HTTP 请求中的参数预填充表单字段,那么为什么不直接在 JSP 的服务器端执行此操作呢?而不是在客户端使用 JavaScript?在 JSP 中,它模糊地看起来像这样:
<input type="text" name="myFormField1" value="<%= request.getParameter("value1"); %>"/>
在客户端,JavaScript 实际上并没有“请求对象”的概念。您几乎必须自己手动解析查询字符串才能获得 CGI 参数。我怀疑这不是你真正想做的。
评论
在 JSP 页面中:
<c:set var="list_size" value="${list1.size() }"></c:set>
在 Javascipt 页面中使用以下命令访问此值:
var list_size = parseInt($('#list_size').val());
我在外部的项目中添加了 javascript 页面。
在 JSP 文件中:
<head>
...
<%@ page import="com.common.Constants" %>
...
</head>
<script type="text/javascript">
var constant = "<%=Constants.CONSTANT%>"
</script>
然后,此常量变量将可用于在上述代码之后声明的 .js 文件。
常量 .java 是一个 java 文件,其中包含一个名为 CONSTANT 的静态常量。
我遇到的情况是,我需要一个属性文件中的常量,所以我没有为 javascript 构造一个属性文件,而是这样做了。
将 JSON 从 JSP 传递到 Javascript。
我来这里寻找这个,@BalusC的回答在一定程度上有所帮助,但并没有从根本上解决问题。在深入研究标签后,我遇到了这个解决方案。<script>
<script id="jsonData" type="application/json">${jsonFromJava}</script>
在 JS 中:
var fetchedJson = JSON.parse(document.getElementById('jsonData').textContent);
评论