`

spring mvc 中的@modelattributes

 
阅读更多
@ModelAttribute一个具有如下三个作用:
①绑定请求参数到命令对象:放在功能处理方法的入参上时,用于将多个请求参数绑定到一个命令对象,从而简化绑定流程,而且自动暴露为模型数据用于视图页面展示时使用;
②暴露表单引用对象为模型数据:放在处理器的一般方法(非功能处理方法)上时,是为表单准备要展示的表单引用对象,如注册时需要选择的所在城市等,而且在执行功能处理方法(@RequestMapping注解的方法)之前,自动添加到模型对象中,用于视图页面展示时使用;
③暴露@RequestMapping方法返回值为模型数据:放在功能处理方法的返回值上时,是暴露功能处理方法的返回值为模型数据,用于视图页面展示时使用。

1 暴露表单引用对象为模型数据
    在 controller 中所有的方法执行前执行

比如是为表单准备要展示的表单引用对象,如注册时需要选择的所在城市等,而且在执行功能处理方法

@ModelAttribute("cityList")
public List<String> cityList() {
    return Arrays.asList("北京", "山东");
}

比如:
 /** 
     * 获得所有Addresses,并使他们成为一个model.  
     * 注意@ModelAttribute作用于method级别上时.会在@Controller执行时加载 
     * method里的方法.即在@Controller执行时@ModelAttribute添加参数. 
     * 返回于该@Controller返回的所有JSP页面. 
     */  
    @ModelAttribute("addresses")  
    public List<Address> getAllAddresses() {  
        return addressService.getAll();  
    }  
  
    /** 
     * 处理和检索一个包含addresses 的JSP Page . 
     */  
    @RequestMapping(value = "list1", method = RequestMethod.GET)  
    public String getAllUsingModelAttribute() {  
        logger.debug("Received request to show all addresses page");  
  
        // 他会解析 /WEB-INF/jsp/addressespage.jsp  
        return "addressespage";  
    }  
  
    /** 
     * 处理和检索一个包含addresses 的JSP Page . 
     *  
     * @return the name of the JSP page 
     */  
    @RequestMapping(value = "list2", method = RequestMethod.GET)  
    public String getAllUsingModel(Model model) {  
        logger.debug("Received request to show all addresses page");  
  
        // 检索所有的address并装入model返回addressespage.jsp  
        model.addAttribute("addresses", addressService.getAll());  
        model.addAttribute("greetings", "I came from Model not ModelAttribute");  
  
        // This will resolve to /WEB-INF/jsp/addressespage.jsp  
        return "addressespage";  
    }  


则访问
http://localhost:8080/spring-jsp/address/list1
时,会自动先执行
public List<Address> getAllAddresses() 方法,并且放到
addresses中,交给JSP页面取出

而在http://localhost:8080/spring-jsp/address/list2 中
则只是用
model.addAttribute实现

2) 模式2:method parameter级(即方法里所带的参数)
   如果你的方法参数里带有@ModelAttribute的参数.表示从JSP Page传回的参数并自动的转化为java对象
 
/**
	 * 检索修改页面
	 */
	@RequestMapping(value = "/edit/{id}", method = RequestMethod.GET)
	public String getEdit(@PathVariable Integer id, Model model) {
		/*
		 * @PathVariable表示指定@RequestMapping的URL模板中{}里的值 
		 * 相当于以前我们URL后面传的参数如XX?id=XXXX .
		 * 但是现在我们可以用 XX/id/XX来代替. 
		 * 这个就是REST风格的URL,我们可以实现非常复杂的URL模板
		 */

		logger.debug("Received request to show edit page");

		/*
		 * 根据ID检索出对应的Person,然后把检索出来的Person放入一个叫
		 * "personAttribute"的model中.
		 * 这样editpage.jsp就会接收一个 名为personAttribute的参数.
		 * 相当于request.setAttribute("XX",XX)
		 */
		model.addAttribute("personAttribute", personService.get(id));

		// This will resolve to /WEB-INF/jsp/editpage.jsp
		return "editpage";
	}

	/**
	 * 保存修改结果
	 */
	@RequestMapping(value = "/edit/{id}", method = RequestMethod.POST)
	public String saveEdit(@ModelAttribute("personAttribute") Person person,
			@PathVariable Integer id, Model model) {
		logger.debug("Received request to update person");

		// 我们从页面接收到了一个名为"personAttribute"的model并命名为person
		// 同样我们也获得了指定的id.
		person.setId(id);

		// 更新person
		personService.edit(person);

		// 在更新后我们重新显示所有Person 的页面
		model.addAttribute("persons", personService.getAll());

		// This will resolve to /WEB-INF/jsp/personspage.jsp
		return "personspage";
	}


对于前端的页面JSP
编辑个人信息的页面:
 
<form:form modelAttribute="personAttribute" method="POST" action="${saveUrl}">  
    <table>  
        <tr>  
            <td><form:label path="id">Id:</form:label></td>  
            <td><form:input path="id" disabled="true"/></td>  
        </tr>  

   所以说,在参数中,加了@modelattributes后,
  public String saveEdit(@ModelAttribute("personAttribute") Person person,  
      @PathVariable Integer id, Model model) {
中 表示从JSP 页面返回的一个叫"personAttribute"的值.并自动的转化为Person对象.

3 其他
   匿名绑定命令参数
public String test4(@ModelAttribute UserModel user, Model model)

public String test5(UserModel user, Model model)
此时我们没有为命令对象提供暴露到模型数据中的名字,此时的名字是什么呢?Spring Web MVC自动将简单类名(首字母小写)作为名字暴露,如“cn.javass.chapter6.model.UserModel”暴露的名字为“userModel”。
public @ModelAttribute List<String> test6()

public @ModelAttribute List<UserModel> test7()
对于集合类型(Collection接口的实现者们,包括数组),生成的模型对象属性名为“简单类名(首字母小写)”+“List”,如List<String>生成的模型对象属性名为“stringList”,List<UserModel>生成的模型对象属性名为“userModelList”。

其他情况一律都是使用简单类名(首字母小写)作为模型对象属性名,如Map<String, UserModel>类型的模型对象属性名为“map”。

@ModelAttribute
    public Account addAccount(@RequestParam String number) {
       return accountManager.findAccount(number);
    }


这种情况,model属性的名称没有指定,它由返回类型隐含表示,如这个方法返回Account类型,那么这个model属性的名称是account。
    这个例子中model属性名称有返回对象类型隐含表示,model属性对象就是方法的返回值。它无须要特定的参数。

分享到:
评论

相关推荐

    Spring-MVC-model

    在 Spring MVC 中,Model 是核心组件之一,负责处理业务逻辑和数据管理。下面我们将深入探讨 Spring MVC 中的 Model 概念。 1. **Model 对象**:在 Spring MVC 中,Model 对象是用于存储和传递应用程序数据的 Java ...

    Spring-MVC-model(1)

    Spring MVC允许我们使用`Model`接口的`addAttributes()`方法添加多个模型对象,这些对象可以在同一个视图中访问。 8. **模型和视图分离(Separation of Concerns)** Spring MVC的模型-视图-控制器架构确保了模型...

    Spring mvc 教程

    ### Spring MVC 教程知识点详解 #### Spring Web MVC 框架简介 Spring Web MVC 是 Spring Framework 的一个重要组成部分,主要用于构建基于 Java 的 Web 应用程序。它提供了一个灵活且强大的 MVC 实现,使得开发者...

    spring学习: spring mvc在redirect请求中传递数据

    以上就是关于“spring学习:spring mvc在redirect请求中传递数据”的详细解析,涵盖了重定向的基本原理、Spring MVC的`RedirectAttributes`接口、Flash Attributes的使用,以及在实际开发中的应用和注意事项。...

    Spring-MVC-step-by-step2.rar

    在实际开发中,我们通常会用到 Spring MVC 提供的一些工具类,如 Model、RedirectAttributes 和 FlashAttributes,它们帮助我们在处理请求之间传递数据。Model 用于在 Controller 和 View 之间共享数据,...

    Spring MVC实战系列教程(2)--常用请求参数接收方式

    本教程将深入探讨Spring MVC中常用的请求参数接收方式。通过实践案例`ParamPassDemo.java`,我们将了解到几种常见的方法,以便在控制器中获取用户提交的数据。 1. **路径变量(Path Variables)** 当URL路径中包含...

    Spring MVC— 处理器(Handler)方法的返回值.docx

    在Spring MVC框架中,处理器(Handler)方法是处理用户请求的核心组件。这些方法通常定义在@Controller注解的类中,并通过@RequestMapping或其相关的注解来指定处理特定HTTP请求的路径。处理器方法的返回值非常关键...

    SpringMVC PDF

    SpringMVC作为Spring框架中的一个重要组件,为构建Web应用提供了一种模型-视图-控制器(Model-View-Controller,简称MVC)的实现方式。本SpringMVC学习文档主要分为以下几部分: 1. Spring Web MVC框架简介:文档首先...

    spring-mvc-documentation-linesh-translation

    **Spring Web MVC** 是 Spring 框架中的一个重要模块,它实现了 MVC(Model-View-Controller)设计模式,并且提供了丰富的功能来帮助开发者构建强大的 Web 应用程序。 #### 新特性 - **允许其他MVC实现**: Spring ...

    SpringMVC 教程

    在深入学习 Spring MVC 时,还需要了解其他关键概念,如拦截器(Interceptor)、模型属性(Model Attributes)、数据绑定、异常处理、国际化支持等。同时,熟悉 RESTful API 设计原则和 JSON 数据交换格式,可以使 ...

    spring学习之@SessionAttributes实例解析

    在Spring MVC中,`@SessionAttributes`是一个非常实用的注解,它允许我们将ModelMap中的特定属性持久化到HTTP Session中,以便在多个请求之间共享数据。这在处理需要跨请求保持状态的情况时非常有用,比如用户登录...

    0622处理模型数据.zip

    1. **模型(Model)**:在Spring MVC中,模型对象是业务逻辑层的数据载体,通常由服务层方法返回,包含了应用程序状态。这些对象可以是简单的JavaBean或POJO(Plain Old Java Object),封装了业务数据。 2. **模型...

    SpringMVC 常用注解类视频详解

    12. `@RequestParam/@PathVariable/@ModelAttribute`的集合注解如`@RequestParams`, `@PathVariables`, `@ModelAttributes`,允许一次性处理多个参数。 13. `@RequestBody`:用于读取HTTP请求体中的JSON或XML数据,...

    Java Springmvc 练习来自国外教育平台lynda

    在Spring MVC中,可以通过`Model`或`ModelMap`对象将数据添加到模型中,这些数据随后可以在视图中使用。 5. **视图(View)** 视图负责呈现模型数据。Spring MVC支持多种视图技术,如JSP、Thymeleaf、FreeMarker等。...

    springMvc中文文档

    Spring MVC是Spring框架的一部分,专门用于构建Web应用程序的MVC(Model-View-Controller)框架。它提供了构建Web层的便捷方式,并且与Spring的其他技术无缝整合。 文档内容涵盖了Spring Web MVC框架的简介,包括...

    SpringMVC后台接收请求参数的几种方式Demo

    在Spring MVC中,我们可以使用`@PathVariable`注解来捕获URL模板中的动态部分。例如,一个RESTful API可能有一个获取用户信息的路径`/users/{userId}`,其中`userId`就是路径变量。通过以下代码接收该参数: ```...

    Manning.Spring.in.Action.4th.Edition.2014.11.epub

    7.1. Alternate Spring MVC configuration 7.1.1. Customizing DispatcherServlet configuration 7.1.2. Adding additional servlets and filters 7.1.3. Declaring DispatcherServlet in web.xml 7.2. Processing ...

    spring2.5所用到的jar包

    5. **Web应用增强**: Spring 2.5对MVC框架进行了大量改进,包括支持RESTful风格的URL映射、模型视图助手(model attributes)、局部视图路径(local view resolution)等,提高了Web应用的开发效率和灵活性。 6. **数据...

    sprinmvc jsp与java的几种相互传参的方式

    在Spring MVC框架中,JSP(JavaServer Pages)与Java之间的数据传递是Web开发中的常见操作。本项目可能是一个Eclipse导出的Spring MVC应用,使用的`spring-webmvc-4.2.5.RELEASE`是Spring MVC的核心库,用于处理HTTP...

Global site tag (gtag.js) - Google Analytics