2014-03-25 83 views
6

我寫這具有映射到一個URL一個控制器方法的簡單的Spring MVC應用程序:當通過瀏覽器請求的URLSpring MVC的:沒有處理程序找到正確解析JSP

@RequestMapping(method = RequestMethod.GET, value = "/person_list") 
public ModelAndView getPersonList() 
{ 
    // get the list of all persons from the database and set this as the only member of our model map 
    List<Person> personList = personDao.list(); 
    Map<String, Object> model = new HashMap<String, Object>(); 
    model.put("person_list", personList); 

    // pass it on as a model and view, view should resolve to "list_persons.jsp" 
    return new ModelAndView("list_persons", "model", model); 
} 

我得到一個404頁面,並在Tomcat的日誌我看到一條消息,告訴我,正確解析JSP視圖文件,/WEB-INF/jsp/list_persons.jsp,未發現:

org.springframework.web.servlet.PageNotFound.noHandlerFound No mapping found for HTTP request with URI [/my_app/WEB-INF/jsp/list_persons.jsp] in DispatcherServlet with name 'dispatcher' 

在我的Spring應用程序上下文配置我已經使用了一個相當標準的視圖解析器設置:

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> 
    <property name="prefix" value="/WEB-INF/jsp/" /> 
    <property name="suffix" value=".jsp" /> 
</bean> 

如果我去到哪裏部署應用程序,我可以看到JSP文件就是它應該是$ TOMCAT_HOME/webapps /下程序my_app/WEB-INF/JSP/list_persons.jsp

Tomcat的webapps目錄

可能是文件被發現,但有是應該發生的,我已經跳過另一個處理程序映射步驟?我的假設是,一旦這個JSP頁面被引用爲響應中的視圖,那麼JSP應該在瀏覽器中呈現爲HTML。我可以從其他視圖獲得預期的結果,這些視圖是擴展AbstractView的類,但普通的JSP並不令人高興。

任何人都可以說明爲什麼這工作不正常?預先感謝任何幫助/見解。

UPDATE:

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

這樣::

<servlet-mapping> 
    <servlet-name>dispatcher</servlet-name> 
    <url-pattern>/</url-pattern> 
</servlet-mapping> 

我希望這這是通過在web.xml改變servlet映射從/ *到/,也就是從這個解決有助於防止別人浪費在這個像我這樣的小時...

+1

我們展示你的web.xml。 –

+3

調度程序配置可能對此有所幫助 – 2014-03-25 07:18:00

+0

請將您的調度程序servlet發佈給我們 –

回答

6

在我看來,你似乎有一個url-pattern/*爲您的DispatcherServlet。你要知道,一個典型的servlet容器將有一個Servlet實施處理的JSP。此JspServlet通常被映射與擴展映射,如*.jspThe path mapping pattern /* is matched before extension mapping.因此,您DispatcherServlet將被選擇來處理內部期待

/my_app/WEB-INF/jsp/list_persons.jsp 

,但它不會有一個適當的處理程序。

通過改變DispatcherServlet映射/,成爲其最後的匹配默認的servlet,因此Servlet容器將已經選擇了JspServlet處理RequestDispatcherforward

+0

我其實自己想到了這一點,但你已經做出了一個很好的解釋,爲什麼它會這樣。幹得不錯,謝謝你的幫助! –

1
<servlet-mapping> 
    <servlet-name>dispatcher</servlet-name> 
    <url-pattern>/</url-pattern> 
</servlet-mapping> 

這將所有請求轉發正如你所說的url-pattern將在這裏與發送模式的要求彈簧調度servlet來春調度

<servlet-mapping> 
    <servlet-name>dispatcher</servlet-name> 
    <url-pattern>.htm</url-pattern> 
</servlet-mapping> 

是。如果指定一個像.htm東西,只有那些請求將被分派作爲第一web.xml負載處理

+0

這是正確的,上面的Sotirios也得到了答案,以及一分鐘之前與另一個很好的解釋,對不起,我不能標記爲正確的答案。感謝您的幫助,我希望我在這裏比我早點要求幫助! –

+0

歡迎您:) –