对于作业,我正在练习Java的Spring MVC来创建Web应用程序。我在IDE Intellij Ultimate 2016.2.5中构建了整个项目。
我为此创建了一个Maven项目,为此导入了正确的和请求的依赖项并构建它。
IDE构建以下目录结构:
├───src
│ └───bas
│ └───animalkingdom
│ ├───config
│ ├───controllers
├───test
│ └───bas
│ └───animalkingdom
└───web
├───META-INF
├───resources
└───WEB-INF
└───pages
config
包是我的配置类,从WebMvcConfigurerAdapter扩展:
package 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
网址,并且它会加载位于我的animals.jsp
包中的web\WEB-INF\pages\
文件。
我的代码中没有编译错误。
当我运行我的TomCat服务器,并打开我的浏览器以使用相应的主机转到localhost时,index.jsp文件只是加载没有问题。此文件位于web\
包中。
当我转到localhost:(port)/animals
时,我只得到一个404页面,其中包含无法找到该页面的消息。
导致这种情况的原因是什么?我已经定义了设置该路线的控制器吗?
另外,在查找其他Spring MVC教程时,它们都使用不同的包装,这也有效吗?
答案 0 :(得分:1)
你的所有java类和jsps都很好,问题是你的模块结构。你的问题基本上有两种方法,传统的(推荐的)和非传统的方式。让我们从非传统的方式开始,这更快,不推荐:
A。非常规:
添加到你的maven-war-plugin,warSourceDirectory标签如下所示:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<warSourceDirectory>${basedir}/web</warSourceDirectory>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
使用这种方法的缺点是其他插件可能会给你带来意想不到的问题,例如maven-jetty-plugin不会用这种方法开箱即用。它默认为查看src / main / webapp,尽管它是可配置的。如果按照传统方法,Maven生活会更容易。
B。传统方法:
解决方案在于为您的模块配备传统的maven结构,请确保执行以下操作:
删除您的web.xml文件。如果由于缺少web.xml文件而导致maven包失败,请在pom.xml的 build 部分添加以下插件:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
创建文件夹结构 / src / main / java 并将所有java包放入此 java目录。如果您的包格式不正确,您可以右键单击文件夹 java ,然后转到标记目录 - &gt;来源根源。
创建文件夹结构 / src / test / java ,并将所有测试包放在java目录中。
创建文件夹结构 / src / main / webapp ,并将文件夹 web 的所有内容放入 webapp 目录。
执行此操作后,您可以测试您的应用程序。您可以尝试使用jetty插件使用以下配置部署您的Web应用程序:
<build>
<finalName>spring-mvc</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.2.11.v20150529</version>
<configuration>
<scanIntervalSeconds>10</scanIntervalSeconds>
<webApp>
<contextPath>/</contextPath>
</webApp>
<httpConnector>
<port>8080</port>
</httpConnector>
</configuration>
</plugin>
</plugins>
</build>