Spring结合tomcat 404的三种原因

  • Post author:
  • Post category:其他


前不久看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 版权协议,转载请附上原文出处链接和本声明。