【问题标题】:Spring MVC - Is JSTL Tag JSON Conversion OK?Spring MVC - JSTL 标记 JSON 转换可以吗?
【发布时间】:2025-12-06 20:00:02
【问题描述】:

一种伪控制器方法

@RequestMapping("/foo")
public String getFoo(Model model) {
   model.add("foo", repo.findFoo());
   model.add("bar", repo.findBar());
   model.add("barOptions", repo.findBarOptions(bar));
   return "fooView";
}

假设客户端使用表达式语言来渲染foobar;但是我们使用 JavaScript 来渲染barOptions

<html>
    <script>
    var options = <mytag:toJSON object="${barOptions}"/>;
    $("#options").renderOptions( options );
    </script>
    <body>
        <mytag:renderFoo foo="${foo}"/>
        <mytag:renderBar foo="${bar}"/>
        <ul id="options"></ul>
    </body>
</html>

通用约定告诉我这是不好的。但是 MVC 的本质,控制器发送数据,视图决定如何使用它,告诉我这很好。有没有更好的方法来做同样的事情?有什么理由不经常这样做吗?我可以使用单独的调用请求 JSON,但随后我必须发出更多请求以加载页面,并且在控制器方法 getFoo() 中可能存在逻辑来确定 barOptions 基于当时的其他输入页面加载。

【问题讨论】:

    标签: javascript model-view-controller spring-mvc


    【解决方案1】:

    乍一看,我不能说我看到任何明显错误的方法。最初让我措手不及的唯一方面是您需要将模型对象中的数据转换为 json。

    对我来说,JSON 通常意味着需要转换某种服务器端对象,以便客户端 javascript 可以以 javascript 方式访问或操作其结构。我想在不了解选项列表的更多用途的情况下,我看不出这里需要 json 序列化的原因。

    通过使用标签将模型对象转换为 JSON,我们避免了 客户提出的额外要求

    但如果我们假设 JSON 是必需的(也许对于某些第三方 jquery 插件),那么我绝对看不出这种方法有什么问题。

    barOptions无序列表有什么特别或不同之处,为什么要用json渲染?为什么不直接使用 for 循环来构建列表项?或者你可以有一个完全构建 ul 的自定义标签。

    除此之外,我忽略了人们如何认为这是糟糕的代码。

    【讨论】:

    • 我想要 JSON 的原因是重用相同的代码来生成选项的查看方式(假设一个选项并且它们的呈现比下拉更复杂) - 当页面我最初将在 JSP 中绘制组件,然后当有更新时,我用 JS 更新组件 - 如果我可以对两者使用相同的逻辑,那就太好了,所以如果我改变它的呈现方式,我不必修改JS 选项组件渲染器和最初渲染组件的 JSP
    • 好的,我现在明白你的意思了。 renderOptions 函数将不仅用于创建,还用于后续更改。也就是说,我认为这似乎是一种优雅的方法。另外,正如您正确提到的那样,模型和视图仍然分离并封装在这种方法中。视图作用于模型中的数据,它是如何作用于它的不是他的姐妹 - 模型和控制器关心的问题。我也喜欢拥有一个负责将对象转换为 json 的自定义标签的想法。我可能不得不拿那个:)
    【解决方案2】:

    JavaScript 通常通过 Ajax 调用请求 JSON,但如果在您的情况下它在页面呈现时可用,我认为您的解决方案没有任何问题。它是干净、紧凑的代码并且易于阅读。在我看来完全没问题,替代方法是使用 forEach 在选项数组上循环,但这种方法看起来更好。

    【讨论】: