- SpringMVC 数据的请求参数的类型
- 基本类型参数
- 参数列表中的参数将会直接由请求参数获取并赋值
- @RequestParam() 注解修改请求参数和 controller 方法参数列表的参数名映射关系
- @PathVariable() 注解配置 Restful 风格请求参数名和 controller 方法参数列表的参数名映射关系
- 通过@RequestHeader() 获取指定的请求头
- 通过@CookieValue() 获取指定的 Cookie
- entity 类型参数
- 参数列表中对象的属性将会直接由请求参数获取并封装
- 解析请求体中的 json 字符串使用@RequestBody 注解,且将其封装到形参的对象中
- 自定义类型转换器的使用
- 数组类型参数
- 参数列表中的参数将会直接由请求中的多个同名请求参数获取并赋值到数组
- 集合类型参数
- urlencoded 参数集合类型的封装有别于其他类型,他一般借助其他类进行封装
- 解析请求体中的 json 字符串使用@RequestBody 注解,且将其封装到形参的对象中
- 文件的上传
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: 新增 use
代码
pom
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>priv.noby</groupId>
<artifactId>springMVC5</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.15.RELEASE</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.11.4</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.11.4</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.11.4</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.2.2</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>8080</port>
<path>/springMVC5</path>
<uriEncoding>utf-8</uriEncoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<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>
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
entity
package priv.noby.springmvc4.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student {
private Integer id;
private String name;
private Integer age;
}
package priv.noby.springmvc5.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class VO {
private List<Student> studentList;
}
spring-mvc.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<context:component-scan base-package="priv.noby.springmvc5.controller"/>
<mvc:annotation-driven conversion-service="converterService"/>
<mvc:default-servlet-handler/>
<bean id="converterService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<list>
<bean class="priv.noby.springmvc5.converter.DateConverter"/>
</list>
</property>
</bean>
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="5242800"/>
<property name="maxUploadSizePerFile" value="5242800"/>
<property name="defaultEncoding" value="UTF-8"/>
</bean>
</beans>
converter
package priv.noby.springmvc5.converter;
import org.springframework.core.convert.converter.Converter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateConverter implements Converter<String, Date> {
@Override
public Date convert(String s) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
try {
return format.parse(s);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
}
controller
package priv.noby.springmvc5.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import priv.noby.springmvc5.entity.Student;
import priv.noby.springmvc5.entity.VO;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
@Controller
public class StudentController {
@RequestMapping("/select")
@ResponseBody
public String select(String name, int age) {
System.out.println("StudentController.select");
String format = String.format("获取到数据 name=%s,age=%d", name, age);
System.out.println(format);
return format;
}
@RequestMapping("/select2")
@ResponseBody
public String select2(Student student) {
System.out.println("StudentController.select2");
String format = String.format("获取到数据 %s", student);
System.out.println(format);
return format;
}
@RequestMapping("/select3")
@ResponseBody
public String select3(int[] nums) {
System.out.println("StudentController.select3");
String format = String.format("获取到数据 %s", Arrays.toString(nums));
System.out.println(format);
return format;
}
@RequestMapping("/select4")
@ResponseBody
public String select4(VO vo) {
System.out.println("StudentController.select4");
String format = String.format("获取到数据 %s", vo);
System.out.println(format);
return format;
}
@RequestMapping("/select5")
@ResponseBody
public String select5(@RequestBody List<Student> studentList) {
System.out.println("StudentController.select5");
String format = String.format("获取到数据 %s", studentList);
System.out.println(format);
return format;
}
@RequestMapping("/select6")
@ResponseBody
public String select6(@RequestParam("username") String name, @RequestParam(value = "userAge", required = false, defaultValue = "18") int age) {
System.out.println("StudentController.select6");
String format = String.format("获取到数据 name=%s,age=%d", name, age);
System.out.println(format);
return format;
}
@RequestMapping(value = "/select7/{userId}", method = RequestMethod.GET)
@ResponseBody
public String select7(@PathVariable("userId") int id) {
System.out.println("StudentController.select7");
String format = String.format("获取到数据 id=%d", id);
System.out.println(format);
return format;
}
@RequestMapping("/select8")
@ResponseBody
public String select8(Date date) {
System.out.println("StudentController.select8");
String format = String.format("获取到数据 date=%s", date);
System.out.println(format);
return format;
}
@RequestMapping("/select9")
@ResponseBody
public String select9(@RequestHeader(value = "User-Agent", required = false) String userAgent) {
System.out.println("StudentController.select9");
String format = String.format("获取到数据 userAgent=%s", userAgent);
System.out.println(format);
return format;
}
@RequestMapping("/select10")
@ResponseBody
public String select10(@CookieValue(value = "JSESSIONID", required = false) String jsessionId) {
System.out.println("StudentController.select10");
String format = String.format("获取到数据 jsessionId=%s", jsessionId);
System.out.println(format);
return format;
}
@RequestMapping("/select11")
@ResponseBody
public String select11(String fileName, MultipartFile uploadFile) {
System.out.println("StudentController.select11");
String format = String.format("获取到数据 fileName=%s", fileName);
System.out.println(format);
String originalFilename = uploadFile.getOriginalFilename();
try {
uploadFile.transferTo(new File("D:\\IdeaProjects\\stage3\\springMVC5\\src\\main\\webapp\\upload\\" + fileName + ".jpg"));
} catch (IOException e) {
e.printStackTrace();
}
return format;
}
}
http
### springMVC 请求 基本类型参数
GET http://localhost:8080/springMVC5/student/select?name=诺比&age=20
### springMVC 请求 entity数据类型的封装
GET http://localhost:8080/springMVC5/student/select2?name=诺比&age=20
### springMVC 请求 数组数据类型封装
GET http://localhost:8080/springMVC5/student/select3?nums=10&nums=20&nums=30
### springMVC 请求 集合数据类型借助VO类的封装
GET http://localhost:8080/springMVC5/student/select4?studentList[0].name=诺比&studentList[0].age=21&studentList[1].name=凯斯&studentList[1].age=22
### springMVC 请求 集合数据类型借助VO类的封装,post请求键值对参数乱码测试
POST http://localhost:8080/springMVC5/student/select4
Content-Type: application/x-www-form-urlencoded
studentList[0].name=诺比&studentList[0].age=21&studentList[1].name=凯斯&studentList[1].age=22
### springMVC 请求 集合数据类型使用@RequestBody
POST http://localhost:8080/springMVC5/student/select5
Content-Type: application/json
[
{ "name": "诺比",
"age": 21
},
{
"name": "凯斯",
"age": 22
}
]
### springMVC 请求 基本类型参数,使用@RequestParam完成参数映射
GET http://localhost:8080/springMVC5/student/select6?username=诺比&userAge=30
### springMVC 请求 基本类型参数,通过@PathVariable注解使用Restful风格请求
GET http://localhost:8080/springMVC5/student/select7/1
### springMVC 请求 自定义类型转换器(自定义类、配置文件声明、配置文件引用三个步骤)
GET http://localhost:8080/springMVC5/student/select8?date=2022-10-14
### springMVC 请求 通过@RequestHeader获取指定的请求头
GET http://localhost:8080/springMVC5/student/select9
### springMVC 请求 通过@CookieValue()获取指定的Cookie
GET http://localhost:8080/springMVC5/student/select10
### springMVC 请求 上传文件(该请求和本项目upload.jsp中的请求一样)
POST http://localhost:8080/springMVC5/student/select11
Content-Type: multipart/form-data; boundary=WebAppBoundary
#一个WebAppBoundary包含内的即代表一个form中的input标签
--WebAppBoundary
#这里的name中的值必须和controller中的方法参数名一致才能传入
Content-Disposition: form-data; name="fileName"
Content-Type: text/plain
#下一行的字符串即为本input的key fileName的value 一个表单输入的name
一个表单输入的name
--WebAppBoundary
Content-Disposition: form-data; name="uploadFile"; filename="984271.jpg"
< D:/media/image/精选/984271.jpg
--WebAppBoundary--
### 中央调度器配置路径,静态资源是否可访问测试(css是否生效)
GET http://localhost:8080/springMVC5/static.jsp
jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>student</title>
</head>
<body>
来自StudentController的转发成功 ${requestScope.info}
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<link href="${pageContext.request.contextPath}/css/static.css" rel="stylesheet">
</head>
<body>
<div class="css_test">
测试css是否生效
</div>
<img src="${pageContext.request.contextPath}/img/photo.jpg" width="900" height="700">
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>upload</title>
</head>
<body>
<%--注意表单中的enctype="multipart/form-data" method="post"--%>
<form action="${pageContext.request.contextPath}/student/select11" enctype="multipart/form-data" method="post">
<label>
name:
<input type="text" name="fileName">
</label><br>
file:<input type="file" name="uploadFile"><br>
<input type="submit" value="submit">
</form>
</body>
</html>