在JavaScript中访问Java / Servlet / JSP / JSTL / ELvariables

我在JSP中有一个表单。 我必须根据请求对象(从servlet)填充它。 如何使用Java脚本来访问请求对象的属性,或者如果你可以build议我任何其他更好的方式dynamic填充表单?

您需要认识到Java / JSP只是一个HTML / CSS / JS代码生成器。 因此,您只需让JSP将Javavariables打印为JavaScriptvariables,并且生成的HTML / JS代码输出在语法上是有效的。

假设Javavariables在${foo}的EL范围中可用,下面是几个如何打印它的例子:

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

想象一下,Javavariables的值是"bar" ,那么JSP将最终生成这个HTML,你可以在web浏览器中右键单击View Source来validation它:

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

请注意,这些单引号是强制性的,以表示JS中的stringtypesvariables。 如果你已经使用var foo = ${foo}; 相反,那么它会打印var foo = bar; 当你试图在JS代码中进一步访问它时,可能会出现“bar is undefined”错误(你可以在浏览器的Web开发者工具集的JS控制台中看到JS错误,你可以通过在Chrome / FireFox23 + IE9 +)。 还要注意,如果variables代表一个数字或布尔值,不需要引用,那么它将正常工作。

如果variables恰好来源于用户控制的input,那么请记住要考虑到XSS攻击漏洞和JS转义 。 在我们的EL维基页面的底部,你可以find一个例子来说明如何创build一个自定义的EL函数来逃避一个Javavariables的安全使用的JS。

如果variables稍微复杂一些,比如说一个Java bean,或者一个列表,或者一个映射,那么你可以使用许多可用的JSON库中的一个将Java对象转换为JSONstring。 这是一个假设Gson的例子。

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

请注意,这样你就不需要把它作为引用的string了。

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

也可以看看:

  • 我们的JSP wiki页面 – 请参阅“JavaScript”一章。
  • 如何在JSP中转义JavaScript?
  • 调用Servlet并从JavaScript调用Java代码以及参数
  • 如何使用Servlets和Ajax?

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

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

在客户端,JavaScript并不真正具有“请求对象”的概念。 您几乎必须手动parsing查询string以获取CGI参数。 我怀疑这不是你真正想要做的。