SpringMVC处理json字符串

目录

一. HttpMessageConverter接口

二、运行原理

三、如何使用HttpMessageConverter

四、@RequestBody和HttpEntity的使用

 1. 使用@RequestBody注解

2.同样的表单使用HttpEntity

五、@ResponseBody和ResponseEntity的使用

1. @ResponseBody注解

2. 使用ResponseEntity实现文件下载


一. HttpMessageConverter<T>接口

        1.HttpMessageConverter<T>是Spring3.0新添加的一个接口,负责将请求信息转换为一个对象(类型为 T),将对象输出为响应信息

        2. boolean canRead(Class<?> clazz, @Nullable MediaType mediaType);

                指定转换器可以读取的对象类型。

        3.boolean canWrite(Class<?> clazz, @Nullable MediaType mediaType);

                指定转换器是否可将 clazz 类型的对象写到响应流中,响应流支持的媒体类型在MediaType 中定义。

        4. List<MediaType> getSupportedMediaTypes();

                获取该转换器支持的媒体类型。

        5.T read(Class<? extends T> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException;

               将请求信息流转换为 T 类型的对象。

        6. void write(T t, @Nullable MediaType contentType, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException;

              将T类型的对象写到响应流中,同时指定相应的媒体类型为 contentType。

二、运行原理

三、如何使用HttpMessageConverter

        1. 使用 HttpMessageConverter<T> 将请求信息转化并绑定到处理方法的入参中或将响应结果转为对应类型的响应信息,Spring 提供了两种途径

                使用 @RequestBody / @ResponseBody 对处理方法进行标注。

                使用 HttpEntity<T> / ResponseEntity<T> 作为处理方法的入参或返回值

        2.当控制器处理方法使用到 @RequestBody/@ResponseBody 或HttpEntity<T> / ResponseEntity<T> 时,Spring 首先根据请求头或响应头的 Accept 属性选择匹配的 HttpMessageConverter,  进而根据参数类型或泛型类型的过滤得到匹配的 HttpMessageConverter, 若找不到可用的 HttpMessageConverter 将报错。

        3.@RequestBody 和 @ResponseBody 不需要成对出现

四、@RequestBodyHttpEntity<T>的使用

需求:将请求体转换为字符串

 1. 使用@RequestBody注解

  1. 表单页面

<h1>测试@RequsetBody注解和HttpEntity对象</h1>
<form th:action="@{/testRequestBody}" method="post">
    用户名:<input type="text" name="username"><br>
    密码:<input type="password" name="password"><br>
    <input type="submit">
</form>
<form th:action="@{/testHttpEntity}" method="post">
    用户名:<input type="text" name="username"><br>
    密码:<input type="password" name="password"><br>
    <input type="submit">
</form>

              2.处理器方法

@RequestMapping(value = "/testRequestBody",method = RequestMethod.POST)
public String testRequestBody(@RequestBody String requestBody){
    System.out.println("请求体中的内容有:"+requestBody);
    return "success";
}

2.同样的表单使用HttpEntity<T>

@RequestMapping(value = "/testHttpEntity",method = RequestMethod.POST)
public String testHttpEntity(HttpEntity<String> request ){
    System.out.println("请求头中的内容有:"+request.getHeaders());
    System.out.println("请求体中的内容有:"+request.getBody());
    return "success";
}

五、@ResponseBodyResponseEntity<T>的使用

   1. @ResponseBody注解

  1. 可以添加到类上也可以添加到方法上
  2. 添加了该注解的处理器方法方法的返回值将通过HttpMessageConverter直接响应给浏览器
  3. 测试案例:将字符串直接响应给浏览器

@ResponseBody
@RequestMapping(value = "/testResponseBody")
public String testResponseBody(){
    System.out.println("测试@ResponseBody注解");
    return "success";

}

  2. 使用ResponseEntity<T>实现文件下载

        1.页面连接

<a th:href="@{/testResponseEntity}">点我有惊喜!!!</a><br>

 2. 处理器方法

@RequestMapping(value = "/testResponseEntity")
public ResponseEntity<byte[]> testResponseEntity(HttpSession session) throws IOException {
    //获取ServletContext对象
    ServletContext servletContext = session.getServletContext();
    //获取服务器中文件的真实路径
    String realPath = servletContext.getRealPath("/download/test.txt");
    //创建输入流
    InputStream is = new FileInputStream(realPath);
    //创建字节数组
    byte[] bytes = new byte[is.available()];
    //将流读到字节数组中
    is.read(bytes);
    //创建HttpHeaders对象设置响应头信息
    MultiValueMap<String, String> headers = new HttpHeaders();
    //设置要下载的文件的名字
    String fileName="zyd.txt";
fileName = URLEncoder.encode(fileName, "UTF-8");
headers.add("Content-Disposition", "attachment;filename="+fileName);


    //设置响应状态码
    HttpStatus statusCode = HttpStatus.OK;
    //创建ResponseEntity对象
    ResponseEntity<byte[]> responseEntity = new ResponseEntity<>(bytes, headers, statusCode);
    //关闭输入流
    is.close();
    return responseEntity;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值