2014-03-25 82 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

欢迎您:) –