前不久看SpringWeb源码的时候,做了一个简单的零xml的web项目,但是启动后就是提示404,网上找了很久还是没有找到原因,最后终于发现了与网上大多数说法不太一样的两个原因
下边看看一段代码, 看这段代码我们知道,如果不用springboot,那么这段代码是springweb项目的关键,当然前提是我们实现的零xml,如果你要提供web.xml配置文件,那就另说了
第一种
注意到addMapping()方法了么,这个地方很可能是我们出现404的一个原因
因为Dispartcher在进行路径匹配的时候,会将我们请求路径中的这段去掉,如你的请求是
http://localhost:8080/app/home 那么最后用来进行匹配的只用/home,如果你的Controller中提供的路径是/app/home, 那么你的正确请求路径应该是http://localhost:8080/app/app/home
public class MyWebApplicationInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletCxt) {
// Load Spring web application configuration
System.out.println("xxx");
//这里提供的application只是一个对象实例, 但是整个spring的环境还没有准备好
AnnotationConfigWebApplicationContext ac = new AnnotationConfigWebApplicationContext();
ac.register(AppConfig.class);
// ac.refresh();
// Create and register the DispatcherServlet
DispatcherServlet servlet = new DispatcherServlet(ac);
servlet.setContextInitializers(new MyApplicationContextInitializer());
ServletRegistration.Dynamic registration = servletCxt.addServlet("app", servlet);
registration.setLoadOnStartup(1);
//需要注意的是, 这个地方的app在进行mapping 匹配的时候会被拿掉
//也就是url:/app/index/index实际在匹配地址为/index/index
registration.addMapping("/app/*");
FilterRegistration.Dynamic filter = servletCxt.addFilter("filter", StaticFilter.class);
filter.addMappingForUrlPatterns(null, false, "/views/*");
}
}
第二种
大家都是怎么打包的呢,下边先看两个图, 在这两个图中,我们的打包的名字要与我们的请求的路径一致,如我们打包项目为web, 但是在部署的时候通过http://localhost:8080/webTest访问,那么404就出现了
第三种
其中前两种是打包部署都没有问题,只是访问出现了问题,第三种是可能是你的代码没有什么问题,但是打包的方式出现了问题,这个时候你启动tomcat一般回提示你你对项目不是一个合法的web模块,那就重新打包吧,或者是调整打配置参数再试试
版权声明:本文为mjlfto原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。