2012-12-23 19 views
15

好了,所以我也遇到了相當普遍的errror:DispatcherServlet,解析器和控制器如何交互?

WARNING: No mapping found for HTTP request with URI [/WEB-INF/jsp/index.jsp] in DispatcherServlet with name 'app'

我期待在現有的答案,我從來沒見過的如何組件交互一個很好的解釋。鑑於我無法根據現有答案解決我的問題,我希望有人能夠提供DispatcherServletResolver的功能的詳細解釋。

在Eclipse發展,我有以下結構:

/src/com/whiuk/philip/web/controller/IndexController.java 
/WebContent 
/WebContent/WEB-INF 
/WebContent/WEB-INF/web.xml 
/WebContent/WEB-INF/app-servlet.xml 
/WebContent/WEB-INF/jsp/index.jsp 

的Eclipse部署總成意味着它部署如下:

/src -> WEB-INF/classes 
/WebContent ->/
/ivy.xml[*] -> WEB-INF/lib 

我有一個的web.xml文件定義了DispatcherServlet並映射到所有文件(/*

<servlet> 
    <servlet-name>app</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
    <servlet-name>app</servlet-name> 
    <url-pattern>/*</url-pattern> 
</servlet-mapping> 

我有一個APP-servlet.xml中文件掃描包和定義InternalResourceViewResolver

<context:component-scan base-package="com.whiuk.philip.web" /> 
<mvc:annotation-driven /> 
<bean id="viewResolver" 
    class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <property name="prefix" value="/WEB-INF/jsp/" /> 
    <property name="suffix" value=".jsp" /> 
</bean> 

我有一個IndexController具有用於索引RequestMapping:

@Controller 
public class IndexController { 
     @RequestMapping(value = "/index", method = RequestMethod.GET) 
     public ModelAndView index() { 
      return new ModelAndView(); 
     } 
} 

日誌顯示這是註冊:

org.springframework.web.servlet.handler.AbstractHandlerMethodMapping registerHandlerMethod 
INFO: Mapped "{[/index],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}" 
onto public org.springframework.web.servlet.ModelAndView 
com.whiuk.philip.web.controller.IndexController.index() 

最後我有一個index.jsp文件。

有人能解釋一下錯誤配置是什麼導致上面顯示的錯誤,如果可能的話,提供一個DispatcherServlet,解析器和它們如何饋送到控制器的目的句子。

回答

8

本質上正在發生的事情是,因爲你有Spring的DispatcherServlet映射到/*,它往往被稱爲爲每個請求(這是好的),但即使請求被分派到JSP頁面不幸被調用(/WEB-INF/jsp/index.jsp) ,而不是調用容器默認的servlet。

,我知道的解決方法是以下幾點:它

地圖默認的servlet路徑/代替:

,你會用在上面看到
<servlet-mapping> 
    <servlet-name>app</servlet-name> 
    <url-pattern>/</url-pattern> 
</servlet-mapping> 

的一個問題是,根據資源你的web應用的根目錄將不幸得到由DispatcherServlet的處理,這將不知道該怎麼做,該解決方法是register a default-servlet-handler this way

<mvc:default-servlet-handler /> 
+0

啊謝謝!我想我嘗試了類似的嘗試,但忘記了@RequestMapping被設置爲'/ index'而不是'/ index *'或'/',因此忽略了對'/index.jsp'的請求,因此讓我認爲Dispatcher/Resolver設置仍然是錯誤的。仍然不確定我有完全正確的映射獲取目錄索引。不管怎樣,謝謝。 –

41

我將嘗試在Spring Web MVC應用程序中解釋請求的「流」。

當發送到應用程序會發生以下情況的請求:在你的服務器(例如Tomcat)的

  • 的請求到達。根據url中的上下文路徑,服務器決定請求屬於哪個應用程序。
  • 根據應用程序的web.xml文件中的url和servlet映射,服務器知道哪個servlet應該處理請求。
  • 該請求被傳遞到可以修改或拒絕請求的servlet filter鏈接
  • 該servlet控制該請求。在您的Spring應用程序中,Spring Dispatcherservlet會收到請求。現在,在
  • 彈簧踢該請求由mvc intercepterspreHandle方法
  • 該請求被映射到基於所述URL的控制器進行處理。相應的控制器方法將被調用。
  • 您的控制器正在處理請求。可以在控制器中返回許多不同的響應(jsp,pdf,json,重定向等)。現在我假設你想渲染一個簡單的jsp視圖。控制器的結果是兩件事:一個模型和一個視圖。該模型是一個包含您想要在視圖中稍後訪問的數據的地圖。這個階段的視圖大部分時間都是一個包含視圖名稱的簡單字符串。
  • 註冊彈簧MVC攔截器可以踢再次使用postHandle方法(例如,用於修改模型)
  • 控制器的「視圖」結果被解析爲使用ViewResolver真正觀。取決於ViewResolver,結果可以是jsp頁面,一個tiles view,一個thymeleaf template或許多其他'視圖'。你的情況ViewResolver解析的圖名(例如,「我的頁面」)到一個jsp文件(例如/WEB-INF/jsp/myPage.jsp
  • 視圖是使用由控制器
  • 返回的模型數據再現與所繪製的視圖的響應將被傳遞再次向mvc攔截器發送(afterCompletion方法)
  • 響應離開調度器servlet。這裏結束了春天的土地
  • 響應再次通過Servlet過濾器
  • 的響應發送回客戶端

隨時糾正我,如果我'不是100%正確,或者如果我錯過了什麼:-)

+4

感謝您的概述。我可以看到它非常複雜,你向我展示了很多我需要閱讀的地方,所以我對它是如何適合在一起感到滿意。 –

相關問題