我们有一个带有控制器的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
但是
http://localhost:8080/app/page1导致错误
警告:在中找不到URI为[/app/page1]的HTTP请求的映射名为"DispatcherServlet 1"的DispatcherServlet
和
http://localhost:8080/app/page2导致错误
警告:在中找不到URI为[/app/page2]的HTTP请求的映射名为"DispatcherServlet 1"的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
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/*");
将是理想的,但正如我上面提到的,它不起作用。
知道我们错过了什么吗?
您可以这样做映射:
@Controller
@RequestMapping("/app/products")
public class ProductController implements Serializable {...}