`
youyu4
  • 浏览: 440310 次
社区版块
存档分类
最新评论

Spring MVC 之控制器数据绑定

阅读更多

Spring MVC 之控制器数据绑定

 

spring用于绑定数据的注解

 

      1. @RequestParam绑定单个请求参数值;

      2. @PathVariable绑定URI模板变量值;

      3. @CookieValue绑定Cookie数据值

      4. @RequestHeader绑定请求头数据;

      5. @ModelValue绑定参数到命令对象;

      6. @SessionAttributes绑定命令对象到session;

      7. @RequestBody绑定请求的内容区数据并能进行自动类型转换等。

      8. @RequestPart绑定“multipart/data”数据,除了能绑定@RequestParam能做到的请求参数外,还能绑定上传的文件等。

 

 

 

各种注解的用法

 

@RequestParam

 

针对Controller中方法的参数使用的,主要有这些参数:

 

      value:参数名字,即入参的请求参数名字,如username表示请求的参数区中的名字为username的参数的值将传入;

      required:是否必须,默认是true,表示请求中一定要有相应的参数,否则将报404错误码;

      defaultValue:默认值,表示如果请求中没有同名参数时的默认值,默认值可以是SpEL表达式,如“#{systemProperties['java.vm.version']}”。

public String requestparam2(@RequestParam("username") String username)  

public String requestparam4(@RequestParam(value="username",required=false) String username)

public String requestparam5(  
@RequestParam(value="username", required=true, defaultValue="zhang") String username)   

public String requestparam7(@RequestParam(value="role") String roleList)  

public String requestparam7(@RequestParam(value="role") String[] roleList)     

public String requestparam8(@RequestParam(value="list") List<String> list)    

 

 

@PathVariable

 

主要用于从URL中取出参数

@RequestMapping(value="/users/{userId}/topics/{topicId}")  
public String test(  
       @PathVariable(value="userId") int userId,   
       @PathVariable(value="topicId") int topicId)

 

 

@CookieValue

 

用于将请求的Cookie数据映射到功能处理方法的参数上。

public String test(@CookieValue(value="JSESSIONID", defaultValue="") String sessionId)   

public String test2(@CookieValue(value="JSESSIONID", defaultValue="") Cookie sessionId)  

 

 

@RequestHeader

 

用于将请求的头信息区数据映射到功能处理方法的参数上。

@RequestMapping(value="/header")  
public String test(  
       @RequestHeader("User-Agent") String userAgent,  
       @RequestHeader(value="Accept") String[] accepts) 

 

 

 

 

@Value

 

用于将一个SpEL表达式结果映射到到功能处理方法的参数上。

public String test(@Value("#{systemProperties['java.vm.version']}") String jvmVersion) 

 

 

@ModelAttribute

 

绑定请求参数到命令对象。

 

@ModelAttribute的作用有三个:

 

      1. 绑定请求参数到命令对象:将参数绑定到一个对象上,并且这个对象可以让jsp直接使用

 

      2. 暴露表单引用对象为模型数据:放在处理器的一般方法(非功能处理方法)上时,是为表单准备要展示的表单引用对象,如注册时需要选择的所在城市等,而且在执行功能处理方法(@RequestMapping注解的方法)之前,自动添加到模型对象中,用于视图页面展示时使用;

 

      3. 暴露@RequestMapping方法返回值为模型数据:放在功能处理方法的返回值上时,是暴露功能处理方法的返回值为模型数据,用于视图页面展示时使用。

 

      4. 匿名绑定命令参数

 

 

绑定请求参数到命令对象

 

如用户登录,我们需要捕获用户登录的请求参数(用户名、密码)并封装为用户对象,此时我们可以使用@ModelAttribute绑定多个请求参数到我们的命令对象。

 

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

 

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

 

      2. 绑定请求参数到命令对象支持对象图导航式的绑定,如请求参数包含“?username=zhang&password=123&workInfo.city=bj”自动绑定到user中的workInfo属性的city属性中。

 

 

@RequestMapping(value="/model2/{username}")  
public String test2(@ModelAttribute("model") DataBinderTestModel model) {
 当URI模板变量和请求参数同名时,URI模板变量具有高优先权。

 

 

 

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

 

 

@ModelAttribute("cityList")  
public List<String> cityList() {  
    return Arrays.asList("北京", "山东");  
}  
 如上代码会在执行功能处理方法之前执行,并将其自动添加到模型对象中,在功能处理方法中调用Model 入参的containsAttribute("cityList")将会返回true。

 

 

 

@ModelAttribute("user")  //①  
public UserModel getUser(@RequestParam(value="username", defaultValue="") String username) {  
//TODO 去数据库根据用户名查找用户对象  
UserModel user = new UserModel();  
user.setRealname("zhang");  
     return user;  
}  
 如你要修改用户资料时一般需要根据用户的编号/用户名查找用户来进行编辑,此时可以通过如上代码查找要编辑的用户。

 

 

也可以进行一些默认值的处理。

 

 

@RequestMapping(value="/model1") //②  
public String test1(@ModelAttribute("user") UserModel user, Model model)  
       1. 首先执行@ModelAttribute注解的方法,准备视图展示时所需要的模型数据;@ModelAttribute注解方法形式参数规则和@RequestMapping规则一样,如可以有@RequestParam等;

 

 

      2. 执行@RequestMapping注解方法,进行模型绑定时首先查找模型数据中是否含有同名对象,如果有直接使用,如果没有通过反射创建一个,因此②处的user将使用①处返回的命令对象。即②处的user等于①处的user。

 

 

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

 

 

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

 

 

匿名绑定命令参数

 

 

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”。

 

@SessionAttributes

 

绑定命令对象到session

 

 

有时候我们需要在多次请求之间保持数据,一般情况需要我们明确的调用HttpSession的API来存取会话数据,如多步骤提交的表单。Spring Web MVC提供了@SessionAttributes进行请求间透明的存取会话数据。

//1、在控制器类头上添加@SessionAttributes注解  
@SessionAttributes(value = {"user"})    //①  
public class SessionAttributeController   
  
//2、@ModelAttribute注解的方法进行表单引用对象的创建  
@ModelAttribute("user")    //②  
public UserModel initUser()   
  
//3、@RequestMapping注解方法的@ModelAttribute注解的参数进行命令对象的绑定  
@RequestMapping("/session1")   //③  
public String session1(@ModelAttribute("user") UserModel user)  
  
//4、通过SessionStatus的setComplete()方法清除@SessionAttributes指定的会话数据  
@RequestMapping("/session2")   //③  
public String session(@ModelAttribute("user") UserModel user, SessionStatus status) {  
    if(true) { //④  
        status.setComplete();  
    }  
    return "success";  
}  

 

 

 

Controller中方法能够支持的参数类型

 

1. ServletRequest/HttpServletRequest 和 ServletResponse/HttpServletResponse

 

public String requestOrResponse (  
        ServletRequest servletRequest, HttpServletRequest httpServletRequest,  
        ServletResponse servletResponse, HttpServletResponse httpServletResponse  
    ) 

 

 

 

2. InputStream/OutputStream 和 Reader/Writer

 

public void inputOrOutBody(InputStream requestBodyIn, OutputStream responseBodyOut)  
        throws IOException {  
responseBodyOut.write("success".getBytes());  
}  


public void readerOrWriteBody(Reader reader, Writer writer)  
        throws IOException {  
    writer.write("hello");  
} 

 

 

3. WebRequest/NativeWebRequest

 

public String webRequest(WebRequest webRequest, NativeWebRequest nativeWebRequest) {  
    System.out.println(webRequest.getParameter("test"));//①得到请求参数test的值  
    webRequest.setAttribute("name", "value", WebRequest.SCOPE_REQUEST);//②  
    System.out.println(webRequest.getAttribute("name", WebRequest.SCOPE_REQUEST));  
    HttpServletRequest request =   
        nativeWebRequest.getNativeRequest(HttpServletRequest.class);//③  
    HttpServletResponse response =   
        nativeWebRequest.getNativeResponse(HttpServletResponse.class);  
        return "success";  
    } 

 

 

4. HttpSession

 

public String session(HttpSession session) {  
    System.out.println(session);  
    return "success";  
} 

 

 

5. 命令/表单对象

 

@RequestMapping(value = "/commandObject", method = RequestMethod.GET)  
public String toCreateUser(HttpServletRequest request, UserModel user) {  
    return "customer/create";  
}  
@RequestMapping(value = "/commandObject", method = RequestMethod.POST)  
public String createUser(HttpServletRequest request, UserModel user) {  
    System.out.println(user);  
    return "success";  
} 

 

 

6. Model、Map、ModelMap

 

@RequestMapping(value = "/model")  
public String createUser(Model model, Map model2, ModelMap model3) {  
    model.addAttribute("a", "a");  
    model2.put("b", "b");  
    model3.put("c", "c");  
    System.out.println(model == model2);  
    System.out.println(model2 == model3);  
    return "success";}  

@RequestMapping(value = "/mergeModel")  
public ModelAndView mergeModel(Model model) {  
    model.addAttribute("a", "a");//①添加模型数据  
    ModelAndView mv = new ModelAndView("success");  
    mv.addObject("a", "update");//②在视图渲染之前更新③处同名模型数据  
    model.addAttribute("a", "new");//③修改①处同名模型数据  
    //视图页面的a将显示为"update" 而不是"new"  
    return mv;  
}  

 

 

7. Errors/BindingResult

@RequestMapping(value = "/error1")  
public String error1(UserModel user, BindingResult result)  

@RequestMapping(value = "/error2")  
public String error2(UserModel user, BindingResult result, Model model) {  
      

@RequestMapping(value = "/error3")  
public String error3(UserModel user, Errors errors)   


@RequestMapping(value = "/error4")  
public String error4(UserModel user, Model model, Errors errors)  
    } 

 

 

8. 其他

public String other(Locale locale, Principal principal)

 

 

分享到:
评论

相关推荐

    spring MVC数据绑定大全

    在Spring MVC中,数据绑定是一项核心功能,它允许开发者将用户输入的数据与控制器中的对象属性进行关联,简化了数据处理的复杂性。本文将详细介绍Spring MVC中的数据绑定,并提供实例帮助初学者理解。 1. **模型...

    spring mvc 参数绑定漏洞

    在处理HTTP请求时,Spring MVC 提供了参数绑定功能,将HTTP请求中的参数映射到控制器方法的参数上,使得开发更加便捷。然而,这个特性也可能导致安全问题,特别是参数绑定漏洞。 参数绑定漏洞通常出现在以下情况: ...

    类似Spring MVC web控制器

    Spring MVC作为Java领域中最流行的MVC(Model-View-Controller)框架之一,提供了强大的控制器概念,允许开发者通过注解轻松地定义和管理HTTP请求处理逻辑。本主题将深入探讨如何实现一个类似Spring MVC的Web控制器...

    Spring MVC数据绑定大全.rar

    10. **数据绑定与视图**:数据绑定不仅涉及控制器,还影响视图层。在视图渲染时,可以使用模型中的数据来填充模板。 11. **前后端分离场景下的数据绑定**:在RESTful API的设计中,虽然不直接使用视图,但数据绑定...

    Spring MVC jar包

    Spring MVC 是一个基于Java的轻量级Web应用框架,它为开发者提供了模型-视图-控制器(MVC)架构,使开发人员能够更好地组织和分离应用程序的业务逻辑、数据处理和用户界面。Spring MVC是Spring框架的一个核心组件,...

    Mastering Spring MVC 4(2015.09)源码

    总的来说,"Mastering Spring MVC 4(2015.09)源码"提供了深入学习Spring MVC的机会,你可以通过阅读和分析源码来了解如何配置DispatcherServlet、怎样编写控制器、如何进行数据绑定与验证,以及如何利用拦截器等特性...

    Spring MVC 4.2.3

    它提供了模型-视图-控制器(MVC)架构,使开发者能够有效地分离业务逻辑、数据处理和用户界面。在"Spring MVC 4.2.3"版本中,我们看到了一系列的功能改进和优化,以提升开发效率和应用性能。 首先,让我们深入了解...

    Spring.MVC-A.Tutorial-Spring.MVC学习指南 高清可复制版PDF

    总之,“Spring MVC - A Tutorial”这份指南会详细讲解Spring MVC的各个核心组件和使用技巧,包括控制器的创建、模型数据的管理、视图的渲染、以及各种高级特性。通过学习,开发者可以熟练地运用Spring MVC来构建...

    最全最经典spring-mvc教程

    首先,Spring MVC的基础架构包括DispatcherServlet(前端控制器)、Model、View和Controller。DispatcherServlet是整个流程的入口,负责接收请求并分发到相应的Controller。Controller是业务逻辑处理的核心,Model...

    spring mvc 4.0

    Spring MVC是Spring框架的一个核心模块,专为构建Web应用程序提供模型-视图-控制器(MVC)架构。在Spring MVC 4.0版本中,它引入了许多改进和新特性,以提升开发效率和应用程序的性能。 1. **依赖注入**:Spring ...

    Spring MVC + Mybatis+Spring实现的个人博客系统

    Spring MVC是Spring框架的一部分,它是一个用于构建Web应用程序的模型-视图-控制器(MVC)架构。在Spring MVC中,Controller负责处理HTTP请求,Model持有业务数据,而View则负责数据的展示。通过DispatcherServlet...

    [免费]Spring MVC学习指南(高清)

    全书共计12章,分别从Spring框架、模型2和MVC模式、Spring MVC介绍、控制器、数据绑定和表单标签库、传唤器和格式化、验证器、表达式语言、JSTL、国际化、上传文件、下载文件多个角度介绍了Spring MVC。除此之外,...

    spring MVC_快速入门

    要使用Spring MVC,首先需要在项目中引入Spring MVC的依赖,并配置Spring的DispatcherServlet,它是Spring MVC的前端控制器,负责调度请求到相应的处理器。 3. **Controller** Controller是处理请求的组件,通常...

    Spring MVC使用Demo

    它是Spring MVC的前端控制器,接收所有HTTP请求,然后根据请求信息选择合适的HandlerMapping找到对应处理器(Controller方法)。处理器执行后,通过HandlerAdapter将结果转换为ModelAndView对象,最后由ViewResolver...

    spring mvc

    6. **ModelAndView**: 它是Spring MVC中用于携带模型数据和视图名的对象,可以在控制器方法中返回,以便于传递数据和指定视图。 7. **Form Handling**: Spring MVC 提供了强大的表单处理能力,包括自动数据绑定、...

    spring mvc框架依赖全面jar

    `org.springframework.web.servlet-3.1.1.RELEASE.jar` 是Spring MVC的主要组件,它负责处理HTTP请求,提供模型-视图-控制器的实现,包括控制器、视图解析和模型数据绑定等功能。 `org.springframework.web-3.1.1....

    精通Spring MVC4

    Spring MVC采用模型-视图-控制器(MVC)模式,将业务逻辑、数据展示和用户交互分离,提高了代码的可维护性和复用性。在Spring MVC中,DispatcherServlet作为核心组件负责请求分发,Controller处理请求并返回...

    《精通Spring MVC 4》源码

    数据绑定是Spring MVC的一个强大特性,它允许自动将请求参数与控制器方法的参数进行映射。源码中,我们可以看到Spring如何解析请求参数并将其绑定到对象属性上,同时支持自定义转换器和验证器。 此外,Spring MVC的...

    大优惠 Spring MVC学习指南(第2版)2017.pdf

    全书共计12章,分别从Spring框架、模型2和MVC模式、Spring MVC介绍、控制器、数据绑定和表单标签库、传唤器和格式化、验证器、表达式语言、JSTL、国际化、上传文件、下载文件多个角度介绍了Spring MVC。除此之外,...

Global site tag (gtag.js) - Google Analytics