第十一节——获取请求数据

一、可以从客户端获取的数据类型

  1. 基本类型参数
  2. POJO类型参数(JavaBean)
  3. 数组类型

二、获取数据的方法

Ⅰ、基本数据类型——在controller中的业务方法的参数名称与发送过来的参数名称一致,MVC自动匹配输入
  1. 编辑main-java-study-controller目录下的UserController.class,定义一个方法
@RequestMapping("/quick1")
    @ResponseBody
    public void show1(String name,int age) {
    
    
        System.out.println(name+age);
    }
  1. 启动tomcat,访问http://localhost:8080/demo03_war/quick1?name=qwe&age=12,成功获取到数据
Ⅱ、POJO数据类型——传入的参数是类的属性名称,MVC自动匹配成对象
  1. 定义一个student类,类的属性有name与age两个属性,且都定义了getter和setter方法
  2. UserController.class中一个方法的请求参数是student类型
@RequestMapping("/quick1")
    @ResponseBody
    public void show1(Student student) {
    
    
        System.out.println(student);
    }
  1. 启动tomcat,访问访问http://localhost:8080/demo03_war/quick1?name=qwe&age=12,MVC成功将数据封装成Student对象
Ⅲ、数组类型——自动匹配
  1. UserController.class中一个方法的请求参数是string数组,且名称是str
  2. 启动tomcat,传入连续的且名称都是str的参数,mvc会自动封装成数组,URL:quick1?str=a&str=b&str=c
Ⅳ、集合类型——通过定义一个类,类里面定义一个student类型的list数组,客户端传入参数需要指明第几个数组中的第几个属性
  1. 定义一个Vo类
public class VO {
    
    
    private List<Student> vo_list;

    public List<Student> getVo_list() {
    
    
        return vo_list;
    }

    public void setVo_list(List<Student> vo_list) {
    
    
        this.vo_list = vo_list;
    }

    @Override
    public String toString() {
    
    
        return "VO{" +
                "vo_list=" + vo_list +
                '}';
    }
}
  1. 定义controller
@RequestMapping("/quick1")
    @ResponseBody
    public void show1(VO vo) {
    
    
        System.out.println(vo);
    }
  1. 定义一个test.jsp,通过里面的table标签传递数组
<form action="${pageContext.request.contextPath}/quick1" method="post">
    <input type="text" name="vo_list[0].name" value="qwe"><br/>
    <input type="text" name="vo_list[0].age" value="12"><br/>
    <input type="text" name="vo_list[1].name" value="asd"><br/>
    <input type="text" name="vo_list[1].age" value="13"><br/>
    <input type="submit" value="提交">
</form>
  1. 开启tomcat,访问jsp/test.jsp页面,点击提交按钮,获取到数据
  2. 由于quick1需要vo对象的数据,而vo需要student类型的list数组,数组名称是vo_list,所以提交数据时需要指定一致的数组名称,和属性值
Ⅴ、集合类型——使用ajax提交时,指定为contentType的json,MVC通过@RequestBody获取
  1. 在webapp目录下新建一个js目录,并把jquery-3.3.1导入到js目录中
  2. 编辑spring-mvc.xml,将jquery添加进去
<mvc:resources mapping="/js/**" location="/js/"/>
或者
<mvc:default-servlet-handler/>
  1. 修改test.jsp
<html>
<head>
    <title>Title</title>
    <script src="${pageContext.request.contextPath}/js/jquery-3.3.1.min.js"></script>
    <script>
        var user_list = new Array();
        user_list.push({
      
      username:"qwe",age:12})
        user_list.push({
      
      username:"asd",age:13})
        $.ajax({
      
      
           type:"POST",url:"${pageContext.request.contextPath}/quick1",
            data:JSON.stringify(vo_list),
            contentType:"application/json;charset=utf-8"
        });
    </script>
</head>
<body>
</body>
</html>
  1. 使用@RequestBody注解接受ajax数据
@RequestMapping("/quick1")
    @ResponseBody
    public void show1(@RequestBody List<Student> user_list) {
    
    
        System.out.println(user_list);
    }
Ⅵ、解决POST传入中文的乱码问题
  1. 编辑web.xml
<filter>
  <filter-name>characterEncodingFilter</filter-name>
  <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  <init-param>
    <param-name>encoding</param-name>
    <param-value>UTF-8</param-value>
  </init-param>
</filter>
<filter-mapping>
  <filter-name>characterEncodingFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>
Ⅶ、使用@RequestParam注解解决提交参数名称与方法参数不一致问题
  1. 修改controller
@RequestMapping("/quick1")
    @ResponseBody
    public void show1(@RequestParam(value = "username") String name) {
    
    
        System.out.println(name);
    }
  1. 页面提交username参数时,MVC将其转换为name进行封装使用

三、获取数据——Restful

  1. 图解
    在这里插入图片描述

  2. 访问URL时,提交的参数:http://localhost:8080/demo03_war/quick1/zhangsan

  3. 修改controller

@RequestMapping("/quick1/{name}")
    @ResponseBody
    public void show1(@PathVariable(value = "name",required = true) String username) {
    
    
        System.out.println(username);
    }
  1. 启动tomcat访问http://localhost:8080/demo03_war/quick1/zhangsan验证数据

四、获取数据——自定义转换类型

前提:虽然可以将string转换为int,但是对于日期等数据无法自动转换,需要手动配置

  1. 在main-java-study-converter目录下创建DateConverter.class
public class DateConverter implements Converter<String, Date> {
    
    
    @Override
    public Date convert(String dateStr) {
    
    
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        Date date =null;
        try {
    
    
            date = format.parse(dateStr);
        } catch (ParseException e) {
    
    
            e.printStackTrace();
        }
        return date;
    }
}
  1. 配置spring-mvc.xml
<mvc:annotation-driven conversion-service="conversionService"/>
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <list>
                <bean class="study.converter.DateConverter"/>
            </list>
        </property>
    </bean>
  1. 编辑controller
@RequestMapping(value = "/quick1")
    @ResponseBody
    public void show1(Date date) {
    
    
        System.out.println(date);
    }
  1. 启动tomcat,访问:quick1?date=2021-10-04

猜你喜欢

转载自blog.csdn.net/qq_37589805/article/details/120600850