Quais são as diferenças entre Servlet 2.5 e 3?

91

Estou lançando o código J2EE que segue o Servlet 2.5 e estou me perguntando quais são as principais diferenças entre 2.5 e 3. Dicas para documentos oficiais da Sun e experiências pessoais são mais apreciadas.

Se eu não deveria estar me preocupando com o 3 por enquanto, apenas diga. Obrigado!

Max A.
fonte
2
+1 Apenas esperando por respostas :)
ATorras

Respostas:

149

ATUALIZAR

Apenas como uma atualização e para ser mais explícito, essas são as principais diferenças entre os servlets 2.5 e 3 (não estou tentando ser exaustivo, estou apenas mencionando as partes mais interessantes):

Anotações para declarar servlets, filtros e ouvintes (facilidade de desenvolvimento)

Em servlets 2.5, para declarar um servlet com um parâmetro init, você precisa adicioná-lo ao web.xml :

<servlet>
    <servlet-name>myServlet</servlet-name>
    <servlet-class>my.server.side.stuff.MyAwesomeServlet</servlet-class>
    <init-param>
        <param-name>configFile</param-name>
        <param-value>config.xml</param-value>
    </init-param>
</servlet>

<servlet-mapping>
    <servlet-name>myServlet</servlet-name>
    <url-pattern>/path/to/my/servlet</url-pattern>
</servlet-mapping>

Nos servlets 3, web.xml é opcional e você pode usar anotações em vez de XML. O mesmo exemplo:

@WebServlet(name="myServlet",
    urlPatterns={"/path/to/my/servlet"},
    initParams={@InitParam(name="configFile", value="config.xml")})
public class MyAwesomeServlet extends HttpServlet { ... }

Para filtros, você precisa adicionar isso em web.xml em servlets 2.5:

<filter>
    <filter-name>myFilter</filter-name>
    <filter-class>my.server.side.stuff.MyAwesomeServlet</filter-class>
</filter>
<filter-mapping>
    <filter-name>myFilter</filter-name>
    <url-pattern>/path/to/my/filter</url-pattern>
</filter-mapping>

Equivalente usando anotações em servlets 3:

@ServletFilter(name="myFilter", urlPatterns={"/path/to/my/filter"})
public class MyAwesomeFilter implements Filter { ... }

Para um ouvinte (neste caso, um ServletContextListener), nos servlets 2.5:

<listener>
    <listener-class>my.server.side.stuff.MyAwesomeListener</listener-class>
</listener>

O mesmo usando anotações:

@WebServletContextListener
public class MyAwesomeListener implements ServletContextListener { ... }

Modularização de web.xml (plugabilidade)

  • Nos servlets 2.5, há apenas um arquivo web.xml monolítico .
  • Nos servlets 3, cada jar "carregável" pode ter um web-fragment.xml em seu diretório META-INF especificando servlets, filtros, etc. Isso permite que bibliotecas e estruturas especifiquem seus próprios servlets ou outros objetos.

Registro dinâmico de servlets, filtros e ouvintes no momento da inicialização do contexto (plugabilidade)

Em servlets 3, um ServletContextListenerpode adicionar dinamicamente servlets, filtros e ouvintes usando os seguintes métodos adicionais para SevletContext: addServlet(), addFilter()eaddListener()

Suporte assíncrono

Exemplo: digamos que algum contêiner de servlet tenha cinco threads em seu pool de threads e haja um processo demorado a ser executado por solicitação (como uma consulta SQL complexa).

  • Com servlets 2,5 este servlet container iria ficar sem threads disponíveis se ele recebe cinco pedidos ao mesmo tempo e os cinco tópicos disponíveis começar a fazer o processo, pois os fios não retornaria até service()(ou doGet(), doPost()etc.) é executado do início para terminar e retorna uma resposta.

  • Com os servlets 3.0, esse processo longo pode ser delegado a outro encadeamento e terminar service()antes de enviar a resposta (a resposta agora será enviada pelo encadeamento mais recente). Desta forma, o tópico fica livre para receber novas respostas.

Um exemplo de suporte assíncrono:

Servlets 2.5:

public class MyAwesomeServlet extends HttpSerlvet {

    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) {
        // ...

        runSlowProcess();
        // no async support, thread will be free when runSlowProcess() and
        // doGet finish

        // ...
    }

}

Servlets 3:

@WebServlet(name="myServlet",
             urlPatterns={"/mySlowProcess"},
             asyncSupported=true) // asyncSupported MUST be specified for
                                  // servlets that support asynchronous
                                  // processing
public class MyAwesomeServlet extends HttpSerlvet {

    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) {


        // an AsyncContext is created, now the response will be completed
        // not when doGet finalizes its execution, but when
        // myAsyncContext.complete() is called.
        AsyncContext myAsyncContext = request.startAsync(request, response);

        // ...

        // myAsyncContext is passed to another thread
        delegateExecutionToProcessingThread(myAsyncContext);

        // done, now this thread is free to serve another request
    }

}

// ... and somewhere in another part of the code:

public class MyProcessingObject {

    public void doSlowProcess() {

        // ...

        runSlowProcess();
        myAsyncContext.complete(); // request is now completed.

        // ...

    }

}

A interface AsyncContexttambém possui métodos para obter o objeto de solicitação, objeto de resposta e adicionar ouvintes para notificá-los quando um processo foi concluído.

Login e logout programáticos (melhorias de segurança)

Nos servlets 3, a interface HttpServletRequestfoi adicionada a dois novos métodos: login(username, password)e logout().

Para obter mais detalhes, dê uma olhada na API Java EE 6 .

Morgano
fonte
3
Vale ressaltar que Servlet 3.0 foi lançado em dezembro de 2009. A pergunta e a resposta aceita atualmente são anteriores a essas.
eis
1
@ServletFilter@WebFiltere @WebServletContextListener@WebListenernas especificações oficiais AFAICT.
lapo de
21

O Servlet 3.0 ainda não foi lançado, mas parece que está muito próximo. As mudanças mais importantes no 3.0 são: Pluggability, Facilidade de desenvolvimento, Async Servlet, Segurança. Se isso é importante ou não para você, é impossível dizer.

O mais significativo deles é provavelmente o suporte para Servlets assíncronos. Aqui está um artigo que descreve isso em detalhes. A especificação completa pode ser baixada aqui .

Dónal
fonte
Puta merda, isso é ótimo. O material assíncrono parece incrível, obrigado pela informação. Acabei de codificar algo muito semelhante a isso.
Max A.
@adi foi lançado em dezembro de 2009 ( jcp.org/aboutJava/communityprocess/final/jsr315 )
mauhiz
4
ATUALIZAÇÃO Especificação do Servlet 3.1 lançada 2013-05. Veja o que há de novo .
Basil Bourque
13

Como Don mencionou, as principais áreas de melhorias e adições são:

  • Pluggability (modularização de web.xml)
  • Facilidade de desenvolvimento (anotações, genéricos, convenção sobre configuração)
  • Suporte a servlet assíncrono (para programação estilo comet, proxy web assíncrono, serviços web assíncronos)
  • Aprimoramentos de segurança (login / logout programático)
  • Outros (HttpOnly Cookie, Session tracking, EJB in WAR file)

Confira a apresentação do Javaone 2008 " Java Servlet 3.0 API: Novidades e empolgantes " para obter detalhes.

Pascal Thivent
fonte