springmvc梳理9----数据绑定

之前的blog中也提到过获取参数的一些方法,现在回顾下:

1.@PathVariable,绑定URL上的变量值;

2.@RequestParam,绑定单个的请求参数值;

3.@RequestBody,绑定请求区的内容并转换格式;

4.@SessionAttributes;

5.@ModelValue和上面一起用,@SessionAttributes是绑定对象到session中,而@ModelValue是绑定参数到对象上。(通俗点,一个绑定一个获取);

6.@RequestHeader,绑定请求头;

7.@CookieValue,绑定Cookie;

8.@RequestPart绑定“multipart/data”数据,除了能绑定@RequestParam能做到的请求参数外,还能绑定上传的文件等。


Spring Web MVC框架会自动把相应的Servlet请求/响应(Servlet API)作为参数传递过来。

原本ServletRequest/HttpServletRquest和ServletResponse/HttpServletResponse:

public String requestOrResponse (
        ServletRequest servletRequest, HttpServletRequest httpServletRequest,
        ServletResponse servletResponse, HttpServletResponse httpServletResponse
    )
1.现在可以通过InputStream/OutputStream 和 Reader/Writer来获取请求的内容区字节流。

public void inputOrOutBody(InputStream requestBodyIn, OutputStream responseBodyOut)
        throws IOException {
responseBodyOut.write("success".getBytes());
}

public void readerOrWriteBody(Reader reader, Writer writer)
        throws IOException {
    writer.write("hello");
}

不过:InputStream/OutputStream 和 Reader/Writer两组不能同时使用,只能使用其中的一组。

看下什么时候用什么:

InputStream、OutputStream是用来处理8位元的流,
Reader、Writer是用来处理16位元的流。
而在JAVA语言中,byte类型是8位的,char类型是16位的,所以在处理中文的时候需要用Reader和Writer。

2.再就是WebRequest/nativeWebRequest

这俩帮助我们获取除了普通数据(参数和请求头数据(cookie得不到))以外的数据,如会话,上下文中的数据。NativeWebRequest继承了WebRequest,并提供访问本地Servlet API的方法。

/**
	 * webRequest.getParameter:访问请求参数区的数据,可以通过getHeader()访问请求头数据;
	 * webRequest.setAttribute/getAttribute:到指定的作用范围内取/放属性数据,Servlet定义的三个作用范围分别使用如下常量代表:
	 * SCOPE_REQUEST :代表请求作用范围;
	 * SCOPE_SESSION :代表会话作用范围;
	 * SCOPE_GLOBAL_SESSION :代表全局会话作用范围,即ServletContext上下文作用范围。
	 * 
	 * @param webRequest
	 * @param nativeWebRequest
	 * @return
	 */
	@RequestMapping(value = "/webRequest",method=RequestMethod.GET)
	public String webRequest(WebRequest webRequest, NativeWebRequest nativeWebRequest) {
	    System.out.println(webRequest.getParameter("test"));//①得到请求参数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);
        return "index";
    }
	
	
	/**
	 * 请求参数只要和user里面的属性一致,那么就绑定到user上
	 * 
	 * @param request
	 * @param user
	 * @return
	 */
	@RequestMapping(value = "/commandObject", method = RequestMethod.GET)
	public String toCreateUser(HttpServletRequest request, User user) {
	    return "/user/customer/index";
	}
	
	@RequestMapping(value = "/commandObject", method = RequestMethod.POST)
	public String createUser(HttpServletRequest request, User user) {
	    System.out.println(user);
	    return "/index";
	}
	
	/**
	 * 通过session来收集数据
	 * @param session
	 * @return
	 */
	@RequestMapping(value = "/session", method = RequestMethod.GET)
	public String session(HttpSession session) {
	    System.out.println(session);
	    return "/index";
	}
	
	
	/**
	 * Spring Web MVC 提供Model、Map或ModelMap让我们能去暴露渲染视图需要的模型数据。
	 * 打印出来都是true
	 * 
	 * @param model
	 * @param model2
	 * @param model3
	 * @return
	 */
	@RequestMapping(value = "/model")
	public String createUser(Model model, Map model2, ModelMap model3) {
	    model.addAttribute("a", "a");
	    model2.put("b", "b");
	    model3.put("c", "c");
	    System.out.println(model == model2);
	    System.out.println(model2 == model3);
	    return "index";
    }

	/**
	 * Errors/BindingResult
	 * error1,error2,error3都是对的
	 * 都能获取错误对象
	 */
	@RequestMapping(value = "/error1")
	public String error1(User user, BindingResult result){
		return "index";
	}
	
	@RequestMapping(value = "/error2")
	public String error2(User user, BindingResult result, Map<String,Object> model) {
		if(result.hasErrors()){
			model.put("error", result.getFieldError().getDefaultMessage()); 
		}
	    return "index";
	}
	
	@RequestMapping(value = "/error3")
	public String error3(User user, Errors errors){
		return "index";
	}
	
	/**
	 * 这个是不可取的的,错误对象必须紧跟在命令对象/表单对象之后
	 * 
	 * @param user
	 * @param model
	 * @param errors
	 * @return
	 */
	@RequestMapping(value = "/error4")
	public String error4(User user, Model model, Errors errors){
		return "index";
    }
	
	/**
	 *  java.util.Locale:得到当前请求的本地化信息,默认等价于ServletRequest.getLocale()
	 * 
	 * @param locale
	 * @param principal
	 * @return
	 */
	@RequestMapping(value = "/other")
	public String other(Locale locale, Principal principal){
		System.out.println(locale.getLanguage());
		return "index";
	}




你可能感兴趣的:(数据绑定)