博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringMVC中用于绑定请求数据的注解以及配置视图解析器
阅读量:6625 次
发布时间:2019-06-25

本文共 10776 字,大约阅读时间需要 35 分钟。

SpringMVC中用于绑定请求数据的注解

在上一篇文章中我们简单介绍了,知道了如何去配置地址映射,本篇则介绍一些用于处理request数据的注解。

1.@RequestHeader注解,该注解用于处理request中的header部分,也就是http请求头的部分,它可以把header部分的值绑定到方法的参数上,示例:

package org.zero01.test;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestHeader;import org.springframework.web.bind.annotation.RequestMapping;@Controller@RequestMapping("/test")public class Test {    @RequestMapping("test.do")    public void method(            @RequestHeader("Host") String host,            @RequestHeader("Content-Type") String contentType    ){        System.out.println(host);        System.out.println(contentType);    }}

使用Postman进行访问,访问方式如下:

SpringMVC中用于绑定请求数据的注解以及配置视图解析器

控制台打印结果:

localhost:8080application/json

从打印结果可以看到,以上的代码把http请求头中的Host以及Content-Type字段的值,都绑定到了注解配置的方法参数上,这就是@RequestHeader注解的作用。

2.@CookieValue注解,该注解用于把http请求头中关于cookie的值绑定到方法的参数上,示例:

package org.zero01.test;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.CookieValue;import org.springframework.web.bind.annotation.RequestMapping;@Controller@RequestMapping("/test")public class Test {    @RequestMapping("test.do")    public void method(            @CookieValue("JSEESIONID") String cookie    ){        System.out.println(cookie);    }}

使用Postman进行访问,访问方式如下:

SpringMVC中用于绑定请求数据的注解以及配置视图解析器

控制台打印结果:

415A4AC178C59DACE0B2C9CA727CDD84

如上,@CookieValue注解帮我们把Cookie里JSEESIONID的值绑定到了该方法的参数中。

3.@PathVariable注解, 该注解可以把@RequestMapping注解中配置的URL占位符映射的值,绑定到相应的方法参数上,示例:

package org.zero01.test;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RequestMapping;@Controller@RequestMapping("/test")public class Test {    // 将URL上映射的值绑定到方法参数上,用 {} 来进行绑定    @RequestMapping("test.do/{typeid}/{id}")    public void method(            @PathVariable String typeid,            @PathVariable String id    ) {        System.out.println(typeid);        System.out.println(id);    }}

使用Postman进行访问,访问方式如下:

SpringMVC中用于绑定请求数据的注解以及配置视图解析器

控制台打印结果:

845125

4.@RequestBody注解,该注解常用来处理application/json, application/xml等数据,也就是用于处理http请求体的内容。通过这个注解可以很轻松的获取到请求体的数据,再也不用像使用Servlet时那样通过流去读了,示例:

package org.zero01.test;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.*;@Controller@RequestMapping("/test")public class Test {    @RequestMapping("/test.do")    public void method(            @RequestBody String json    ) {        System.out.println(json);    }}

使用Postman进行访问,访问方式如下:

SpringMVC中用于绑定请求数据的注解以及配置视图解析器

控制台打印结果:

{    "name" : "Jon",    "age" : 23,    "address" : "usa"}

5.@SessionAttributes注解,该注解用来将方法参数中的值绑定到HttpSession的attribute中,这个注解是写在类上的,示例:

package org.zero01.test;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.*;import java.util.Map;@Controller@SessionAttributes("name")@RequestMapping("/test")public class Test {    @RequestMapping("/test.do")    public void method(Map
map) { // 由于@SessionAttributes注解的作用,这对键值会被存储一份到HttpSession对象的attribute中 map.put("name", "Jon"); }}

该注解有value、types两个属性,可以通过名字和类型来指定需要存储到HttpSession中的数据;示例:

package org.zero01.test;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.*;import java.util.Map;@Controller@SessionAttributes(value = "name", types = Object.class)@RequestMapping("/test")public class Test {    @RequestMapping("/test.do")    public void method(Map
map) { // 由于@SessionAttributes注解的作用,这对键值会被存储一份到HttpSession对象的attribute中 map.put("name", "Jon"); }}

6.@SessionAttribute注解,该注解用来访问预先存在的HttpSession中的属性值,例如HttpSession中存储了一个name的值,通过@SessionAttribute注解可以取出这个name的值,并且可以绑定到方法的参数上,所以这个注解是写在方法参数上的,示例:

package org.zero01.test;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.*;@Controller@RequestMapping("/test")public class Test {    @RequestMapping("/test.do")    // 拿出HttpSession中键为name的值,绑定到方法参数name上    public void method(@SessionAttribute("name") String name) {    }}

7.@ModelAttribute注解,该注解有两个用法,一个是用于方法上,一个是用于参数上:

  • 用于方法上时: 通常用来在处理@RequestMapping之前,为请求绑定需要从后台查询的model;
  • 用于参数上时: 用来通过名称对应,把相应名称的值绑定到注解的参数bean上;要绑定的值来源于:
    • @SessionAttributes 启用的attribute 对象上;
    • @ModelAttribute 用于方法上时指定的model对象;
    • 上述两种情况都没有时,new一个需要绑定的bean对象,然后把request中按名称对应的方式把值绑定到bean中。

用在方法上的示例代码:

package org.zero01.test;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.*;@Controller@RequestMapping("/test")public class Test {    @ModelAttribute    @RequestMapping("/test.do")    public Account method(@RequestParam String number) {        return accountManager.findAccount(number);    }}

用在参数上的示例代码:

package org.zero01.test;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.*;@Controller@RequestMapping("/test")public class Test {    @RequestMapping("/test.do")    public void method(@ModelAttribute String name) {    }}

获得HttpRequest以及HTTPResponse对象

在控制器中要想获得HttpRequest以及HTTPResponse对象很简单,直接在方法上声明这两个对象的参数即可,示例:

package org.zero01.test;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.*;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;@Controller@RequestMapping("/test")public class Test {    @RequestMapping("/test.do")    public void method(HttpServletRequest request, HttpServletResponse response) {        System.out.println(request.getRequestURI());        System.out.println(response.getStatus());    }}

使用Postman进行访问,访问方式如下:

SpringMVC中用于绑定请求数据的注解以及配置视图解析器

控制台打印结果:

/test/test.do200

把url参数封装到对象的属性里

通常url上会带有好几个参数,我们希望把这些参数都封装到某个对象的属性里,这样就不需要在方法上声明多个参数了,只需要声明一个对象即可。而SpringMVC可以自动帮我们完成这个事情,我们只需要创建一个封装类即可。例如我这里创建一个Student类,里面封装了与URL参数对应的属性:

Student类代码如下:

package org.zero01.test;public class Student {    private String sname;    private int age;    private String address;    public String getSname() {        return sname;    }    public void setSname(String sname) {        this.sname = sname;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    public String getAddress() {        return address;    }    public void setAddress(String address) {        this.address = address;    }}

控制器代码如下:

package org.zero01.test;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.*;@Controller@RequestMapping("/test")public class Test {    @RequestMapping("/test.do")    // 只需要在方法上声明一个对象参数即可    public void method(Student student) {        System.out.println(student.getSname());        System.out.println(student.getAge());        System.out.println(student.getAddress());    }}

使用Postman进行访问,访问方式如下:

SpringMVC中用于绑定请求数据的注解以及配置视图解析器

控制台打印结果:

Jon2215

注:URL参数的名称要与对象属性的名称对应得上,不然是无法进行绑定的。如:

SpringMVC中用于绑定请求数据的注解以及配置视图解析器

控制台打印结果:

Jon0null

数组参数绑定

SpringMVC除了可以自动帮我们绑定参数到pojo对象之外,还可以自动绑定参数到数组对象里,这里的数组指的是Integer、Stirng、Long等基本数据类型的包装类数组,以及int、long、byte等基本数据类型的数组,示例:

package org.zero01.test;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.*;@Controllerpublic class Test {    @RequestMapping(value = "/test.do")    public void method(String[] names) {        for (String name : names) {            System.out.println(name);        }    }}

使用Postman进行访问,访问方式如下:

SpringMVC中用于绑定请求数据的注解以及配置视图解析器

控制台打印结果:

JonMackAlinStevenEson

基本数据类型的数组也是一样的:

package org.zero01.test;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.*;@Controllerpublic class Test {    @RequestMapping(value = "/test.do")    public void method(int[] numbers) {        for (int number : numbers) {            System.out.println(number);        }    }}

使用Postman进行访问,访问方式如下:

SpringMVC中用于绑定请求数据的注解以及配置视图解析器

控制台打印结果:

12345

集合类型参数绑定

对于List、Set、Map等集合类型的参数绑定,如果我们尝试直接绑定,是会失败的,必须将其作为一个具体类对象的成员属性,这个时候我们也可称这个具体类对象为一个包装类。

POJO类代码如下:

package org.zero01.test;import java.util.*;public class Student {    private Map
map; private List
list; private Set
set; public Map
getMap() { return map; } public void setMap(Map
map) { this.map = map; } public List
getList() { return list; } public void setList(List
list) { this.list = list; } public Set
getSet() { return set; } public void setSet(Set
set) { this.set = set; }}

控制器代码如下:

package org.zero01.test;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.*;@Controllerpublic class Test {    @RequestMapping(value = "/test.do")    public void method(Student student) {        System.out.println(student.getMap());        System.out.println(student.getList());        System.out.println(student.getSet());    }}

使用Postman进行访问,访问方式如下:

SpringMVC中用于绑定请求数据的注解以及配置视图解析器

控制台打印结果:

{one=1, three=3, tow=2}[4, 5, 6][7, 8, 9]

通过方法返回值转发到视图上

在SpringMVC中控制器只需要通过方法的返回值就可以转发到某个指定的视图上,示例:

package org.zero01.test;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.*;@Controllerpublic class Test {    @RequestMapping(value = "/test.do", method = RequestMethod.GET)    public String method() {        return "index.jsp";    }}

index.jsp内容如下:

Hello World!

使用Postman进行访问,访问结果如下:

SpringMVC中用于绑定请求数据的注解以及配置视图解析器

默认情况下不加任何关键字是使用转发机制(forward),如果在视图名称前面加上redirect关键字则是使用重定向机制(redirect)示例:

package org.zero01.test;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.*;@Controllerpublic class Test {    @RequestMapping(value = "/test.do", method = RequestMethod.GET)    public String method() {        return "redirect:index.jsp";    }}

但是大多数情况下为了安全性,我们一般会把jsp文件都放在WEB-INF目录下,而放在该目录下的jsp文件是无法通过重定向来进行访问的,只能通过转发机制进行访问。因为WEB-INF目录下的文件是不允许外部访问的,重定向属于外部访问,外部访问的话会报404错误,如下:

SpringMVC中用于绑定请求数据的注解以及配置视图解析器

只能通过内部转发进行访问:

package org.zero01.test;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.*;@Controllerpublic class Test {    @RequestMapping(value = "/test.do")    public String method() {        return "WEB-INF/index.jsp";    }}

访问结果:

SpringMVC中用于绑定请求数据的注解以及配置视图解析器


配置视图解析器

在以上的实验中,我们只把jsp文件放在了WEB-INF目录下,但是如果这个jsp文件是在很多级目录下,那么我们通过返回值来转发到jsp上时,需要写的路径就很长了。例如我在WEB-INF目录下创建一个pages目录,在pages目录里再创建一个index目录,然后把index.jsp文件放在这个index目录下,那么我们需要写的路径就是这样子的:

package org.zero01.test;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.*;@Controllerpublic class Test {    @RequestMapping(value = "/test.do")    public String method() {        return "WEB-INF/pages/index/index.jsp";    }}

如果不想写这么长的路径,就需要用到SpringMVC中的视图解析器了,在Spring配置文件中,添加如下内容:

控制器代码:

package org.zero01.test;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.*;@Controllerpublic class Test {    @RequestMapping(value = "/test.do")    public String method() {        return "index";    }}

从控制器代码中可以看到,配置了视图解析器之后,我们只需要写个视图的名称就可以了,不需要去写全路径。

访问结果:

SpringMVC中用于绑定请求数据的注解以及配置视图解析器

转载于:https://blog.51cto.com/zero01/2086981

你可能感兴趣的文章
求最大公约数与最小公倍数
查看>>
C# Winform 跨线程更新UI控件常用方法总结(转)
查看>>
eclipse菜单栏不显示 + the system is running in lou-graphics mode问题
查看>>
【WebService】使用jaxb完成对象和xml的转换
查看>>
如何去除My97 DatePicker控件上右键弹出官网的链接 - 如何debug混淆过的代码
查看>>
多文档
查看>>
输入5个学生的信息(包括学号,姓名,英语成绩,计算机语言成绩和数据库成绩), 统计各学生的总分,然后将学生信息和统计结果存入test.txt文件中...
查看>>
BZOJ2337 [HNOI2011]XOR和路径
查看>>
C# 该行已经属于另一个表 ...
查看>>
android 避免线程的重复创建(HandlerThread、线程池)
查看>>
手游-放开那三国socket协议分析
查看>>
SQL Lazy Spool Eager Spool
查看>>
type的解释
查看>>
Windows Phone 8 开发环境搭建
查看>>
2017:IDC市场规模将持续增长 增速放缓
查看>>
从自动驾驶到学习机器学习:解读2017科技发展的15大趋势
查看>>
SinoBBD探索"一体化"大数据创新发展
查看>>
互联网金融带来新机遇 数据合规性不容忽视
查看>>
在Linux中永久并安全删除文件和目录的方法
查看>>
全民直播时代 内容监管还得靠技术
查看>>