對於一個任務,我正在練習Java的Spring MVC以創建一個Web應用程序。我已經在IDE Intellij Ultimate 2016.2.5中構建了整個項目。由於路由無效,彈簧路由獲取404錯誤
我爲此創建了一個Maven項目,爲此導入了正確的和問題的依賴關係並構建它。
IDE將構建以下的目錄結構:
├───src
│ └───bas
│ └───animalkingdom
│ ├───config
│ ├───controllers
├───test
│ └───bas
│ └───animalkingdom
└───web
├───META-INF
├───resources
└───WEB-INF
└───pages
的config
包是我的配置類,從WebMvcConfigurerAdapter延伸:
包bas.animalkingdom.config;
import ...
@Configuration
@ComponentScan("bas.animalkingdom")
@EnableWebMvc
public class Config extends WebMvcConfigurerAdapter {
@Bean
public UrlBasedViewResolver setupViewResolver() {
UrlBasedViewResolver resolver = new UrlBasedViewResolver();
resolver.setPrefix("/WEB-INF/pages/");
resolver.setSuffix(".jsp");
resolver.setViewClass(JstlView.class);
return resolver;
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
}
}
我以爲@ComponentScan
必須指向所有源文件所在的主要源代碼目錄。
有人告訴我,我還需要一個從WebApplicationInitializer
延伸的類。我從我的學校得到這一個
package bas.animalkingdom.config;
import ...
public class WebInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
ctx.register(Config.class);
ctx.setServletContext(servletContext);
ServletRegistration.Dynamic servlet = servletContext.addServlet("dispatcher", new DispatcherServlet(ctx));
servlet.addMapping("/");
servlet.setLoadOnStartup(1);
}
}
這一個也在config
包。
Config類在IDE中的項目結構設置中設置爲Spring Application Context
。
在根目錄下是web
文件夾。在文件夾WEB-INF
是一個空的web.xml
文件,我被告知我不需要,因爲設置將通過配置類加載。它看起來像這樣:
<web-app id="WebApp_ID" version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
</web-app>
在web
文件夾的根目錄下有一個index.jsp
文件。
在bas.animalkingdom.controllers
包是我的控制器。爲了測試用途變更,我只創建了一個:
package bas.animalkingdom.controllers;
import ...
@Controller("AnimalC")
public class AnimalController {
@RequestMapping(value = "/animals", method = RequestMethod.GET)
public String getAnimals(ModelMap modelMap) {
Animal animal = new AfricanElephant(new Male(), "Body Covering", "Ename", " acolor", 123, 321);
modelMap.put("animal", animal);
return "animals";
}
}
有了這個控制器我的預期,我可以去localhost/animals
URL,並且它會加載了animals.jsp
文件位於我web\WEB-INF\pages\
包。
我的代碼沒有編譯錯誤。
當我運行我的TomCat服務器,並打開我的瀏覽器去與相應的主機本地主機,index.jsp文件只是加載沒有問題。該文件位於web\
包中。
當我轉到localhost:(port)/animals
時,我剛剛收到一個404頁面,並顯示無法找到該頁面的消息。
這是什麼造成的?我已經定義了控制器設置該路線的權利?
另外,查找其他Spring MVC教程時,它們都使用不同的包裝,這是否也適用?
對於初學者刪除您'web.xml'你不需要它,它目前防止'WebInitializer'從做其工作。 –
你不需要在控制器中返回'pages/animals'嗎? –
@OlarAndrei爲什麼呢? – Bas