【问题标题】:Some doubts related to Spring MVC model objectSpring MVC模型对象相关的一些疑惑
【发布时间】:2015-06-07 07:02:49
【问题描述】:

我正在研究Spring MVC,我对模型的概念有一些疑问。

如果我有这样的控制器

@Controller
public class RewardController {

    private RewardLookupService lookupService;

    @Autowired
    public RewardController(RewardLookupService svc) {
        this.lookupService = svc;
    }

    @RequestMapping("/reward/show")
    public String show(@RequestParam("id") long id, Model model) {
        Reward reward = lookupService.lookupReward(id);
        model.addAttribute(“reward”, reward);
        return “rewardView”;
    }
}

因此,在此控制器中定义了 show() 方法,该方法将 HttpRequest 处理到 /reward/show 路径并接受 2 个输入参数:

  • long id:从请求的 URL 中提取,类似于 /reward/show?id=1

  • 模型模型对象:我认为它包含与视图共享的值。

所以这个控制器方法在数据库上执行查询并获得一个 Reward 对象,该对象放入 Model 对象中。

所以我可以将这个简单的视图命名为例如 rewardView.jsp(名称和路径由 Spring view resolveréé 自动构建)显示 **Model 的内容 对象:

<html>
    <head><title>Your Reward</title></head>

    <body>
        Amount=${reward.amount} <br/>
        Date=${reward.date} <br/>
        Account Number=${reward.account} <br/>
        Merchant Number=${reward.merchant}
    </body>
</html>

所以我的疑问是:

  1. Model 对象是 Java Map 的特定实现还是包装 Map 的对象?我这么认为是因为,就像在地图中一样,我有几个 ,其中 KEY 是字段名称,VALUE 是要在视图中显示的特定值。

  2. 如果我之前的推理是正确的,那么 addAttribute() 是一种将元素放入此 Map 的特定 Spring 方法?为什么不直接使用 Map put() 方法?

Tnx

【问题讨论】:

  • 是的,您或多或少是正确的,模型是一个接口,因此它取决于具体的实现,但它基本上旨在允许您添加到底层地图并作为访问整个模型地图

标签: java spring spring-mvc model-view-controller annotations


【解决方案1】:

model(MVC 中的 M)是一个Map interface,它允许完全抽象视图技术。您可以直接与基于模板的渲染技术(如 JSP、Velocity 和 Freemarker)集成,或直接生成 XML、JSON、Atom 和许多其他类型的内容。模型 Map 只是简单地转换成适当的格式,例如 JSP 请求属性、Velocity 模板模型。

【讨论】:

    【解决方案2】:

    Model实际上是一个接口,它声明了你提到的addAttribute方法。在您的 Show 方法中,您有效地使用此接口来访问地图。

    “put”方法不能通过 Model 接口使用,因此您需要使用 addAttribute(它对您的键/值参数执行基本的完整性检查,然后为您将它们“放入”底层映射中。

    【讨论】:

      【解决方案3】:

      ExtendedModelMapModel对象的实现。

      这个类正在扩展 ModelMap,而 ModelMap 本身正在扩展 HashMap。

      并且 addAttribute 名称更有意义,因为我们在 servlet/web 环境中使用它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-02-04
        • 2012-08-20
        • 2015-06-21
        • 2016-02-08
        • 1970-01-01
        • 1970-01-01
        • 2012-12-31
        • 1970-01-01
        相关资源
        最近更新 更多