精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Spring MVC通過注解完成運行配置,原理你都會嗎?

開發 前端
DispatcherServlet需要一個WebApplicationContext(一個普通ApplicationContext的擴展)用于它自己的配置。WebApplicationContext有一個鏈接到ServletContext和它所關聯的Servlet。

環境:Spring5.3.26

SpringMVC使用相信大家都會使用,別人項目工程搭建后,你只需負責寫Controller即可,那你是否想過自己能否把環境搭建出來呢?而且還不借助網絡;本篇教大家如何通過注解快速搭建SpringMVC運行環境。

傳統SpringMVC配置

本節:回顧傳統SpringMVC的基本配置原理。

DispatcherServlet需要一個WebApplicationContext(一個普通ApplicationContext的擴展)用于它自己的配置。WebApplicationContext有一個鏈接到ServletContext和它所關聯的Servlet。它還綁定到ServletContext,這樣應用程序就可以在需要訪問WebApplicationContext時使用RequestContextUtils上的靜態方法來查找它。

對于許多應用程序來說,只有一個WebApplicationContext就足夠簡單了。也可以有一個上下文層次結構,其中一個根WebApplicationContext在多個DispatcherServlet(或其他Servlet)實例之間共享,每個實例都有自己的子WebApplicationContext配置。有關上下文層次結構特性的更多信息,請參閱ApplicationContext的附加功能。

根WebApplicationContext通常包含基礎設施bean,例如需要跨多個Servlet實例共享的數據存儲庫和業務服務。這些bean被有效地繼承,并且可以在特定于Servlet的子WebApplicationContext中被重寫(即重新聲明),該子WebApplicationContext通常包含給定Servlet的本地bean。下圖顯示了這種關系:

圖片

web.xml中配置:

<web-app>


    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>


    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/root-context.xml</param-value>
    </context-param>


    <servlet>
        <servlet-name>app1</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/app1-context.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>


    <servlet-mapping>
        <servlet-name>app1</servlet-name>
        <url-pattern>/app1/*</url-pattern>
    </servlet-mapping>


</web-app>

ContextLoaderListener:該監聽器用來創建Root 容器,該容器就是用來配置基礎的Bean,如DAO,Service等。

DispatcherServlet:對應一個web 容器,也就是子容器。該容器用來配置Controller。在Controller中會應用到Service,那么該子容器就會從父容器中查找相應的Bean。如下父子關系配置:

public abstract class FrameworkServlet extends HttpServletBean implements ApplicationContextAware {
  protected WebApplicationContext initWebApplicationContext() {
    // 獲取父容器,該父容器是在ContextLoaderListener監聽器中創建并保存到ServletContext中
    WebApplicationContext rootContext = WebApplicationContextUtils.getWebApplicationContext(getServletContext());
    WebApplicationContext wac = null;


    if (this.webApplicationContext != null) {
      wac = this.webApplicationContext;
        if (wac instanceof ConfigurableWebApplicationContext) {
          ConfigurableWebApplicationContext cwac = (ConfigurableWebApplicationContext) wac;
          if (!cwac.isActive()) {
            if (cwac.getParent() == null) {
              cwac.setParent(rootContext);
            }
            configureAndRefreshWebApplicationContext(cwac);
         }
      }
    }
    if (wac == null) {
      // 創建子容器并設置父容器
      wac = createWebApplicationContext(rootContext);
    }
    return wac;
  }
}

以上就是SpringMVC的基本配置。

Servlet注冊

既然是基于注解的方式配置SpringMVC,那么我們需要先了解Servlet的注冊方式有哪些。

方式1:

web.xml中注冊

<servlet>
  <servlet-name>DemoServlet</servlet-name>
  <servlet-class>com.pack.servlet.DemoServlet</servlet-class>
</servlet>
<servlet-mapping>
  <servlet-name>DemoServlet</servlet-name>
  <url-pattern>/demo</url-pattern>
</servlet-mapping>

方式2:

基于注解方式

@WebServlet(name = "demoServlet", urlPatterns = "/demo")
@WebServlet(value = {"/demo","/demo1"})
@WebServlet(value = "/demo")
@WebServlet("/demo")
public class DemoServlet extends HttpServlet {
  // ...
}

方式3:

通過SPI技術,這也是今天要使用的方式

Servlet3.0以上的版本開始,可以通過SPI方式注冊Servlet,Filter,Listener三大組件。

第一步:在項目中建立如下文件

META-INF/service/javax.servlet.ServletContainerInitializer

文件名:javax.servlet.ServletContainerInitializer

第二步:自定義類實現ServletContainerInitializer

@HandlesTypes({CustomHandler.class})
public class CustomContainerInitializer implements ServletContainerInitializer {
  // 這里的set集合就是當前環境中所有CustomHandler的子類
  @Override
  public void onStartup(Set<Class<?>> set, ServletContext servletContext) throws ServletException {
    if (set!=null&&set.size()>0){
      set.stream().forEach(cls->{
        try {
          CustomHandler o = (CustomHandler)cls.newInstance();
          o.onStartup();
        } catch (Exception e) {
          e.printStackTrace();
        }
      });
    }
    //注入Servlet
    ServletRegistration.Dynamic userServlet = servletContext.addServlet("DemoServlet", DemoServlet.class);
    userServlet.addMapping("/demo");
  }
}

SpringMVC注解配置

接下來就是要使用上面介紹的Servlet注冊方式的第三種方式來實現SpringMVC的注冊。

在Spring中已經提供了相應的實現:

在spring-web包中:

圖片


內容:

org.springframework.web.SpringServletContainerInitializer
@HandlesTypes(WebApplicationInitializer.class)
public class SpringServletContainerInitializer implements ServletContainerInitializer {
}

這里我們只需要實現WebApplicationInitializer接口即可,不過Spring已經為我們定義好了該接口的抽象模版,我們只需繼承該抽象類即可:

public class SpringMVCConfig extends AbstractAnnotationConfigDispatcherServletInitializer {


  @Override
  protected Class<?>[] getRootConfigClasses() {
    return new Class<?>[] {RootConfig.class} ;
  }


  @Override
  protected Class<?>[] getServletConfigClasses() {
    return new Class<?>[] {WebConfig.class} ;
  }


  @Override
  protected String[] getServletMappings() {
    return new String[] {"/"} ;
  }


}

RootConfig.java

@Configuration
public class RootConfig {
}

WebConfig.java

@Configuration
@ComponentScan(basePackages = {"com.pack.controller"})
public class WebConfig {
  
}

測試controller

@RestController
@RequestMapping("/demo")
public class DemoController {


  @GetMapping("")
  public Object index() {
    Map<String, Object> result = new HashMap<>() ;
    result.put("code", 0) ;
    result.put("data", "你好") ;
    return result ;
  }
  
}

測試:

只是通過如上配置,SpringMVC環境基本上是可以使用了,但是我們看上面Controller接口,是基于REST full,所以當你訪問該接口時會出現如下錯誤:

圖片

這是因為默認情況下RequestMappingHandlerAdapter無法處理,服務器端無法提供與 Accept-Charset 以及 Accept-Language 消息頭指定的值相匹配的響應。

這時候就需要為其配置相應的消息轉換器:

@Bean
public RequestMappingHandlerAdapter requestMappingHandlerAdapter() {
  RequestMappingHandlerAdapter adapter = new RequestMappingHandlerAdapter() ;
  adapter.getMessageConverters().add(new MappingJackson2HttpMessageConverter()) ;
  return adapter ;
}

再次方法正常:

圖片

完畢!!!

責任編輯:武曉燕 來源: 實戰案例錦集
相關推薦

2009-09-27 14:01:29

Spring MVC

2021-10-31 19:39:11

注解Spring 核心類

2022-06-28 14:57:09

FormatterSpring

2023-10-23 10:43:24

SpringRestful風格

2023-05-05 07:39:04

Spring事務面試

2013-05-03 10:04:16

WorkstationvSphere

2009-06-19 11:28:45

2009-06-19 11:43:59

Spring MVC框

2020-08-23 10:03:51

SynchronizeJava

2025-06-09 01:01:00

2022-01-05 08:53:13

Spring原理分析MVC

2021-07-28 07:53:19

配置Bean掃描

2009-06-24 16:01:28

Spring MVC

2020-12-29 16:55:44

ZooKeeper運維數據結構

2019-09-03 09:19:34

CPU架構內核

2020-06-17 11:42:50

異常解析器Spring MVC

2022-05-30 11:17:44

Spring容器配置

2021-01-11 15:02:27

Redis數據庫命令

2010-08-29 21:09:57

DHCP協議

2020-07-27 16:10:49

SpringBoottomcaJava
點贊
收藏

51CTO技術棧公眾號

精品99在线视频| 国产日韩欧美中文在线播放| 国产精品一级黄片| 国产91亚洲精品久久久| 日韩一区日韩二区| 久久综合一区| 99久久久国产精品无码免费| 国产日韩欧美在线播放不卡| 色天天综合狠狠色| 中国免费黄色片| 日本精品另类| 亚洲va韩国va欧美va| 亚洲欧美电影在线观看| 狠狠人妻久久久久久综合麻豆| 乱人伦精品视频在线观看| 精品国产一区二区三区久久狼5月 精品国产一区二区三区久久久狼 精品国产一区二区三区久久久 | 国产精品成人aaaa在线| 国产一区二区三区天码| 精品国精品国产尤物美女| 艹b视频在线观看| 国产调教在线| 亚洲综合久久av| 一区二区av| 国产黄色免费在线观看| eeuss影院一区二区三区| 91手机视频在线观看| 国产精品xxxxxx| 亚洲在线黄色| 高清一区二区三区日本久| 中日韩一级黄色片| 色喇叭免费久久综合| 日韩国产中文字幕| 在线观看成人动漫| 2020国产精品极品色在线观看| 欧美日韩高清影院| 日本美女高潮视频| 日韩大尺度黄色| 狠狠色狠狠色综合日日五| 老司机激情视频| 伊人手机在线| 亚洲欧美国产高清| 中文字幕一区二区三区乱码| 午夜免费福利在线观看| 欧美国产成人精品| 神马欧美一区二区| 国产人成在线观看| 国产欧美日韩亚州综合 | 成人毛片免费看| 亚洲色图13p| 日韩人妻无码一区二区三区| 欧洲亚洲一区二区三区| 日韩成人性视频| 亚洲天堂成人av| 小嫩嫩12欧美| 亚洲精品自在久久| www.av欧美| 欧美最新另类人妖| 自拍偷拍亚洲区| 三级在线观看免费大全| 国产精品黑丝在线播放| 久久这里只有精品99| xxxx日本少妇| 影音先锋一区| 日本高清视频一区| 中文在线资源天堂| 黄色资源网久久资源365| 亚洲综合小说区| 成人免费观看在线视频| 91在线免费视频观看| 欧美一进一出视频| 成人三级黄色免费网站| 日韩理论片中文av| 国产精品久久久久久久久电影网| 国产第一页在线| 色综合中文字幕| 亚欧激情乱码久久久久久久久| 日本在线一区二区| 欧美成人a视频| 中文字字幕码一二三区| 色天天久久综合婷婷女18| 久久综合伊人77777| 国产网址在线观看| 欧美在线综合| 亚洲tv在线观看| 熟妇人妻一区二区三区四区 | 日韩激情av在线免费观看| 日韩在线免费观看av| 全球成人免费直播| 久久久久久久国产精品视频| 东京热一区二区三区四区| 老司机午夜精品| 国产精品久久久久av福利动漫| 久蕉在线视频| 玉足女爽爽91| 日韩手机在线观看视频| 欧美久久一区二区三区| 亚洲美女av在线| av激情在线观看| 麻豆久久婷婷| 懂色中文一区二区三区在线视频 | 国产午夜亚洲精品午夜鲁丝片| 五月天av影院| 亚洲成人不卡| 亚洲精品在线观看网站| 欧美成人久久久免费播放| 一区在线免费| 91久久精品在线| 黄色视屏网站在线免费观看| 亚洲日本va在线观看| 久久人妻精品白浆国产| 99久久香蕉| 美乳少妇欧美精品| 久久这里只有精品9| a亚洲天堂av| 日产精品久久久久久久蜜臀| 日韩国产大片| 亚洲日本中文字幕免费在线不卡| 久久高清免费视频| 国产另类ts人妖一区二区| 亚洲国产婷婷香蕉久久久久久99| 爱福利在线视频| 欧美一级欧美三级在线观看| 亚洲色图100p| 日韩成人精品在线观看| 久久精品美女| 91超碰国产在线| 精品国产电影一区二区| 一区二区国产精品精华液| 日本不卡视频在线观看| 欧洲亚洲一区二区三区四区五区| 97天天综合网| 精品国产91亚洲一区二区三区婷婷 | 国产www视频| 中文字幕一区二区在线播放| 五月婷婷激情久久| 国产一区二区在线| 国产91免费看片| 国产在线资源| 在线观看日韩av先锋影音电影院| 亚洲精品视频久久久| 亚洲专区在线| 欧美亚洲免费在线| 日本综合字幕| 中日韩美女免费视频网址在线观看 | 国产成+人+综合+亚洲欧美| 亚洲一级黄色av| 日批视频免费观看| 国产精品少妇自拍| 夜夜夜夜夜夜操| 在线看片不卡| av一区二区在线看| av色在线观看| 日韩成人av在线| 波多野结衣理论片| 国产精品久久久久久久久久免费看| 国模杨依粉嫩蝴蝶150p| 国产亚洲第一伦理第一区| 国产精品观看在线亚洲人成网 | 久久久久久久国产| 天天影院图片亚洲| 日本韩国欧美一区二区三区| 免费一级黄色录像| 国产一区二区在线免费观看| 女人床在线观看| 九九热hot精品视频在线播放| 91wwwcom在线观看| sese一区| 日韩视频免费观看高清在线视频| 国产亚洲精品av| 91免费观看视频在线| 另类小说色综合| 中文字幕av亚洲精品一部二部| 国产伦精品一区二区三区| 欧美xxxxhdvideosex| 亚洲老头老太hd| 国产孕妇孕交大片孕| 亚洲国产你懂的| 香蕉视频久久久| 国产一本一道久久香蕉| 欧美精品一区免费| 欧美国产偷国产精品三区| 99久久自偷自偷国产精品不卡| 国产自产自拍视频在线观看| 色偷偷9999www| 人妻va精品va欧美va| 日本乱码高清不卡字幕| 欧美在线视频第一页| 91免费看片在线观看| 激情文学亚洲色图| 亚洲在线成人| 伊人久久在线观看| 久久99国内| av观看久久| 成人av集中营| 国语自产偷拍精品视频偷| 成人av毛片| 亚洲аv电影天堂网| 中文字幕男人天堂| 婷婷一区二区三区| 四虎精品免费视频| 国产日韩三级在线| 国产二级一片内射视频播放| 美国一区二区三区在线播放| 自慰无码一区二区三区| 亚洲网色网站| 亚洲精品一区国产精品| 欧美大胆视频| 国产a一区二区| 亚洲伦理网站| 91精品成人久久| 中日韩高清电影网| 日韩中文综合网| 国产一二在线观看| 日韩禁在线播放| 亚洲精品成人电影| 在线成人小视频| 中文在线字幕免费观| 欧美性猛交xxxx偷拍洗澡| 欧美爱爱小视频| 成人欧美一区二区三区黑人麻豆| 日本二区在线观看| 99久久久无码国产精品| 深田咏美中文字幕| 丁香婷婷综合网| 成人三级做爰av| 九九国产精品视频| 天堂av在线网站| 久久精品91| 97国产精东麻豆人妻电影| 激情久久综合| 91成人综合网| 国产综合婷婷| 日本久久久网站| 欧美精品导航| 精品视频在线观看一区二区| 天天做综合网| 熟妇熟女乱妇乱女网站| 久久久久久久久丰满| 在线丝袜欧美日韩制服| 日韩精品首页| 亚洲AV无码成人精品一区| 欧美韩日高清| 视频一区二区视频| 色综合久久一区二区三区| 亚洲免费不卡| 久久久久久久久久久久久久久久久久| 一本一道久久a久久精品综合| av亚洲在线观看| 亚洲电影网站| 亚洲激情中文| 男人的天堂avav| 欧美在线看片| 蜜臀av无码一区二区三区| 精品动漫一区| 99精品视频播放| 免费在线观看视频一区| 青青草久久伊人| 懂色av中文字幕一区二区三区| 美女网站视频在线观看| 91色.com| www成人啪啪18软件| 国产精品欧美一区喷水| 成人高潮免费视频| 亚洲乱码中文字幕综合| 日本熟妇毛耸耸xxxxxx| 色88888久久久久久影院按摩 | 久久av中文字幕片| 日韩精品aaa| 成人福利视频在线| 一区二区黄色片| 亚洲人午夜精品天堂一二香蕉| 精品一区在线视频| 色欧美乱欧美15图片| 一区二区视频网站| 日韩精品一区二| 日色在线视频| 久热爱精品视频线路一| 操人在线观看| 成人国产精品日本在线| av成人综合| 亚洲欧美精品| 影音国产精品| 成人一区二区三| 国产高清不卡一区| 亚洲精品国产91| 一区二区三区毛片| 天天操天天干天天摸| 日韩丝袜美女视频| 日本电影一区二区在线观看 | 蜜桃视频在线观看播放| 国产日韩av高清| 三级小说欧洲区亚洲区| 国产对白在线播放| 日韩电影免费在线看| 毛茸茸free性熟hd| 欧美国产丝袜视频| 亚洲精品午夜久久久久久久| 欧洲精品在线观看| 十八禁一区二区三区| 久久亚洲精品毛片| 欧美成a人片在线观看久| 爱情岛论坛亚洲入口| 日韩在线理论| 国产成人精品无码播放| 成人免费视频网站在线观看| 精品伦精品一区二区三区视频密桃| 亚洲3atv精品一区二区三区| 国产又爽又黄免费软件| 国产亚洲欧美aaaa| 毛片在线网站| 国产精品毛片va一区二区三区| 首页国产精品| 欧美三级理论片| 91视频在线看| 日韩精品在线免费看| 欧美一级片在线看| 一级毛片视频在线| 国产精品久久久久久久久久东京 | 中文字幕中文字幕在线中一区高清 | 国产精品久久久久永久免费观看 | 91精品国自产在线| 亚洲一区二三区| 亚洲综合精品视频| 亚洲天堂免费视频| 樱桃视频成人在线观看| 韩国精品一区二区三区六区色诱| 欧美特黄一区| 中文字幕在线观看视频www| 国产精品美女久久久久久久| 中文字幕xxxx| 亚洲欧洲日本专区| 另类专区亚洲| 久久久av水蜜桃| 国产视频一区三区| 五月开心播播网| 五月婷婷久久综合| 色香蕉在线视频| 97视频免费看| 欧美黑人巨大videos精品| 欧美午夜性视频| 91在线观看一区二区| 亚洲第一精品在线观看| 日韩精品中文字幕在线| 黄视频网站在线观看| 玛丽玛丽电影原版免费观看1977| 久久国产66| 三上悠亚影音先锋| 欧美性一二三区| 伦xxxx在线| 99久久综合狠狠综合久久止| 雨宫琴音一区二区在线| 亚洲精品女人久久久| 日韩欧美一区视频| sese在线视频| 亚洲伊人成综合成人网| 欧美性久久久| 国产精品无码毛片| 色综合久久久久久久久久久| 国产精品视频一区二区久久| 国产精品人人做人人爽| 91九色精品| 日韩无码精品一区二区| 91久久精品国产91性色tv| 午夜在线小视频| 操一操视频一区| 免播放器亚洲| 国产91在线播放九色| 欧美v亚洲v综合ⅴ国产v| 超碰激情在线| 神马影院我不卡午夜| 男人操女人的视频在线观看欧美| 老司机成人免费视频| 精品福利在线导航| 国产麻豆久久| 69精品丰满人妻无码视频a片| 成人三级在线视频| 国产99久久久久久免费看| 久久精品中文字幕| 啪啪国产精品| 男人的天堂最新网址| 精品久久久免费| 日本视频不卡| 精品网站在线看| 狠狠色丁香婷婷综合| 国产日产精品一区二区三区| 日韩午夜在线视频| 三级精品视频| 亚洲一级片免费观看| 日韩欧美在线视频日韩欧美在线视频| 三区四区电影在线观看| 国产伦精品一区二区三区四区免费 | 91sa在线看| 欧美久久九九| 精品一区二区三孕妇视频| 亚洲第一福利在线观看| 色综合视频一区二区三区44| 少妇无码av无码专区在线观看| 中文字幕五月欧美| 国产一区二区影视| 国产精品视频在线免费观看|