-
如何绑定数据
-
API方式绑定数据
一、ServletRequest/HttpServletRequest 和ServletResponse/HttpServletResponse
二、InputStream/OutputStream 和Reader/Writer
requestBodyIn:等价于request.getInputStream();
responseBodyOut:等价于response.getOutputStream() 。
三、WebRequest/NativeWebRequest
WebRequest 是Spring Web MVC 提供的统一请求访问接口,不仅仅可以访问请求相关数据(如参数区数据、请求头数据,但访问不到Cookie 区数据),还可以访问会话和上下文中的数据;NativeWebRequest 继承了WebRequest,并提供访问本地Servlet API 的方法。
四、HttpSession
session 访问不是线程安全的,如果需要线程安全,需要设置AnnotationMethodHandlerAdapter 或RequestMappingHandlerAdapter 的synchronizeOnSession 属性为true,即可线程安全的访问session。
五、命令/表单对象
Spring Web MVC 能够自动将请求参数绑定到功能处理方法的命令/表单对象上。
六、Model、Map、ModelMapSpring Web MVC 提供Model、Map 或ModelMap 让我们能去暴露渲染视图需要的模型数据。
虽然此处注入的是三个不同的类型(Model model, Map model2, ModelMap model3),但三者是同一个对象
AnnotationMethodHandlerAdapter 和RequestMappingHandlerAdapter 将使用BindingAwareModelMap 作为模型对象的实现,即此处我们的参数(Model model, Map model2, ModelMap model3)都是同一个BindingAwareModelMap 实例。
七、Errors/BindingResult
-
注解方式绑定数据
1、@RequestParam绑定单个请求参数值;
2、@PathVariable绑定URI 模板变量值;
3、@CookieValue绑定Cookie 数据值
4、@RequestHeader绑定请求头数据;
5、@ModelAttribute绑定参数到命令对象;
6、@SessionAttributes绑定命令对象到session;
@RequestParam绑定单个请求参数值
public String requestparam(@RequestParam("username") String username)
@RequestParam注解主要有哪些参数
value:参数名字,即入参的请求参数名字,如username 表示请求的参数区中的名字为username 的参数的值将传入;
required:是否必须,默认是true,表示请求中一定要有相应的参数,否则将报404 错误码;
defaultValue:默认值,表示如果请求中没有同名参数时的默认值public String requestparam(@RequestParam(value="username“,required=false) String username)
表示请求中可以没有名字为username 的参数,如果没有默认为null,此处需要注意如下几点:原子类型:必须有值,否则抛出异常,如果允许空值请使用包装类代替。Boolean 包装类型类型:默认Boolean.FALSE,其他引用类型默认为null。
对于多个同名请求参数的处理,
例如:url?role=admin&role=user
public String requestparam(@RequestParam(value=“role”) String roles)
实际得到的值是roles=“admin,user”。多个值以逗号的方式隔开
或者把方法参数定义为字符串数组(String[] roles)或集合(List<String> roles)@PathVariable绑定URI 模板变量值
@RequestMapping(value="/users/{userId}/topics/{topicId}")public String test(@PathVariable(value="userId") intuserId, @PathVariable(value="topicId") inttopicId)
如请求的URL 为“控制器URL/users/123/topics/456”,则自动将URL 中模板变量{userId}和{topicId} 绑定到通过@PathVariable注解的同名参数上,即入参后userId=123、topicId=456。@CookieValue绑定Cookie 数据值
public String test(@CookieValue(value="JSESSIONID", defaultValue="") String sessionId)
传入参数类型也可以是javax.servlet.http.Cookie类型。public String test2(@CookieValue(value="JSESSIONID", defaultValue="") Cookie sessionId)@RequestHeader绑定请求头数据
@RequestMapping(value="/header")public String test(@RequestHeader("User-Agent") String userAgent,@RequestHeader(value="Accept") String[] accepts)@ModelAttribute绑定请求参数到Model
@ModelAttribute一个具有如下三种使用方式:
作用在方法参数里面:用于将多个请求参数绑定到一个命令对象,从而简化绑定流程,而且自动暴露为模型数据用于视图页面展示时使用;
作用在一般方法上面:该Controller的所有方法在调用前,先执行此@ModelAttribute方法;
作用于方法的返回值上面:放在功能处理方法的返回值上时,是暴露功能处理方法的返回值为模型数据,用于视图页面展示时使public String findUser(@ModelAttribute("user") UserModel user) @ModelAttribute("cityList")public List<String> cityList() { return Arrays. asList("北京", "山东"); } public @ModelAttribute(“user”) UserModel findUser(@ModelAttribute(“user2”) UserModel user)
注:返回值上的user会覆盖方法参数上的user2作为视图的模型名匿名绑定
public String findUser(@ModelAttribute UserModel user)
Spring Web MVC 会自动将简单类名(首字母小写)作为名字暴露对于集合类型(Collection 接口的实现者们,包括数组),生成的模型对象属性名为“简单类名(首字母小写)”+“ List”@SessionAttributes绑定对象到session
在控制器上加入@SessionAttributes(value = { “user”}) @SessionAttributes(value = { “user”}) public class SessionAttributeController调用SessionStatus对象的setComplete()销毁当前控制器上使用的Session
@RequestMapping("/session2") public String session(@ModelAttribute("user") UserModeluser, SessionStatusstatus) {status.setComplete();return "success";}
来源:oschina
链接:https://my.oschina.net/u/2248484/blog/1553050