@PathVariable 注解参数访问URI模板变量。
@RequestParam 注解参数访问特定的Servlet请求参数,请求参数绑定。
@RequestBody 注解参数访问HTTP请求主体,注解映射请求体
@RequestPart 注解参数访问“的multipart / form-data的”请求部分的内容。处理客户端上传文件,多部分文件上传的支持
@SessionAttribute 注解参数会话属性
@RequestAttribute 注解参数访问请求属性
1.基本类型
方法的参数可以任意基本类型,如果参数名个http请求的参数名称相同时进行自动映射。
自定义数据类型。
除了基本数据类型,也可以自定义的数据类型,如果一个自定义的pojo对象,SpringMVC会通过反射吧请求的参数设置到对象中,转换类型。
复杂数据类型
这里的复杂数据 类型指的是一个自定义类型中还包括另外一个对象类型。
public class ProductMap { private Mapitems; public Map getItems() { return items; } public void setItems(Map items) { this.items = items; } }
//产品集合 public class ProductList { private Listitems; public List getItems() { return items; } public void setItems(List items) { this.items = items; } }
1.2@RequestParam参数绑定
简单的参数可以使用上一节中讲过的自动参数映射,复杂一些的需要使用@RequestParam完成。虽然自动参数映射很方便。
但有些细节是不能处理的,如参数是否必须参数。名称没有办法指定。参数的默认值就没有办法做到了。如果使用了@RequestParam可以实现 请求参数绑定。SpringMVC会自动查找请求中的参数类型转换并将于参数进行绑定。
@Controller @RequestMapping("/foo") public class FooController { @RequestMapping("/action1") public String action1(Model model, @RequestParam(required = false, defaultValue = "99") int id) { model.addAttribute("message", id); return "foo/index"; } }
在上一节中我们使用自动参数映射是不能直接完成List与数组绑定的,结合@RequestParam可以轻松实现
// List集合与数组类型
@RequestMapping("/action05")
public String action05(Model model, @RequestParam("u") List users) {
model.addAttribute("message", users.get(0) + "," + users.get(1));
return "foo/index";
}
List与数组直接绑定自定义数据类型与Ajax.
上一小节中我们绑定的集合存放的只是基本数据类型。如果需要指定更加的复杂的数据类型则需要使用@RequestBody与@ResponseBody注解了。
@RequestBody默认接收的Content-Type是application/json。因此发送发送POST请求时需要设置报文头信息。否则Springmvc在请求是不会自动的转换json数据在解析成相应的集合。Spring默认的json协议解析有Jackson完成。要完成这个功能还需要配置环境。具体要求如下:
1.修改Spring MVC配置文件,请用mvc注解驱动功能。
2.pom.xml添加jackson依赖,添加依赖的配置内容如下:
com.fasterxml.jackson.core jackson-core 2.5.2 com.fasterxml.jackson.core jackson-databind 2.5.2
3.ajax请求时需要设置属性dataType 为 json,contentType 为 'application/json;charse=UTF-8',data 转换成JSON字符串,如果条件不满足有可能会出现415异常。
// List与数组直接绑定自定义数据类型与AJAX @RequestMapping("/action21") public void action21(@RequestBody Listproducts, HttpServletResponse response) throws IOException { response.setCharacterEncoding("UTF-8"); System.out.println(Arrays.deepToString(products.toArray())); response.getWriter().write("添加成功"); }
//这里我们跑题去讲一下get和post请求的区别:
content-type请求是干吗的呢。http请求头是由四种类型。分别是通用头部,请求头部,响应头部以及内容头部。首先,我们要弄清楚。content-type是干嘛的呢?content-type是属于内容头部的。那么这个请求是用来想接收端传递的改内容主题的。content-type的取值去告诉服务端。你传递过去的内容是啥。应该准备去如何接收她呢。
’application/json’,传递的是一个json对象,并不是直接丢一个对象过去,需要进行序列化,JSON.stringify(data);
’multipart/form-data’。一般用来上传文件)
: 数据被编码为一条消息,页上的每个控件对应消息中的一个部分。
前面的大家基本了解后,我们开始正题了。
GET 请求不存在请求实体部分,键值对参数放置在 URL 尾部,浏览器把form数据转换成一个字串(name1=value1&name2=value2...),然后把这个字串追加到url后面,用?
分割,加载这个新的url。因此请求头不需要设置 Content-Type 字段。
非 ASCII 码会自动进行编码转换,例如发送请求:www.bilibili.com?hehe=你的我的
值得一提的是,GET 参数的编码方式是无法人为干涉的,这导致了不同浏览器有不同的编码方式,因此最稳妥的方案是人工预编码,人工解码,从而禁止浏览器编码的干涉。
所以我们就可以回到上文了。
使用 String 作为请求处理方法的返回值类型是比较通用的方法,这样返回的逻辑视图名不会和请求 URL 绑定,具有很高的灵活性,而模型数据又可以通过Model控制。
使用void,map,Model时,返回对应的逻辑视图名称真实url为:prefix前缀+控制器路径+方法名 +suffix后缀组成。(
void map model 都是使用默认视图的名称为方法名)
使用String,ModelAndView返回视图名称可以不受请求的url绑定,ModelAndView可以设置返回的视图名称。
另外在非MVC中使用的许多办法在Action也可以使用。