SpringMVC框架基础详解(五) (报文转化器HttpMessageConverter实现文件下载上传、SpringMVC处理JSON、)


一、HttpMessageConverter

报文信息转换器,将请求报文转换为Java对象,或将Java对象转换为响应报文。

HttpMessageConverter提供了两个注解和两个类型:
@RequestBody
@ResponseBody
RequestEntity
ResponseEntity

1.1、@RequestBody

@RequestBody可以获取请求体,需要在控制器方法设置一个形参。
使用@RequestBody进行标识,当前请求的请求体就会为当前注解所标识的形参赋值。
<form th:action="@{/testRequestBody}" method="post"> 
用户名:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br> 
<input type="submit"> </form>
 @RequestMapping("/testRequestBody")
    public String testRequestBody(@RequestBody String requestBody) {
        System.out.println("requestBody:" + requestBody);
        return "success";
    }

在这里插入图片描述

1.2、RequestEntity

RequestEntity封装请求报文的一种类型,需要在控制器方法的形参中设置该类型的形参,
当前请求的请求报文就会赋值给该形参,可以通过getHeaders()获取请求头信息,通过getBody()获取请求体信息
@RequestMapping("/testRequestEntity") 
public String testRequestEntity(RequestEntity<String> requestEntity){
 System.out.println("requestHeader:"+requestEntity.getHeaders()); 
 System.out.println("requestBody:"+requestEntity.getBody());
return "success"; }

输出结果: requestHeader:[host:“localhost:8080”, connection:“keep-alive”, content-length:“27”,
cache-control:“max-age=0”, sec-ch-ua:“” Not A;Brand";v=“99”, “Chromium”;v=“90”, “Google
Chrome”;v=“90"”, sec-ch-ua-mobile:“?0”, upgrade-insecure-requests:“1”, origin:“http://localhost:8
080”, user-agent:"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like

1.3、@ResponseBody

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

@RequestMapping("/testResponseBody") 
@ResponseBody 
	public String testResponseBody(){ 
	return "success...";
	 }

结果:浏览器页面显示success…

1.4、ResponseEntity(文件下载)

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

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

file.html页面如下,即可实现下载。

<body>
<!--下载是从服务器端下载到浏览器端,上传是从浏览器端上传到服务器端 -->
<a th:href="@{testDown}">下载1.jpg</a>
<!--上传必须用post请求,配置multipart/from-data会让文件以二进制的方式进行传输-->
</body>

二、SpringMVC处理json、ajax

2.1 、处理json

*1. 导入jackson的依赖
<dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.13.2.2</version>
        </dependency>
*2.在SpringMVC的核心配置文件中开启mvc的注解驱动,此时在HandlerAdaptor中会自动装配一个消息转换器:MappingJackson2HttpMessageConverter,
它可以将响应到浏览器的Java对象转换为Json格式的字符串
<mvc:annotation-driven></mvc:annotation-driven>
*3.在处理器方法上使用@ResponseBody注解进行标识

*4.将Java对象直接作为控制器方法的返回值返回,就会自动转换为Json格式的字符串

2.2 处理ajax

*1.请求超链接:	
<div id="app">
 <a th:href="@{/testAjax}" @click="testAjax">testAjax</a><br> 
</div>
*2.通过vue和axios处理点击事件:
<script type="text/javascript" th:src="@{static/js/vue.js}"></script>
<script type="text/javascript" th:src="@{static/js/axios.min.js}"></script>
<script type="text/javascript">
    var vue=new Vue({
       el:"#app",
        methods:{
           testAxios:function (event){
               axios({
                   method:"post",
                   url:event.target.href,
                   params:{
                       username:"admin",
                       password:"123456"
                   }
               }).then(function (response){
                   alert(response.data);
               });
               event.preventDefault();
           }
        }
    });
</script>

2.3、@RestController注解

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

三、文件上传

*文件上传要求form表单的请求方式必须为post,并且添加属性enctype="multipart/form-data"

*SpringMVC中将上传的文件封装到MultipartFile对象中,通过此对象可以获取文件相关信息

3.1、添加依赖pom.xml

<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.4</version>
</dependency>

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

<!--必须通过文件解析器的解析才能将文件转换为MultipartFile对象--> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> </bean>

3.3、控制器方法

 @RequestMapping("/testUp")
    //获取服务器路径,需要形参session
    public String testUp(MultipartFile photo ,HttpSession session){
        //获取上传的文件的文件名
        String fileName = photo.getOriginalFilename();
        //获取上传的文件的后缀名
        String suffixName=fileName.substring(fileName.lastIndexOf("."));
        //将UUID作为文件名
        String uuid = UUID.randomUUID().toString();
        //将uuid和后缀名拼接后的结果作为最终的文件名
        fileName=uuid+suffixName;
        //通过servletContext获取服务器中photo文件目录的路径
        ServletContext servletContext = session.getServletContext();
        String photoPath = servletContext.getRealPath("photo");
        File file =new File(photoPath);
        //判断photoPath所对应路径是否存在
        if (file.exists()){
            //若不存在,创建目录
            file.mkdir();
        }
        //最终路径是 目录+分隔符+文件名
        String finalPath=photoPath+File.separator+fileName;
        try {
            photo.transferTo(new File(finalPath));
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "success";
    }

3.4 访问file路径,选择文件点击上传,实现上传

在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值