• SpringMVC-HttpMessageConverter(请求体/响应体)/文件下载与上传)


    目录

    一、介绍

    二、@RequestBody-获取请求体

    三、RequestEntity-获取请求报文

    四、@ResponseBody-返回值作为响应体

    五、处理json

    六、处理ajax请求

    七、@RestController

    八、ResponseEntity-返回值作为响应报文,实现文件下载

    九、文件上传


    一、介绍

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

            @RequestBody,@ResponseBody, RequestEntity, ResponseEntity(文件下载)        

    二、@RequestBody-获取请求体

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

    1. <form th:action="@{/testRequestBody}" method="post">
    2. 用户名:<input type="text" name="username"><br/>
    3. 密码:<input type="password" name="password"><br/>
    4. <input type="submit">
    5. form>
    1. @RequestMapping("/testRequestBody")
    2. public String testRequestBody(@RequestBody String requestBody){
    3. System.out.println("requestBody:"+requestBody);
    4. return "success";
    5. }

            输出结果:

    requestBody:username=admin&password=123456

    三、RequestEntity-获取请求报文

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

    1. <form th:action="@{/testRequestEntity}" method="post">
    2. 用户名:<input type="text" name="username"><br/>
    3. 密码:<input type="password" name="password"><br/>
    4. <input type="submit">
    5. form>
    1. @RequestMapping("/testRequestEntity")
    2. public String testRequestEntity(RequestEntity requestEntity){
    3. System.out.println("requestHeader:"+requestEntity.getHeaders());
    4. System.out.println("requestBody:"+requestEntity.getBody());
    5. return "success";
    6. }

            输出结果:

    1. requestHeader:[host:"localhost:8080", connection:"keep-alive", content-length:"24", cache-control:"max-age=0", sec-ch-ua:"" Not;A Brand";v="99", "Microsoft Edge";v="103", "Chromium";v="103"", sec-ch-ua-mobile:"?0", sec-ch-ua-platform:""Windows"", upgrade-insecure-requests:"1", origin:"http://localhost:8080", user-agent:"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.134 Safari/537.36 Edg/103.0.1264.71", accept:"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9", sec-fetch-site:"same-origin", sec-fetch-mode:"navigate", sec-fetch-user:"?1", sec-fetch-dest:"document", referer:"http://localhost:8080/SpringMVC/", accept-encoding:"gzip, deflate, br", accept-language:"zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6", cookie:"JSESSIONID=8B43926B2EC67BD7894DC19AB0F9E017; Idea-78910da9=e89c6d10-8e05-4fd7-8e94-8d41c1b52e21", Content-Type:"application/x-www-form-urlencoded;charset=UTF-8"]
    2. requestBody:username=wz&password=111

    四、@ResponseBody-返回值作为响应体

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

    <a th:href="@{/testResponseBody}">响应体a><br/>
    1. @RequestMapping("/testResponseBody")
    2. @ResponseBody
    3. public String testResponseBody(){
    4. return "我是响应体!!!";
    5. }

    五、处理json

            首先导入jackson的依赖

    1. <dependency>
    2. <groupId>com.fasterxml.jackson.coregroupId>
    3. <artifactId>jackson-databindartifactId>
    4. <version>2.12.1version>
    5. dependency>

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

    1. <form th:action="@{/testJson}" method="post">
    2. 用户名:<input type="text" name="username"><br>
    3. 密码:<input type="password" name="password"><br>
    4. <input type="submit">
    5. form>
    1. @RequestMapping("/testJson")
    2. @ResponseBody
    3. public User testJson(String username,String password){
    4. return new User(username,password);//响应给浏览器的就是json对象
    5. }

    六、处理ajax请求

    1. <div id="app">
    2. <h1>testAjaxh1>
    3. <a th:href="@{/testAjax}" @click="testAjax">testAjaxa><br>
    4. div>
    5. <script type="text/javascript" th:src="@{/static/js/vue.js}">script>
    6. <script type="text/javascript" th:src="@{/static/js/axios.min.js}">script>
    7. <script type="text/javascript">
    8. var vue = new Vue({
    9. el:"#app",
    10. methods:{
    11. testAjax:function (event) {
    12. axios({
    13. method:"post",
    14. url:event.target.href,
    15. params:{
    16. username:"admin",
    17. password:"123456" //传给服务器的参数
    18. }
    19. }).then(function (response) {
    20. alert(response.data); //显示响应的内容
    21. });
    22. event.preventDefault();
    23. }
    24. }
    25. });
    26. script>
    1. @RequestMapping("/testAjax")
    2. @ResponseBody
    3. public String testAjax(String username, String password){
    4. System.out.println("username:"+username+",password:"+password);
    5. return "hello,ajax";//这是返回给浏览器的数据
    6. }

    七、@RestController

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

    八、ResponseEntity-返回值作为响应报文,实现文件下载

            ResponseEntity用于控制器方法返回值类型,该控制器方法的返回值就是响应浏览器响应报文。使用ResponseEntity可实现文件下载的功能

    <a th:href="@{/testDown}">下载1.jpga><br>
    1. @RequestMapping("/testDown")
    2. public ResponseEntity<byte[]> testResponseEntity(HttpSession session) throws IOException {
    3. //获取ServletContext对象
    4. ServletContext servletContext = session.getServletContext();
    5. //获取服务器中文件的真实路径
    6. String realPath = servletContext.getRealPath("/static/img/1.jpg");
    7. //创建输入流
    8. InputStream is = new FileInputStream(realPath);
    9. //创建字节数组
    10. byte[] bytes = new byte[is.available()];
    11. //将流读到字节数组中
    12. is.read(bytes);
    13. //创建HttpHeaders对象设置响应头信息
    14. MultiValueMap headers = new HttpHeaders();
    15. //设置要下载方式以及下载文件的名字
    16. headers.add("Content-Disposition", "attachment;filename=1.jpg");
    17. //设置响应状态码
    18. HttpStatus statusCode = HttpStatus.OK;
    19. //创建ResponseEntity对象
    20. ResponseEntity<byte[]> responseEntity = new ResponseEntity<>(bytes, headers, statusCode);
    21. //关闭输入流
    22. is.close();
    23. return responseEntity;
    24. }

    九、文件上传

            文件上传要求form表单请求方式须为post,添加属性enctype="multipart/formdata"。SpringMVC中将上传的文件封装MultipartFile对象中,通过此对象可以获取文件相关信息

            添加依赖:

    1. <dependency>
    2. <groupId>commons-fileuploadgroupId>
    3. <artifactId>commons-fileuploadartifactId>
    4. <version>1.3.1version>
    5. dependency>

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

    1. <bean id="multipartResolver"
    2. class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    3. bean>

            核心代码: 

    1. <form th:action="@{/testUp}" method="post" enctype="multipart/form-data">
    2. 头像:<input type="file" name="photo"><br>
    3. <input type="submit" value="上传">
    4. form>
    1. @RequestMapping("/testUp")
    2. public String testUp(MultipartFile photo, HttpSession session) throws IOException {
    3. //获取上传的文件的文件名
    4. String fileName = photo.getOriginalFilename();
    5. //处理文件重名问题
    6. String hzName = fileName.substring(fileName.lastIndexOf("."));//获取后缀名
    7. fileName = UUID.randomUUID().toString() + hzName;//生成新的不会重复的文件名
    8. //获取服务器中photo目录的路径
    9. ServletContext servletContext = session.getServletContext();
    10. String photoPath = servletContext.getRealPath("photo");
    11. File file = new File(photoPath);
    12. if(!file.exists()){
    13. file.mkdir();//如果目录不存在,就创建一个
    14. }
    15. String finalPath = photoPath + File.separator + fileName;//最终的路径
    16. //实现上传功能
    17. photo.transferTo(new File(finalPath));
    18. return "success";
    19. }

  • 相关阅读:
    问 ChatGPT 关于GPT的事情:压缩篇
    真的牛!简历这样写,面试电话约面不断!!
    Python3 集合
    H5 兼容底部地址栏、搜索栏
    Java I/O(3):NIO中的Buffer
    hadoop报错:HADOOP_HOME and hadoop.home.dir are unset. 解决方法
    【c++5道练习题】①
    记录Kettle连不上mysql8
    电压放大器如何选择型号规格(电压放大器选型标准)
    win10搭建gtest测试环境+vs2019
  • 原文地址:https://blog.csdn.net/weixin_62427168/article/details/126068660