Рубрики
Без рубрики

Как зарегистрировать сервлет в Java

Практическое руководство по регистрации сервлетов в Jakarta EE и Spring Boot.

Автор оригинала: baeldung.

1. введение

В этой статье будет представлен обзор того, как зарегистрировать сервлет в Jakarta EE и Spring Boot. В частности, мы рассмотрим два способа регистрации сервлета Java в Jakarta EE — один с помощью web.xml файл, а другой с использованием аннотаций. Затем мы зарегистрируем сервлеты в Spring Boot, используя конфигурацию XML, конфигурацию Java и настраиваемые свойства.

Большую вводную статью о сервлетах можно найти здесь .

2. Регистрация сервлетов в Jakarta EE

Давайте рассмотрим два способа регистрации сервлета в Jakarta EE. Во-первых, мы можем зарегистрировать сервлет через web.xml . В качестве альтернативы мы можем использовать аннотацию Jakarta EE @WebServlet .

2.1. Через web.xml

Наиболее распространенным способом регистрации сервлета в приложении Jakarta EE является добавление его в web.xml файл:


    index.html
    index.htm
    index.jsp


    Example
    com.baeldung.Example


    Example
    /Example

Как вы можете видеть, это включает в себя два шага: (1) добавление нашего сервлета в тег servlet , а также указание исходного пути к классу, в котором находится сервлет, и (2) указание URL-пути, по которому сервлет будет отображаться в теге url-pattern .

The Jakarta EE web.xml файл обычно находится в WebContent/WEB-INF .

2.2. С помощью аннотаций

Теперь давайте зарегистрируем наш сервлет с помощью аннотации @WebServlet в нашем пользовательском классе сервлетов. Это устраняет необходимость в сопоставлениях сервлетов в server.xml и регистрация сервлета в 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("

Hello World!

"); } }

Приведенный выше код демонстрирует, как добавить эту аннотацию непосредственно в сервлет. Сервлет по-прежнему будет доступен по тому же URL-адресу, что и раньше.

3. Регистрация сервлетов в Spring Boot

Теперь, когда мы показали, как зарегистрировать сервлеты в Jakarta EE, давайте рассмотрим несколько способов регистрации сервлетов в приложении Spring Boot.

3.1. Программная регистрация

Spring Boot поддерживает 100% программную конфигурацию веб-приложения.

Сначала мы реализуем интерфейс WebApplicationInitializer , затем реализуем интерфейс WebMvcConfigurer , который позволяет переопределять предустановленные значения по умолчанию вместо необходимости указывать каждый конкретный параметр конфигурации,экономя ваше время и позволяя вам работать с несколькими проверенными и верными настройками из коробки.

Давайте рассмотрим пример WebApplicationInitializer реализация:

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("/");
     }
}

Далее давайте реализуем интерфейс WebMvcConfigurer :

@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());
    }
}

Выше мы явно указываем некоторые настройки по умолчанию для сервлетов JSP, чтобы поддерживать .jsp представления и статическое обслуживание ресурсов.

3.2. Конфигурация XML

Другой способ настройки и регистрации сервлетов в Spring Boot-это web.xml :


    dispatcher
    org.springframework.web.servlet.DispatcherServlet
    
        contextConfigLocation
        /WEB-INF/spring/dispatcher.xml
    
    1



    dispatcher
    /

В web.xml используется для указания конфигурации в Spring аналогично конфигурации, найденной в Jakarta EE. Выше вы можете увидеть, как мы указываем еще несколько параметров с помощью атрибутов под тегом servlet .

Здесь мы используем другой XML для завершения конфигурации:


    
    

    
        
        
    

Помните, что ваша весна web.xml обычно будет жить в src/main/webapp/WEB-INF .

3.3. Объединение XML и программной регистрации

Давайте смешаем подход к конфигурации XML с программной конфигурацией Spring:

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("/");
}

Давайте также настроим сервлет диспетчера:



    
    

3.4. Регистрация по Bean

Мы также можем программно настроить и зарегистрировать наши сервлеты с помощью ServletRegistrationBean . Ниже мы сделаем это для того, чтобы зарегистрировать HttpServlet (который реализует javax.servlet.Сервлет интерфейс):

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

Основное преимущество этого подхода заключается в том, что он позволяет добавлять в приложение Spring как несколько сервлетов, так и различные типы сервлетов.

Вместо того, чтобы просто использовать DispatcherServlet, который является более конкретным видом HttpServlet и наиболее распространенным видом, используемым в WebApplicationInitializer программный подход к конфигурации, который мы рассмотрели в разделе 3.1, мы будем использовать более простой HttpServlet экземпляр подкласса, который предоставляет четыре основных HttpRequest работает с помощью четырех функций: doGet() , doPost() , doPut () и doDelete () , как в Jakarta EE.

Помните, что HttpServlet-это абстрактный класс (поэтому он не может быть создан). Однако мы можем легко создать пользовательское расширение:

public class CustomServlet extends HttpServlet{
    ...
}

4. Регистрация Сервлетов Со Свойствами

Другим, хотя и необычным способом настройки и регистрации сервлетов является использование файла пользовательских свойств, загруженного в приложение через PropertyLoader, PropertySource, или PropertySources объект экземпляра .

Это обеспечивает промежуточный вид конфигурации и возможность в противном случае настроить application.properties , которые обеспечивают небольшую прямую конфигурацию для не встроенных сервлетов.

4.1. Подход к свойствам системы

Мы можем добавить некоторые пользовательские настройки в наш файл application.properties или другой файл свойств. Давайте добавим несколько настроек для настройки нашего DispatcherServlet :

servlet.name=dispatcherExample
servlet.mapping=/dispatcherExampleURL

Давайте загрузим наши пользовательские свойства в наше приложение:

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

И теперь мы можем получить доступ к этим свойствам через:

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

4.2. Подход к Пользовательским свойствам

Давайте начнем с файла custom.properties :

servlet.name=dispatcherExample
servlet.mapping=/dispatcherExampleURL

Затем мы можем использовать обычный загрузчик свойств:

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;
}

И теперь мы можем добавить эти пользовательские свойства в качестве констант в нашу реализацию WebApplicationInitializer :

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");

Затем мы можем использовать их, например, для настройки сервлета диспетчера:

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

Преимущество этого подхода заключается в отсутствии обслуживания .xml , но с простыми в изменении настройками конфигурации, которые не требуют повторного развертывания кодовой базы.

4.3. Подход к Источнику Свойств

Более быстрый способ выполнить вышеизложенное-использовать источник свойств Spring , который позволяет получить доступ к файлу конфигурации и загрузить его.

PropertyResolver – это интерфейс, реализованный в настраиваемой среде, который делает свойства приложения доступными при запуске и инициализации сервлета:

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

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

Выше мы автоматически подключаем зависимость в класс и указываем местоположение нашего файла пользовательских свойств. Затем мы можем извлечь наше основное свойство, вызвав функцию getProperty () , передав строковое значение.

4.4. Программный Подход К Источнику Собственности

Мы можем объединить приведенный выше подход (который включает в себя выборку значений свойств) с приведенным ниже подходом (который позволяет нам программно указывать эти значения):

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

Мы создали карту, связывающую ключ со значением, а затем добавляем эту карту в Источники свойств включение вызова по мере необходимости.

5. Регистрация Встроенных Сервлетов

Наконец, мы также рассмотрим базовую конфигурацию и регистрацию встроенных сервлетов в Spring Boot.

Встроенный сервлет обеспечивает полную функциональность веб-контейнера (Tomcat, Jetty и т. Д.) Без необходимости установки или обслуживания веб-контейнера отдельно .

Вы можете добавить необходимые зависимости и конфигурацию для простого развертывания live server везде, где такая функциональность поддерживается безболезненно, компактно и быстро.

Мы только рассмотрим, как это сделать, но тот же подход может быть применен к причалу и альтернативам.

Давайте определим зависимость для встроенного веб-контейнера Tomcat 8 в pom.xml :


    org.apache.tomcat.embed
     tomcat-embed-core
     8.5.11

Теперь давайте добавим теги, необходимые для успешного добавления Tomcat в .war , созданный Maven во время сборки:


    embeddedTomcatExample
    
        
            org.codehaus.mojo
            appassembler-maven-plugin
            2.0.0
            
                target
                
                    
                        launch.Main
                        webapp
                    
            
            
            
                
                    package
                    
                        assemble
                    
                
            
        
    

Если вы используете Spring Boot, вы можете вместо этого добавить зависимость Spring spring-boot-starter-tomcat в свой pom.xml :


    org.springframework.boot
    spring-boot-starter-tomcat
    provided

5.1. Регистрация Через Свойства

Spring Boot поддерживает настройку большинства возможных параметров Spring через application.properties . После добавления необходимых встроенных зависимостей сервлета в pom.xml , вы можете настроить и настроить встроенный сервлет, используя несколько таких параметров конфигурации:

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

Выше приведены некоторые параметры приложения, которые можно использовать для настройки DispatcherServlet и статического совместного использования ресурсов. Также доступны настройки для встроенных сервлетов, поддержки SSL и сеансов.

Здесь действительно слишком много параметров конфигурации, чтобы перечислять их здесь, но вы можете увидеть полный список в документации Spring Boot .

5.2. Настройка Через YAML

Аналогично, мы можем настроить наш встроенный контейнер сервлетов с помощью YAML. Это требует использования специализированного загрузчика свойств YAML — YamlPropertySourceLoader , который предоставляет наш YAML и делает ключи и значения в нем доступными для использования в нашем приложении.

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

5.3. Программная Конфигурация Через TomcatEmbeddedServletContainerFactory

Программная конфигурация встроенного контейнера сервлетов возможна через подклассный экземпляр EmbeddedServletContainerFactory . Например, вы можете использовать TomcatEmbeddedServletContainerFactory для настройки встроенного сервлета Tomcat.

TomcatEmbeddedServletContainerFactory обертывает org.apache.catalina.startup.Tomcat объект, предоставляющий дополнительные параметры конфигурации:

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

Затем мы можем настроить возвращаемый экземпляр:

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

Каждую из этих конкретных настроек можно настроить с помощью любого из ранее описанных методов.

Мы также можем напрямую обращаться к org.apache.catalina.startup и управлять им.Tomcat объект:

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

6. Заключение

В этой статье мы рассмотрели несколько способов регистрации сервлета в приложении Jakarta EE и Spring Boot.

Исходный код, используемый в этом учебнике, доступен в проекте Github .