【问题标题】:What is the actual implementation of Model in Spring MVCSpring MVC中Model的实际实现是什么
【发布时间】:2020-10-09 05:27:55
【问题描述】:

很多人回答说Model是一个接口,而ModelView是一个实现Map接口的类。

  1. 我的困惑是什么实际上实现了接口Model? (我是Spring MVC的初学者,请耐心等待 您可以参考此线程以获取代码提示。 What are the differences between Model, ModelMap, and ModelAndView?

  2. 更有趣的是,我看到有人只是使用Map<>接口:

//当路径被路由到'/new'下面的方法被调用并且查看//返回的是newPokemon

@RequestMapping(method = RequestMethod.GET, value ="/new")

    public String newPokemonForm(Map<String, Object> model) {
    Pokemon Pokemon = new Pokemon();
    model.put("pokemon", Pokemon);
    return "newPokemon";
}

所以我在考虑这个模型参数Map&lt;&gt; 应该声明类型而modelmap 是实际类型? 谁能和我澄清一下? 非常感谢

----------------------更新------------ ----------------

对于第一个问题,其实在 Intellij 中检查很容易。感谢 Elmar Brauch,只需打开源代码包。我将展示图片:

【问题讨论】:

    标签: java rest model


    【解决方案1】:

    如果您将构建工具配置为下载源代码,则只需打开 Spring 的模型界面即可。类型层次结构(您可以在 Eclipse 中打开它)向您显示,以下类实现了 Model 接口:

    • 公共类 ConcurrentModel 扩展 ConcurrentHashMap 实现模型
    • 公共类 ExtendedModelMap 扩展 ModelMap 实现模型

    在这两个类中,您可以看到它们扩展了某种 Map 类,它在超类中实现了 Map 接口。

    在运行时,您可以确定使用哪种类型作为 Map 接口的实现。设置断点并在调试模式下检查或执行以下操作:

    @PostMapping
    public void postMap(@RequestBody Map map) {
        System.out.println(map.getClass());
    }
    

    这为我的带有 @RestController 注释的类打印这种类型: 类 java.util.LinkedHashMap

    【讨论】:

    • 你好,谢谢。有了你的提示,我知道如何找到源代码。在我只知道如何通过 ctr+左键找到它们之前。
    • 但是既然这两个类都实现了接口,那么和第二个问题一样,你知道哪个是实际类型吗?谢谢。
    • class org.springframework.validation.support.BindingAwareModelMap 是我为 Map 打印的结果。我很困惑,容器怎么知道要使用哪个类,因为这么多类都实现了模型接口
    猜你喜欢
    • 2014-06-30
    • 2017-01-02
    • 2019-05-04
    • 2020-07-26
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    • 2021-05-26
    • 1970-01-01
    相关资源
    最近更新 更多