Spring MVC中@ModelAttribute
的用途和用途是什么?
@ModelAttribute
指的是 Model 对象的一个属性(MVC 中的 M ;)所以假设我们有一个表单,它有一个名为“Person”的表单支持对象,那么您可以让 Spring MVC 通过以下方式将此对象提供给 Controller 方法使用 @ModelAttribute
注释:
public String processForm(@ModelAttribute("person") Person person){
person.getStuff();
}
另一方面,注释用于定义应该是模型一部分的对象。因此,如果您想在 Model 中引用 Person 对象,可以使用以下方法:
@ModelAttribute("person")
public Person getPerson(){
return new Person();
}
这个带注释的方法将允许访问 View 中的 Person 对象,因为它会被 Spring 自动添加到模型中。
我知道这是一个旧线程,但我想我把帽子扔进擂台上,看看我能不能把水弄得更混一点:)
我发现我最初难以理解 @ModelAttribute
是因为 Spring 决定将多个注释合并为一个。将其拆分为几个较小的注释后,它变得更加清晰:
对于参数注释,将 @ModelAttribute
视为 @Autowired + @Qualifier
的等价物,即它尝试从 Spring 托管模型中检索具有给定名称的 bean。如果没有找到命名的bean,它不会抛出错误或返回null
,而是隐含地扮演@Bean
的角色,即使用默认构造函数创建一个新实例并将bean 添加到模型中。
对于方法注解,将@ModelAttribute
视为@Bean + @Before
的等价物,即将用户代码构造的bean 放入模型中,并且总是在请求处理方法之前调用它。
形象地说,我认为 @ModelAttribute
如下(请不要按字面意思理解!!):
@Bean("person")
@Before
public Person createPerson(){
return new Person();
}
@RequestMapping(...)
public xxx handlePersonRequest( (@Autowired @Qualifier("person") | @Bean("person")) Person person, xxx){
...
}
如您所见,Spring 做出了正确的决定,让 @ModelAttribute
成为一个包罗万象的注释;没有人愿意看到注释大杂烩。
@Scope("request")
然后 :)
所以我会尝试用更简单的方式来解释它。让我们:
public class Person {
private String name;
public String getName() {
return name;
}
public void setName(final String name) {
this.name = name;
}
}
如 Spring MVC 文档中所述 - @ModelAttribute 注释可用于方法或方法参数。当然,我们可以在一个控制器中同时使用两者。
1.方法注解
@ModelAttribute(“cities”)
public List<String> checkOptions(){
return new Arrays.asList(new[]{“Sofia”,”Pleven","Ruse”});//and so on
}
这种方法的目的是在模型中添加属性。因此,在我们的例子中,cities 键将列表 new Arras.asList(new[]{“Sofia”,”Pleven","Ruse”})
作为模型中的值(您可以将模型视为 map(key:value))。控制器中的 @ModelAttribute 方法在同一控制器中的 @RequestMapping 方法之前调用。
在这里,我们要向模型中添加公共信息,这些信息将在表单中显示给用户。例如,它可用于填充 HTML 选择:
https://i.stack.imgur.com/huLxb.png
2.方法参数
public String findPerson(@ModelAttriute(value="person") Person person) {
//..Some logic with person
return "person.jsp";
}
方法参数上的 @ModelAttribute 指示应从模型中检索该参数。因此,在这种情况下,我们希望我们在 Model 中的 person 对象作为键,我们想要获取它的值并将其放入方法参数 Person person。如果这样不存在或(有时您拼错了 (value="persson")),那么 Spring 将不会在模型中找到它,并将使用其默认值创建空的 Person 对象。然后将获取请求参数并尝试使用它们的名称将它们数据绑定到 Person 对象中。
name="Dmitrij"&countries=Lesoto&sponsor.organization="SilkRoad"&authorizedFunds=&authorizedHours=&
所以我们有了名字,它将使用 setName(String name) 绑定到 Person.name。所以在
//..Some logic with person
我们可以使用值“Dimitrij”访问这个填充名称。
当然 Spring 可以绑定更复杂的对象,例如 Lists、Maps、List of Sets of Maps 等等,但在幕后它使数据绑定变得神奇。
我们可以同时在参数中使用 @ModelAttribute 对带注释的方法和请求方法处理程序进行建模。然后我们必须联合规则。当然,我们有很多不同的情况 - @ModelAttribute 方法也可以在 @ControllerAdvice 中定义等等......
对于我的风格,我总是使用 @ModelAttribute 从 spring form jsp 中捕获对象。例如,我在 jsp 页面上设计表单,该表单与 commandName 一起存在
<form:form commandName="Book" action="" methon="post">
<form:input type="text" path="title"></form:input>
</form:form>
我用下面的代码在控制器上捕获对象
public String controllerPost(@ModelAttribute("Book") Book book)
并且书的每个字段名称必须与表单子元素中的路径匹配
catch
动词准确地描述了 @ModelAttribute
所做的工作。好的。
我知道我迟到了,但我会像他们说的那样引用“迟到总比没有好”。所以让我们开始吧,每个人都有自己的解释方式,让我试着总结一下,并通过一个例子为你分几步简单;假设您有一个简单的表单 form.jsp
:
<form:form action="processForm" modelAttribute="student">
First Name : <form:input path="firstName" />
<br/><br/>
Last Name : <form:input path="lastName" />
<br/><br/>
<input type="submit" value="submit"/>
</form:form>
<form:input path="firstName" />
<form:input path="lastName" />
这些是 Student 类中的字段/属性。当表单被调用/初始化时,它们的 getter 被调用。在表单提交时,它们的设置器被调用,它们的值在表单标记中用 modelAttribute="student"
指示的 bean 中传输。
我们有 StudentController
,其中包括以下方法:
@RequestMapping("/showForm")
// `Model` is used to pass data between controllers and views
public String showForm(Model theModel) {
// attribute name, value
theModel.addAttribute("student", new Student());
return "form";
}
@RequestMapping("/processForm")
public String processForm(@ModelAttribute("student") Student theStudent) {
System.out.println("theStudent :"+ theStudent.getLastName());
return "form-details";
}
//@ModelAttribute("student") Student theStudent
//Spring automatically populates the object data with form data
//all behind the scenes
现在我们终于有了一个 form-details.jsp
:
<b>Student Information</b>
${student.firstName}
${student.lastName}
那么回到 Spring MVC 中的 @ModelAttribute
是什么问题?来自源代码的示例定义,http://www.baeldung.com/spring-mvc-and-the-modelattribute-annotation @ModelAttribute
是一个注释,它将方法参数或方法返回值绑定到命名模型属性,然后将其公开给 Web 视图。
实际发生的是它获取表单中所有由它提交的值,然后保存它们以供您绑定或分配给对象。它像 @RequestParameter
一样工作,我们只获取一个参数并将值分配给某个方法参数。不同之处在于 @ModelAttribute
保存所有表单数据而不是单个参数。它为您创建一个 bean,其中包含表单中提交的数据。
回顾一下整个事情:
第 1 步:
发送一个请求,我们的方法 showForm()
运行,一个模型,一个临时 bean,被设置为名称 student
并转发到表单:
theModel.addAttribute("student", new Student());
第 2 步:
表单属性 modelAttribute="student"
定义了在提交表单时,模型将更新学生并保存表单的所有参数。
第 3 步:
提交表单时,使用参数 @ModelAttribute("student") Student theStudent
调用 processForm()
方法:使用 modelAttribute="student"
获取表单中保存的值并将其分配给 Student
对象中的字段。
第 4 步:然后我们在出价时使用它,就像我在页面上显示它一样
我希望它能帮助你理解这个概念。谢谢
@ModelAttribute
呢?
以任何 Web 应用程序为例,无论是 Gmail、Facebook、Instagram 还是任何其他 Web 应用程序,它都是关于在最终用户与应用程序或 UI 与后端应用程序之间交换数据或信息的。即使在 Spring MVC 世界中,也有两种交换数据的方式:
从 Controller 到 UI,从 UI 到 Controller。
我们在这里感兴趣的是数据是如何从 UI 传递到 Controller 的。这也可以通过两种方式完成:
使用使用查询参数的 HTML 表单。
使用 HTML 表单:考虑以下场景,
https://i.stack.imgur.com/fLdHj.jpg
当我们从 Web 浏览器提交表单数据时,我们可以在 Controller 类中以对象的形式访问该数据。当我们提交 HTML 表单时,Spring 容器会做四件事。它会,
首先使用 request.getParameter 方法读取请求中提交的所有数据。一旦读取它们,它将使用 integer.parseInt、double.parseDouble 和所有其他基于数据数据类型可用的解析方法将它们转换为适当的 Java 类型。解析后,它将创建我们创建的模型类的对象。例如,在这种情况下,提交的是用户信息,我们创建了一个名为 User 的类,Container 将为其创建一个对象,并将自动进入该对象的所有值设置为该对象。然后它将通过将值设置给控制器来移交该对象。
为了让整个事情发挥作用,我们必须遵循某些步骤。
https://i.stack.imgur.com/38qzM.png
我们首先需要定义一个模型类,比如 User,其中的字段数应该与 HTML 表单中的字段数完全匹配。此外,我们在 HTML 表单中使用的名称应该与我们在 Java 类中的名称相匹配。这两点非常重要。名称应匹配,表单中的字段数应与我们创建的类中的字段数匹配。一旦我们这样做了,容器将自动读取进来的数据,创建这个模型的一个对象,设置值并将其交给控制器。要在 Controller 中读取这些值,我们在方法参数上使用 @ModelAttribute 注释。当我们在 Controller 中创建方法时,我们将使用 @ModelAttribute 并向其添加一个参数,该参数将自动获得由 Container 提供的该对象。
下面是一个注册用户的示例代码:
@RequestMapping(value = "registerUser", method = RequestMethod.POST)
public String registerUser(@ModelAttribute("user") User user, ModelMap model) {
model.addAttribute("user", user);
return "regResult";
}
希望这个图解解释有所帮助!
@ModelAttribute 可以用作方法参数/参数或方法声明之前。此注解的主要目的是将请求参数或表单字段绑定到模型对象
参考。 http://www.javabeat.net/modelattribute-spring-mvc/
这用于 Spring MVC
中的数据绑定目的。让你有一个jsp,其中有一个表单元素,例如
在 JSP 上
<form:form action="test-example" method="POST" commandName="testModelAttribute"> </form:form>
(Spring Form方法,也可以使用简单的表单元素)
在控制器端
@RequestMapping(value = "/test-example", method = RequestMethod.POST)
public ModelAndView testExample(@ModelAttribute("testModelAttribute") TestModel testModel, Map<String, Object> map,...) {
}
现在,当您提交表单时,您可以使用表单字段值。
将方法参数或方法返回值绑定到命名模型属性的注释,公开给 Web 视图。
public String add(@ModelAttribute("specified") Model model) {
...
}
@ModelAttribute
将在给定示例中创建一个名称由您指定的属性 (@ModelAttribute("Testing") Test test) as Testing
,Test 是 bean test 是对 bean 的引用,并且 Testing 将在模型中可用,以便您可以在 jsp 页面上进一步使用它检索您存储在 ModelAttribute
中的值。
@ModelAttribute 只是将 jsp 字段中的值绑定到 Pojo calss 以在控制器类中执行我们的逻辑。如果您熟悉 struts,那么这就像在提交时填充 formbean 对象。
ModelAttribute 注解用作 Spring MVC Web 应用程序的一部分,可用于两种场景。
首先,它可以用于将数据注入到预 JSP 加载模型中。这在确保需要 JSP 来显示所有数据本身时特别有用。通过将一种方法连接到模型来获得注入。
其次,它可用于从现有模型中读取数据并将其分配给教练方法的参数。
参考https://dzone.com/articles/using-spring-mvc%E2%80%99s
在方法级别
1.在方法级别使用注解时,表明该方法的目的是添加一个或多个模型属性
@ModelAttribute
public void addAttributes(Model model) {
model.addAttribute("india", "india");
}
在方法参数处 1. 当用作方法参数时,它表示应该从模型中检索参数。当不存在并且应该首先实例化然后添加到模型中并且一旦存在于模型中时,应该从具有匹配名称的所有请求参数填充参数字段因此,它将表单数据与bean绑定。
@RequestMapping(value = "/addEmployee", method = RequestMethod.POST)
public String submit(@ModelAttribute("employee") Employee employee) {
return "employeeView";
}
@ModelAttribute
。@ModelAttribute
?