【发布时间】:2016-01-05 14:22:56
【问题描述】:
我们有一个带有控制器的 Spring MVC 应用程序:
@Controller("/app")
@Controller("/app/page1")
@Controller("/app/page2")
我们有 AppInitializer:
public class AppInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
WebApplicationContext context = getContext();
DispatcherServlet servlet = new DispatcherServlet(context);
ServletRegistration.Dynamic dispatcher = servletContext.addServlet("DispatcherServlet1", servlet);
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/app/*");
}
private AnnotationConfigWebApplicationContext getContext() {
... prepare app context
}
}
运行此应用时,我们可以访问
但是
http://localhost:8080/app/page1 导致错误
警告:未找到包含 URI [/app/page1] 的 HTTP 请求的映射 名称为“DispatcherServlet1”的 DispatcherServlet
和
http://localhost:8080/app/page2 导致错误
警告:未找到包含 URI [/app/page2] 的 HTTP 请求的映射 名称为“DispatcherServlet1”的 DispatcherServlet
我们可以通过像这样向 DispatcherServlet 添加严格映射来解决这个问题
DispatcherServlet servlet = new DispatcherServlet(context);
ServletRegistration.Dynamic dispatcher = servletContext.addServlet("DispatcherServlet1", servlet);
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/app", "/app/page1", "/app/page2");
所有页面都可以正常工作:
http://localhost:8080/app/page1
http://localhost:8080/app/page2
但问题是我们每次添加新页面时都需要向 DispatcherServlet 添加映射。例如要添加第 3 页,我们需要创建控制器
@Controller("/app/page3")
和
添加调度器servlet映射dispatcher.addMapping("/app", "/app/page1", "/app/page2", **"/app/page3"**);
我们真的很想避免这最后一步。
dispatcher.addMapping("/app/*"); 是理想的,但正如我上面提到的,它不起作用。
知道我们缺少什么吗?
【问题讨论】:
-
从控制器映射中删除
/app。它是调度程序 servlet 内部的映射,而不是完整的 URI。 -
@M.Deinum 谢谢伙计,这就像一个魅力。正是我们想要的:)
标签: java spring-mvc servlets servlet-mapping