Programaticamente criar, configurar e executar um servidor Tomcat

Programaticamente criar, configurar e executar um servidor Tomcat

1. Visão geral

Neste artigo rápido, vamos criar, configurar e executar programaticamente umTomcat server.

2. Configuração

Antes de começarmos, precisamos configurar nosso projeto Maven adicionando as dependências abaixo ao nossopom.xml:


    
        org.apache.tomcat
        tomcat-catalina
        ${tomcat.version}
    
    
        org.apache.httpcomponents
        httpclient
        ${apache.httpclient}
    
    
        junit
        junit
        ${junit.version}
        test
    

Aqui está umlink to Maven Central com as versões mais recentes das dependências usadas aqui no projeto.

3. Inicializando e configurando o Tomcat

Vamos primeiro falar sobre as etapas necessárias para a inicialização e configuração de um servidor Tomcat.

3.1. Criando Tomcat

Podemos criar uma instância simplesmente fazendo:

Tomcat tomcat = new Tomcat();

Agora que temos o servidor, vamos configurá-lo.

3.2. Configurando o Tomcat

Vamos nos concentrar em como fazer o servidor funcionar, adicionando um servlet e um filtro.

Primeiro, precisamos configurar uma porta, nome de host e umappBase (normalmente aplicativos da web). Para nosso propósito, usaremos o diretório atual:

tomcat.setPort(8080);
tomcat.setHostname("localhost");
String appBase = ".";
tomcat.getHost().setAppBase(appBase);

Em seguida, precisamos definir umdocBase (o diretório raiz de contexto para este aplicativo da web):

File docBase = new File(System.getProperty("java.io.tmpdir"));
Context context = tomcat.addContext("", docBase.getAbsolutePath());

Neste ponto, temos um Tomcat quase funcionando.

Em seguida, vamos adicionar um servlet e um filtro e iniciar o servidor para ver se ele está funcionando.

3.3. Adicionando um Servlet ao Contexto Tomcat

A seguir, adicionaremos um texto simples aoHttpServletResponse.. Este é o texto que será exibido quando acessarmos o mapeamento de URL para este servlet.

Vamos primeiro definir nosso servlet:

public class MyServlet extends HttpServlet {

    @Override
    protected void doGet(
      HttpServletRequest req,
      HttpServletResponse resp) throws IOException {

        resp.setStatus(HttpServletResponse.SC_OK);
        resp.getWriter().write("test");
        resp.getWriter().flush();
        resp.getWriter().close();
    }
}

Agora, adicionamos este servlet ao servidor Tomcat:

Class servletClass = MyServlet.class;
Tomcat.addServlet(
  context, servletClass.getSimpleName(), servletClass.getName());
context.addServletMappingDecoded(
  "/my-servlet/*", servletClass.getSimpleName());

3.4. Adicionando um Filtro ao Contexto Tomcat

Em seguida, definimos um filtro e o adicionamos ao Tomcat:

public class MyFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) {
        // ...
    }

    @Override
    public void doFilter(
      ServletRequest request,
      ServletResponse response,
      FilterChain chain)
      throws IOException, ServletException {

        HttpServletResponse httpResponse = (HttpServletResponse) response;
        httpResponse.addHeader("myHeader", "myHeaderValue");
        chain.doFilter(request, httpResponse);
    }

    @Override
    public void destroy() {
        // ...
    }
}

Adicionar o filtro ao contexto requer um pouco mais de trabalho:

Class filterClass = MyFilter.class;
FilterDef myFilterDef = new FilterDef();
myFilterDef.setFilterClass(filterClass.getName());
myFilterDef.setFilterName(filterClass.getSimpleName());
context.addFilterDef(myFilterDef);

FilterMap myFilterMap = new FilterMap();
myFilterMap.setFilterName(filterClass.getSimpleName());
myFilterMap.addURLPattern("/my-servlet/*");
context.addFilterMap(myFilterMap);

Neste ponto, devemos ter um servlet e um filtro adicionados ao Tomcat.

Tudo o que resta a fazer é iniciá-lo e obter a página "teste" e verificar os logs para ver se o filtro funciona.

4. Iniciando o Tomcat

Esta é uma operação bastante simples e, depois disso, devemos ver o Tomcat executando:

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

Assim que começar, podemos ir parahttp://localhost:8080/my-servlete ver a página de teste:

image

E se olharmos os registros, veremos algo assim:

image

Esses logs mostram que o Tomcat começou a escutar na porta 8080 e também que nosso filtro está funcionando corretamente.

5. Conclusão

Neste tutorial, passamos por uma configuração programática básica de um servidor Tomcat.

Vimos como criar, configurar e executar o servidor, mas também como podemos adicionar um Servlet e um Filtro programaticamente ao contexto do Tomcat.

Como sempre, a implementação completa pode ser encontradaover on Github.