2015-12-15 12 views
4

我新的春天,我注意到,處理靜態資源時,有兩種方法可供選擇:?爲什麼有2種方式來處理春季靜態資源(addResourceHandlers和容器的默認servlet「)


選項1:

如果 Spring的DispatcherServlet映射到/與下面的代碼,這使得它的「默認的servlet」,有可能映射CER覃靜資源與RequestMapping註釋(重寫AbstractAnnotationConfigDispatcherServletInitializer類)春天處理程序:

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

然後,我們仍然可以使容器的「默認servlet」來處理這些靜態資源,其URL模式不屬於春天的請求映射(重寫WebMvcConfigurerAdapter類):

@Override 
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { 
    configurer.enable(); 
} 

這基本上使用servlet容器的「默認servlet」爲包羅萬象的來處理所有的靜態[R esources 錯過由Spring的DispatcherServlet


選項2:

(重寫WebMvcConfigurerAdapter類)

@Override 
public void addResourceHandlers(ResourceHandlerRegistry registry) { 
    super.addResourceHandlers(registry); 
    registry.addResourceHandler("*.efi").addResourceLocations("/"); 
} 

  • 爲什麼有兩個選擇呢?
  • 這些方法之間的主要區別是什麼?
  • 還有其他的選擇嗎?

我通常採取選項2,因爲我想堅持到春天,但我知道這不是一個強有力的理由。


一些參考與靜態資源處理:


ADD 1

看來選項2提供了有關資源映射了更多的靈活性。甚至可以映射WEB-INF文件夾內的資源。

+1

你基本上自己回答了這個問題。選項1允許您啓用容器的默認行爲**如果您將'DispatcherServlet'映射到'\',則爲**。 – zeroflagL

+0

@zeroflagL直到今天,我完全認識到您的評論中的大寫** IF **。謝謝。框架可能會減少我們編寫的代碼,但大大增加我們需要保持腦力的東西。 – smwikipedia

回答

1

下面是Falling Back On the "Default" Servlet To Serve Resources不適用的具體示例。

這是上述方法的典型實現:

@Override 
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) 
{ 
    configurer.enable(); 
    return; 
} 

然而,在春季4 處理404錯誤的當前最好的做法似乎是使用setThrowExceptionIfNoHandlerFound

@Override 
protected DispatcherServlet createDispatcherServlet(WebApplicationContext servletAppContext) 
{ 
    DispatcherServlet dispatcherServlet = (DispatcherServlet) super.createDispatcherServlet(servletAppContext); 
    dispatcherServlet.setThrowExceptionIfNoHandlerFound(true); 
    return dispatcherServlet; 
} 

不幸的是,根據DispatcherServlet的文檔:

請注意,如果使用DefaultServletHttpRequestHandler,那麼請求 將始終轉發到默認的servlet,並且在這種情況下永遠不會拋出請求 NoHandlerFoundException

確實如此。結合上述兩種方法都不會導致觸發NoHandlerFoundException,並且這反過來阻止了我的404自定義錯誤頁面的解析。現在,如果我要將我的configureDefaultServletHandling方法註釋掉,則會拋出NoHandlerFoundException,並且我的錯誤處理(通過鏈接答案中顯示的@ControllerAdvice)解析爲我的自定義「notFoundPage」。

不幸的是,現在這意味着我的靜態資源(即「default.css」)都沒有解決:

DEBUG org.springframework.web.servlet.DispatcherServlet - Handler execution resulted in exception - forwarding to resolved error view: ModelAndView: reference to view with name 'notFoundPage'; model is {} 
org.springframework.web.servlet.NoHandlerFoundException: No handler found for GET /webapp-test/style/default.css 

我沒有看到任何方式,使他們不會干涉這兩種方式調和與彼此。我的結論是,在這種情況下,「默認Servlet」方法不適合於服務靜態資源,這使我們採用了addResourceHandlers方法。

在使用addResourceHandlers method的好處是:

  • ...從比Web應用程序根,包括在classpath位置之外的位置提供靜態資源。
  • cache-period屬性可用於設置遠期過期標題,以便客戶端更有效地使用它們。
  • 處理程序還正確評估Last-Modified標頭(如果存在),以便適當地返回304狀態碼,避免客戶端已緩存的資源產生不必要的開銷。
相關問題