我编写了一个简单的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>
我希望这会有助于防止别人像我一样浪费时间......
答案 0 :(得分:6)
在我看来,您url-pattern
的{{1}}为/*
。您必须知道典型的servlet容器将具有用于处理JSP的DispatcherServlet
实现。此Servlet
通常使用扩展名映射进行映射,例如JspServlet
。 The 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
首先加载