Spring MVC:找不到正确解析的JSP的处理程序

Jam*_*ams 6 java spring jsp tomcat spring-mvc

我编写了一个简单的Spring MVC应用程序,它有一个映射到URL的Controller方法:

@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);
}
Run Code Online (Sandbox Code Playgroud)

当通过浏览器请求的URL,我收到了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'
Run Code Online (Sandbox Code Playgroud)

在我的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>
Run Code Online (Sandbox Code Playgroud)

如果我去到哪里部署应用程序,我可以看到JSP文件是它应该是Tomcat的webapps目录,$ TOMCAT_HOME/webapps /下程序my_app/WEB-INF/JSP/list_persons.jsp

也许文件正在被找到但是还有另一个处理程序映射步骤应该发生我已经跳过了?我的假设是,一旦将这个JSP页面作为响应中的视图引用,那么JSP应该在浏览器中呈现为HTML.我可以从其他视图中获得预期的结果,这些视图是扩展AbstractView的类,但普通的JSP并不令人高兴.

任何人都可以建议为什么这不能按预期工作?在此先感谢任何帮助/见解.

更新:这是通过将web.xml中的servlet映射从/*更改为/来解决的,即:

<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>
Run Code Online (Sandbox Code Playgroud)

对此:

<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>
Run Code Online (Sandbox Code Playgroud)

我希望这会有助于防止别人像我一样浪费时间......

Sot*_*lis 6

就像你有一个在我看来url-pattern/*DispatcherServlet.您必须知道典型的servlet容器将具有Servlet用于处理JSP 的实现.这JspServlet通常使用扩展映射进行映射,例如*.jsp.在扩展映射之前匹配路径映射模式/*.因此,您DispatcherServlet将被选择处理内部转发

/my_app/WEB-INF/jsp/list_persons.jsp
Run Code Online (Sandbox Code Playgroud)

但它没有合适的处理程序.

通过将DispatcherServlet映射更改为/,它将成为最后匹配的默认servlet,因此Servlet容器已经选择了JspServlet处理它RequestDispatcher forward.