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

时间:2014-03-25 07:15:13

标签: 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);
}

当通过浏览器请求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'

在我的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>

如果我进入部署了应用程序的Tomcat webapps目录,我可以看到JSP文件应该是它的位置,$ TOMCAT_HOME / webapps / my_app / WEB-INF / jsp / list_persons.jsp < / p>

也许正在找到该文件,但是还有另一个处理器映射步骤应该发生,我已经跳过了?我的假设是,一旦将这个JSP页面作为响应中的视图引用,那么JSP应该在浏览器中呈现为HTML。我可以从扩展AbstractView的其他视图中获得预期的结果,但普通的JSP不会给你带来欢乐。

有人能说明为什么这不能按预期工作吗?提前感谢任何帮助/见解。

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

<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>

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

2 个答案:

答案 0 :(得分:6)

在我看来,您url-pattern的{​​{1}}为/*。您必须知道典型的servlet容器将具有用于处理JSP的DispatcherServlet实现。此Servlet通常使用扩展名映射进行映射,例如JspServletThe path mapping pattern /* is matched before extension mapping.因此,您的*.jsp将被选中处理内部转发

DispatcherServlet

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

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

答案 1 :(得分:1)

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

向前转发所有请求弹簧调度员

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

是的,正如您所说,url-pattern会将带有模式的请求发送到spring dispatcher servlet。如果指定.htm之类的内容,则只有web.xml首先加载

时,调度程序才会处理这些请求