尚硅谷SpringMVC

**九、**HttpMessageConverter

HttpMessageConverter ,报文信息转换器,将请求报文转换为 Java 对象,或将 Java 对象转换为响应报文 HttpMessageConverter提供了两个注解和两个类型:
@RequestBody , @ResponseBody , RequestEntity, ResponseEntity

1**、****@RequestBody**

@RequestBody 可以获取请求体,需要在控制器方法设置一个形参,使用 @RequestBody 进行标识,当前请求的请求体就会为当前注解所标识的形参赋值

html 复制代码
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
<h1>首页</h1>
<form th:action="@{/testRequestBody}" method="post">
    <input type="text" name="username"><br>
    <input type="text" name="password"><br>
    <input type="submit" value="测试@RequestBody"><br>
</form>
</body>
</html>
java 复制代码
@Controller
public class HttpController {
    @RequestMapping("testRequestBody")
    public String testRequestBody(@RequestBody String requestBody){
        System.out.println("requestBody:"+requestBody);
        return "success";
    }
}
html 复制代码
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
成功了呀!
</body>
</html>

输出结果: requestBody:username=helloWorld&password=123456

2**、**RequestEntity

RequestEntity 封装请求报文的一种类型,需要在控制器方法的形参中设置该类型的形参,当前请求的请求报文就会赋值给该形参,可以通过getHeaders() 获取请求头信息,通过 getBody() 获取请求体信息

html 复制代码
<form th:action="@{/testRequestEntity}" method="post">
    <input type="text" name="username"><br>
    <input type="text" name="password"><br>
    <input type="submit" value="测试RequestEntity"><br>
</form>
java 复制代码
    @RequestMapping("/testRequestEntity")
    public String testRequestEntity(RequestEntity<String> requestEntity){
        //当前requestEntity表示整个请求报文的信息
        System.out.println("请求头:"+requestEntity.getHeaders());
        System.out.println("请求体:"+requestEntity.getBody());
        return "success";
    }

输出结果:
请求头:[host:"localhost:8080", user-agent:"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/116.0", accept:"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8", accept-language:"zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2", accept-encoding:"gzip, deflate, br", content-length:"29", origin:"http://localhost:8080", connection:"keep-alive", referer:"http://localhost:8080/springMVC/", cookie:"JSESSIONID=05A1276222C18EB3F9DB64EDC1381B98; Idea-4579b2af=cf1f07a0-0b0d-40ab-934f-8398b410993b", upgrade-insecure-requests:"1", sec-fetch-dest:"document", sec-fetch-mode:"navigate", sec-fetch-site:"same-origin", sec-fetch-user:"?1", Content-Type:"application/x-www-form-urlencoded;charset=UTF-8"]
请求体:username=admin&password=12314

3**、****@ResponseBody**

@ResponseBody 用于标识一个控制器方法,可以将该方法的返回值直接作为响应报文的响应体响应到浏览器

html 复制代码
<a th:href="@{/testResponse}">通过servletAPI的response对象响应浏览器数据</a><br>
<a th:href="@{/testResponseBody}">通过@ResponseBody响应浏览器数据</a><br>
java 复制代码
    @RequestMapping("/testResponse")
    public void testResponse(HttpServletResponse response) throws IOException {
        //将print中的内容直接作为响应报文的响应体,响应到浏览器中
        response.getWriter().print("hello,response");
    }

    @RequestMapping("/testResponseBody")
    @ResponseBody
    public String testResponseBody(){
        //加上@ResponseBody注解,就是success直接作为返回值,而不加@ResponseBody注解,就是跳转到success视图
        return "success";
    }
html 复制代码
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>成功了呀!</h1>
</body>
</html>

结果:浏览器页面显示 success

4**、SpringMVC处理****json**

@ResponseBody 处理 json 的步骤:
a> 导入 jackson 的依赖

java 复制代码
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.13.4.2</version>
        </dependency>

b> 在 SpringMVC 的核心配置文件中开启 mvc 的注解驱动,此时在 HandlerAdaptor 中会自动装配一个消息转换器:MappingJackson2HttpMessageConverter ,可以将响应到浏览器的 Java 对象转换为 Json 格式的字符串

XML 复制代码
<mvc:annotation-driven />

c> 在处理器方法上使用 @ResponseBody 注解进行标识
d> 将 Java 对象直接作为控制器方法的返回值返回,就会自动转换为 Json 格式的字符串

java 复制代码
    @RequestMapping("/testResponseUser")
    @ResponseBody
    public User testResponseUser(){
        return new User(1001,"admin","123456",22,"男");
    }

浏览器的页面中展示的结果:
{"id":1001,"username":"admin","password":"123456","age":22,"sex":" 男 "}

5**、SpringMVC处理****ajax**

a> 请求超链接

html 复制代码
<a th:href="@{/testResponseUser}">通过@ResponseBody响应浏览器User对象</a><br>

6**、@RestController注解**

@RestController 注解是 springMVC 提供的一个复合注解,标识在控制器的类上,就相当于为类添加了
@Controller 注解,并且为其中的每个方法添加了 @ResponseBody 注解

7**、**ResponseEntity

ResponseEntity 用于控制器方法的返回值类型,该控制器方法的返回值就是响应到浏览器的响应报文

十、文件上传和下载

1**、文件下载**

使用 ResponseEntity 实现下载文件的功能

html 复制代码
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>测试文件上传和下载</title>
</head>
<body>
<a th:href="@{/testDown}">下载1.webp</a>
</body>
</html>
XML 复制代码
    <mvc:view-controller path="/file" view-name="file"></mvc:view-controller>
java 复制代码
@Controller
public class FileAndDownController {

    @RequestMapping("/testDown")
    public ResponseEntity<byte[]> testResponseEntity(HttpSession session) throws IOException {
        //获取ServletContext对象
        ServletContext servletContext = session.getServletContext();
        //获取服务器中文件的真实路径
        String realPath = servletContext.getRealPath("/static/img/1.webp");
        //创建输入流
        InputStream is = new FileInputStream(realPath);
        //创建字节数组
        byte[] bytes = new byte[is.available()];//is.available()获取输入流文件所有的字节
        //将流读到字节数组中
        is.read(bytes);
        //创建HttpHeaders对象设置响应头信息
        MultiValueMap<String, String> headers = new HttpHeaders();
        //设置要下载方式以及下载文件的名字,固定的,只需要修改下载的名字
        headers.add("Content-Disposition", "attachment;filename=1.webp");
        //设置响应状态码
        HttpStatus statusCode = HttpStatus.OK;
        //创建ResponseEntity对象
        ResponseEntity<byte[]> responseEntity = new ResponseEntity<>(bytes, headers, statusCode);
        //关闭输入流
        is.close();
        return responseEntity;
    }
}

2**、文件上传**

文件上传要求 form 表单的请求方式必须为 post ,并且添加属性 enctype="multipart/form-data"
SpringMVC 中将上传的文件封装到 MultipartFile 对象中,通过此对象可以获取文件相关信息
上传步骤:
a> 添加依赖

java 复制代码
        <!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.1</version>
        </dependency>

b> 在 SpringMVC 的配置文件中添加配置:

java 复制代码
    <!--配饰文件上传解析器,将上传的文件封装为MultipartFile-->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"></bean>

c> 控制器方法:

java 复制代码
    @RequestMapping("/testUp")
    public String testUp(MultipartFile photo,HttpSession session) throws IOException {
        String filename = photo.getOriginalFilename();
        ServletContext servletContext = session.getServletContext();
        String photoPath = servletContext.getRealPath("photo");
        File file = new File(photoPath);
        //判断photoPath对应的路径是否存在
        if(!file.exists()){
            //若不存在,则创建目录
            file.mkdirs();
        }
        String finalPath=photoPath+File.separator+filename;
        photo.transferTo(new File(finalPath));
        return "success";
    }

十、拦截器

1**、拦截器的配置**

SpringMVC 中的拦截器用于拦截控制器方法的执行
SpringMVC 中的拦截器需要实现 HandlerInterceptor
SpringMVC 的拦截器必须在 SpringMVC 的配置文件中进行配置:

相关推荐
xiaoye370813 分钟前
Spring 事务传播机制 + 隔离级别
java·后端·spring
xuhaoyu_cpp_java1 小时前
Spring学习(一)
java·经验分享·笔记·学习·spring
苍煜4 小时前
SpringBoot AOP切面编程精讲:实现方式、Spring区别及与自定义注解生产实战
java·spring boot·spring
流年似水~6 小时前
Java新手5分钟接AI:Spring AI Alibaba实战
java·人工智能·spring
jnrjian7 小时前
Library Cache Load Lock library cache pins are replaced by mutexes
java·后端·spring
952368 小时前
SpringAOP
java·后端·学习·spring
zx2859634008 小时前
Laravel6.x新特性全解析
java·后端·spring
未若君雅裁9 小时前
Spring Statemachine 实战入门:从零实现一个订单状态流转 Demo
java·spring·状态模式
java1234_小锋10 小时前
Spring AI 2.0 开发Java Agent智能体 - Advisors —— 拦截器模式增强AI能力
java·人工智能·spring·ai·spring ai2.0
苍煜11 小时前
SpringBoot Spring事务完整版详解:@Transactional注解实操 + 七大事务传播机制用法
spring boot·spring·oracle