三、SpringMVC报文信息
1、HttpMessageConverter
- HttpMessageConverter,报文信息转换器,将请求报文转换为java对象,或将java对象转换为响应报文
- HttpMessageConverter提供了两个注解和两个类型:
- @RequestBody RequestEntity
- @ResponseBody ResponseEntity
2、@RequestBody
-
@RequestBody可以获取请求体,需要在控制器方法设置一个形参,使用@RequestBody进行表示,当前请求的请求体就会为当前注解所标识的形参赋值
<form th:action="@{/testRequestBody}" method="post"> <input type="text" name="username" placeholder="用户名"> <input type="text" name="password" placeholder="密码"> <input type="submit" value="测试@RequestBody注解"> </form>
/** * 用来测试 @RequestBody注解 * @param body * @return */ @RequestMapping("/testRequestBody") public String testRequestBody(@RequestBody String body){ System.out.println(body);//username=admin&password=1234 return "success"; }
3、RequestEntity
-
RequestEntity是封装请求报文的一种类型,需要在控制器方法的形参中设置该类型的形参,当前请求的请求报文就会赋值给该形参,可以通过getHeads()获取请求头信息,通过getBody()获取请求体信息
/** * 测试 RequestEntity类型获取全部的请求信息 * @param entity * @return */ @RequestMapping("/testRequestEntity") public String testRequestEntity(RequestEntity<String> entity){ System.out.println("请求头:" + entity.getHeaders()); System.out.println("请求体:" + entity.getBody()); return "success"; }
4、@ResponseBody
-
@ResponseBody用于标识一个控制器方法,可以将该方法的返回值直接作为响应报文的响应体响应到浏览器
/** * 使用 @ResponseBody注解向浏览器返回数据 * @return */ @RequestMapping("/testResponseBody") @ResponseBody public String testResponseBody(){ return "success";//页面不再被视图解析器解析,会在页面显示success }
5、SpringMVC处理ajax
-
使用@ResponseBody注解处理json需要以下步骤
-
导入jsckson的jar包
<!-- jackson的驱动包--> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.12.4</version> </dependency>
-
在springMVC的核心配置文件中开启mvc的注解驱动,此时HandlerAdaptor中会自动装配一个消息转换器:MapppingJackson2HttpMessageConverter,可以将响应到浏览器的java对象转换为json格式的字符串
<!-- 开启注解驱动--> <mvc:annotation-driven/>
-
编写控制器方法
/** * 使用 @ResponseBody注解向浏览器返回对象 * springMVC中是使用jackson的json解析,要导入jack的jar包 * 并且要开启注解驱动 * @return */ @RequestMapping("/testResponseBodyUser") @ResponseBody//使用 @ResponseBody向浏览器返回对象 以json的形式 public User testResponseBodyUser(){ User user = new User(); user.setId(1001); user.setName("张三"); user.setAge("23"); return user; }
-
6、SpringMVC处理ajax
-
请求超链接以及ajax
<div id="app"> <a @click.prevent="testAxios" th:href="@{/testAjax}">使用@ResponseBody注解测试ajax</a> </div> <script th:src="@{/static/js/vue.js}"></script> <script th:src="@{/static/js/axios.min.js}"></script> <script> new Vue({ el : '#app', methods : { testAxios(e){ axios({ method : 'post', url : e.target.href, params : { username : 'admin', password : '123456' } }).then(function (response) { alert(response.data); }); } } }) </script>
-
控制器方法
@RequestMapping("/testAjax") @ResponseBody public String testAjax(String username,String password){ return "Hello,Ajax"; }
7、@RestController注解
- @RestController注解是SpringMVC提供的一个复合注解,标识在控制器的类上,相当于类添加了@Controller注解,并且为其中的每个方法添加了@ResponseBody注解
8、ResponseEntity
-
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; }
9、文件上传功能
-
要求:文件上传要求form表单的请求方式必须为post,并且添加属性enctype=“multipart/form-data”,SpringMVC中将上传的文件封装到MultipartFile对象中,通过此对象可以获取文件相关信息
-
使用步骤:
-
导入文件上传依赖jar包
<!-- 文件上传需要的jar包--> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.4</version> </dependency>
-
在SpringMVC核心配置文件中添加
<!-- 文件上传解析器--> <!-- 注意:id名称必须为multipartResolver--> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/>
-
控制器方法
/** * 测试文件上传 * @param photo * @return */ @RequestMapping("/testUp") public String testUp(MultipartFile photo,HttpSession session) throws IOException { //获取上传文件的文件名 String fileName = photo.getOriginalFilename(); //处理文件重名问题 String hzName = fileName.substring(fileName.lastIndexOf(".")); fileName = UUID.randomUUID().toString() + hzName; //获取服务器中photo目录的路径 ServletContext context = session.getServletContext(); String photoPath = context.getRealPath("photo"); File file = new File(photoPath); if (!file.exists()){ file.mkdir(); } String finalPath = photoPath + File.separator + fileName; //实现文件上传功能 photo.transferTo(new File(finalPath)); return "success"; }
-