<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      只為成功找方向,不為失敗找借口

      每天都不能停止前進的腳步
        博客園  :: 首頁  :: 新隨筆  :: 聯系 :: 訂閱 訂閱  :: 管理

      SpringMvc中獲取Request

      Posted on 2018-11-01 11:21  冰碟  閱讀(479)  評論(0)    收藏  舉報

      Controller中加參數

      復制代碼
      @Controller
      public class TestController {
          @RequestMapping("/test")
          public void test(HttpServletRequest request) {
              ......
          }
      }
      復制代碼

      Controller中獲取request對象后,如果要在其他方法中(如service方法、工具類方法等)使用request對象,需要在調用這些方法時將request對象作為參數傳入

      此時request對象是方法參數,相當于局部變量,毫無疑問是線程安全的。 

      自動注入

      復制代碼
      @Controller
      public class TestController{
           
          @Autowired
          private HttpServletRequest request; //自動注入request
           
          @RequestMapping("/test")
          public void test() throws InterruptedException{
              ......
          }
      }
      復制代碼

      使用這種方式,當Bean(本例的TestController)初始化時,Spring并沒有注入一個request對象,而是注入了一個代理(proxy);當Bean中需要使用request對象時,通過該代理獲取request對象。request實際上是一個代理:代理的實現參見AutowireUtils的內部類ObjectFactoryDelegatingInvocationHandler。

      調用request的方法method時,實際上是調用了由objectFactory.getObject()生成的對象的method方法;objectFactory.getObject()生成的對象才是真正的request對象。

      objectFactory的類型為WebApplicationContextUtils的內部類RequestObjectFactory;而RequestObjectFactory要獲得request對象需要先調用currentRequestAttributes()方法獲得RequestAttributes對象,生成RequestAttributes對象的核心代碼在類RequestContextHolder中,生成的RequestAttributes對象是線程局部變量(ThreadLocal),因此request對象也是線程局部變量;這就保證了request對象的線程安全性。

      基類中自動注入

      復制代碼
      public class BaseController {
          @Autowired
          protected HttpServletRequest request;     
      }
      @Controller
      public class TestController extends BaseController {
      }
      復制代碼

      與方法2相比,避免了在不同的Controller中重復注入request;但是考慮到java只允許繼承一個基類,所以如果Controller需要繼承其他類時,該方法便不再好用。

      手動調用

      復制代碼
      @Controller
      public class TestController {
          @RequestMapping("/test")
          public void test() throws InterruptedException {
              HttpServletRequest request = ((ServletRequestAttributes) (RequestContextHolder.currentRequestAttributes())).getRequest();
                  .......
          }
      }
      復制代碼

      通過自動注入實現與通過手動方法調用實現原理差不多。因此本方法也是線程安全的。

      優點:可以在非Bean中直接獲取。缺點:如果使用的地方較多,代碼非常繁瑣;因此可以與其他方法配合使用。

      @ModelAttribute方法

      復制代碼
      @Controller
      public class TestController {
          private HttpServletRequest request; 此處線程不安全
          @ModelAttribute
          public void bindRequest(HttpServletRequest request) {
              this.request = request;  此處request線程安全
          }
          @RequestMapping("/test")
          public void test() throws InterruptedException {
              ......
          }
      }
      復制代碼

      @ModelAttribute注解用在Controller中修飾方法時,其作用是Controller中的每個@RequestMapping方法執行前,該方法都會執行。bindRequest()的作用是在test()執行前為request對象賦值。雖然bindRequest()中的參數request本身是線程安全的,但由于TestController是單例的,request作為TestController的一個域,無法保證線程安全。

      主站蜘蛛池模板: 国产片一区二区三区视频| 中文字幕日韩人妻一区| 2020国产成人精品视频| 性色av无码久久一区二区三区| 亚洲熟妇av综合一区二区| 中国老熟妇自拍hd发布| 人妻少妇偷人精品视频| 国产成AV人片久青草影院| 国产中年熟女高潮大集合| 国产视色精品亚洲一区二区| 婷婷四虎东京热无码群交双飞视频| 福利一区二区不卡国产| 亚洲女人的天堂在线观看| 人妻互换一二三区激情视频| 欧美日本精品一本二本三区| 亚洲精品在线少妇内射| 毛葺葺老太做受视频| 女女互揉吃奶揉到高潮视频| 国产最新AV在线播放不卡| 无码激情亚洲一区| 武陟县| 亚洲an日韩专区在线| 东京热无码国产精品| 久久综合色一综合色88欧美| 色欲国产精品一区成人精品| 国产成人精彩在线视频| 日韩人妻中文字幕精品| 国产亚洲精品第一综合另类| 在线看av一区二区三区| 在线 欧美 中文 亚洲 精品| 国产成人亚洲精品狼色在线| 香蕉乱码成人久久天堂爱| 免费无码一区无码东京热| 好深好湿好硬顶到了好爽| 日本道之久夂综合久久爱| 久久国产精品成人免费| 久久av高潮av喷水av无码| 国产免费高清69式视频在线观看| 亚洲中文欧美在线视频| 欧美人与动牲猛交A欧美精品 | 风流老熟女一区二区三区|