我们有一个带有控制器的 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导致错误
警告:在名称为“DispatcherServlet1”的 DispatcherServlet 中找不到具有 URI [/app/page1] 的 HTTP 请求的映射
和
http://localhost:8080/app/page2导致错误
警告:在名称为“DispatcherServlet1”的 DispatcherServlet 中找不到具有 URI [/app/page2] 的 HTTP 请求的映射
我们可以通过像这样向 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/*");
将是理想的,但正如我上面提到的它不起作用。
知道我们缺少什么吗?