我是Spring的新手。成功地运行了一些应用程序,但我对事情是如何朝着某个方向进行的有些怀疑,也找不到我想要的解释。特别是在这种方法中:
@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)正被传递到视图中。但有两件事让我担心,我觉得有些不寻常:
model被声明为printHello方法的输入参数?而不是说是局部变量?model没有被显式地传递到视图中,所以这在幕后发生了吗?发布于 2016-06-23 21:33:35
为什么
model被声明为printHello方法的输入参数?而不是说是局部变量?
可以将其声明为局部变量,并在需要时返回它:
@RequestMapping("/hello")
public ModelMap printHello() {
return new ModelMap("message", "Hello Spring MVC Framework!");
}但是,这样您就没有利用Spring的数据绑定(绑定请求属性( GET请求的查询参数)来建模)。
同样,您也没有提供任何视图名称(如您最初的示例return "hello"),因此Spring将使用默认的DefaultRequestToViewNameTranslator推断它,默认DefaultRequestToViewNameTranslator使用没有Controller后缀的控制器名称作为逻辑视图名称(在您的示例中,它将是hello,因为您的控制器是HelloController)。有关更多信息,请参见文档。
此外,您还可以返回新的ModelAndView实例,而不仅仅是Model或ModelMap。在这种情况下,您可以显式地设置视图、名称和模型属性。
,但使用模型作为处理程序方法参数的主要优点是数据绑定。
当您提供Model 和某些模型属性(将请求绑定到)作为方法参数时,您将获得模型实例,其中已经添加了(并使用请求参数填充)模型属性,然后,如果需要的话,您可以向模型添加另一个属性。
@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标记库的示例
<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使用它传递给控制器方法的模型作为参数。
发布于 2016-06-23 20:30:47
您提供的@RequestMapping注释神奇地做到了这一点。我从字面意义和隐喻意义上都这么说。它基本上消除了每件事都会涉及的杂乱无章的手工布线。
@Autowire类似。当您自动创建一个服务时,您从来没有明确地说过new FooService()在任何地方,但是它是在Spring之前自动为您创建和管理的。您基本上是将大部分布线工作卸载到Spring,它处理所有样板,同时处理您需要它处理的内容。在本例中,您从get请求中将一个带有值的ModalMap传递给客户端,然后将该值加载到页面上。
补充阅读+资料来源:http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/bind/annotation/RequestMapping.html
发布于 2016-06-23 20:57:49
将model对象作为参数传递,类似于我在下面代码中添加的HttpServletRequest对象。Spring生成一个在整个请求生命周期中可用的隐式模型对象,类似于可用于JSP的隐式request对象。因此,根据单个请求生命周期,这个隐式模型对象将在控制器和视图之间共享。
@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视图的隐式模型。
https://stackoverflow.com/questions/38001036
复制相似问题