栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Spring MVC 3中的表单提交-说明

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring MVC 3中的表单提交-说明

@ModelAttribute
在这种情况下,注释用于标识Spring应该添加为模型属性的对象。模型属性是对属性的抽象
HttpServletRequest
。基本上,它们是由某个键标识的对象,这些键将进入
HttpServletRequest
属性。你可以通过使用手动添加属性
Model#addAttribute(String, Object)
,使用带
@ModelAttribute
注释的方法或通过使用方法参数对方法参数进行注释来实现
@ModelAttribute

你需要了解的是Spring如何解析你的处理程序方法参数并注入参数。它使用

HandlerMethodArgumentResolver
接口来做到这一点。有很多实现类(请参阅javadoc),每个实现类都有责任通过反射
resolveArgument()
将Spring将使用的参数返回给invoke()你的处理程序方法。
resolveArgument()
如果
HandlerMethodArgumentResolver supportsParameter()
方法返回true特定参数,Spring只会调用该方法。

这里讨论的

HandlerMethodArgumentResolver
实现是
ServletModelAttributeMethodProcessor
ModelAttributeMethodProcessor
哪个状态扩展的

解析用

@ModelAttribute
注释的方法参数,并处理用
@ModelAttribute
注释的方法的返回值。

spring(3.2)将登记

本HandlerMethodArgumentResolver
及其他

private List<HandlerMethodArgumentResolver> getDefaultArgumentResolvers() {        List<HandlerMethodArgumentResolver> resolvers = new ArrayList<HandlerMethodArgumentResolver>();    // Annotation-based argument resolution    resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), false));    resolvers.add(new RequestParamMapMethodArgumentResolver());    resolvers.add(new PathVariableMethodArgumentResolver());    resolvers.add(new ServletModelAttributeMethodProcessor(false));    resolvers.add(new RequestResponseBodyMethodProcessor(getMessageConverters()));    resolvers.add(new RequestPartMethodArgumentResolver(getMessageConverters()));    resolvers.add(new RequestHeaderMethodArgumentResolver(getBeanFactory()));    resolvers.add(new RequestHeaderMapMethodArgumentResolver());    resolvers.add(new ServletcookievalueMethodArgumentResolver(getBeanFactory()));    resolvers.add(new expressionValueMethodArgumentResolver(getBeanFactory()));    // Type-based argument resolution    resolvers.add(new ServletRequestMethodArgumentResolver());    resolvers.add(new ServletResponseMethodArgumentResolver());    resolvers.add(new HttpEntityMethodProcessor(getMessageConverters()));    resolvers.add(new RedirectAttributesMethodArgumentResolver());    resolvers.add(new ModelMethodProcessor());    resolvers.add(new MapMethodProcessor());    resolvers.add(new ErrorsMethodArgumentResolver());    resolvers.add(new SessionStatusMethodArgumentResolver());    resolvers.add(new UriComponentsBuilderMethodArgumentResolver());    // Custom arguments    if (getCustomArgumentResolvers() != null) {        resolvers.addAll(getCustomArgumentResolvers());    }    // Catch-all    resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), true));    resolvers.add(new ServletModelAttributeMethodProcessor(true));    return resolvers;}

当Spring需要调用你的处理程序方法时,它将遍历参数类型和上面的列表,并使用第一个that supportsParameter()。

请注意,ServletModelAttributeMethodProcessor已添加的两个实例(在//catch all注释后添加一个)。该ModelAttributeMethodProcessor有一个annotationNotRequired场,告诉它,如果它应该寻找@ModelAttribute与否。第一个实例必须寻找@ModelAttribute,第二个实例不寻找。Spring这样做是为了你可以注册自己的HandlerMethodArgumentResolver实例,请参见// Custom arguments注释。

特别

@RequestMapping(value = "/", method = RequestMethod.POST)public String sayHello(Person person, Model model) {    model.addAttribute("person", person);    return "home";}

在这种情况下,Person参数是否带注释都没有关系。A ModelAttributeMethodProcessor将解决它并绑定表单字段,即。向实例的字段请求参数。你甚至无需将其添加到中,model因为ModelAttributeMethodProcessor该类将处理该问题。

用你的showHelloPage()方法

model.addAttribute("person", new Person());

<form>taglib
需要。这就是它解决其input领域的方式。

所以我的问题是-“ ModelAttribute”注释的用途是什么?

将指定的参数(或方法返回值)自动添加到模型中。

是否可以通过某种方式省略表单中的“ modelAttribute”属性?

否,该form绑定在中查找对象,Model并将其字段绑定到html input元素。

第二部分,使表单自动将输入的值绑定到适当的bean的属性(将其声明为方法参数)的方式(也许是一些注释)是什么?在发送表单之前无需添加空bean(因为我现在必须这样做)。

Spring <form>
标记锁存到模型属性对象上,并使用其字段来创建input和label元素。只要对象完成,对象如何最终出现在模型中都没有关系。如你所见,如果找不到指定名称(键)的模型属性,则会引发异常。

 <form:form method="post" modelAttribute="person">

提供空bean的替代方法是自己创建html。Spring的全部

<form>
工作就是使用bean的字段名称创建一个
input
元素。所以这

<form:form method="post" modelAttribute="person">    <form:label path="firstName">First name</form:label>    <form:input path="firstName" />

创建类似

<form method="post" action="[some action url]">    <label for="firstName">First name<label>    <input type="text" name="firstName" value="[whatever value firstName field had]" />    ...

Spring使用name属性将请求参数绑定到实例字段。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/432123.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号