繁体   English   中英

Spring启动与MVC和自动配置

[英]Spring boot with mvc and autoconfigured

我正在努力使自己在春季MVC上领先,并且现在已经启动了一个多星期。 我了解其背后的理论,但是不知何故我无法使它起作用。 我知道白页错误问题已被问过1000次,但是它们都使用web.xml进行配置,而我使用了application.properties。

我创建了一个项目,首先,我的应用程序是我的控制器,在其中我使用请求映射和响应正文来呈现JSP页面,即使多次调用不同的JSP页面,该效果也很好。 但是,当我尝试分离控制器并将它们放在控制器类中时,出现白标签页面错误吗? 有人知道我在做什么错吗?

我遵循本教程的内容,但他的主要应用程序位于默认程序包中,我的应用程序位于打包的应用程序中,原因是我收到一个错误消息,说我无法在基本程序包上执行组件,并且在最后一个程序包与视频被卡住了,他覆盖了受保护的SpringApplicationBuilder方法配置,但是当我尝试覆盖它时,我得到一个警告,它不是超类的方法。 他也从不解释消息的作用。

这是我的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

打扰一下我的英语,但是我荷兰语

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

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

这是您应该使用的文件夹结构

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

放在两个文件的顶部

package da.ny;

看来您的控制器未添加到spring配置中。 我看到一个裸露的注解

@ComponentScan

如您在其javadoc中所看到的:

如果未定义特定的*包,则将从声明此批注的*类的包中进行扫描。

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

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

你写了 :

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

web.xml用于配置servlet上下文。 从Java Servlet版本3开始,这可以完全在Java中完成。 Spring为您做到了,这就是为什么您不再需要web.xml的原因了。

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

最后,您可以看一下这个基本的春季教程,它可能比您到目前为止尝试的要容易得多。

希望我能对您有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM