<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # SpringMVC強大的數據綁定(1)——第六章 注解式控制器詳解——跟著開濤學SpringMVC 到目前為止,請求已經能交給我們的處理器進行處理了,接下來的事情是要進行收集數據啦,接下來我們看看我們能從請求中收集到哪些數據,如圖6-11: ![](https://box.kancloud.cn/2016-05-15_5737eddaceeb4.jpg) 圖6-11 1、@RequestParam綁定單個請求參數值; 2、@PathVariable綁定URI模板變量值; 3、@CookieValue綁定Cookie數據值 4、@RequestHeader綁定請求頭數據; 5、@ModelValue綁定參數到命令對象; 6、@SessionAttributes綁定命令對象到session; 7、@RequestBody綁定請求的內容區數據并能進行自動類型轉換等。 8、@RequestPart綁定“multipart/data”數據,除了能綁定@RequestParam能做到的請求參數外,還能綁定上傳的文件等。 除了上邊提到的注解,我們還可以通過如HttpServletRequest等API得到請求數據,但推薦使用注解方式,因為使用起來更簡單。 接下來先看一下功能處理方法支持的參數類型吧。 #### 6.6.1、功能處理方法支持的參數類型 在繼續學習之前,我們需要首先看看功能處理方法支持哪些類型的形式參數,以及他們的具體含義。 **一、ServletRequest/HttpServletRequest 和 ServletResponse/HttpServletResponse** ``` public String requestOrResponse ( ServletRequest servletRequest, HttpServletRequest httpServletRequest, ServletResponse servletResponse, HttpServletResponse httpServletResponse ) ``` Spring Web MVC框架會自動幫助我們把相應的Servlet請求/響應(Servlet API)作為參數傳遞過來。 **二、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("hello"); } ``` reader:獲取請求的內容區字符流,等價于request.getReader(); writer:獲取相應的內容區字符流,等價于response.getWriter()。 InputStream/OutputStream 和 Reader/Writer兩組不能同時使用,只能使用其中的一組。 **三、WebRequest/NativeWebRequest** WebRequest是Spring Web MVC提供的統一請求訪問接口,不僅僅可以訪問請求相關數據(如參數區數據、請求頭數據,但訪問不到Cookie區數據),還可以訪問會話和上下文中的數據;NativeWebRequest繼承了WebRequest,并提供訪問本地Servlet API的方法。 ``` 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 "success"; } ``` ① webRequest.getParameter:訪問請求參數區的數據,可以通過getHeader()訪問請求頭數據; ② webRequest.setAttribute/getAttribute:到指定的作用范圍內取/放屬性數據,Servlet定義的三個作用范圍分別使用如下常量代表: :代表請求作用范圍; :代表會話作用范圍; :代表全局會話作用范圍,即ServletContext上下文作用范圍。? ③ nativeWebRequest.getNativeRequest/nativeWebRequest.getNativeResponse:得到本地的Servlet API。 **四、HttpSession** ``` public String session(HttpSession session) { System.out.println(session); return "success"; } ``` 此處的session永遠不為null。 注意:session訪問不是線程安全的,如果需要線程安全,需要設置AnnotationMethodHandlerAdapter或RequestMappingHandlerAdapter的synchronizeOnSession屬性為true,即可線程安全的訪問session。 **五、命令/表單對象** Spring Web MVC能夠自動將請求參數綁定到功能處理方法的命令/表單對象上。 ``` @RequestMapping(value = "/commandObject", method = RequestMethod.GET) public String toCreateUser(HttpServletRequest request, UserModel user) { return "customer/create"; } @RequestMapping(value = "/commandObject", method = RequestMethod.POST) public String createUser(HttpServletRequest request, UserModel user) { System.out.println(user); return "success"; } ``` 如果提交的表單(包含username和password文本域),將自動將請求參數綁定到命令對象user中去。 **六、Model、Map、ModelMap** Spring Web MVC 提供Model、Map或ModelMap讓我們能去暴露渲染視圖需要的模型數據。 ``` @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 "success";} ``` 雖然此處注入的是三個不同的類型(Model model, Map model2, ModelMap model3),但三者是同一個對象,如圖6-12所示: ![](https://box.kancloud.cn/2016-05-15_5737eddae912c.jpg) 圖6-11 AnnotationMethodHandlerAdapter和RequestMappingHandlerAdapter將使用BindingAwareModelMap作為模型對象的實現,即此處我們的形參(Model model, Map model2, ModelMap model3)都是同一個BindingAwareModelMap實例。 此處還有一點需要我們注意: ``` @RequestMapping(value = "/mergeModel") public ModelAndView mergeModel(Model model) { model.addAttribute("a", "a");//①添加模型數據 ModelAndView mv = new ModelAndView("success"); mv.addObject("a", "update");//②在視圖渲染之前更新③處同名模型數據 model.addAttribute("a", "new");//③修改①處同名模型數據 //視圖頁面的a將顯示為"update" 而不是"new" return mv; } ``` 從代碼中我們可以總結出功能處理方法的返回值中的模型數據(如ModelAndView)會 合并 功能處理方法形式參數中的模型數據(如Model),但如果兩者之間有同名的,返回值中的模型數據會覆蓋形式參數中的模型數據。 **七、Errors/BindingResult** ``` @RequestMapping(value = "/error1") public String error1(UserModel user, BindingResult result) ``` ``` @RequestMapping(value = "/error2") public String error2(UserModel user, BindingResult result, Model model) { ``` ``` @RequestMapping(value = "/error3") public String error3(UserModel user, Errors errors) ``` 以上代碼都能獲取錯誤對象。 Spring3.1之前(使用AnnotationMethodHandlerAdapter)錯誤對象必須緊跟在命令對象/表單對象之后,如下定義是錯誤的: ``` @RequestMapping(value = "/error4") public String error4(UserModel user, Model model, Errors errors) } ``` 如上代碼從Spring3.1開始(使用RequestMappingHandlerAdapter)將能正常工作,但還是推薦“錯誤對象緊跟在命令對象/表單對象之后”,這樣是萬無一失的。 Errors及BindingResult的詳細使用請參考4.16.2數據驗證。 **八、其他雜項** ``` public String other(Locale locale, Principal principal) ``` java.util.Locale:得到當前請求的本地化信息,默認等價于ServletRequest.getLocale(),如果配置LocaleResolver解析器則由它決定Locale,后續介紹; java.security.Principal:該主體對象包含了驗證通過的用戶信息,等價于HttpServletRequest.getUserPrincipal()。 以上測試在cn.javass.chapter6.web.controller.paramtype.MethodParamTypeController中。 其他功能處理方法的形式參數類型(如HttpEntity、UriComponentsBuilder、SessionStatus、RedirectAttributes)將在后續章節詳細講解。 第二部分會介紹注解方式的數據綁定。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看