由于路由无效,Spring路由会收到404错误

时间:2016-11-14 19:59:01

标签: java spring maven spring-mvc

对于作业,我正在练习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教程时,它们都使用不同的包装,这也有效吗?

1 个答案:

答案 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结构,请确保执行以下操作:

  1. 删除您的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>
    
  2. 创建文件夹结构 / src / main / java 并将所有java包放入此 java目录。如果您的包格式不正确,您可以右键单击文件夹 java ,然后转到标记目录 - &gt;来源根源。

  3. 创建文件夹结构 / src / test / java ,并将所有测试包放在java目录中。

  4. 创建文件夹结构 / src / main / webapp ,并将文件夹 web 的所有内容放入 webapp 目录。

  5. 执行此操作后,您可以测试您的应用程序。您可以尝试使用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>