用mvc和autoconfigured

时间:2017-08-26 10:51:52

标签: java maven spring-mvc spring-boot

我试图让我的头围绕着春天的MVC并启动一个多星期了。 我理解它背后的理论,但不知怎的,我无法让它发挥作用。 我知道白页错误问题已被问过1000次,但他们都使用web.xml进行配置,我使用的是application.properties。

我创建了一个项目,首先,我的应用程序是我的控制器,我在其中使用请求映射和响应主体来呈现JSP页面,该页面运行良好,即使对不同的JSP页面进行多次调用也是如此。但是当我尝试将控制器分开并将它们放在控制器类中时,我会收到白标签页错误? 任何人都知道我做错了什么?

我按照教程写了这封信,除了,他的主要应用程序在默认包中,我的打包应用程序,因为我得到一个错误,说我不能在基础包上执行组件,以及在最后一个和视频之间的某个地方我被卡住了他覆盖了受保护的SpringApplicationBuilder方法configure,但是当我试图覆盖它时,我得到一个警告,它不是超类的方法。他也从不解释信息的作用。

这是我的pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0     
     http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>be.intecBrussel.danielDemesmaecker</groupId>
<artifactId>springMVC</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
    <java.version>1.8</java.version>
</properties>

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.3.8.RELEASE</version>
</parent>

<build>
    <finalName>SpringMVC</finalName>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <executable>true</executable>
            </configuration>
        </plugin>
    </plugins>
</build>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-jasper</artifactId>
        <scope>required</scope>
    </dependency>
</dependencies>
</project>

我的PageController:

@Controller
public class PageController {

    @RequestMapping("/")
    String home(){
        return "home";
    }

    @RequestMapping("/about")
    String about(){
        return "about";
    }

    @RequestMapping("/contact")
    String contact(){
        return "contact";
    }
}

我的应用:

@EnableAutoConfiguration
@ComponentScan

public class App {
    public static void main(String[] args) {
        SpringApplication.run(App.class,args);
    }
}

我的应用程序,当她还在没有控制器类的情况下工作时:

@EnableAutoConfiguration
@Controller

public class App {
    public static void main(String[] args) {
        SpringApplication.run(App.class,args);
    }

    @RequestMapping("/")
    String home(){
        return "home";
    }

    @RequestMapping("/about")
    String about(){
        return "about";
    }

    @RequestMapping("/contact")
    String contact(){
        return "contact";
    }
}

我知道社区对这样的问题感到皱眉,为什么这不起作用,但我根本不知道问题是什么,所以不知道任何其他方式来提问。所以任何人都可以帮助我理解为什么在将我的控制器移动到一个单独的类结果中断了视图链接后,这将是很好的。 供参考:我使用的是本教程:http://courses.caveofprogramming.com/courses/spring-boot-tutorial/lectures/1063634

对不起我的英语,但我是荷兰人

2 个答案:

答案 0 :(得分:0)

包是主要问题。 @ComponentScan获取包并搜索所有子包。例如,包含com.dan.ny.App的主类将在com.dan.ny.controllers.*中查找。

当你说默认包时,我假设你没有把包裹声明放在顶部。你需要这样做。它归结为java最佳实践。它不一定是一个好的包名,但你会喜欢在更大的应用程序中使用它。 Spring需要将类代码与类路径中的代码区分开来。

这是你应该hava的文件夹结构

mvc/src/main/java/da/ny/App.java
mvc/src/main/java/da/ny/Controller.java

放在两个文件的顶部

package da.ny;

答案 1 :(得分:0)

看起来您的控制器未添加到弹簧配置中。 我看到一个裸注释

@ComponentScan

正如你在javadoc中看到的那样:

  

具体如何    *包没有定义,扫描将从包中发生    *声明此注释的类。

因此,您需要将控制器放在与App类相同或ab子包中,而不是应该找到它。

向控制器类添加构造函数,在内部添加断点并以调试模式启动应用程序。如果它没有在断点处停止,则控制器不会被弹簧实例化....

您写道:

  

但他们都使用web.xml进行配置,我使用的是application.properties。

web.xml用于配置servlet上下文。从java servlet版本3开始,这可以完全用Java完成。 Spring为你做了这个,这就是为什么你不再需要web.xml了。

application.properties用于配置spring和您自己的类。这与web.xml完全不同。

最后你可能会看一下这个基本的春季教程,它可能比你到目前为止所做的更容易理解......

希望我能帮助你一点。