我在理解Spring 3 MVC中的表单如何工作时遇到问题。
我想做的是创建一个控制器,该控制器将用户名显示给他。我以某种方式做到了,但我真的不了解它是如何工作的。所以..
我有一个看起来像这样的表格:
<form:form method="post" modelAttribute="person">
<form:label path="firstName">First name</form:label>
<form:input path="firstName" />
<br />
<form:label path="lastName">Last name</form:label>
<form:input path="lastName" />
<br />
<input type="submit" value="Submit" />
</form:form>
我也有一个看起来像这样的控制器:
@Controller
public class HomeController {
@RequestMapping(value = "/", method = RequestMethod.GET)
public String showHelloPage(Model model) {
model.addAttribute("person", new Person());
return "home";
}
@RequestMapping(value = "/", method = RequestMethod.POST)
public String sayHello(Person person, Model model) {
model.addAttribute("person", person);
return "home";
}
}
为了向用户显示欢迎消息,我在JSP页面中使用以下代码:
<c:if test="${not empty person.firstName and not empty person.lastName}">
Hello ${person.firstName} ${person.lastName}!
</c:if>
而且行得通(我忽略了XML配置文件,因为它们与问题无关)。
我认为表单中的“ modelAttribute”属性指向应使用输入值(在其“ path”属性中设置)填充的bean变量。但是看起来,它以完全不同的方式工作。如果我删除线
model.addAttribute("person", new Person());
从“ showHelloPage”方法中,我得到一个(公共)异常“ BindingResult或…都没有”。
同样,在开始时,“ sayHello”方法如下所示:
(...)
public String sayHello(@ModelAttribute("person") Person person, Model model) {
(...)
我的意思是,它具有“ ModelAttribute”注释。我添加了它,因为在我阅读的教程中,它始终存在。但是在我删除它之后,一切都像以前一样运作良好。
所以我的问题是 -“ ModelAttribute”注释的用途是什么?是否可以通过某种方式省略表单中的“ modelAttribute”属性?第二部分,使表单自动将输入的值绑定到适当的bean的属性(将其声明为方法参数)的方式(也许是一些注释)是什么?在发送表单之前无需添加空bean(因为我现在必须这样做)。
@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属性将请求参数绑定到实例字段。
问题内容: 我在理解Spring 3 MVC中的表单如何工作时遇到问题。 我想做的是创建一个控制器,该控制器将用户名显示给他。我以某种方式做到了,但我真的不了解它是如何工作的。所以.. 我有一个看起来像这样的表格: 我也有一个看起来像这样的控制器: 为了向用户显示欢迎消息,我在JSP页面中使用以下代码: 而且行得通(我忽略了XML配置文件,因为它们与问题无关)。 我认为表单中的“ modelAtt
大家要切记这一点: 在任何 Single Page App中,js代码都不会产生 一个传统意义的form表单提交!(这会引起整个页面的刷新) 所以,我们往往用事件来实现.(桌面开发思维) 假设,我们在远程有个接口,可以接受别人的留言: URL: http://siwei.me/interface/blogs/add_comment 参数: content: 留言的内容. 请求方式: POST 返回
获取Form变量 通过Action的如下方法可以获取变量: GetSlice GetString GetInt GetBool GetFloat GetFile GetForm 自动映射 通常我们通过http.Request.Form来获得从用户中请求到服务器端的数据,这些数据一般都是采用name,value的形式提交的。xweb默认支持自动将这些变量映射到Action的成员中,并且这种映射支持子
问题内容: 我正在学习AngularJs的学习过程,发现几乎没有任何示例可用于现实世界。 我试图对如何使用最标准的组件提交表单并将其传递给PHP文件有一个清晰的了解。 我的小提琴。 有人在提交简单,无污染的表单方面有什么好的例子吗,这些表单会对我以及其他许多Angularjs初学者有所帮助。 当我说一个干净的表格时,我指的是这样的东西。 我的ng-app代码… 我猜我接下来要问的三个问题是… 我的
Framework7 可以通过ajax自动提交 有两种自动提交方式: 当用户提交了表单 (点击了提交按钮) 或者当通过代码触发了 "submit" 事件 当用户更改了表单的内容,或者当通过代码触发了 "change" 事件 submit时提交表单数据 只需要添加 "ajax-submit" class 在form上,当submit时就会自动通过ajax发送表单数据 <form action="se
用户单击提交按钮或图像按钮时,就会提交表单。使用<input>或<button>都可以定义提交按钮,只要将其type 特性的值设置为"submit"即可,而图像按钮则是通过将<input>的type 特性值设置为"image"来定义的。因此,只要我们单击以下代码生成的按钮,就可以提交表单。 <!-- 通用提交按钮 --> <input type="submit" value="Submit For