SpringMVC的请求处理

有目标就不怕路远。年轻人.无论你现在身在何方.重要的是你将要向何处去。只有明确的目标才能助你成功。没有目标的航船.任何方向的风对他来说都是逆风。因此,再遥远的旅程,只要有目标.就不怕路远。没有目标,哪来的劲头?一车尔尼雷夫斯基

导读:本篇文章讲解 SpringMVC的请求处理,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

主要知识点

  • servlet API获取请求参数用的是request.getParameter("xxx")
  • 在SpringMVC中只需要在处理方法中声明相应名称的参数就可以与请求传入的参数自动匹配,并进行相应的类型转换(servlet API还需要自己进行类型判断)
  • 如果类型未匹配/无法匹配会报400错误
  • 匹配规则
    • 请求参数必须跟处理方法的参数名一致
    • 如果处理方法的参数未传入会赋null
    • 如果传入的参数名和处理方法的参数名不一致,可以通过@RequestParam("xxx")进行匹配

处理请求参数乱码

GET

在tomcat的server.xml文件中添加URIEncoding="utf-8"

SpringMVC的请求处理

SpringMVC的请求处理

<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" URIEncoding="utf-8" />

POST

配置编码过滤器 CharacterEncodingFilter 解决中文乱码
在SpringMVC的web.xml中添加乱码处理拦截器的配置

<filter>
        <filter-name>characterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<!--        解决post响应乱码-->
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
<!--        同时开启请求和响应的编码设置-->
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>

    <filter-mapping>
        <filter-name>characterEncodingFilter</filter-name>
<!--        拦截规则(/* 全部拦截)-->
        <url-pattern>/*</url-pattern>
<!--        <servlet-name>根据servlet名称拦截</servlet-name>-->
    </filter-mapping>

@RequestParam 获取请求的参数

 @RequestMapping("/hehe")
    public String params01(@RequestParam(value = "xxx",defaultValue = "aqin") String name){
        System.out.println(name);
        return "/index.jsp";
    }
  • value 重命名参数
  • required 指定是否必须传入该参数
    • true 默认(不传报400错误)
    • false 可以不传(自动传入null),不会报错
      • 所以注意!声明函数传入参数时,不要使用基础数据类型,因为基础数据类型无法接收null
  • defaultValue 默认值,当传入的参数为null时会自动设置一个默认值(有此参数可以省略required=false

@RequestHeader 获取请求头信息

获取头部Host字段的值

	@RequestMapping(value = "/getheader",params = {"username"})
    public String params02(@RequestHeader("Host") String host){
        System.out.println(host);
        return "/index.jsp";
    }

@CookieValue 获取cookie中的值

获取一个指定key值的cookies

@RequestMapping(value = "/getcookie",params = {"username"})
    public String params02(@CookieValue("JSESSIONID") String cookie){
        System.out.println("cookie="+cookie);
        return "/index.jsp";
    }

获取全部的cookie

@RequestMapping(value = "/getcookie",params = {"username"})
    public String params03(@CookieValue Map<String,String> cookies){
        System.out.println("cookies");
        return "/index.jsp";
    }

@RequestMapping

@RequestMapping(value = "/heheda",method = {RequestMethod.POST})
    public String params02(){
        System.out.println("heheda");
        return "index.jsp";
    }

从spring4.3开始提供了一套简写请求方式的注解:

  • @PostMapping(“heheda”)
    • 这里的 @RequestMapping(value = "/heheda",method = {RequestMethod.POST})等同于@PostMapping("/heheda")
  • @GetMapping()
  • @PutMapping()
  • @DeleteMapping()

params:对请求参数进行设置

  1. 必须要某些参数 params={“username”}
  2. 必须不要某些参数 params={“!username”}
  3. 参数必须要等于某值 params={“username=aqin”}
  4. 参数必须要不等于某值 params={“username!=aqin”}

headers:对请求头进行设置

  1. 必须包含某个值 headers={“Accept-Language=zh-CN,zh;q=0.9”}

consumes:对当前请求的内容类型进行设置

  1. 当前请求的内容类型必须为指定值
  2. 常请求的内容类型:
    1. application/x-www-form-urlencoded form表单提交的默认内容类型
    2. multipart/form-data form表单提交文件流的内容类型
    3. application/json ajax提交的json内容类型
  3. 请求内容类型不匹配:HTTP Status 415
  4. consumes={“application/x-www-form-urlencoded”}

通配符

映射的url还可以支持通配符

  • ? 一个?可以匹配单个字符(a-z0-9)[1]
  • * 一个*可以匹配任意个字符(a-z0-9)[任意个]
  • ** **匹配任意个字符任意个层级
//http://localhost/aqin/user/123 会匹配这个
    @RequestMapping(value = "/user*")
    public String params05(){
        System.out.println("*");
        return "/index.jsp";
    }

//http://localhost/aqin/user/1 会匹配这个
    @RequestMapping(value = "/user?")
    public String params06(){
        System.out.println("?");
        return "/index.jsp";
    }

//http://localhost/aqin/1/2/3/user/ 会匹配这个
    @RequestMapping(value = "/**/user")
    public String params07(){
        System.out.println("**");
        return "/index.jsp";
    }

注意:如果映射存在包含关系会优先交给更精确的那个映射处理

无统配符>?>*>**

@PathVariable

用来获取URL目录级别的参数

@RequestMapping("/user/{id}")
    public String params04(@PathVariable("id") Integer id){
        System.out.println(id);
        return "/index.jsp";
    }

当请求链接为http://localhost:8080/aqin/user/1012时函数params04(@PathVariable("id") Integer id)中的id就会获取到1012的值。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/135475.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!