【问题标题】:Pass Spring model vars from JSP template to javascript将 Spring 模型变量从 JSP 模板传递到 javascript
【发布时间】:2014-07-14 15:05:57
【问题描述】:

在 jsp 文件中的 <script> 标记中,我有一些如下所示的代码:

var chart = new myChart({'id': ${user.id}, 'type': ${user.type}, 'name': {user.name});

其中user 是在服务器端设置的Spring 模型属性。我的问题是,通过用户的每个不同领域感觉很笨拙。如果我能做这样的事情就好了:

var chart = new myChart('user': "${user}");

但是,当这样做时,${user} 的值将是一个对象字符串,如下所示:
User{id=1, type='admin', name='foo'}
我知道我可以将这个字符串解析为我的外部 js 中的一个对象,但感觉应该有一种更简洁的方法来做到这一点。感谢您的帮助。

编辑:离开下面卡梅伦的回答,我可以将它添加到我的服务器端控制器代码中:

model.put("user", user);  
String userJSON = MyJSONSerializer.serialize(user);  
model.put("userJSON", userJSON);

然后在我的 JSP 中我可以这样做:

var chart = new myChart({'user': JSON.parse('${userJSON}')});

这确实解决了我的选项对象混乱的问题,但它带来了使用两个模型属性来获取相同的确切数据的问题。如果我可以为 user 对象使用一个模型属性,然后可以以某种方式即时将其编码为 JSON,那将是理想的。

【问题讨论】:

    标签: javascript spring jsp


    【解决方案1】:

    您可以使用 Jackson 之类的库将 Object 转换为 JSON:

    public static String objectAsJSON(Object obj) {
    
      try
      {
        // This could be optimized by making a static ObjectMapper
        return new ObjectMapper().writeValueAsString(obj);
      }
      catch (IOException e)
      {
        // Log exception and re-throw or return null
        return null; 
      }
    }
    

    您可以在将对象放入模型之前调用此方法,并像这样在 JSP 中引用字符串:

    var chart = ${jsonChart};
    

    或者您可以编写一个自定义标记库并从那里调用objectAsJSON()。然后实际的myChart 对象可以进入您的模型一次。您的 JSP 可能如下所示:

    var chart = <chartlib:toJson obj="${chart}" />;
    

    【讨论】:

    • 这可行,但不如我希望的那样干净。我需要用户模型对象来呈现我的 jsp。所以在我的模型中,我将同时拥有一个 user 和一个 userJson 属性。对具有不同结构的相同数据使用两个不同的模型属性似乎很臭。
    • 这是可以理解的。我已经编辑了我的答案,建议使用自定义标记库,这样您就可以在模型中只保留一个版本的对象。
    猜你喜欢
    • 2013-12-16
    • 2013-07-17
    • 1970-01-01
    • 1970-01-01
    • 2016-10-10
    • 2021-01-15
    • 2019-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多