2016-08-30 58 views
1

我剛剛進入Spring Framework技術,並且正在製作一個包含少量WebServices(Webstore,社交媒體站點等)的網站。我想要的是,每個Web服務都擁有擁有自己的ViewResolver的DispatcherServlet。所以,我的項目的結構看起來像:Spring MVC中的多DispatcherServlets(Java配置)

  • 的主要場所 - DispatcherServlet的#1映射只http://example.com(是的,我知道我可以只使用靜態的HTML網站,但它是學習的目的
  • Webservice的沒有。 1如網絡商店 - DispatcherServlet的#2映射只 /網絡存儲器/ *
  • Webservice的二號例如社交媒體網站 - DispatcherServlet的#3映射只/社會/ *

在配置上,我使用Java類,所以我做的是:

  • 延伸WebMvcConfigureAdapter和 首先我創建的AppConfig類實現ViewResolver主網站的意見。接下來,我創建了一個類012.,它擴展了AbstractAnnotationConfigDispatcherServletInitializer類,並且在其中我配置了RootConfigClass和servlet映射
  • 其次,我遇到了問題 - 即無法爲Dispatcher Servlet#2創建另一個類(couldn'有兩個類擴展了AbstractAnnotationConfigDispatcherServletInitializer),我發現創建的類將實現一個接口WebApplicationInitializer。我做了,並最終有工作第二DispatcherServlet
  • 第三我已經講了從第二點的步驟,並有三個工作調度Servlets(理論上...)

    1. 我可以通過DispatcherServlet的#訪問我的主網站1
      http://example.com

    2. 我可以通過DispatcherServlet的#2(http://example.com/webstore

    3. 訪問我的網站商鋪爲主的網站,我可以訪問我的webservice通過DispatcherServlet#3(http://example.com/social

但是畢竟,當我創建另一個視圖指向例如登錄部分(http://example.com/webstore/login)根本沒有工作。錯誤表示調度程序Servlet#1無法處理映射請求,其中地址應與分派器Servlet#2綁定。我所做的解決此問題的方法是將Servlet映射的Dispatcher Servlet#2配置類部分從servlet.addMapping("/webstore/");更改爲servlet.addMapping("/webstore/*");,我讀過的內容並不是最好的主意,但它工作正常。 當我輸入控制器無法處理的地址(不存在)時,出現問題(http://example.com/webstore/thisaddressdoesntexists),視圖控制器將我從http://example.com/webstore返回到主默認視圖,而不是找不到404頁面。這不是我想要實施的行爲。除了那個小功能外,一切正常。所有specyfic請求都與他們specopy的DispatcherServlet一起提供。Finnal的問題是:

  • 如何防止加載默認視圖,在這種情況下,當我指向不存在的URL和加載錯誤代碼網站?
  • 我的理念甚至還好嗎?我的意思是使用實現WebApplicationInitializer的類來使用更多的DispatcherServlets,或者有另一種方法嗎?我只談論基於Java的配置類,沒有xml。

回答

1

我的概念甚至還好嗎?我的意思是使用類實現 WebApplicationInitializer用於使用更多的DispatcherServlets或 是另一種方式?我只是在談論基於Java的配置類,不是 xmls。

對於你需要有它實現WebApplicationInitializer並有提供的ContextLoader類與所有豆根上下文的單個類,並定義一個單獨的類的所有豆每個Servlet(usualliy延伸WebAppConfigurer類多個servlet )。您還需要爲每個單獨的servlet提供映射。看看here它是如何作爲一個例子做(在最近的響應)

至於到

Is my concept even good at all? 

爲什麼你想有三個獨立的servlet?這三個不同的應用程序捆綁在一起嗎?如果是這種情況,我不會把它們放在同一個軟件包中,但要製作三個不同的應用程序。您還可以使用映射到每個URL的單個Dispatchetservlet,併爲每個組件分別安裝控制器。這將減少整個項目的複雜性。所以它可以是任何方式。不知道你想做什麼更多,沒有人可以說它是對的或錯的。

如何防止加載默認視圖,在這種情況下,當我指向不存在的url和加載錯誤代碼網站?

對於錯誤處理頁面看看here。您通常會針對特定的HTTP錯誤代碼使用@ResponseStatus,或者針對通用錯誤使用@ExceptionHandler。在這兩種情況下,您都需要重定向到默認的錯誤頁面。