05-Request

1. @RequestParam

  1. 紧耦合方式(了解)
    • DispatcherServlet中的service()直接将此次请求的Request对象传递给单元方法。必须在单元方法上声明形参HttpServletRequest
  2. 解耦合方式(熟练)
    • DispatcherServlet中的service()将请求数据从Request对象中获取出来。单元方法上直接声明对应的形参进行接收
    • 形参名必须和请求数据键名一致,DispatcherServlet根据形参名作为key获取请求数据
/**
 * HttpServletRequest获取参数。紧耦合参数注入
 */
@RequestMapping("/httpServletRequest")
public String httpServletRequest(HttpServletRequest req, HttpServletResponse resp) {
    String name = req.getParameter("name");
    String pwd = req.getParameter("pwd");

    System.out.println("name = " + name);
    System.out.println("pwd = " + pwd);
    return name + ", " + pwd;
}

/**
 * mvc获取参数。解耦合参数注入
 * 1. 形参名必须和实参名一致
 * 2. 不一致用`@RequestParam`获取
 * 3. 类型自动转换
 */
@RequestMapping("/mvc")
public String mvc(String name, @RequestParam("password") Integer pwd) {
    System.out.println("name = " + name);
    System.out.println("pwd = " + pwd);
    return name + ", " + pwd;
}




 















 




<form action="httpServletRequest" method="get">
    <input type="text" name="name"/>
    <input type="text" name="pwd"/>
    <input type="submit" value="httpServletRequest">
</form>

<hr/>

<form action="mvc" method="get">
    <input type="text" name="name"/>
    <input type="text" name="password"/>
    <input type="submit" value="mvc">
</form>

2. POJO接收参数

/*
 * 1. 入参名和POJO属性名一致
 * 2. SpringMVC底层通过反射setter()给pojo属性赋值
 */
@RequestMapping("/pojo")
public String pojo(Person person, Pet pet) {
    System.out.println("person = " + person);
    System.out.println("pet = " + pet);
    return person.toString() + pet.toString();
}





 




<form action="pojo" method="post">
    <p>姓名:<input type="text" name="pname" value="ooxx"></p>
    <p>年龄:<input type="text" name="page" value="18"></p>
    <p>性别:
        <input type="radio" name="gender" value="1"><input type="radio" name="gender" value="0"></p>
    <p>爱好:
        <input type="checkbox" name="hobby" value="1"> 篮球
        <input type="checkbox" name="hobby" value="2"> 足球
        <input type="checkbox" name="hobby" value="3"> 羽毛球
    </p>
    <p>生日:
        <input type="text" name="birthday" value="1994-10-18">
    </p>
    宠物:
    <p>
        名字:<input type="text" name="petName" value="petName">
        类型:<input type="text" name="petType" value="petType">
    </p>
    宠物2:
    <p>
        名字:<input type="text" name="pet.petName" value="pet.petName">
        类型:<input type="text" name="pet.petType" value="pet.petType">
    </p>
	<input type="submit" value="pojo">
</form>






















 
 



@Data
@AllArgsConstructor
@NoArgsConstructor
class Person {
    private String pname;
    private String page;
    private String gender;
    private String[] hobby;

    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date birthday;

    private Pet pet;
    private List<Pet> pets;
    private Map<String, Pet> petMap;
}

@Data
@AllArgsConstructor
@NoArgsConstructor
class Pet {
    private String petName;
    private String petType;
}









 


 











3. 日期类型转换

1. 注解

@DateTimeFormat(pattern = "yyyy-MM-dd")可以用于形参、类的属性上

@RequestMapping("/pojo")
public String pojo(@DateTimeFormat(pattern = "yyyy-MM-dd") Date date) {
    System.out.println("date = " + date);
    return "index.jsp";
}

 



@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date birthday;
 

2. 转换器

package com.listao.mvc.util;

public class StringToDateConverter implements Converter<String, Date> {

    private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");

    @Override
    public Date convert(String source) {
        Date date;
        try {
            date = dateFormat.parse(source);
        } catch (ParseException e) {
            throw new RuntimeException("日期转换异常");
        }

        return date;
    }
}


 















  • spring_mvc.xml中配置转换器
<!-- 数据转换工厂 -->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
    <!-- 配置类型转换器 -->
    <property name="converters">
        <array>
            <!-- 注入自定义转换器对象 -->
            <bean class="com.listao.servlet.util.StringToDateConverter"/>
        </array>
    </property>
</bean>

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

 




 




 

4. 集合

  • List, Map 必须嵌套在对象中
/**
 * 1. List<String>前必须@RequestParam注解
 * 2. List<Pojo>不可用
 */
@RequestMapping("/listStr")
// public String list(@RequestParam List<Pet> pets) {
public String list(@RequestParam List<String> pets) {
    System.out.println("pets = " + pets);
    return pets.toString();
}

@RequestMapping("/container")
public String container(Person person) {
    System.out.println("person = " + person);
    return person.toString();
}
@Data
@AllArgsConstructor
@NoArgsConstructor
class Person {
    private String pname;
    private String page;
    private String gender;
    private String[] hobby;

    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date birthday;

    private Pet pet;
    private List<Pet> pets;
    private Map<String, Pet> petMap;
}













 
 

<form action="container" method="post">
    List:
    <p>
        宠物1:名字:<input type="text" name="pets[0].petName" value="list1">
        类型:<input type="text" name="pets[0].petType" value="list1">
    </p>
    <p>
        宠物2:名字:<input type="text" name="pets[1].petName" value="list2">
        类型:<input type="text" name="pets[1].petType" value="list2">
    </p>
    Map:
    <p>
        宠物1:名字:<input type="text" name="petMap['a'].petName" value="map1">
        类型:<input type="text" name="petMap['a'].petType" value="map1">
    </p>
    <p>
        宠物2:名字:<input type="text" name="petMap['b'].petName" value="map2">
        类型:<input type="text" name="petMap['b'].petType" value="map2">
    </p>
    <input type="submit" value="container">
</form>


 
 
 
 
 
 
 
 

 
 
 
 
 
 
 
 


5. 编码问题

1. GET

  • 增加URIEncoding="utf-8",不过Tomcat9已经自行解决
    <!-- URIEncoding="utf-8" -->
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443"
               maxParameterCount="1000"
               URIEncoding="utf-8"
               />





 

2. POST

  • web.xml中配置编码过滤器
<!-- SpringMVC提供字符编码过滤器 -->
<filter>
    <filter-name>encFilter</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>encFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

6. postman

1. x-www-form-urlencoded

image-20240104152104416
$("#btn").click(function () {
    var jsonObj = {pname: "jsonObj", petName: "petName"};

    $.ajax({
        type: "post",
        url: "requestBody",
        data: jsonObj,
    })

})

 








image-20240104152214365
image-20240104152232809
@RequestMapping("/requestBody")
public String requestBody(Person person, Pet pet) {
// public String requestBody(@RequestBody Person person, Pet pet) {
    System.out.println("person = " + person);
    System.out.println("pet = " + pet);
    return person + " ------- " + pet;
}

 





2. application/json

image-20240104152756427
$("#btn").click(function () {
    var jsonObj = {pname: "jsonObj", petName: "petName"};

    $.ajax({
        type: "post",
        url: "requestBody",

        data: JSON.stringify(jsonObj),
        contentType: "application/json",
    })

})

 





 
 



image-20240104152544315
image-20240104152559012
// 只有 @RequestBody 修饰形参可以接收请求参数

@RequestMapping("/requestBody")
// public String requestBody(Person person, Pet pet) {
public String requestBody(@RequestBody Person person, Pet pet) {
    System.out.println("person = " + person);
    System.out.println("pet = " + pet);
    return person + " ------- " + pet;
}




 




3. form-data

image-20240104153559294
$("#btn").click(function () {

    var formData = new FormData();
    formData.append('pname', 'formData')
    formData.append('petName', 'petName')

    $.ajax({
        type: "post",
        url: "requestBody",

        data: formData,
        processData: false,
        contentType: false,
        mimeType: "multipart/form-data",
    })

})


 
 
 





 


 



image-20240104151025783
image-20240104152435474
@RequestMapping("/requestBody")
public String requestBody(Person person, Pet pet) {
// public String requestBody(@RequestBody Person person, Pet pet) {
    System.out.println("person = " + person);
    System.out.println("pet = " + pet);
    return person + " ------- " + pet;
}