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

访问JavaScript中的Java/Servlet/JSP/JSTL/EL变量,javascript,jsp,servlets,parameter-passing,el,Javascript,Jsp,Servlets,Parameter Passing,El,我有一个JSP格式的表单。我必须基于请求对象(来自servlet)填充它。如何使用Java脚本访问请求对象属性,或者您是否可以向我推荐其他更好的动态填充表单的方法?您需要意识到Java/JSP只是一个HTML/CSS/JS代码生成器。因此,您需要做的就是让JSP打印Java变量,就像它是JavaScript变量一样,并且生成的HTML/JS代码输出在语法上是有效的 如果Java变量通过${foo}在EL范围内可用,下面是几个如何打印它的示例: var foo='${foo}'; someFun

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

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

如果Java变量通过
${foo}
在EL范围内可用,下面是几个如何打印它的示例:

var foo='${foo}';
someFunction('${foo}');
。。。
假设Java变量的值为
“bar”
,那么JSP最终将生成此HTML,您可以通过在webbrowser中右键单击查看源代码来验证:

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

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

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

String someObjectAsJson = new Gson().toJson(someObject);
请注意,这样您就不再需要将其作为带引号的字符串打印

<script>var foo = ${someObjectAsJson};</script>
var foo=${someObjectAsJson};
另见:
  • -请参阅“JavaScript”一章

如果您是基于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>
我在项目外部添加了javascript页面。

在JSP文件中:

<head>
...
<%@ page import="com.common.Constants" %>
...
</head>

...
...

var常量=“”
然后,在上述代码之后声明的.js文件将可以使用此常量变量

java是一个包含名为constant的静态常量的java文件


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

Yes。。。显然,您还需要清理参数,以避免任何类型的XSS或注入攻击。我不确定OP所说的“来自servlet的请求对象”是什么意思。我需要做什么才能在请求对象中拥有属性?我使用数据属性来避免内联
script
标记和全局js变量。您的解决方案是否比使用
数据属性更可取?(我正在处理存储一个大的
JSON
变量)。@BalusC我不确定您是否收到了关于前面评论的通知。只是想确定你看到了。。。
<head>
...
<%@ page import="com.common.Constants" %>
...
</head>
<script type="text/javascript"> 
        var constant = "<%=Constants.CONSTANT%>"
</script>