SpringMVC 坑路5 -> 注解3 -> 数据绑定

32 篇文章 0 订阅
13 篇文章 1 订阅

SpringMVC 有两种方式可以实现绑定数据:

  • API 方式绑定数据
  • 注解方式绑定数据

通过API绑定数据

  可以通过如 HttpServletRequest 等 API 得到请求数据,但推荐使用注解方式,因为使用起来更简单。
  首先看看功能处理方法支持哪些类型的形式参数,以及他们的具体含义。

一、ServletRequest/HttpServletRequest 和 ServletResponse/HttpServletResponse
public String requestOrResponse(ServletRequest servletRequest,HttpServletRequest httpServletRequest)
二、InputStream/OutputStream 和 Reader/Writer
public void inputOrOutBody(InputStream requestBodyIn,OutputStream responseBodyOut) throws IOException{
    responseBodyOut.write("success".getBytes());
}
  • requestBodyIn:等价于 request.getInputStream();
  • responseBodyOut:等价于 response.getOutputStream()。
public void readerOrWriteBody(Reader reader,Writer writer) throws IOException{
    writer.write("something");
}
三、WebRequest/NativeWebRequest

  WebReqeust 是 Spring Web MVC 提供的统一请求访问接口,不仅仅可以访问请求相关数据(如参数区数据、请求头数据,但访问不到 Cookie 区数据),还可以访问回话和上下文中的数据;NativeWebRequest 继承了 WebRequest,并提供访问本地 ServletAPI 的方法。

public String webRequest(WebRequest webRequest,NativeWebRequest nativeWebRequest){
    System.out.pringln(webRequest.getParameter("test"));
    webRequest.setAttribute("name","value",WebRequest.SCOPE_REQUEST);
    System.out.println(webRequest.getAttribute("name",WebRequest.SCOPE_REQUEST));
    HttpServletRequest request = nativeWebRequest.getNativeRequest(HttpServletRequest.class);
    HttpServletResponse response = nativeWebRequest.getNativeResponse(HttpServletResponse.class);
}
四、HttpSession
public String session(HttpSession session){
    System.out.println(session);
}

  session 访问不是线程安全的,如果需要线程安全,需要设置 AnnotationMethodHandlerAdapter 或 RequestMappingHandlerAdapter 的 synchronizeOnSession 属性为 true,即可线程安全的访问 session。

五、命令/表单对象

Spring Web MVC 能够自动将请求参数绑定到功能处理方法的命令/表单对象上。

@RequestMapping(value="/commandObject1",method=RequestMethod.GET)
public String to CreateUser(HttpSerlverRequest request,User user){
    return "customer/create";
}
@RequestMapping(value="/commandObject2",method=RequestMethod.POST)
public String createUser(HttpServletRequest request,User user){
    System.out.println(user);
    return "success";
}
六、Model、Map、ModelMap

  Spring Web MVC 提供 Model、Map 或 ModelMap 让我们能去暴露渲染视图需要的模型数据。

@RequestMapping(value="/model")
public String createUser(Model model,Map map,ModelMap modelMap){
    model.addAttribute("a","a");
    map.put("b","b");
    modelMap.put("c","c");
    System.out.println(model==map); // true
    System.out.println(map==modelMap); // true
    return "success";
}

  虽然此处注入的是三个不同的类型(Model model,Map map,ModelMap modelMap),但三者是同一个对象。

  AnnotationMethodHandlerAdapter 和 RequestMappingHandlerAdapter 将使用 BindingAwareModelMap 作为模型对象的实现,即此处我们的参数(Model model,Map map,ModelMap modelMap)都是同一个 BindingAwareModelMap 实例。

七、Errors/BindingResult
@RequestMapping(value="/error1")
public String error1(User user,BindingResult result)

@RequestMapping(value="/error2")
public String error2(User user,BindingResult result,Model model)

@RequestMapping(value="/error3")
public String error3(User user,Errors errors)

通过注解绑定数据:

  • 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[] rolse) 或集合(List roles)

@PathVariable 绑定 URI 模版变量值
@RequestMapping(value="/users/{userId}/topics/{topicId}")
public String test(@PathVariable(value="userId")int userId,@PathVariable(value="topicId")int topicId)

  如请求的 URL 为”控制器 URL/users/123/topics/456”,则自动将 URL 中模版变量 {userId} 和 {topicId} 绑定到通过 @PathVariable 注解的同名参数上,即入参后 userId=123、topicId=456。

public String cookie1(@CookieValue(value="SESSIONID",defaultValue="")String sessionId)

传入参数类型也可以是 javax.servlet.http.Cookie 类型:

public String cookie2(@CookieValue(value="SESSIONID",defaultValue="")Cookie sessionId)
@RequestHeader 绑定请求头数据
@RequestMapping(value="/header")
public String header(@RequestHeader("User-Agent")String userAgent,@RequestHeader(value="Accept")String[] accepts)
@ModelAttribute 绑定请求参数到 Model

@ModelAttribute 一个具有如下三种使用方式:

  • 作用在方法参数里面:用于将多个请求参数绑定到一个命令对象,从而简化绑定流程,而且自动暴露为模型数据用于视图页面展示时使用;
  • 作用在一般方法上面:该 Controller 的所有方法在调用前,先执行此 @ModelAttribute 方法;
  • 作用于方法的返回值上面:放在功能处理方法的返回值上时,是暴露功能处理方法的返回值为模型数据,用于视图页面展示时使用
part1
public String findUser(@ModelAttribute("user")User user)
part2
@ModelAttribute("nameList")
public List<String> nameList(){
    return Arrays.asList("Lily","Jame");
}
part3
public @ModelAttribute("user") User findUser(@ModelAttribute("user2")User user)

注:返回值上的 user 会覆盖方法参数上的 user2 作为视图的模型名。

匿名绑定:

public String findUser(@ModelAttribute User user)

Spring Web MVC 会自动将简单类名(首字母小写)作为名字暴露。

  对于集合类型(Collection 接口的实现者们,包括数组),生成模型对象属性名为“简单类名(首字母小写)” + “List”

  @SessionAttributes 绑定对象到 session,
在控制器上加入 @SessionAttributes(value={“user”})

@SessionAttributes(value={"user"})
public class SessionAttributeController

  调用 SessionStatus 对象的 setComplete() 销毁当前控制器上使用的 session

@RequestMapping("/session")
public String session(@ModelAttribute("user")User user,SessionStatus status){
    status.setComplete();
    return "success";
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值