之前的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是用来处理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"; }