您的位置:首页 > 编程语言 > Java开发

springmvc 常用的绑定参数用法

2016-04-11 20:35 363 查看
当请求路径和方法匹配之后,请求便进入方法体里面进行处理业务,在这之前,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();

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: