Qual é a diferença conceitual entre forward()
e sendRedirect()
?
requestDispatcher - método forward ()
Quando usamos o
forward
método, a solicitação é transferida para outro recurso dentro do mesmo servidor para processamento adicional.No caso de
forward
, o contêiner da Web lida com todo o processamento internamente e o cliente ou o navegador não está envolvido.Quando
forward
é chamado norequestDispatcher
objeto, passamos os objetos de solicitação e resposta, para que nosso objeto de solicitação antigo esteja presente no novo recurso que processará nossa solicitação.Visualmente, não conseguimos ver o endereço encaminhado, é transparente.
Usar o
forward()
método é mais rápido quesendRedirect
.Quando redirecionamos usando forward, e queremos usar os mesmos dados em um novo recurso, podemos usá-lo
request.setAttribute()
porque temos um objeto de solicitação disponível.SendRedirect
No caso de
sendRedirect
, a solicitação é transferida para outro recurso, para um domínio diferente ou para um servidor diferente para processamento adicional.Quando você usa
sendRedirect
, o contêiner transfere a solicitação para o cliente ou navegador, para que a URL fornecida dentro dosendRedirect
método fique visível como uma nova solicitação para o cliente.Em caso de
sendRedirect
chamada, os objetos antigos de solicitação e resposta são perdidos porque são tratados como nova solicitação pelo navegador.Na barra de endereço, podemos ver o novo endereço redirecionado. Não é transparente.
sendRedirect
é mais lento porque é necessária uma ida e volta extra, porque uma solicitação completamente nova é criada e o objeto de solicitação antigo é perdido. São necessárias duas solicitações do navegador.Porém
sendRedirect
, se quisermos usar os mesmos dados para um novo recurso, temos que armazenar os dados na sessão ou repassar a URL.Qual deles é bom?
Depende do cenário para o qual o método é mais útil.
Se você deseja que o controle seja transferido para um novo servidor ou contexto e seja tratado como uma tarefa completamente nova, então prosseguimos
sendRedirect
. Geralmente, um encaminhamento deve ser usado se a operação puder ser repetida com segurança após o recarregamento do navegador da página da web e não afetar o resultado.
No mundo do desenvolvimento da Web, o termo "redirecionamento" é o ato de enviar ao cliente uma resposta HTTP vazia com apenas um Location
cabeçalho que contém o novo URL para o qual o cliente deve enviar uma nova solicitação GET. Então, basicamente:
some.jsp
.Location: other.jsp
cabeçalhoother.jsp
(isso é refletido na barra de endereços do navegador!)other.jsp
.Você pode rastreá-lo com o conjunto de ferramentas de desenvolvedor interno / complementar do navegador da web. Pressione F12 no Chrome / IE9 / Firebug e verifique a seção "Rede" para vê-lo.
Exatamente o acima é alcançado por sendRedirect("other.jsp")
. O RequestDispatcher#forward()
não envia um redirecionamento. Em vez disso, ele usa o conteúdo da página de destino como resposta HTTP.
some.jsp
.other.jsp
.No entanto, como a solicitação HTTP original some.jsp
, a URL na barra de endereços do navegador permanece inalterada. Além disso, qualquer pedido atributos definidos no de trás do controlador some.jsp
estará disponível em other.jsp
. Isso não acontece durante um redirecionamento, porque você está basicamente forçando o cliente a criar uma nova solicitação HTTP other.jsp
, descartando a solicitação original, some.jsp
incluindo todos os seus atributos.
Isso RequestDispatcher
é extremamente útil no paradigma MVC e / ou quando você deseja ocultar JSPs do acesso direto. Você pode colocar JSPs na /WEB-INF
pasta e usar um Servlet
que controla, pré-processa e pós-processa as solicitações. As JSPs na /WEB-INF
pasta não são diretamente acessíveis por URL, mas Servlet
podem acessá-las usando RequestDispatcher#forward()
.
É possível, por exemplo, incluir um arquivo JSP /WEB-INF/login.jsp
e um LoginServlet
mapeado em um url-pattern
de /login
. Quando você invocar http://example.com/context/login
, os servlets doGet()
serão invocados. Você pode fazer qualquer pré- processamento e encaminhar a solicitação como:
request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response);
Quando você envia um formulário, normalmente deseja usar POST
:
<form action="login" method="post">
Dessa forma, os servlets doPost()
serão chamados e você poderá executar qualquer processo de pós- processamento (por exemplo, validação, lógica de negócios, logon no usuário, etc.).
Se houver algum erro, normalmente você deseja encaminhar a solicitação de volta para a mesma página e exibir os erros ao lado dos campos de entrada e assim por diante. Você pode usar o RequestDispatcher
para isso.
Se a POST
for bem-sucedida, você normalmente deseja redirecionar a solicitação, para que a solicitação não seja reenviada quando o usuário atualizar a solicitação (por exemplo, pressionando F5 ou navegando de volta no histórico).
User user = userDAO.find(username, password);
if (user != null) {
request.getSession().setAttribute("user", user); // Login user.
response.sendRedirect("home"); // Redirects to http://example.com/context/home after succesful login.
} else {
request.setAttribute("error", "Unknown login, please try again."); // Set error.
request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response); // Forward to same page so that you can display error.
}
Um redirecionamento, portanto, instrui o cliente a disparar uma nova GET
solicitação no URL fornecido. Atualizar a solicitação apenas atualizaria a solicitação redirecionada e não a solicitação inicial. Isso evitará "envios duplos", confusão e experiências ruins do usuário. Isso também é chamado de POST-Redirect-GET
padrão .
response.sendRedirect("..")
para a página index.jsp do site. Mas isso perde os arquivos css e algum texto da página jsp, levando ao carregamento parcial da página. Mas quando eu faço a página de boas-vindas do site ser index.jsp, tudo funciona bem e o carregamento da página é concluído. o que há de errado com o redirecionamento?A
RequestDispatcher
interface permite que você faça um encaminhamento / inclusão do servidor, enquantosendRedirect()
o redirecionamento do lado do cliente. Em um redirecionamento do lado do cliente, o servidor enviará de volta um código de status HTTP de302
(redirecionamento temporário) que faz com que o navegador da Web emita uma novaGET
solicitação HTTP para o conteúdo no local redirecionado. Por outro lado, ao usar aRequestDispatcher
interface, a inclusão / encaminhamento para o novo recurso é tratada inteiramente no lado do servidor.fonte
forward
, na verdade , não é redirecionado.fonte
Qualquer um desses métodos pode ser "melhor", ou seja, mais adequado, dependendo do que você deseja fazer.
Um redirecionamento do servidor é mais rápido na medida em que você obtém os dados de uma página diferente sem fazer uma ida e volta ao navegador. Mas o URL visto no navegador ainda é o endereço original, então você está criando um pouco de inconsistência lá.
Um redirecionamento do lado do cliente é mais versátil, pois pode enviar para um servidor completamente diferente ou alterar o protocolo (por exemplo, de HTTP para HTTPS), ou ambos. E o navegador está ciente da nova URL. Mas é preciso um retorno extra entre servidor e cliente.
fonte
SendRedirect()
irá pesquisar o conteúdo entre os servidores. é lento porque precisa intimizar o navegador enviando a URL do conteúdo. o navegador criará uma nova solicitação para o conteúdo no mesmo servidor ou em outro.RquestDispatcher
é para pesquisar o conteúdo dentro do servidor, eu acho. é o processo do lado do servidor e é mais rápido comparar com oSendRedirect()
método. mas o fato é que ele não intimidará o navegador em que servidor está pesquisando a data ou o conteúdo necessário, nem solicitará que o navegador altere o URL na guia URL. portanto, causa pouco inconveniente para o usuário.fonte
Tecnicamente, o redirecionamento deve ser usado se precisarmos transferir o controle para um domínio diferente ou para conseguir a separação de tarefas.
Por exemplo, no aplicativo de pagamento, fazemos o PaymentProcess primeiro e, em seguida, redirecionamos para displayPaymentInfo. Se o cliente atualizar o navegador, apenas displayPaymentInfo será executado novamente e PaymentProcess não será repetido. Porém, se avançarmos nesse cenário, PaymentProcess e displayPaymentInfo serão reexecutados sequencialmente, o que pode resultar em dados incosistentes.
Para outros cenários, o encaminhamento é eficiente, pois é mais rápido que o sendRedirect
fonte
O Request Dispatcher é uma interface usada para despachar a solicitação ou resposta do recurso da Web para outro recurso da Web. Ele contém principalmente dois métodos.
request.forward(req,res)
: Esse método é usado para encaminhar a solicitação de um recurso da web para outro recurso. ou seja, de um servlet para outro servlet ou de um aplicativo da web para outro aplicativo da web.response.include(req,res)
: Este método é usado para incluir a resposta de um servlet para outro servletNOTA: Ao usar o Request Dispatcher, podemos encaminhar ou incluir a solicitação ou respostas no mesmo servidor.
request.sendRedirect()
: Ao usar isso, podemos encaminhar ou incluir a solicitação ou respostas nos diferentes servidores. Nisso, o cliente recebe uma sugestão enquanto redireciona a página, mas no processo acima, o cliente não recebe uma notificação.fonte
Simplesmente diferença entre
Forward(ServletRequest request, ServletResponse response)
esendRedirect(String url)
éfrente():
forward()
método é executado no lado do servidor.forward ()
método é fornecido pelo contêiner do servlet.forward()
método é mais rápido que osendRedirect()
método.RequestDispatcher
interface.sendRedirect ():
fonte