当请求路径和方法匹配之后,请求便进入方法体里面进行处理业务,在这之前,springmvc会做一些参数绑定,格式化,已经校验。springmvc在参数绑定方面,给我们带来巨大便利,现在我们来看看支持哪些参数类型
用原生的servlet api做为参数
@RequestMapping("/mvc1")
public void mvc1(HttpServletRequest request,HttpServletResponse response,HttpSession session) {
ServletContext context = request.getServletContext();
}
springmvc还专门为HttpServletRequest 封装了俩个类,这俩个类也可以作为参数传进来,
@RequestMapping("/mvc2")
public void mvc2(WebRequest webRequest,NativeWebRequest nativeWebRequest) {
}
利用java.util.Locale获取本地化信息,Locale本地化信息由LocaleResolver / LocaleContextResolver配置
@RequestMapping("/mvc3")
public void mvc3(Locale local) {
System.out.println("首都:" + local.getCountry() + " 国语" + local.getLanguage() + " ");
}
利用java.util.TimeZone解析时区,由LocaleContextResolver配置
@RequestMapping("/mvc4")
public void mvc4(TimeZone zone) {
}
用输入流作为参数,可处理上传文件文件
@RequestMapping("/mvc5")
public void mvc5(InputStream is ,Reader reader) throws IOException{
FileUtils.copyInputStreamToFile(is, new File("D://color.png")); //将输入流保存成文件
}
用输出流做参数,可处理下载文件
@RequestMapping("/mvc6")
public void mvc6(OutputStream os ,Writer write,InputStream is) throws IOException{
os.write(FileCopyUtils.copyToByteArray(is)); //将输入流写到客户端,可用于下载文件
}
利用org.springframework.http.HttpMethod读取请求方法
@RequestMapping(“/mvc7”)
public void mvc7(HttpMethod reqMethod) throws IOException{
System.out.println(reqMethod.name());
}
利用java.security.Principal 获取当前登录用户的一些信息
@RequestMapping("/mvc8")
public void mvc8(Principal principal) throws IOException{
System.out.println(principal.getName());
}
利用@PathVariable获取请求变量
@RequestMapping("/mvc9/{id}")
public void mvc9(@PathVariable Long id) throws IOException{
System.out.println(id);
}
利用@MatrixVariable 获取矩阵请求变量,需要在配置文件将矩阵请求打开,请求类似/cars;color=red;year=2012
@RequestMapping("/mvc10/")
public void mvc10(@MatrixVariable Long id) throws IOException{
System.out.println(id);
}
//在dispatch-content.xml配置打开允许矩阵请求格式
<mvc:annotation-driven enable-matrix-variables="true">
</mvc:annotation-driven>
利用@RequestParam来绑定请求参数,不能绑定content-type为application/xml和application/json的媒体类型
/**
* 默认required为true,当为true时,如果请求参数没有name,则报错
* @param name
* @throws IOException
*/
@RequestMapping("/mvc11/")
public void mvc11(@RequestParam(value = "name", required = false ,defaultValue = "我是谁") String name) throws IOException{
}
利用@RequestPart除来绑定multipart/form-data
@RequestMapping("/mvc21")
public void mvc21(@RequestPart("file") MultipartFile file) {
}
利用@CookieValue除来绑定cookie值
@RequestMapping("/mvc22")
public void mvc22(@CookieValue("JSESSIONID") String sessionId) {
}
利用@RequestHeader获取头部信息
@RequestMapping("/mvc12/")
public void mvc12(@RequestHeader("Accept-Encoding") String encoding,
@RequestHeader("Keep-Alive") long keepAlive) {
//...
}
利用@RequestBody来绑定类似application/json,application/xml的媒体类型请求,目前测试的springmvc的版本是4.1.4,直接加入jackson-annotations-2.7.3.jar,jackson-core-2.7.3.jar,jackson-databind-2.7.3.jar,jackson-dataformat-xml-2.7.3.jar,前端在请求的时候,需要加入需要的content-type
@RequestMapping(value = "/mvc13", method = RequestMethod.POST, consumes="application/json")
public void mvc13(HttpServletRequest req ,@RequestBody(required = false) List<Task> task) {
}
@RequestMapping(value = "/mvc14", method = RequestMethod.POST, consumes="application/xml")
public void mvc14(HttpServletRequest req ,@RequestBody(required = false) List<Task> task) {
}
前端这里利用jquery的ajax
function getXmlStr(){
var xml = "<?xml version = '1.0'?>" +
"<ArrayList>" +
" <item>" +
" <taskName>taskName</taskName>" +
" <createTime>1460195925557</createTime>" +
" <taskDetail>taskDetail</taskDetail>" +
" </item>" +
" <item>" +
" <taskName>taskName</taskName>" +
" <createTime>1460195925557</createTime>" +
" <taskDetail>taskDetail</taskDetail>" +
" </item>" +
"</ArrayList>" ;
return xml;
}
function getJsonStr(){
var customerArray = new Array();
customerArray.push({taskName: "任务1"});
customerArray.push({taskName: "任务2"});
var jsonStr = JSON.stringify(customerArray);
return jsonStr;
}
//xml的请求,后台直接直接用list<Task>接收
$.ajax({
url : "/whats/task/mvcTest10",
contentType : "application/xml",
data : getXmlStr(),
type : "post",
success : function(data){
},
error : function(error){
}
});
//json请求,后台直接直接用list<Task>接收
$.ajax({
url : "/whats/task/mvcTest10",
contentType : "application/xml",
data : getJsonStr(),
type : "post",
success : function(data){
},
error : function(error){
}
});
@requestBody在实现上是利用HttpMessageConverters实现,HttpMessageConverter默认注册了了以下
ByteArrayHttpMessageConverter 转化字节.
StringHttpMessageConverter 转化字符串
FormHttpMessageConverter 转化数据到MultiValueMap
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" />
<bean class="org.springframework.http.converter.xml.MappingJackson2XmlHttpMessageConverter" />
</mvc:message-converters>
</mvc:annotation-driven>
但这里其实,我们不需要注册,因为当我们在配置文件配置spingmvc会检测com.fasterxml.jackson.databind.ObjectMapper和com.fasterxml.jackson.dataformat.xml.XmlMapper类是否存在,存在则自动注册MappingJackson2HttpMessageConverter和MappingJackson2XmlHttpMessageConverter。所以我们只需要按常规配置就可以了
<mvc:annotation-driven />
springmvc的参数默认编码是iso-8859-1消息转化器的作用还能帮我们解决乱码问题
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<constructor-arg value="UTF-8" />
<property name="supportedMediaTypes">
<list>
<value>application/json;charset=UTF-8</value>
<value>text/html;charset=UTF-8</value>
<value>application/xml;charset=UTF-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
除了@RequestBody利用HttpMessageConverter处理之外,HttpEntity
@RequestMapping(value = "/mvc15", method = RequestMethod.POST, consumes="application/json")
public void mvc15(HttpEntity<List<Task>> task) {
List<Task> tasks = task.getBody();
HttpHeaders headers = task.getHeaders();
}
利用@ModelAttribute 来将参数绑定到模型中
@RequestMapping("/mvc23")
public void mvc23(@ModelAttribute Task task) {
}
利用java.util.Map / org.springframework.ui.Model / org.springframework.ui.ModelMap读写模型数据
/**
* 任何请求进入方法之前,都会先进入这个方法,将task放到模型数据中
* @return
*/
@ModelAttribute
public Task getTask() {
Task task = new Task();
task.setTaskDetail("mydetai");
task.setTaskName("mytaskName");
return task;
}
@RequestMapping("/mvc16")
public void mvc16(ModelMap modelMap) {
modelMap.get("task"); //获取模型数据
modelMap.addAttribute("task", new Task()) ; //添加模型数据
}
利用@Validated校验参数,利用org.springframework.validation.Errors / org.springframework.validation.BindingResult 获取参数校验结果
@RequestMapping("/mvc17")
public void mvc17(@Validated Task task,BindingResult result) {
if (result.hasErrors()) {
//..
}
}
利用org.springframework.web.util.UriComponentsBuilder 这个类能用于构建和编码URI,包括支持URI模板
@RequestMapping("/mvc19")
public void mvc19(UriComponentsBuilder ucb) {
UriComponents uriComponents = ucb.scheme("http").host("example.com").path("/hotels/{hotel}/bookings/{booking}").build()
.expand("42", "21")
.encode();
URI uri = uriComponents.toUri();
}