SpringMVC学习笔记(二)-参数与返回值
SpringMVC学习笔记(二)-参数与返回值
控制器方法参数
-
在控制器中可以包含以下四类参数。参数由系统自动赋值
- HttpServletRequest
- HttpServletResponse
- HttpSession
- 请求中携带的参数
-
参数乱码的过滤器设置
<filter> <filter-name>characterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <!--设置项目使用的字符编码--> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <!--强制请求使用encoding的编码方式--> <init-param> <param-name>forceRequestEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>characterEncodingFilter</filter-name> <!--拦截所有请求--> <url-pattern>/*</url-pattern> </filter-mapping>
逐个接收
- 保证请求参数名与控制器方法参数名相同即可
- 框架使用request.getParameter("xxxx")接收参数
- 前端控制器调用对应的控制器方法将接受的参数值赋予对应的形参
- 框架自动转换数据类型
- 面临的问题:
- 参数数据为空,使用包装类型
- 请求参数名与形参名不一致:
- 解决办法:@RequestPram,value属性设置为请求中的参数名,放置在形参前
- 此注解存在属性:boolean required() default true,默认必须存在对应的请求参数
对象接收
- 保证请求参数名与对象属性名一致
- 对象对应的类需要有无参构造方法及属性对应的set方法
- 框架在处理时会调用对象的类的无参构造方法创建对象,之后调用对应属性的set方法进行赋值
- 此时无法再使用@RequestParameter注解
控制器方法的返回值
-
控制器方法的返回值表示返回处理的结果,包含:
- ModelAndView:处理结果既有数据又有视图
- String:返回的处理结果只有视图,执行转发操作,可以为完整视图路径或视图逻辑名称
- void
- Object
-
void
-
无直接返回处理结果,可用于AJAX请求的处理
-
Maven配置
-
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.11.3</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.11.3</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.11.3</version>
-
-
传统的json数据处理
-
objectMapper om = new ObjectMapper(); String json = om.writerValueAsString(xxx); response.setContentType("application/json;charset=utf-8"); PrintWriter pw = response.getWriter(); pw.println(json); pw.flush();
pw.close();
``` -
-
-
Object
-
返回对象为数据,用于响应AJAX请求,可以是List、Map、Intdege... ...
-
HttpMessageConverter接口,作用:
- 实现请求数据转换为java对象
- boolean canRead(Class<?> clazz,MediaType mediaType);方法检查clazz对象能否转为mediaType格式,MediaType类比于MINI
- T read(Class<? extends T> clazz, HttpInputMessage inputMessage);方法接收请求中的数据,转换为clazz对应的对象
- 将对象转为json或其他数据格式
- boolean canWrite(Class<?> clazz, MediaType mediaType);
- void write(T t, MediaType contentType, HttpOutputMessage outputMessage)
- 实现类:
- MappingJackson2HttpMessageConverter:使用jackson工具库的objectmapper把java对象转为json数据格式
- StringHttpMessageConverter:将字符串类型的数据进行格式转换和编码
- 实现请求数据转换为java对象
-
框架根据控制器方法的返回值类型,自动查找使用的实现类
-
默认情况下SpringMVC使用了HttpMessageConverter接口的4个实现类,包括StringHttpMessageConverter,但是不包括MappingJackson2HttpMessageConverter
-
在SpringMVC的配置文件中加入注解驱动
<mvc:annotation-driven/>
标签后,SpringMVC会创建HttpMessageConverter接口的七个实现类 -
@ResponseBody
-
将转换为json数据的java对象通过HttpServletResponse输出到浏览器,功能是输出
-
可以区分返回值String是视图还是数据,此时返回到浏览器的是文本数据,此时响应头Content-Type为text/plain;charset=ISO-8859-1,使用StringHttpMessageConverter处理的,解决办法:
-
设置 @RequestMapping的produces属性
-
-
-
框架的处理流程:
-
框架根据控制器方法的返回值类型,使用HttpMessageConverter接口的实现类MappingJackson2HttpMessageConverter
-
使用MappingJackson2HttpMessageConverter的write()方法将java对象转换为json数据格式,此时设置了媒体的类型及编码方式
-
框架使用@ResponseBody注解将转化的json数据输出到浏览器
@RequestMapping(path = "/findById") @ResponseBody public Product findById(int id){ return productService.findById(id); }
-
-