首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >了解模型解析的工作原理

了解模型解析的工作原理
EN

Stack Overflow用户
提问于 2016-06-23 20:17:40
回答 4查看 212关注 0票数 2

我是Spring的新手。成功地运行了一些应用程序,但我对事情是如何朝着某个方向进行的有些怀疑,也找不到我想要的解释。特别是在这种方法中:

代码语言:javascript
复制
@Controller
@RequestMapping("/hello")
public class HelloController{

   @RequestMapping(method = RequestMethod.GET)
   public String printHello(ModelMap model) {
      model.addAttribute("message", "Hello Spring MVC Framework!");
      return "hello";
   }

}

我知道"Hello Spring MVC Framework!" (名为message)正被传递到视图中。但有两件事让我担心,我觉得有些不寻常:

  1. 为什么model被声明为printHello方法的输入参数?而不是说是局部变量?
  2. model没有被显式地传递到视图中,所以这在幕后发生了吗?
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-06-23 21:33:35

为什么model被声明为printHello方法的输入参数?而不是说是局部变量?

可以将其声明为局部变量,并在需要时返回它:

代码语言:javascript
复制
@RequestMapping("/hello")
public ModelMap printHello() {
    return new ModelMap("message", "Hello Spring MVC Framework!");
}

但是,这样您就没有利用Spring的数据绑定(绑定请求属性( GET请求的查询参数)来建模)。

同样,您也没有提供任何视图名称(如您最初的示例return "hello"),因此Spring将使用默认的DefaultRequestToViewNameTranslator推断它,默认DefaultRequestToViewNameTranslator使用没有Controller后缀的控制器名称作为逻辑视图名称(在您的示例中,它将是hello,因为您的控制器是HelloController)。有关更多信息,请参见文档

此外,您还可以返回新的ModelAndView实例,而不仅仅是ModelModelMap。在这种情况下,您可以显式地设置视图、名称和模型属性。

,但使用模型作为处理程序方法参数的主要优点是数据绑定。

当您提供Model 某些模型属性(将请求绑定到)作为方法参数时,您将获得模型实例,其中已经添加了(并使用请求参数填充)模型属性,然后,如果需要的话,您可以向模型添加另一个属性。

代码语言:javascript
复制
@RequestMapping(path = "/hello", method = RequestMethod.GET)
public String printHello(Model model, @ModelAttribute("form") SearchForm form, BindingResult result) {
    model.addAttribute("anotherUsefulValue", myService.getSomeValue());
    // 'hello' view will get the model with both 'form' and 'anotherUsefulValue' attributes
    // and 'form' attribute will have 'text' field filled from request's
    // query parameter 'text'.
    return "hello";
}

class SearchForm {
    private String text;
    // ... getter and setter
}

使用此方法,您可以从带有名为text的文本字段的html text获得请求,当您提交此表单时,您的模型将包含以实例化的SearchForm对象作为值的属性form。该对象的字段text将以text查询参数作为值。

使用spring表单JSP标记库的示例

代码语言:javascript
复制
<form:form method="GET" action="/hello" modelAttribute="form">
    <form:input path="text" />
    <input type="submit">
</form>

或者输入URL /hello?text=12345。您将看到model具有form属性,text字段与12345相等,它也具有anotherUsefulValue属性。您刚刚将Spring的数据绑定与您的自定义模型属性结合起来。

当然,您可以手动创建新模型,并根据方法的anotherUsefulValue参数设置form属性和form。但它只是更多的样板。

model没有被显式地传递到视图中,所以这在幕后发生了吗?

当然了。Spring的DispatcherServlet为您做了许多其他的事情。这在文档中都有描述。

Front Controller只知道您的控制器方法返回了什么,并且能够理解它是新模型还是您的方法没有返回任何模型,然后Front Controller使用它传递给控制器方法的模型作为参数。

票数 2
EN

Stack Overflow用户

发布于 2016-06-23 20:30:47

您提供的@RequestMapping注释神奇地做到了这一点。我从字面意义和隐喻意义上都这么说。它基本上消除了每件事都会涉及的杂乱无章的手工布线。

  1. 该模型是众多可选输入参数之一。你可以,如果你愿意,提供更多,或更少,或不提供。在本例中,您想要使用ModalMap,所以您可以通过包含参数来表示“我想使用ModalMap”。如果您有来自请求的参数,例如在标头中,则可以将这些参数添加到其中并对其进行强制转换。
  2. 这与Spring时的@Autowire类似。当您自动创建一个服务时,您从来没有明确地说过new FooService()在任何地方,但是它是在Spring之前自动为您创建和管理的。您基本上是将大部分布线工作卸载到Spring,它处理所有样板,同时处理您需要它处理的内容。

在本例中,您从get请求中将一个带有值的ModalMap传递给客户端,然后将该值加载到页面上。

补充阅读+资料来源:http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/bind/annotation/RequestMapping.html

票数 1
EN

Stack Overflow用户

发布于 2016-06-23 20:57:49

model对象作为参数传递,类似于我在下面代码中添加的HttpServletRequest对象。Spring生成一个在整个请求生命周期中可用的隐式模型对象,类似于可用于JSP的隐式request对象。因此,根据单个请求生命周期,这个隐式模型对象将在控制器和视图之间共享。

代码语言:javascript
复制
@Controller
@RequestMapping("/hello")
public class HelloController{

   @RequestMapping(method = RequestMethod.GET)
   public String printHello(ModelMap model, HttpServletRequest req) {
      model.addAttribute("message", "Hello Spring MVC Framework!");
      return "hello";
   }

}

下面是来自春季医生的描述。这里提到的输入参数传递给带有@RequestMapping注释的方法的意义是什么?

Map / Model / ModelMap,用于丰富将公开给web视图的隐式模型。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38001036

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档