4:spring mvc 数据绑定

白昼怎懂夜的黑 提交于 2019-12-01 06:03:27

  1. 如何绑定数据

     

  2. API方式绑定数据

     

    我们还可以通过如HttpServletRequest 等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




     
  3. 注解方式绑定数据

    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";}

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!