Spring MVC中@ModelAttribute
的用途和用法是什么?
答案 0 :(得分:376)
@ModelAttribute
指的是Model对象的属性(MVC中的M;)
所以我们假设我们有一个带有表单支持对象的表单,称为“Person”
然后,您可以让Spring MVC使用@ModelAttribute
注释将此对象提供给Controller方法:
public String processForm(@ModelAttribute("person") Person person){
person.getStuff();
}
Check here示例(Spring 2.5),另见"Using @ModelAttribute on a method argument"(Spring 3.1)。
另一方面,注释用于定义应该成为模型一部分的对象。 因此,如果您希望在模型中引用Person对象,则可以使用以下方法:
@ModelAttribute("person")
public Person getPerson(){
return new Person();
}
这个带注释的方法将允许访问View中的Person对象,因为它会自动添加到Spring的Models中。
见"Using @ModelAttribute on a method"(春季3.1)。
希望这会有所帮助。
答案 1 :(得分:125)
我知道这是一个老话题,但我想我把帽子戴在戒指上,看看我是否能把水弄得更干净了一些:)
我发现我最初理解@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
成为一个包罗万象的注释;没有人想看到一个注释smorgasbord。
答案 2 :(得分:22)
对于我的风格,我总是使用@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)
并且书的每个字段名称必须与表单
的子元素中的路径匹配答案 3 :(得分:17)
所以我会尝试以更简单的方式解释它。我们有:
public class Person {
private String name;
public String getName() {
return name;
}
public void setName(final String name) {
this.name = name;
}
}
如Spring MVC文档中所述 - @ModelAttribute 注释可用于方法或方法参数。当然,我们可以在一个控制器中同时使用它们。
1.Method annotation
@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(键:值))。控制器中的 @ModelAttribute 方法在同一控制器中的 @RequestMapping 方法之前调用。
这里我们要添加模型常用信息,这些信息将在表单中用于向用户显示。例如,它可用于填充HTML选择:
2.Method参数
public String findPerson(@ModelAttriute(value="person") Person person) {
//..Some logic with person
return "person.jsp";
}
方法参数上的@ModelAttribute指示应从模型中检索参数。因此,在这种情况下,我们希望我们在模型 person 对象中作为键,我们希望获取其值并将其放入方法参数 Person person 。如果不存在或(有时你拼错了(value =&#34; persson&#34;))那么Spring将不会在模型中找到它并使用其默认值创建空Person对象。然后将获取请求参数并尝试使用其名称将数据绑定到Person对象中。
name="Dmitrij"&countries=Lesoto&sponsor.organization="SilkRoad"&authorizedFunds=&authorizedHours=&
因此我们有名称,它将使用setName(String name)绑定到Person.name。所以在
//..Some logic with person
我们可以使用价值&#34; Dimitrij&#34;来访问这个填充的名称。
当然Spring可以绑定更复杂的对象,如Lists,Maps,Map of Sets of Maps等等,但在场景后面,它会使数据绑定变得神奇。
我们可以同时在参数中使用@ModelAttribute建模带注释的方法和请求方法处理程序。然后我们必须结合规则。
当然我们有很多不同的情况 - @ModelAttribute方法也可以在@ControllerAdvice中定义,等等......
答案 4 :(得分:9)
我知道我迟到了,但我会像他们说的那样引用, &#34;最好迟到而不是#34;。让我们开始吧 每个人都有自己的方式来解释事情,让我尝试总结一下,并通过一个例子在几个步骤中为你简单化; 假设您有一个简单的表单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>
路径=&#34;的firstName&#34; 路径=&#34; lastName的&#34; 这些是StudentClass中的字段/属性 当表单被调用时,他们的getter被调用但是一旦被提交,他们的setter被调用并且他们的值被设置在modelAttribute =&#34; student&#34;中指定的bean中。在表格标签中。
我们有StudentController,包括以下方法;
@RequestMapping("/showForm")
public String showForm(Model theModel){ //Model is used to pass data between
//controllers and views
theModel.addAttribute("student", new Student()); //attribute name, value
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视图。
实际发生的是它获取由其提交的ur表单的所有值,然后保存它们以便绑定或将它们分配给对象。 它的作用与 @RequestParameter 相同,我们只获取参数并将值分配给某个字段。 唯一的区别是 @ModelAttribute 包含所有表单数据而不是单个参数。它为您创建了一个bean,用于保存表单提交的数据,供开发人员稍后使用。
回顾整个事情。 步骤1 : 发送一个请求,我们的方法showForm运行,一个模型,一个临时bean设置名称student转发到表单。 theModel.addAttribute(&#34; student&#34;,new Student());
第2步: 的 的ModelAttribute =&#34;学生&#34; 强> 在表单提交模型上更改学生,现在它保存表单的所有参数
第3步: @ModelAttribute(&#34;学生&#34;)学生theStudent 我们获取 @ModelAttribute 所持有的值,并将整个bean /对象分配给Student。
第4步: 然后我们在出价时使用它,就像在页面上显示它一样
我希望它可以帮助您理解这个概念。感谢
答案 5 :(得分:4)
Annotation that binds a method parameter or method return value to a named model attribute, exposed to a web view.
public String add(@ModelAttribute("specified") Model model) {
...
}
答案 6 :(得分:3)
这用于Spring MVC
中的数据绑定目的。让你有一个带有表单元素的jsp,例如
on
JSP
<form:form action="test-example" method="POST" commandName="testModelAttribute"> </form:form>
(Spring Form方法,也可以使用Simple form元素)
在控制器端
@RequestMapping(value = "/test-example", method = RequestMethod.POST)
public ModelAndView testExample(@ModelAttribute("testModelAttribute") TestModel testModel, Map<String, Object> map,...) {
}
现在,当您提交表单时,您可以使用表单字段值。
答案 7 :(得分:2)
@ModelAttribute可以用作方法arguments /参数,也可以在方法声明之前使用。 此批注的主要目标是将请求参数或表单字段绑定到模型对象
答案 8 :(得分:2)
采用任何Web应用程序(无论是Gmail还是Facebook或Instagram或任何其他Web应用程序),都与在最终用户与应用程序或UI与后端应用程序之间交换数据或信息有关。即使在Spring MVC世界中,也有两种交换数据的方法:
我们在这里感兴趣的是如何将数据从UI传递到Controller。这也可以通过两种方式完成:
使用HTML表单: 考虑以下情形,
当我们从Web浏览器提交表单数据时,我们可以将其作为对象访问Controller类中的数据。当我们提交HTML表单时,Spring容器会做四件事。会
要使整个工作正常进行,我们必须遵循某些步骤。
我们首先需要定义一个模型类,例如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";
}
希望这个图解说明有所帮助!
答案 9 :(得分:1)
@ModelAttribute只是将jsp字段中的值绑定到Pojo calss以在控制器类中执行我们的逻辑。如果你熟悉struts,那就像提交时填充formbean对象一样。
答案 10 :(得分:0)
ModelAttribute批注用作Spring MVC Web应用程序的一部分,并且可以在两种情况下使用。
首先,它可以用于将数据注入到JSP之前的加载模型中。这对于确保需要JSP才能显示所有数据本身特别有用。通过将一种方法连接到模型来获得进样。
第二,它可以用于从现有模型中读取数据并将其分配给教练方法的参数。
答案 11 :(得分:0)
在方法级别
1。当在方法级别使用注释时,表示该目的 方法是添加一个或多个模型属性
@ModelAttribute
public void addAttributes(Model model) {
model.addAttribute("india", "india");
}
在方法参数上 1.用作方法参数时,它指示应从模型中检索参数。如果不存在,则应首先实例化,然后将其添加到模型中,然后再添加到模型中,则应从所有具有匹配名称的请求参数中填充arguments字段,以便将表单数据与Bean绑定。
@RequestMapping(value = "/addEmployee", method = RequestMethod.POST)
public String submit(@ModelAttribute("employee") Employee employee) {
return "employeeView";
}
答案 12 :(得分:-1)
function openurl($url, $postvars = "") {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postvars);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, '3');
$content = trim(curl_exec($ch));
curl_close($ch);
return $content;
}
将在给定的示例中使用您@ModelAttribute
指定的名称创建一个属性,Test是bean测试,是对bean的引用,测试将在模型中可用,以便您可以进一步在jsp页面上使用它来检索存储在(@ModelAttribute("Testing") Test test) as Testing
中的值。