【问题标题】:Access to model object by EL in javascript function?通过 EL 在 javascript 函数中访问模型对象?
【发布时间】:2012-01-31 19:24:31
【问题描述】:

这是我的标记,我使用的是 jtsl 核心标签

<c:forEach var="attr" items="${attributes}">
    <c:when test='${attr.controlType == "textField"}'>
        <script>createTextField("${attr}");</script>
        </c:when>
</c:forEach>

所以“属性”是驻留在模型中的对象列表。

我想调用 createTextField 函数并且我想访问“attr” 在那个函数中。

这是我的函数,但我无法访问该对象,说它未定义。

function createTextField(object) {
    document.write(object.name);        
}

有什么想法吗?将不胜感激。

【问题讨论】:

    标签: javascript model-view-controller jsp jstl


    【解决方案1】:

    这是行不通的。 Java 和 JavaScript 不在同一个环境中运行。您基本上是将attr.toString() 传递给默认情况下看起来像com.example.ClassName@hashcode 的JavaScript 函数。 JavaScript String 对象没有 name 属性。

    基本上有两种方法可以让它工作:

    1. 您需要将#{attr} 表示的Java 对象转换为符合JavaScript 对象表示法(也称为JSON)的字符串。例如

      <script>createTextField(${attr.asJson});</script>
      

      使用类似的东西(在Gson 的帮助下):

      public String getAsJson() {
          return new Gson().toJson(this);
      }
      

      您当然也可以使用StringBuilder 或其他东西手动构建它。 JSON 格式并不难。

    2. 只传递感兴趣的属性,只要它们可以表示为String。例如

      <script>createTextField("${attr.name}");</script>
      

      function createTextField(name) {
          document.write(name);        
      }
      

    【讨论】:

    • 谢谢,在这种情况下,选项 2 将不起作用,因为我在函数中需要的对象中有很多字段,所以我必须使用选项 1,但我很困惑,我知道JSON是什么,但不明白你所说的数字1是什么意思。你能详细解释一下吗?
    • 究竟哪一部分你不明白?选项 1 只是告诉您应该将 Java 对象转换为 JSON,以便您可以轻松地将其打印为有效的 JS 函数参数。
    • 如何将该对象转换为 JSON,然后如何在该 JS 函数中从该 JSON 中提取值
    • 嗯,只需使用 Gson 或任何基于 Java 的任意 JSON 解析器 API 将 Java 对象转换为 JSON 字符串,或者使用 StringBuilder 自己创建 JSON 格式的 String。格式最终应该类似于{"name":"somevalue", "otherproperty":"othervalue"} 等。您的JS createTextField() 函数可以保持不变,因为它在使用JSON 时已经检索了一个有效的JS 对象。您说您知道 JSON 是什么,但毕竟您显然根本不了解 JSON。你到底有什么问题?
    猜你喜欢
    • 1970-01-01
    • 2020-01-31
    • 1970-01-01
    • 2016-05-18
    • 1970-01-01
    • 2011-10-07
    • 2011-09-06
    • 1970-01-01
    • 2020-10-30
    相关资源
    最近更新 更多