数据响应
-
页面跳转
-
直接返回字符串
@RequestMappng("/quick") public String quickMethod() { return "index"; }
与spring-mvc的视图解析器前缀、后缀拼接
<property name="prefix" value="/WEB-INF/views/"/> <property name="suffix" value=".jsp"/>
转发资源地址:/WEB-INF/views/index.jsp
-
通过ModelAndView对象返回
UserController
@RequestMappng(value="/quick2") public ModelAndView save2() { /** * Model 封装数据 * View 展示数据 */ ModelAndView modelAndView = new ModelAndView(); // 设置数据 modelAndView.addObject("username", "mkl"); // 设置视图 modelAndView.setViewName("success") return modelAndView }
- 自动注入 ModelAndView
SpringMVC会自动注入ModelAndView在需要的时候
UserController@RequestMappng(value="/quick3") public ModelAndView save3(ModelAndView modelAndView) { modelAndView.addObject("username", "mkl"); modelAndView.setViewName("success") return modelAndView }
- 拆分Model和View
UserController
@RequestMappng(value="/quick4") public Model save4(Model model) { model.addAttribute("username", "miaokela") return "success"; }
- 通过Request域对象
UserController
@RequestMappng(value="/quick5") public Model save5(HttpServletRequest request) { request.addAttribute("username", "miaokela") return "success"; }
- 自动注入 ModelAndView
-
-
回写数据
-
直接返回字符串
@RequestMappng(value="/quick6") public Model save6(HttpServletResponse response) throws IOException { response.getWriter().print("hello world"); }
- 告知SpringMVC 不进行视图跳转 直接进行数据响应
@RequestMappng(value="/quick7") @ResponseBody public String save7() throws IOException { return "hello world"; }
- 返回json字符串
导入坐标: jackson-core、jackson-databind、jackson-annotations
@RequestMappng(value="/quick8") @ResponseBody public String save8() throws IOException { User user = new User(); user.setUsername("mkl"); user.setAge(20); // 使用json转换工具 ObjectMapper objectMapper = new ObjectMapper(); String json = objectMapper.writeValueAsString(user); return json; }
- 告知SpringMVC 不进行视图跳转 直接进行数据响应
-
返回对象或集合
@RequestMappng(value="/quick9") @ResponseBody public User save9() throws IOException { User user = new User(); user.setUsername("mkl"); user.setAge(20); return user; }
配置处理器映射器 告诉SpringMVC返回对象或集合时使用json转换工具
spring-mvc.xml<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> <property name="messageConverters"> <list> <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/> </list> </property> </bean>
- 通过mvc注解驱动代替上面的配置
spring-mvc.xml
<mvc:annotation-driven/>
解释
处理器映射器、处理器适配器、视图解析器是SpringMVC的三大组件 <mvc:annotation-driven>会自动加载上面三个组件,不需要手动配置 默认底层就会集成jackson进行对象或者集合的json格式字符串转换
- 通过mvc注解驱动代替上面的配置
-
请求数据
-
请求参数
SpringMVC可以接受如下类型参数
基本类型参数 POJO类型参数 数组类型参数 集合类型参数
-
基本类型参数
参数名称与请求参数名称一致,参数值会自动映射匹配
?username=miaokela&age=20@RequestMappng(value="/quick10") @ResponseBody public void save10(String username, int age) throws IOException { System.out.println(username); System.out.println(age); }
-
POJO类型参数
POJO参数的属性名和请求参数名一致,参数值会自动映射匹配
public class User { private String username; private int age; // getter/setter } @RequestMappng(value="/quick11") @ResponseBody public void save11(User user) throws IOException { System.out.println(user); }
-
数组类型参数
业务方法数组名称和请求参数名一致,参数值会自动映射匹配
?strs=111&strs=222&strs=333@RequestMappng(value="/quick11") @ResponseBody public void save11(String[] strs) throws IOException { System.out.println(Arrays.asList(strs)); }
-
集合类型参数
获取集合参数时,需要将集合参数包装到一个POJO中才可以
public class VO { private List<User> userList; // getter/setter // toString() } @RequestMappng(value="/quick12") @ResponseBody public void save12(VO vo) throws IOException { System.out.println(vo) }
- 指定Content-Type为json形式
方法参数位置使用@RequestBody可以直接接收集合,不需要POJO进行包装
@RequestMappng(value="/quick13") @ResponseBody public void save13(@RequestBody List<User> userList) throws IOException { System.out.println(userList) }
- 开放资源访问权限
spring-mvc.xml
<mvc:resources mapping="/js/**" location="/js/"/> <mvc:resources mapping="/img/**" location="/img/"/>
或者,让tomcat去找静态资源
<mvc:default-servlet-handler/>
- 指定Content-Type为json形式
-
请求数据乱码问题
配置全局编码过滤filter
web.xml<filter> <filter-name></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> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
-
参数绑定注解
@RequestParam
请求参数名称与Controller业务方法参数名称不一致时,需要通过@RequestParam注解显示的绑定
@RequestMappng(value="/quick14") @ResponseBody public void save14(@RequestParam("name") String username) throws IOException { System.out.println(userList) }
- @RequestParam 其他参数
- value
- required
设置参数必须传递
@RequestMappng(value="/quick15") @ResponseBody public void save15(@RequestParam(value="name", required=false) String username) throws IOException { System.out.println(userList) }
- defaultValue
设置参数
@RequestMappng(value="/quick15") @ResponseBody public void save15(@RequestParam(value="name", required=false, defaultValue="mkl") String username) throws IOException { System.out.println(userList) }
- @RequestParam 其他参数
-
Restful风格参数
- 路径参数传递
@RequestMappng(value="/quick15/{username}") @ResponseBody public void save15(@PathVariable(value="username") String username) throws IOException { System.out.println(userList) }
- 路径参数传递
-
自定义类型转化器
SpringMVC默认提供了一些常用的类型转换器
但是不是所有类型都提供了类型转换器,比如日期类型就需要自定义转换器-
步骤
1.定义转换器类实现Converter接口 2.在配置文件中声明转换器 3.在<annotation-driven>中引用转换器
-
实践
请求: ?date=2020/10/20
UserController@RequestMappng(value="/quick16") @ResponseBody public void save16(Data date) throws IOException { System.out.println(date) }
- 转换器接口
public class DateConverter implements Converter<String, Date> { public Date convert(String dataStr) { // 将日期字符串转换成日期对象返回 SimpleDateFormat format = new SimpleDateFormat("yyy-MM-dd"); Data data = null; try { date = format.parse(dateStr) } catch (ParseException e) { e.printStackTrace(); } return date; } }
- 声明转换器
spring-mvc.xml
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"> <property name="converters"> <list> <bean class="com.miaokela.converter.DateConverter"></bean> </list> </property> </bean> <!-- 引用转换器 --> <mvc:annotation-driven conversion-service="conversionService"/>
- 转换器接口
-
-
-
请求头
-
@RequestHeader
value: 请求头名称 required: 是否必须携带请求头
- 示例
@RequestMappng(value="/quick17") @ResponseBody public void save17(@RequestHeader(value="User-Agent", required=false) String headerValue) throws IOException { System.out.println(headerValue) }
- 示例
-
@CookieValue
value: 指定cookie名称
required: 是否必须携带cookie- 示例 ```java @RequestMappng(value="/quick18") @ResponseBody public void save18(@CookieValue(value="JESESSOINID", required=false) String jesessionid) throws IOException { System.out.println(jesessionid) } ```
-