当前位置: 首页 > 面试题库 >

Tomcat如何在没有web.xml的情况下完全引导应用程序?

鲍驰
2023-03-14
问题内容

我想知道如何Tomcat在Spring MVC上引导我的应用程序?

我有一个初始化器:

public class AppInitializer implements WebApplicationInitializer {
    @Override
    public void onStartup(ServletContext container) {
        AnnotationConfigWebApplicationContext rootCtx = new AnnotationConfigWebApplicationContext();
        rootCtx.register(AppConfig.class);
        container.addListener(new ContextLoaderListener(rootCtx));
        AnnotationConfigWebApplicationContext dispatcherCtx = new AnnotationConfigWebApplicationContext();
        dispatcherCtx.register(FreeMarkerWebConfig.class);
        ServletRegistration.Dynamic dispatcher = container.addServlet("dispatcher", new DispatcherServlet(dispatcherCtx));
        dispatcher.setLoadOnStartup(1);
        dispatcher.addMapping("/");
    }
}

我知道我们为什么需要web.xml以及如何Tomcat使用它来引导应用程序。但是我不明白Tomcat,如果没有xml文件(只有),怎么知道应该使用哪个servlet来引导应用程序AppAppInitializer

依存关系

<!-- spring mvc -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>4.2.1.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    <version>4.2.1.RELEASE</version>
</dependency>
<!-- servlet -->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.0.1</version>
</dependency>

...

我在Spring核心中找到了此类SpringServletContainerInitializerTomcat使用它来引导我的应用程序是否正确?

http://docs.oracle.com/javaee/7/api/javax/servlet/ServletContainerInitializer.html?is-
external=true


问题答案:

Servlet
3.0添加了可插入性机制。它的工作方式是,在加载您的应用程序时,它将扫描类路径中名为javax.servlet.ServletContainerInitializerinside
的文件META-INF/services。在这里,实现者应该具有实现的名称,servlet容器可以在其中加载它。您可以在spring- webjar中看到此文件。它org.springframework.web.SpringServletContainerInitializer列为初始化程序的实现。

Spring初始化程序的工作方式是,它WebApplicationInializer由servlet容器传递所有的实现(在类路径上)。那么servlet容器如何知道传递这些实现?如果查看inializer的源代码,将会看到

@HandlesTypes(WebApplicationInitializer.class)
public class SpringServletContainerInitializer implements ServletContainerInitializer {

它是@HandlesType注释。所有类
甚至注释1中列出的@HandlesTypes将获得由servlet容器拾起,并传递到SevletContainerInitializer通过一个回调方法参数

void onStartup(java.util.Set<java.lang.Class<?>> c, ServletContext ctx)

Set参数包含servlet容器在扫描时拾取的所有实现。您可以浏览源代码,以了解Spring对这些实现的作用。它基本上只是调用onStartup所有inializer的,并传入ServletContext

1.这听起来有点不清楚(上面的解释在切线上可能有点偏离),所以我将其作为附加内容发布在这里。想象一下,@HandlesType相反是

@HandlesTypes({WebApplicationInitializer.class, Controller.class})
public class SpringServletContainerInitializer implements ServletContainerInitializer {

这意味着servlet容器还将扫描用注释的类@Controller,并将它们传递到onStartupSpring初始化程序的。



 类似资料:
  • TL;DR:将@webservlet(“/find-customers”)放在servlet(通过Tomcat 7部署)的开头并不是将servlet映射到host:port/webproject/find-customers中,即使servlet位于src文件夹中。

  • 问题内容: 我从 JavaEE 6中 了解到,它是可选的。 因此,如果没有 web.xml ,如何告诉应用程序服务器使用Jersey作为JAX-RS规范的实现? 问题答案: 就如何在没有web.xml的情况下实现应用程序配置而言,@AlexNevidomsky的回答是正确的。您在子类上使用注释。 有关部署选项的更多信息,请参见JAX-RS规范-> 2.3发布-> 2.3.2Servlet。 或更常

  • 我使用创建了一个应用程序构建文件。这将用和文件填充文件夹。 我在internet上进行了搜索,发现可以使用运行这些文件。不幸的是,这会产生以下错误输出: org.springframework.beans.factory.BeanCreationException:创建名为“org.springframework.boot.autocigure.orm.jpa.hibernatejpaAutoCo

  • 我想在Java Spring boot中获取我的应用程序的当前url。但问题是,我想从类而不是从中获得它。我试图从获取这个,但我无法将其包导入我的类。 请帮我得到我的网站的网址,不应该硬编码。或者如果有一种方法可以使用到我的util类。

  • 我知道这可以在Servlet3.0中通过@Webservlet注释实现,在这里您只需分配url模式,而不必在web.xml中进行任何配置。是否有一种方法可以通过编程方式为运行Servlet2.5的应用程序分配servlets url模式? 我正在创建一个库,多个应用程序将依赖于它,并试图使它,以便这些应用程序中的每一个都不必显式配置任何servlet url映射,我正在创建的库中的servlet在

  • 问题内容: 我有一个从网站的jnlp文件启动的Java应用程序。我正在尝试使其运行,而不会在运行前弹出一堆安全警告。 该程序分为大约10个不同的jar文件,大约30个jar库,以及也包含在jar文件中的几个本机库。 我已经使用官方代码签名证书(来自Verisign)对所有jar文件进行了签名,并将jnlp文件包含在保存主类的jar文件中,并向我所使用的主要10个jar添加了权限和代码库属性编译。