【问题标题】:How do I embed Tomcat in a Spring Framework MVC application?如何在 Spring Framework MVC 应用程序中嵌入 Tomcat?
【发布时间】:2017-12-23 11:41:36
【问题描述】:

我已经创建了所需的配置/控制器类。但我不清楚我应该如何编排这些类以使用运行 tomcat 实例。我知道使用 Spring Boot 是使用 SpringApplication.run(..) 的问题。但我正在尝试探索在 Spring Boot 之前使用的替代方法。我对 Spring 框架有点陌生,所以请原谅我的无知。我也没有使用任何仅使用 Java 的 XML 配置

public class SpittrWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer
{

@Override //....
protected String[] getServletMappings(){
    return new String[] { "/" }; 
}

@Override //...
protected Class<?>[] getRootConfigClasses(){
    return new Class<?>[] { RootConfig.class };
}

@Override //.....
protected Class<?>[] getServletConfigClasses(){
    return new Class<?>[] { WebConfig.class };
}
}

我已经创建了一个控制器

@Controller
@RequestMapping("/")
public class HomeController {

    @RequestMapping(method = RequestMethod.GET)
    public String home(){
        return "home";
    }

POM 文件:

    <dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>4.3.9.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>4.3.9.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>4.3.9.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>4.3.9.RELEASE</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.1.0</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

【问题讨论】:

  • 您需要将您的 servlet 添加到您的 tomcat 的 webapps 文件夹中,该文件夹将在运行时发现您的 servlet。或者您想通过您的 java 应用程序启动嵌入式 tomcat?
  • 传统的 Spring WEB MVC 应该运行在 servlet 容器中,可以是 Tomcat 或 Pivotal tc 服务器。在这种情况下,您不需要创建应用程序上下文,引导由容器本身完成。在您的 IDE 中右键单击项目,选择 Run as 并选择 Tomcat 或 Pivotal tc。
  • here如果你想要一个带有嵌入式tomcat的胖罐
  • 谢谢你们,我正在重新配置我的 Intellij 项目以使用 Tomcat 启动。会回来报告的。

标签: java spring spring-mvc tomcat spring-boot


【解决方案1】:

终于解决了我遇到的问题。就像 VitalyZ 推荐的那样,我在我的 POM 中添加了一个嵌入式 Tomcat 实例。我在一个新类中配置了嵌入式 tomcat 实例。

在我的 Pom 文件中添加了以下内容

    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-jasper</artifactId>
        <version>8.5.15</version>
    </dependency>

创建了一个名为 Application.java 的新类

public class Application {
    public static void main(String[] args) throws Exception {

        String webAppDirLocation = "src/main/";
        Tomcat tomcat = new Tomcat();

        //Set Port #
        tomcat.setPort(8080);

        StandardContext ctx = (StandardContext) tomcat.addWebapp("/", new File(webAppDirLocation).getAbsolutePath());

        tomcat.start();
        tomcat.getServer().await();
    }
}

【讨论】:

  • 硬编码路径“src/main”让我很怀疑。这在打包到 JAR 文件中时不起作用,但只能使用项目文件夹中的文件,不是吗?
【解决方案2】:

我建议您查看the spring official documentation 以了解机制,更准确地说是DispatcherServlet part

对我来说,您缺少 web.xml 部分:

<web-app>
    <servlet>
        <servlet-name>example</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>example</servlet-name>
        <url-pattern>/example/*</url-pattern>
    </servlet-mapping>

</web-app>

这个stackoverflow answer也可以帮助你。

【讨论】:

  • Java Config Servlet 3+ 配置不需要 web.xml。
  • 就 fg78nc 而言,我确实确保我使用的是 Servlet 3+ 来避免 XML 配置。我同意,我会多阅读文档。谢谢阿卡的回复。
  • 是的,很抱歉,如果我的回答没有帮助。
猜你喜欢
  • 2018-05-29
  • 1970-01-01
  • 2020-07-18
  • 1970-01-01
  • 2017-01-04
  • 2011-06-24
  • 1970-01-01
  • 2016-10-09
  • 2017-10-21
相关资源
最近更新 更多