Pular para o conteúdo principal

foward vs include - Uma questão que confunde no Java Web

As funcionalidades das ações forward e include são bem semelhantes e por isso as vezes confunde! Motivado por isso e pela recente necessidade de alguns alunos meus, resolvi postar aqui um breve artigo sobre as principais diferenças entre as duas ações.


O "forward" serve para transferir o controle para outro componente web (servlet/JSP). Você deve lembrar como ele funciona: redireciona seus objetos request e reponse para o recurso que você aponta no getRequestDispatcher.

//Redireciona para A.jsp
RequestDispatcher dispatcher = request.getRequestDispatcher("A.jsp");
dispatcher.forward(request, response);

Por isso ele só pode ser chamado uma vez pelo seu servlet, porque ele delega toda a responsabilidade da requisição para outro servlet ou JSP. Isto também significa que ele só pode ser redirecionado para um servlet/JSP por vez, nada mais!
Se você tentar executar qualquer método após o forward, terá uma exceção!

Já o "include" serve, como o próprio nome diz, para incluir recursos web na sua página atual (Objeto response). É no reponse que ele age principalmente, e também pode ser chamado quantas vezes você quiser.

Ex.:
RequestDispatcher dispatcher = request.getRequestDispatcher("A.jsp");
dispatcher.include(request, response);
dispatcher = request.getRequestDispatcher("B.jsp");
dispatcher.include(request, response);


Isso fará tanto a página A.jsp quanto a B.jsp serem incluídas na sua página de retorno para o usuário (response)!

Lembre-se: A ação include não redireciona, apenas inclui, por isso você pode chama-lá e continuar executando código logo após, porque ainda está no mesmo recurso web - no caso, no teu servlet!
-->

Comentários

Postagens mais visitadas deste blog

Como acessar um iframe e seus elementos via jQuery?

Recentemente tive  um problema no projeto pois sentiu a necessidade de acessar um valor de um input que estava dentro de um iframe. Esse tipo de situação não é tão comum, uma vez que geralmente acessamos os valores do iframe para fora. Para acessar, de dentro de um iframe, um valor externo, utilizamos o seguinte código: $('#idDoElementoExterno', parent.document).val(); Entretanto, nunca tínhamos passado pela situação contrária. Pesquisando um pouco descobrimos uma alternativa, porém em JavaScript. Para ficar melhor o entendimento, vamos simular uma situação aqui. Temos uma página html "A.html" e dentro da mesma existe um iframe que aponta (src) para uma página "B.html": <!-- A.html --> <html> <head> <title>Testando iframe - jQuery</title> <script language="JavaScript"> function exibeValor() { // alert aqui! } </script> </head> <body> <input typ...

"Content is not allowed in prolog" - Entendendo exceção no Seam

Recentemente tive um problema de edição em um arquivo .xhtml utilizando JBoss Seam, Richfaces e afins. A princípio a mensagem de erro não dizia muito a respeito da causa do mesmo: com.sun.facelets.FaceletException: Error Parsing /consulta.xhtml: Error Traced[line: 1] Content is not allowed in prolog. "O conteúdo não é permitido no prólogo". Mas que conteúdo? Em qual prolog? Depois de dar uma pesquisada descobri que o erro acontece em vista de terem sido colocados alguns caraceteres inválidos antes da declaração de documento xml na página xhtml. Em outras palavras, a primeira coisa que deve constar em um documento xml (afins) deve ser: <?xml version="1.0" encoding="utf-8"?> Qualquer coisa antes disso, até mesmo um simples espaço em branco, pode gerar o erro em questão. Por fim, lembre-se de que a declaração de documento xml segue o padrão de encoding definido. Logo temos: <!-- Inc...

Como configurar a flag allow-file-access-from-files no Google Chrome

Se você já tentou desenvolver ou testar alguma aplicação no Google Chrome usando apenas páginas HTML estáticas sem hospedá-las em um servidor local qualquer, provavelmente já passou pelo impasse de não conseguir que seus códigos JavaScript, jQuery ou Ajax funcionem. Vários tipos de implementação enfrentam esse tipo de problema: tentar enviar um request via API Ajax do jQuery, acessar uma página dentro de um iframe/embed , dentre outras. O que acontece é que o Chrome não carrega arquivos localmente por padrão em função de restrições de segurança internas. Essa é uma discussão de muito tempo, mas já temos soluções para solucioná-la. Através da opção de flag --allow-file-access-from-files você consegue forçar o browser a reconhecer esse recurso como antes. Vejamos os passos necessários: Acesse o prompt cmd e acesse o diretório de instalação do seu Chrome (atente que para cada tipo de instalação - usuário ou global - temos um diretório diferente). Ex:  cd C:\Pr...