So registrieren Sie ein Servlet in Java

** 1. Einleitung

**

Dieser Artikel enthält einen Überblick über das Registrieren eines Servlets in Java EE und Spring Boot. Im Einzelnen werden zwei Möglichkeiten zur Registrierung eines Java-Servlets in Java EE beschrieben - eines mit einer web.xml -Datei und eines mit Anmerkungen. Dann registrieren wir Servlets in Spring Boot mit XML-Konfiguration, Java-Konfiguration und über konfigurierbare Eigenschaften.

Einen großartigen Einführungsartikel zu Servlets finden Sie hier:

2. Servlets in Java EE registrieren

Gehen wir zwei Wege durch, um ein Servlet in Java EE zu registrieren. Zunächst können wir ein Servlet über web.xml registrieren. Alternativ können wir die Java EE @ WebServlet -Annotation verwenden.

2.1. Über web.xml

Das gebräuchlichste Verfahren zum Registrieren eines Servlets in Ihrer Java EE-Anwendung ist das Hinzufügen zu Ihrer web.xml -Datei:

<welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<servlet>
    <servlet-name>Example</servlet-name>
    <servlet-class>com.baeldung.Example</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>Example</servlet-name>
    <url-pattern>/Example</url-pattern>
</servlet-mapping>

Wie Sie sehen, umfasst dies zwei Schritte: (1) Hinzufügen unseres Servlets zum servlet -Tag, wobei Sie auch den Quellpfad der Klasse angeben, in der sich das Servlet befindet, und (2) den URL-Pfad angeben, den das Servlet bereitstellt im url-pattern -Tag ein.

Die Java EE-Datei web.xml befindet sich normalerweise in WebContent/WEB-INF .

2.2. Über Anmerkungen

Lassen Sie uns nun unser Servlet mit der Annotation @ WebServlet unserer benutzerdefinierten Servlet-Klasse registrieren. Dadurch entfallen Servlet-Zuordnungen in der server.xml und die Registrierung des Servlets in web.xml :

@WebServlet(
  name = "AnnotationExample",
  description = "Example Servlet Using Annotations",
  urlPatterns = {"/AnnotationExample"}
)
public class Example extends HttpServlet {

    @Override
    protected void doGet(
      HttpServletRequest request,
      HttpServletResponse response) throws ServletException, IOException {

        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("<p>Hello World!</p>");
    }
}

Der obige Code veranschaulicht, wie diese Anmerkung direkt zu einem Servlet hinzugefügt wird. Das Servlet ist weiterhin unter demselben URL-Pfad wie zuvor verfügbar.

3. Servlets im Spring Boot registrieren

Nachdem wir nun gezeigt haben, wie Servlets in Java EE registriert werden, sehen wir uns verschiedene Möglichkeiten zum Registrieren von Servlets in einer Spring Boot-Anwendung an.

3.1. Programmatische Registrierung

Spring Boot unterstützt die 100% ige programmatische Konfiguration einer Webanwendung.

Zuerst implementieren wir die Schnittstelle WebApplicationInitializer und dann die Schnittstelle WebMvcConfigurer , mit der Sie voreingestellte Standardwerte überschreiben können, anstatt die einzelnen Konfigurationseinstellungen angeben zu müssen. Dadurch sparen Sie Zeit und arbeiten mit mehreren bewährten Einstellungen -die Kiste.

Schauen wir uns eine Beispielimplementierung von WebApplicationInitializer an:

public class WebAppInitializer implements WebApplicationInitializer {

    public void onStartup(ServletContext container) throws ServletException {
        AnnotationConfigWebApplicationContext ctx
          = new AnnotationConfigWebApplicationContext();
        ctx.register(WebMvcConfigure.class);
        ctx.setServletContext(container);

        ServletRegistration.Dynamic servlet = container.addServlet(
          "dispatcherExample", new DispatcherServlet(ctx));
        servlet.setLoadOnStartup(1);
        servlet.addMapping("/");
     }
}

Als nächstes implementieren wir die WebMvcConfigurer -Schnittstelle:

@Configuration
public class WebMvcConfigure implements WebMvcConfigurer {

    @Bean
    public ViewResolver getViewResolver() {
        InternalResourceViewResolver resolver
          = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/");
        resolver.setSuffix(".jsp");
        return resolver;
    }

    @Override
    public void configureDefaultServletHandling(
      DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/resources/** ** ")
          .addResourceLocations("/resources/").setCachePeriod(3600)
          .resourceChain(true).addResolver(new PathResourceResolver());
    }
}

Oben spezifizieren wir einige der Standardeinstellungen für JSP-Servlets explizit, um .jsp -Ansichten und statische Ressourcenbereitstellung zu unterstützen.

3.2. XML-Konfiguration

Eine andere Methode zum Konfigurieren und Registrieren von Servlets in Spring Boot ist über web.xml :

<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/dispatcher.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

Das zur Angabe der Konfiguration in Spring verwendete web.xml ähnelt dem in Java EE gefundenen. Oben können Sie sehen, wie wir über Attribute unter dem servlet -Tag einige weitere Parameter angeben.

Hier verwenden wir ein anderes XML, um die Konfiguration abzuschließen:

<beans ...>

    <context:component-scan base-package="com.baeldung"/>

    <bean
      class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>

Denken Sie daran, dass Ihr Spring web.xml normalerweise in src/main/webapp/WEB-INF lebt.

3.3. Kombination von XML und programmatischer Registrierung

Lassen Sie uns einen XML-Konfigurationsansatz mit der programmatischen Konfiguration von Spring kombinieren:

public void onStartup(ServletContext container) throws ServletException {
   XmlWebApplicationContext xctx = new XmlWebApplicationContext();
   xctx.setConfigLocation('classpath:/context.xml');
   xctx.setServletContext(container);

   ServletRegistration.Dynamic servlet = container.addServlet(
     "dispatcher", new DispatcherServlet(ctx));
   servlet.setLoadOnStartup(1);
   servlet.addMapping("/");
}

Lassen Sie uns auch das Dispatcher-Servlet konfigurieren:

<beans ...>

    <context:component-scan base-package="com.baeldung"/>
    <bean class="com.baeldung.configuration.WebAppInitializer"/>
</beans>

3.4. Anmeldung per Bean

Wir können unsere Servlets auch programmgesteuert mithilfe einer ServletRegistrationBean konfigurieren und registrieren. Im Folgenden tun wir dies, um ein HttpServlet zu registrieren (das die javax.servlet.Servlet -Schnittstelle implementiert):

@Bean
public ServletRegistrationBean exampleServletBean() {
    ServletRegistrationBean bean = new ServletRegistrationBean(
      new CustomServlet(), "/exampleServlet/** ");
    bean.setLoadOnStartup(1);
    return bean;
}

Der Hauptvorteil dieses Ansatzes besteht darin, dass Sie Ihrer Spring-Anwendung sowohl mehrere Servlets als auch unterschiedliche Servlets hinzufügen können.

Anstatt nur ein DispatcherServlet zu verwenden, eine spezifischere Art von HttpServlet und die gebräuchlichste Art, die im programmatischen WebApplicationInitializer -Konfigurationsansatz verwendet wird, den wir in Abschnitt 3.1 besprochen haben, verwenden wir eine einfachere HttpServlet -Subclass-Instanz, die die vier grundlegenden HttpRequest zeigt. Operationen durch vier Funktionen: doGet () , doPost () , doPut () und doDelete () wie in Java EE.

Denken Sie daran, dass es sich bei HttpServlet um eine abstrakte Klasse handelt (sie kann daher nicht instanziiert werden). Wir können jedoch leicht eine benutzerdefinierte Erweiterung erstellen:

public class CustomServlet extends HttpServlet{
    ...
}

** 4. Servlets mit Eigenschaften registrieren

**

Eine andere, wenn auch ungewöhnliche Methode zum Konfigurieren und Registrieren Ihrer Servlets besteht in der Verwendung einer benutzerdefinierten Eigenschaftendatei, die über ein PropertyLoader, PropertySource, - oder PropertySources -Instanzobjekt _. _ in die App geladen wird.

Dies bietet eine mittlere Konfiguration und die Möglichkeit, application.properties anderweitig anzupassen, wodurch wenig direkte Konfiguration für nicht eingebettete Servlets bereitgestellt wird.

4.1. Systemeigenschaften-Ansatz

Wir können unserer application.properties -Datei oder einer anderen Eigenschaftendatei einige benutzerdefinierte Einstellungen hinzufügen. Nehmen wir einige Einstellungen zur Konfiguration unseres DispatcherServlet an:

servlet.name=dispatcherExample
servlet.mapping=/dispatcherExampleURL

Laden Sie unsere benutzerdefinierten Eigenschaften in unsere Anwendung:

System.setProperty("custom.config.location", "classpath:custom.properties");

Und jetzt können wir auf diese Eigenschaften zugreifen:

System.getProperty("custom.config.location");

4.2. Benutzerdefinierter Eigenschaftsansatz

Beginnen wir mit einer custom.properties -Datei:

servlet.name=dispatcherExample
servlet.mapping=/dispatcherExampleURL

Wir können dann einen normalen Property Loader verwenden:

public Properties getProperties(String file) throws IOException {
  Properties prop = new Properties();
  InputStream input = null;
  input = getClass().getResourceAsStream(file);
  prop.load(input);
  if (input != null) {
      input.close();
  }
  return prop;
}

Jetzt können wir diese benutzerdefinierten Eigenschaften als Konstanten zu unserer WebApplicationInitializer -Implementierung hinzufügen:

private static final PropertyLoader pl = new PropertyLoader();
private static final Properties springProps
  = pl.getProperties("custom__spring.properties");

public static final String SERVLET__NAME
  = springProps.getProperty("servlet.name");
public static final String SERVLET__MAPPING
  = springProps.getProperty("servlet.mapping");

Wir können sie dann verwenden, um beispielsweise unser Dispatcher-Servlet zu konfigurieren:

ServletRegistration.Dynamic servlet = container.addServlet(
  SERVLET__NAME, new DispatcherServlet(ctx));
servlet.setLoadOnStartup(1);
servlet.addMapping(SERVLET__MAPPING);

Der Vorteil dieses Ansatzes ist das Fehlen einer .xml -Wartung, jedoch mit einfach zu ändernden Konfigurationseinstellungen, die keine erneute Bereitstellung der Codebase erfordern.

4.3. Der PropertySource -Ansatz

Ein schnellerer Weg, um dies zu erreichen, ist die Verwendung von Spring’s PropertySource , mit der auf eine Konfigurationsdatei zugegriffen werden kann.

PropertyResolver ist eine von __ConfigurableEnvironment implementierte Schnittstelle, die Anwendungseigenschaften beim Servlet-Start und bei der Initialisierung verfügbar macht:

@Configuration
@PropertySource("classpath:/com/yourapp/custom.properties")
public class ExampleCustomConfig {
    @Autowired
    ConfigurableEnvironment env;

    public String getProperty(String key) {
        return env.getProperty(key);
    }
}

Oben haben wir eine Abhängigkeit für die Klasse automatisch festgelegt und geben den Speicherort unserer benutzerdefinierten Eigenschaftendatei an. Wir können dann unsere herausragende Eigenschaft abrufen, indem wir die Funktion getProperty () aufrufen, die den String-Wert übergibt.

4.4. Der programmatische Ansatz von PropertySource

Wir können den obigen Ansatz (der das Abrufen von Eigenschaftswerten beinhaltet) mit dem folgenden Ansatz kombinieren (wodurch wir diese Werte programmgesteuert angeben können):

ConfigurableEnvironment env = new StandardEnvironment();
MutablePropertySources props = env.getPropertySources();
Map map = new HashMap(); map.put("key", "value");
props.addFirst(new MapPropertySource("Map", map));

Wir haben eine Map erstellt, die einen Schlüssel mit einem Wert verknüpft, und dann diese Map zu PropertySources hinzufügen, um den Aufruf nach Bedarf zu ermöglichen.

5. Embedded Servlets registrieren

Schließlich betrachten wir auch die grundlegende Konfiguration und Registrierung eingebetteter Servlets in Spring Boot.

  • Ein eingebettetes Servlet bietet vollständige Web-Container-Funktionen (Tomcat, Jetty usw.), ohne dass der Web-Container separat installiert oder verwaltet werden muss ** .

Sie können die erforderlichen Abhängigkeiten und Konfigurationen für die einfache Live-Server-Bereitstellung hinzufügen, wenn diese Funktionen problemlos, kompakt und schnell unterstützt werden.

Wir werden nur betrachten, wie man diesen Tomcat ausführt, aber der gleiche Ansatz kann für Jetty und Alternativen verwendet werden.

Geben Sie die Abhängigkeit für einen eingebetteten Tomcat 8-Webcontainer in pom.xml an:

<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
     <artifactId>tomcat-embed-core</artifactId>
     <version>8.5.11</version>
</dependency>

Fügen wir nun die Tags hinzu, die zum erfolgreichen Hinzufügen von Tomcat zu dem von Maven produzierten .war zur Build-Time erforderlich sind:

<build>
    <finalName>embeddedTomcatExample</finalName>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>appassembler-maven-plugin</artifactId>
            <version>2.0.0</version>
            <configuration>
                <assembleDirectory>target</assembleDirectory>
                <programs>
                    <program>
                        <mainClass>launch.Main</mainClass>
                        <name>webapp</name>
                    </program>
            </programs>
            </configuration>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>assemble</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

Wenn Sie Spring Boot verwenden, können Sie stattdessen die spring-boot-starter-tomcat -Abhängigkeit von Spring zu Ihrer pom.xml hinzufügen:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <scope>provided</scope>
</dependency>

5.1. Registrierung über Eigenschaften

Spring Boot unterstützt das Konfigurieren der meisten möglichen Federeinstellungen über application.properties . Nachdem Sie die erforderlichen Abhängigkeiten des eingebetteten Servlets zu Ihrer pom.xml hinzugefügt haben, können Sie Ihr eingebettetes Servlet mithilfe mehrerer solcher Konfigurationsoptionen anpassen und konfigurieren:

server.jsp-servlet.class-name=org.apache.jasper.servlet.JspServlet
server.jsp-servlet.registered=true
server.port=8080
server.servlet-path=/----

Oben sind einige Anwendungseinstellungen angegeben, mit denen das __DispatcherServlet__ und die statische Ressourcennutzung konfiguriert werden können. Einstellungen für eingebettete Servlets, SSL-Unterstützung und Sitzungen sind ebenfalls verfügbar.

Es gibt wirklich zu viele Konfigurationsparameter, die Sie hier aufführen können, aber die vollständige Liste finden Sie in der https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html[Spring Boot-Dokumentation].

====  **  5.2. Konfiguration über YAML **

In ähnlicher Weise können wir unseren eingebetteten Servlet-Container mit YAML konfigurieren.

Dies erfordert die Verwendung eines speziellen YAML-Eigenschaftsladers - __YamlPropertySourceLoader__ -, der unsere YAML verfügbar macht und die darin enthaltenen Schlüssel und Werte für die Verwendung in unserer App verfügbar macht.

[source,java,gutter:,true]

YamlPropertySourceLoader sourceLoader = new YamlPropertySourceLoader(); PropertySource<?> yamlProps = sourceLoader.load("yamlProps", resource, null);

====  **  5.3. Programmatische Konfiguration über TomcatEmbeddedServletContainerFactory **

Die programmgesteuerte Konfiguration eines eingebetteten Servlet-Containers ist durch eine untergeordnete Instanz von __EmbeddedServletContainerFactory__ möglich. Sie können beispielsweise die __TomcatEmbeddedServletContainerFactory__ verwenden, um Ihr eingebettetes Tomcat-Servlet zu konfigurieren.

Das __TomcatEmbeddedServletContainerFactory__ umschließt das __org.apache.catalina.startup.Tomcat__-Objekt und stellt zusätzliche Konfigurationsoptionen bereit:

[source,java,gutter:,true]

@Bean public ConfigurableServletWebServerFactory servletContainer() { TomcatServletWebServerFactory tomcatContainerFactory = new TomcatServletWebServerFactory(); return tomcatContainerFactory; }

Dann können wir die zurückgegebene Instanz konfigurieren:

[source,java,gutter:,true]

tomcatContainerFactory.setPort(9000); tomcatContainerFactory.setContextPath("/springboottomcatexample");

Jede dieser Einstellungen kann mit jeder der zuvor beschriebenen Methoden konfigurierbar gemacht werden.

Wir können auch direkt auf das Objekt __org.apache.catalina.startup.Tomcat__ zugreifen und dieses bearbeiten:

[source,java,gutter:,true]

Tomcat tomcat = new Tomcat(); tomcat.setPort(port); tomcat.setContextPath("/springboottomcatexample"); tomcat.start();

===  **  6. Fazit**

In diesem Artikel haben wir verschiedene Möglichkeiten zur Registrierung eines Servlets in einer Java EE- und Spring Boot-Anwendung beschrieben.

Der in diesem Tutorial verwendete Quellcode ist im Projekt https://github.com/eugenp/tutorials/tree/master/spring-boot[Github]verfügbar.