您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

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

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从@H_434_1@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属性将请求参数绑定到实例字段。

Java 2022/1/1 18:20:14 有522人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶