Spring的@ModelAttribute注解

1.

一、绑定请求参数到指定对象

Java代码  

  1. public String test1(@ModelAttribute("user") UserModel user)

只是此处多了一个注解@ModelAttribute("user"),它的作用是将该绑定的命令对象以“user”为名称添加到模型对象中供视图页面展示使用。我们此时可以在视图页面使用${user.username}来获取绑定的命令对象的属性。

如请求参数包含“?username=zhang&password=123&workInfo.city=bj”自动绑定到user 中的workInfo属性的city属性中。

Java代码  

  1. @RequestMapping(value="/model2/{username}")
  2. public String test2(@ModelAttribute("model") DataBinderTestModel model)

URI 模板变量也能自动绑定到命令对象中, 当你请求的URL 中包含“bool=yes&schooInfo.specialty=computer&hobbyList[0]=program&hobbyList[1]=music&map[key1]=value1&map[key2]=value2&state=blocked”会自动绑定到命令对象上。当URI模板变量和请求参数同名时,URI模板变量具有高优先权。

二、暴露表单引用对象为模型数据

Java代码  

  1. /**
  2. * 设置这个注解之后可以直接在前端页面使用hb这个对象(List)集合
  3. * @return
  4. */
  5. @ModelAttribute("hb")
  6. public List<String> hobbiesList(){
  7. List<String> hobbise = new LinkedList<String>();
  8. hobbise.add("basketball");
  9. hobbise.add("football");
  10. hobbise.add("tennis");
  11. return hobbise;
  12. }

JSP页面展示出来

Java代码  

  1. <br>
  2. 初始化的数据 :    ${hb }
  3. <br>
  4. <c:forEach items="${hb}" var="hobby" varStatus="vs">
  5. <c:choose>
  6. <c:when test="${hobby == ‘basketball‘}">
  7. 篮球<input type="checkbox" name="hobbies" value="basketball">
  8. </c:when>
  9. <c:when test="${hobby == ‘football‘}">
  10. 足球<input type="checkbox" name="hobbies" value="football">
  11. </c:when>
  12. <c:when test="${hobby == ‘tennis‘}">
  13. 网球<input type="checkbox" name="hobbies" value="tennis">
  14. </c:when>
  15. </c:choose>
  16. </c:forEach>

备注:

1、通过上面这种方式可以显示出一个集合的内容

2、上面的jsp代码使用的是JSTL,需要导入JSTL相关的jar包

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

三、暴露@RequestMapping方法返回值为模型数据

Java代码  

  1. public @ModelAttribute("user2") UserModel test3(@ModelAttribute("user2") UserModel user)

大家可以看到返回值类型是命令对象类型,而且通过@ModelAttribute("user2")注解,此时会暴露返回值到模型数据( 名字为user2 ) 中供视图展示使用

@ModelAttribute 注解的返回值会覆盖@RequestMapping 注解方法中的@ModelAttribute 注解的同名命令对象

2.

@ModelAttribute使用详解

[email protected]注释方法 
    例子(1),(2),(3)类似,被@ModelAttribute注释的方法会在此controller每个方法执行前被执行,因此对于一个controller映射多个URL的用法来说,要谨慎使用。
    
    (1)@ModelAttribute注释void返回值的方法

[java] view plain copy

print?

  1. <span style="font-size:12px;">@Controller
  2. public class HelloWorldController {
  3. @ModelAttribute
  4. public void populateModel(@RequestParam String abc, Model model) {
  5. model.addAttribute("attributeName", abc);
  6. }
  7. @RequestMapping(value = "/helloWorld")
  8. public String helloWorld() {
  9. return "helloWorld";
  10. }
  11. }</span>
  12. <span style="font-size:12px;">
  13. </span>

这个例子,在获得请求/helloWorld 后,populateModel方法在helloWorld方法之前先被调用,它把请求参数(/helloWorld?abc=text)加入到一个名为attributeName的model属性中,在它执行后helloWorld被调用,返回视图名helloWorld和model已由@ModelAttribute方法生产好了。
这个例子中model属性名称和model属性对象有model.addAttribute()实现,不过前提是要在方法中加入一个Model类型的参数。
    当URL或者post中不包含次参数时,会报错,其实不需要这个方法,完全可以把请求的方法写成,这样缺少此参数也不会出错

[java] view plain copy

print?

  1. <span style="font-size:12px;">       @RequestMapping(value = "/helloWorld")
  2. public String helloWorld(String abc) {
  3. return "helloWorld";
  4. }</span>
  5. <span style="font-size:12px;">
  6. </span>

(2)@ModelAttribute注释返回具体类的方法

[java] view plain copy

print?

  1. <span style="font-size:12px;">@ModelAttribute
  2. public Account addAccount(@RequestParam String number) {
  3. return accountManager.findAccount(number);
  4. }
  5. </span>
  6. <span style="font-size:12px;">
  7. </span>

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

[java] view plain copy

print?

  1. <span style="font-size:12px;">@Controller
  2. public class HelloWorldController {
  3. @ModelAttribute("attributeName")
  4. public String addAccount(@RequestParam String abc) {
  5. return abc;
  6. }
  7. @RequestMapping(value = "/helloWorld")
  8. public String helloWorld() {
  9. return "helloWorld";
  10. }
  11. }</span>
  12. <span style="font-size:12px;">
  13. </span>

这个例子中使用@ModelAttribute注释的value属性,来指定model属性的名称。model属性对象就是方法的返回值。它无须要特定的参数。
    
    (4)@ModelAttribute和@RequestMapping同时注释一个方法

[java] view plain copy

print?

  1. <span style="font-size:12px;">@Controller
  2. public class HelloWorldController {
  3. @RequestMapping(value = "/helloWorld.do")
  4. @ModelAttribute("attributeName")
  5. public String helloWorld() {
  6. return "hi";
  7. }
  8. }</span>
  9. <span style="font-size:12px;">
  10. </span>

这时这个方法的返回值并不是表示一个视图名称,而是model属性的值,视图名称由RequestToViewNameTranslator根据请求"/helloWorld.do"转换为逻辑视图helloWorld。
    Model属性名称有@ModelAttribute(value=””)指定,相当于在request中封装了key=attributeName,value=hi。
    
[email protected]注释一个方法的参数

(1)从model中获取

[java] view plain copy

print?

  1. <span style="font-size:12px;">@Controller
  2. public class HelloWorldController {
  3. @ModelAttribute("user")
  4. public User addAccount() {
  5. return new User("jz","123");
  6. }
  7. @RequestMapping(value = "/helloWorld")
  8. public String helloWorld(@ModelAttribute("user") User user) {
  9. user.setUserName("jizhou");
  10. return "helloWorld";
  11. }
  12. }</span>
  13. <span style="font-size:12px;">
  14. </span>

在这个例子里,@ModelAttribute("user") User user注释方法参数,参数user的值来源于addAccount()方法中的model属性。
    此时如果方法体没有标注@SessionAttributes("user"),那么scope为request,如果标注了,那么scope为session
    
    (2)从Form表单或URL参数中获取(实际上,不做此注释也能拿到user对象)

[java] view plain copy

print?

  1. <span style="font-size:12px;">@Controller
  2. public class HelloWorldController {
  3. @RequestMapping(value = "/helloWorld")
  4. public String helloWorld(@ModelAttribute User user) {
  5. return "helloWorld";
  6. }
  7. }</span>
  8. <span style="font-size:12px;">
  9. </span>
时间: 2024-08-07 12:58:57

Spring的@ModelAttribute注解的相关文章

Spring MVC @ModelAttribute注解

在一个Controller内,被@ModelAttribute标注的方法会在此controller的每个handler方法执行前被执行. 被@ModelAttribute标注的方法的参数绑定规则和普通handler方法相同. 可以理解为: 请求到达Controller后,不论其他handler方法的RequestMapping值是多少,请求都会路由至被@ModelAttribute标注的方法: 由springMVC再对request执行一次forward,路由至真正的handler方法. @Mo

Spring MVC之@ModelAttribute注解的使用

@ModelAttribute注解的作用 Spring MVC提供了几种将数据添加到模型的方式:使用ModelMap/Model类型的方法参数.方法体内创建ModelAndView实例,如下代码片段所示: @RequestMapping(value = "/login.htm", method = RequestMethod.GET) public String doLogin(ModelMap modelMap) { BaseMember mockMember = new BaseM

Spring - @ModelAttribute注解的使用

@ModelAttribute注解的使用 在SpringMVC的Controller中使用@ModelAttribute时,其位置包括下面三种: 应用在方法上 应用在方法的参数上 应用在方法上,并且方法也使用了@RequestMapping 应用在方法上 首先说明一下,被@ModelAttribute注解的方法会在Controller每个方法执行之前都执行,因此对于一个Controller中包含多个URL的时候,要谨慎使用. 1)使用@ModelAttribute注解无返回值的方法 @Contr

Spring MVC常用注解

cp by http://www.cnblogs.com/leskang/p/5445698.html 1.@Controller 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ,然后再把该Model 返回给对应的View 进行展示.在SpringMVC 中提供了一个非常简便的定义Controller 的方法,你无需继承特定的类或实现特定的接口,只需使用@Control

spring mvc 常用注解标签详解

1.@Controller 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ,然后再把该Model 返回给对应的View 进行展示.在SpringMVC 中提供了一个非常简便的定义Controller 的方法,你无需继承特定的类或实现特定的接口,只需使用@Controller 标记一个类是Controller ,然后使用@RequestMapping 和@RequestP

Spring中常用注解的介绍

spring中使用注解时配置文件的写法: <?xml version="1.0" encoding="UTF-8"?> <span style="font-size:18px;"><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-in

spring mvc常用注解总结

1.@RequestMapping@RequestMappingRequestMapping是一个用来处理请求地址映射的注解(将请求映射到对应的控制器方法中),可用于类或方法上.用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径.RequestMapping请求路径映射,如果标注在某个controller的类级别上,则表明访问此类路径下的方法都要加上其配置的路径:最常用是标注在方法上,表明哪个具体的方法来接受处理某次请求. @Controller @RequestMapping(val

spring的@ControllerAdvice注解

@ControllerAdvice注解是Spring3.2中新增的注解,学名是Controller增强器,作用是给Controller控制器添加统一的操作或处理. 对于@ControllerAdvice,我们比较熟知的用法是结合@ExceptionHandler用于全局异常的处理,但其作用不止于此.ControllerAdvice拆开来就是Controller Advice,关于Advice,在Spring的AOP中,是用来封装一个切面所有属性的,包括切入点和需要织入的切面逻辑.这里Contro

springmvc在使用@ModelAttribute注解获取Request和Response会产生线程并发不安全问题(转)

springmvc在获取Request和Response有很多方式:具体请看:https://www.cnblogs.com/wade-luffy/p/8867144.html 产生线程问题的代码如下: public class BaseController { protected HttpServletRequest request; protected HttpServletResponse response; protected HttpSession session; @ModelAtt