从 JavaScript 读取 JSP 变量

IT技术 java javascript jsp
2021-01-22 20:26:02

如何从 JavaScript 读取/访问 JSP 变量?

6个回答
alert("${variable}");

或者

alert("<%=var%>");

或完整示例

<html> 
<head>
<script language="javascript"> 

function access(){ 
  <% String str="Hello World"; %>
   var s="<%=str%>"; 
   alert(s); 
} 

</script> 
</head> 

<body onload="access()"> 
</body> 

</html>

注意:在渲染之前清理输入,它可能会打开很多 XSS 的可能性

不好的例子,正是因为@NagaSrinuKapusetti 提到的。如果您将其用于任何用户输入,您将进入一个麻烦的世界。
2021-03-17 20:26:02
@Adr +1 你的回答我只是展示如何在 js 上访问它
2021-03-21 20:26:02
另请阅读这篇文章,它非常清楚地解释了 JS 和 JSP 的概念 - balusc.blogspot.in/2009/05/javajspjsf-and-javascript.html
2021-03-26 20:26:02
如果您的字符串包含双引号 (") 字符会发生什么?我认为它会破坏它可能为您提供部分数据的功能
2021-03-28 20:26:02
@JigarJoshi:我没有冒犯的意思,但我认为你的回答真的很脏/老派,我怀疑这个话题有很多无知。你怎么看我下面的回答?
2021-04-01 20:26:02

据我所知,最干净的方法是:

  1. 将您的 JSP 变量添加到 HTML 元素的 data-* 属性
  2. 然后在需要时通过 Javascript 读取这个值

我对这个 SO 页面上当前解决方案的看法:在实际的 javascript 代码中使用 java 脚本“直接”读取 JSP 值可能是你能做的最恶心的事情。让我想吐。哈哈。说真的,尽量不要这样做。

没有 JSP 的 HTML 部分:

<body data-customvalueone="1st Interpreted Jsp Value" data-customvaluetwo="another Interpreted Jsp Value">
    Here is your regular page main content
</body>

使用 JSP 时的 HTML 部分:

<body data-customvalueone="${beanName.attrName}" data-customvaluetwo="${beanName.scndAttrName}">
    Here is your regular page main content
</body>

javascript 部分(为简单起见使用 jQuery):

<script type="text/JavaScript" src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.1/jquery.js"></script>
<script type="text/javascript">
    jQuery(function(){
        var valuePassedFromJSP = $("body").attr("data-customvalueone");
        var anotherValuePassedFromJSP = $("body").attr("data-customvaluetwo");

        alert(valuePassedFromJSP + " and " + anotherValuePassedFromJSP + " are the values passed from your JSP page");
});
</script>

这里是 jsFiddle 看到这个在行动http://jsfiddle.net/6wEYw/2/

资源:

我很难理解为什么 1 行解决方案会让你“想吐”,而这种令人费解的混乱不知何故不会。关心启发我吗?有没有我没有考虑的边缘情况?
2021-03-17 20:26:02
这是一个很好的做法:关注点分离。它允许在专用文件中移动你的 javascript 代码(你应该)。该文件通常由您的 CDN 或其他方式自动缩小。它只是更通用和可扩展。另一个优势是,在团队中工作时,后端人员可以告诉前端人员“嘿,我在数据属性 x 和 y 中删除了那些动态值,可以开始使用了”。哦,你不能调试内联 javascript。
2021-03-24 20:26:02
@JamieBurke 很公平,我从未尝试使用它来存储 JSON 值。可能有针对该特定问题的通用解决方案,这需要调查。
2021-04-07 20:26:02
此方法适用于作为基本字符串的 Model 对象,但是如果它是 JSON 值,则 JSON 中的所有双引号都需要转义,这是有问题的。
2021-04-08 20:26:02
具有讽刺意味的是,这具有相同的问题,即无法转义字符串中的特殊字符。
2021-04-12 20:26:02

假设您正在谈论 HTML 文档中的 JavaScript。

您不能直接执行此操作,因为就 JSP 而言,它正在输出文本,而就页面而言,它只是获取一个 HTML 文档。

您必须生成 JavaScript 代码来实例化变量,注意转义JS 中具有特殊含义的任何字符如果您只是转储数据(如其他一些答案所建议的那样),您会发现当数据包含新行、引号字符等时它会倒塌。

最简单的方法是使用 JSON 库(在http://json.org/底部列出了一堆),然后有 JSP 输出:

<script type="text/javascript">
    var myObject = <%= the string output by the JSON library %>;
</script>

这将为您提供一个可以访问的对象,例如:

myObject.someProperty

在 JS 中。

不,JSFiddle 不会执行 JSP。
2021-03-20 20:26:02
{ "someProperty" : "some \"value\"\nwith a new line" }
2021-03-22 20:26:02
很公平,但是您能否简单地对 JSP 将输出的值进行硬编码?
2021-04-01 20:26:02
你能提供一个jsFiddle吗?我大致明白了这个想法。
2021-04-02 20:26:02
+1 对于 JSON 方法,我使用 HTML5data-*属性的解决方案(请参阅本页上的答案)永远不会像 JSON 方法那样扩展。在 javascript 中使用 java scriptlet 仍然让我不寒而栗,但它具有防止后端开发人员编写专用 Web 服务的优点。万一你能想到一些好的妥协吗?
2021-04-12 20:26:02
   <% String s="Hi"; %>
   var v ="<%=s%>"; 
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <script 
src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"> 

    <title>JSP Page</title>
    <script>
       $(document).ready(function(){
          <% String name = "phuongmychi.github.io" ;%> // jsp vari
         var name = "<%=name %>" // call var to js
         $("#id").html(name); //output to html

       });
    </script>
</head>
<body>
    <h1 id='id'>!</h1>
</body>