Spring結合tomcat 404的三種原因

前不久看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模塊,那就重新打包吧,或者是調整打配置參數再試試

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章