SpringMVC的请求


SpringMVC的请求-获得请求参数-请求参数类型

客户端请求参数的格式是:name=value&name=value……

服务器端要获得请求的参数,有时还需要进行数据的封装,SpringMVC可以接收如下类型的参数

  基本类型参数

  POJO类型参数

  数组类型参数

  集合类型参数

获得基本类型参数

Controller中的业务方法的参数名称要与请求参数的name一致,参数值会自动映射匹配。并且能自动做类型转换;

自动的类型转换是指从String向其他类型的转换

如果你传递的基本类型的参数和方法中的形参不匹配,那么方法中的形参就是null

http://localhost:8080/week/quickMonday?username=laowang

    @ResponseBody
    @RequestMapping("/quickMonday")
    public void Monday(String username){ //传递来的参数需要和方法的形参名相同,否在获取的参数就是null,不传递此参数也为null
        System.out.println(username);
    }

获得POJO类型参数

Controller中的业务方法的POJO参数的属性名与请求参数的name一致,参数值会自动映射匹配。

在我们获取对象类型的参数时,如果我们传递的是这个对象内的元素,那么只要传递的数据名和对象内部的元素名匹配上就自动帮我们封装到对象内部

http://localhost:8080/week/quickTuesday?username=laowang&age60

User:

package com.springMvc.Domain;

public class User {
    private String username;
    private Integer age;

    public User() {
    }

    public User(String username, Integer age) {
        this.username = username;
        this.age = age;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", age=" + age +
                '}';
    }
}
User对象
    @ResponseBody
    @RequestMapping("/quickTuesday")
    public void quickTuesday(User user){ // 传递来的参数会自动帮我们封装进对象内,如果没有传递来的参数就是null
        System.out.println(user);
    }

获得数组类型参数

Controller中的业务方法数组名称与请求参数的name一致,参数值会自动映射匹配。

    @ResponseBody
    @RequestMapping("quickWednesday")
    //http://localhost:8080/week/quickWednesday?strs=aaa&strs=bbb
    public void quickWednesday(String [] strs){  // 传递的参数必须是strs名
//        System.out.println(Arrays.asList(strs));// 使用了转化后数组不可以为空,必须要有值,所以传递来的数组不可以为空
        System.out.println(strs); // 可以为空
    }

获得集合类型参数1

获得集合参数时,要将集合参数包装到一个POJO中才可以。

VO:

public class VO {
    private List userList;

    public VO(List userList) {
        this.userList = userList;
    }

    public List getUserList() {
        return userList;
    }

    public void setUserList(List userList) {
        this.userList = userList;
    }

    @Override
    public String toString() {
        return "VO{" +
                "userList=" + userList +
                '}';
    }
}
集合参数的封装

前端:

<%--表明是第一个User对象的username age--%>



    @ResponseBody
    @RequestMapping(path = "quickThursday",method = RequestMethod.POST)
    public void quickThursday(VO vo){ // 接收传递来的参数自动和VO中的进行匹配
        System.out.println(vo);
    }

获得集合类型参数2

当使用ajax提交时,可以指定contentType为json形式,那么在方法参数位置使用@RequestBody可以直接接收集合数据而无需使用POJO进行包装

首先idea要导入对应的包

    <dependency>
      <groupId>org.apache.tomcatgroupId>
      <artifactId>catalinaartifactId>
      <version>6.0.29version>
    dependency>

springMVC.xml 开放访问资源


    <mvc:annotation-driven/>
    <mvc:resources mapping="/js/**" location="/js/"/>  

1、保持上述配置不变
2、导入catalina包,位于tomcat的lib下,添加到项目中
3、修改web.xml配置文件:

web.xml

  
  <servlet>
    <servlet-name>defaultservlet-name>
    <servlet-class>org.apache.catalina.servlets.DefaultServletservlet-class>
  servlet>
    <servlet-mapping>
    <servlet-name>defaultservlet-name>
    <url-pattern>*.jsurl-pattern>
  servlet-mapping>

jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    Title
    <script type="text/javascript" src="/js/jquery-3.3.1.js"></script>
    <script>
        var userList = new Array();
        userList.push({username:"zhangsan",age:18});
        userList.push({username:"lisi",age:28});
        console.log(JSON.stringify(userList))
        $.ajax({
            type:"POST",
            url:"/week/quickFriday",
            dataType :'json',
            data:JSON.stringify("laolwang"),
            contentType: "application/json;charset=UTF-8",
        });
    </script>




    @ResponseBody
    @RequestMapping(value = "quickFriday",method = RequestMethod.POST)
    public void quickFriday(@RequestBody List userList){
        System.out.println(userList);

    }

-静态资源访问的开启

当有静态资源需要加载时,比如jquery文件,通过谷歌开发者工具抓包发现,没有加载到jquery文件,原因是SpringMVC的前端控制器DispatcherServlet的url-pattern配置的是/,代表对所有的资源都进行过滤操作,我们可以通过以下两种方式指定放行静态资源:

 ?在spring-mvc.xml配置文件中指定放行的资源


    

    <mvc:default-servlet-handler/>

也可以使用以下来代替

?使用标签

配置全局乱码过滤器

当post请求时,数据会出现乱码,我们可以设置一个过滤器来进行编码的过滤。

web.xml


    <filter>
        <filter-name>CharacterEncodingFilterfilter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
        <init-param>
            <param-name>encodingparam-name>
            <param-value>UTF-8param-value>
        init-param>
    filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilterfilter-name>
        <url-pattern>/*url-pattern>
    filter-mapping>

 

参数绑定注解@RequestParam

当请求的参数名称与Controller的业务方法参数名称不一致时,就需要通过@RequestParam注解显示的绑定

我们在获取参数的时候上面讲解都是传递参数名要和方法内的形参名相同才可以获取到,但是前后端分离的时候有时候会出现人员核对出错导致传递参数名和方法内规定的参数名不同,那样就会导致参数获取为null,所以我们可以使用注解@RequestParam来进行注解绑定,只要方法内的参数通过这个注解限定后就会自动和前端传递来的参数进行匹配上

注解@RequestParam还有如下参数可以使用:
value:与请求参数名称
required:此在指定的请求参数是否必须包括,默认是true,提交时如果没有此参数则报错
defaultValue:当没有指定请求参数时,则使用指定的默认值赋值

语法:@RequestParam(value=”参数名”,required=”true/false”,defaultValue=””)
 
value:参数名
 
required:是否包含该参数,默认为true,表示该请求路径中必须包含该参数,如果不包含就报错。
 
defaultValue:默认参数值,如果设置了该值,required=true将失效,自动为false,如果没有传该参数,就使用默认值
 


    @ResponseBody
    @RequestMapping("quickSaturday")
    public void quickSaturday(@RequestParam(value = "name",required = false)String username){ // 请求的参数可以为空,请求的参数名士name,和username的值进行绑定
        System.out.println(username);
    }

如果参数设置了required = true则不可以为空

    @ResponseBody
    @RequestMapping("quickWeekday")
    public void quickWeekday(@RequestParam(value = "user",required = true) String username){ // 请求的参数user不可以为空
        System.out.println(username);
    }

请求为空则会报错

defaultValue:默认参数值,如果设置了该值,required=true将失效,自动为false,如果没有传该参数,就使用默认值
    @ResponseBody
    @RequestMapping("quickWeekday")
    public void quickWeekday(@RequestParam(value = "user",required = true,defaultValue = "老王") String username){ // 设置了默认值之后,限定不可以为空就无意义了,因为哪怕你不传递值也有默认值了
        System.out.println(username);
    }

SpringMVC的请求-获得请求参数-Restful风格的参数的获取

Restful是一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。主要用于客户端和服务器交互类的软件,基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存机制等。

Restful风格的请求是使用“url+请求方式”表示一次请求目的的,HTTP 协议里面四个表示操作方式的动词如下:

GET:用于获取资源

POST:用于新建资源

PUT:用于更新资源

DELETE:用于删除资源

例如:

/user/1    GET :       得到 id = 1 的 user

/user/1   DELETE:  删除 id = 1 的 user

/user/1    PUT:       更新 id = 1 的 user

/user       POST:      新增 user

上述url地址/user/1中的1就是要获得的请求参数,在SpringMVC中可以使用占位符进行参数绑定。地址/user/1可以写成/user/{id},占位符{id}对应的就是1的值。在业务方法中我们可以使用@PathVariable注解进行占位符的匹配获取工作。

Restful风格的url必须搭配@PathVariable注解进行占位符的匹配获取工作

不然是获取不到url请求所携带的值

rstful所使用的占位符再传递参数的时候直接输入对应的参数值就可以了,后端获取的时候直接使用@RepathVariable进行获取即可

eg:

http://localhost:8080/week/quickJanuaryMonday/saas

    @ResponseBody
    @RequestMapping(path = "/quickJanuaryMonday/{name}")  // restful风格的url占位符name
    public void quickJanuaryMonday(@PathVariable("name")String username){ // 接受占位符name的值并映射到username中
        System.out.println(username);
    }

SpringMVC的请求-获得请求参数-自定义类型转换器

pringMVC 默认已经提供了一些常用的类型转换器,例如客户端提交的字符串转换成int型进行参数设置。

但是不是所有的数据类型都提供了转换器,没有提供的就需要自定义转换器,例如:日期类型的数据就需要自定义转换器。

 

 

自定义类型转换器的开发步骤:

定义转换器类实现Converter接口
在配置文件中声明转换器
在中引用转换器

定义继承了 Converter类的转换类

public class DateConverter implements Converter {
    @Override
    public Date convert(String s) {
        //将日期字符串转换成日期对象 返回
        SimpleDateFormat formate = new SimpleDateFormat("yy-MM-dd");
        Date date = null;
        try {
            date = formate.parse(s);
        } catch (ParseException e) {
            e.printStackTrace();
        }

        return date;
    }
}

在springMvc.xml中声明转换器类


    <bean id="converterservice" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <list>
                <bean class="com.springMvc.Controller.DateConverter"/>
            list>
        property>
    bean>

在springMVC.xml中引用转换器

    <mvc:annotation-driven conversion-service="converterservice"/>

后端代码:

    @ResponseBody
    @RequestMapping("quickJanuaryThursday")
    public void quickJanuaryThursday(Date date){
        System.out.println(date);
    }

请求的地址;http://localhost:8080/week/quickJanuaryThursday?date=2020-19-7

SpringMVC的请求-获得请求参数-获得Servlet相关API

SpringMVC支持使用原始ServletAPI对象作为控制器方法的参数进行注入,常用的对象如下:

HttpServletRequest

HttpServletResponse

HttpSession

    @ResponseBody
    @RequestMapping("quickJanuaryWednesday")
    public void quickJanuaryWednesday(HttpServletRequest request, HttpServletResponse response, HttpSession httpSession){
        System.out.println(request);
        System.out.println(response);
        System.out.println(httpSession);
    }

SpringMVC的请求-获得请求参数-获得请求头信息

使用@RequestHeader可以获得请求头信息,相当于web阶段学习的request.getHeader(name)

@RequestHeader注解的属性如下:

value:请求头的名称

required:是否必须携带此请求头

    @ResponseBody
    @RequestMapping("quickJanuaryThursday")
    public void quickJanuaryThursday(@RequestHeader(value = "User-Agent",required = false)String user_agent){ // 获取user-agent请求头
        System.out.println(user_agent);
    }

 

@CookieValue

使用@CookieValue可以获得指定Cookie的值

@CookieValue注解的属性如下:

value:指定cookie的名称

required:是否必须携带此cookie

    @ResponseBody
    @RequestMapping("quickJanuaryFriday")
    public void quickJanuaryFriday(@CookieValue(value = "JSESSIONID") String jsessionId){
        System.out.println(jsessionId);
    }