- Spring MVC的配置是通过继承
WebMvcConfigurerAdapter
类并重载其方法实现的; - 前几个教程已做了得配置包括
- 01点睛Spring MVC 4.1-搭建环境 配置viewResolver
- 03点睛Spring MVC 4.1-REST 静态资源映射
- 04点睛Spring MVC 4.1-拦截器 配置拦截器
- 06点睛Spring MVC 4.1-文件上传 配置multipartResolver
- 07点睛Spring MVC4.1-ContentNegotiatingViewResolver 配置ContentNegotiatingViewResolver
9.2 演示
9.2.1 配置路径匹配参数
-
在Spring MVC中路径参数如果带
.
的话,.
后面的值将被忽略,本例演示配置configurePathMatch
不忽略点后面的参数; -
演示控制器
@RequestMapping("/configPath/{test}") public @ResponseBody String configPath(@PathVariable String test){ return "request value:"+test; }
- 运行:访问http://localhost:8080/testSpringMVC/configPath/xx.yy
- 在继承
WebMvcConfigurerAdapter
的DemoMVCConfig
类中重载configurePathMatch
@Override public void configurePathMatch(PathMatchConfigurer configurer) { configurer.setUseSuffixPatternMatch(false); }
- 再次运行:访问访问http://localhost:8080/testSpringMVC/configPath/xx.yy
9.2.2 快捷定义ViewController
- 我们经常涉及到页面转向,但没任何处理业务的时候,快捷的页面转向定义会节省好多代码;
- 在views目录下建一个任意的
test.jsp
- 常规的方案是这样写的
@RequestMapping("/mytest") public String test(){ return "test"; }
- 在继承
WebMvcConfigurerAdapter
的DemoMVCConfig
类中重载addViewControllers
@Override public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController("/mytest").setViewName("/test"); //添加更多 }
- 以上效果等同,均会指向views下的test.jsp
9.2.3 配置HttpMessageConverter
HttpMessageConverter
是对http的request和response进行自动转换-
配置
HttpMessageConverter
可重载下面两个方法任意一个configureMessageConverters
:重载会覆盖掉spring mvc默认注册的多个HttpMessageConverter
extendMessageConverters
:仅添加一个自定义的HttpMessageConverter
,不覆盖默认注册的HttpMessageConverter
-
通过对上面的讲述,我们一般是重载
extendMessageConverters
方法; -
下面我们演示使用js向spring mvc发送自定义格式的字符串(属性用-隔开),通过自定义的
HttpMessageConverter
自动转换成对象,然后通过HttpMessageConverter
输出指定格式到浏览器 -
测试javabean
- Person
package com.wisely.domain;public class Person { private String firstName; private String lastName; public Person(String firstName, String lastName) { super(); this.firstName = firstName; this.lastName = lastName; } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; }}
- 自定义
HttpMessageConverter
:WiselyMessageConverter
package com.wisely.converters;import java.io.IOException;import java.nio.charset.Charset;import org.springframework.http.HttpInputMessage;import org.springframework.http.HttpOutputMessage;import org.springframework.http.MediaType;import org.springframework.http.converter.AbstractHttpMessageConverter;import org.springframework.http.converter.HttpMessageNotReadableException;import org.springframework.http.converter.HttpMessageNotWritableException;import org.springframework.util.StreamUtils;import com.wisely.domain.Person;public class WiselyMessageConverter extends AbstractHttpMessageConverter { //自定义媒体类型 public WiselyMessageConverter(){ super(new MediaType("application", "x-wisely", Charset.forName("UTF-8"))); } //从request里获得构造Person实例的数据 @Override protected Person readInternal(Class clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException { String temp = StreamUtils.copyToString(inputMessage.getBody(), Charset.forName("UTF-8")); String[] tempArr = temp.split("-"); return new Person(tempArr[0],tempArr[1]); } //只支持Person类 @Override protected boolean supports(Class clazz) { return Person.class.isAssignableFrom(clazz); } //将person实例转换成你想要的字符串格式 @Override protected void writeInternal(Person person, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException { String out = "hello:" +person.getFirstName() + "-" + person.getLastName(); outputMessage.getBody().write(out.getBytes()); }}
- 配置
WiselyMessageConverter
@Override public void extendMessageConverters(List > converters) { WiselyMessageConverter converter = new WiselyMessageConverter(); converters.add(converter); }
注释掉上例的configureContentNegotiation
,这里会自动将媒体类型变为text/html
// 配置ContentNegotiationManager,在无后缀名情况下默认为jsp view resolver// @Override// public void configureContentNegotiation(// ContentNegotiationConfigurer configurer) { // //忽略请求的header信息,并将contentType置为text/html// configurer.ignoreAcceptHeader(true).defaultContentType(// MediaType.TEXT_HTML);// }
- 测试控制器
@RequestMapping(value = "/convert", produces = { "application/x-wisely" }) public @ResponseBody Person convert(@RequestBody Person person) { return person; }
- 测试页面:test.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> Insert title here
- 运行效果