Servlet – método forward() y sendRedirect() con ejemplo

Como aprendimos en los temas anteriores, los Servlets son los programas Java que se ejecutan en el lado del servidor y generan respuestas dinámicas a la solicitud del cliente. La ejecución del Servlet implica los siguientes pasos:

  • El cliente envía la solicitud a través del navegador al servidor web/servidor de aplicaciones.
  • El servidor pasa la solicitud del cliente al servlet respectivo.
  • El servlet procesa la solicitud, genera la respuesta y la envía de regreso al servidor.
  • El servidor pasa la respuesta generada al navegador/cliente.

Ahora, consideremos que tenemos un requisito para llamar a un servlet desde otro servlet sin pasar por la información usando objetos de solicitud y respuesta. Podemos lograr esto de 2 maneras, servlet proporciona

  • método forward() en RequestDispatcher(I).
  • método sendRedirect() en HttpServletResponse(I)

Interfaz de RequestDispatcher

Los servlets proporcionan RequestDispatcher en el paquete javax.servlet . Define un objeto para enviar la solicitud del cliente de un servlet a otro servlet en el mismo servidor. Básicamente, esto se puede usar para recibir el objeto de solicitud del cliente y enviar ese objeto a cualquier otro recurso, como Servlet, JSP, archivo HTML, etc. Podemos obtener el objeto RequestDispatcher usando la siguiente sintaxis:

Java

RequestDispatcher r = req.getRequestDispatcher(String arg);

método adelante()

Este método reenvía una solicitud de un servlet a otro servlet en el mismo servidor. Permite que un servlet realice el procesamiento inicial de una solicitud, obtiene el objeto RequestDispatcher y reenvía la solicitud a otro servlet para generar la respuesta.

Sintaxis de adelante():

Java

// r - requestDispatcher object
r.forward(req, resp);

Cuando reenviamos la solicitud del cliente utilizando el método forward(), el cliente/navegador ni siquiera sabe que la solicitud se está reenviando a otro archivo servlet o archivo JSP o desde qué archivo se generará la respuesta. No habrá ningún cambio en la URL en el navegador.

método enviarRedirect()

Envía una respuesta de redirección temporal al cliente utilizando la URL de ubicación de redirección especificada en el método y borra el búfer. Consideremos un escenario en el que necesitamos redirigir la solicitud de un servlet a otros servlets que se encuentran en otro servidor; en este caso, podemos usar el método sendRedirect() para que el cliente/navegador sepa adónde va la solicitud y adónde va. procesada. 

Sintaxis para usar sendRedirect():

Java

resp.sendRedirect(java.lang.String location)

Tomemos un ejemplo para comprender más acerca de estos dos métodos.

Ejemplo:

Considere un ejemplo simple: tome dos valores enteros del cliente y genere la suma y el promedio de esos dos números. Para demostrar el uso de los métodos forward() y sendRedirect(), realizaremos operaciones de suma en un servlet y enviaremos ese objeto de solicitud a otro servlet para realizar la operación promedio.

Programa 1: Usar el método forward()

Pasos:

  • Cree una página HTML simple para tomar los valores del navegador.
  • Cree el primer servlet para obtener la solicitud y realice una operación de adición.
  • Cree un segundo servlet para realizar la operación promedio y enviar la respuesta.

Paso 1: Cree una página HTML simple para tomar los valores del navegador

Inicio.html

HTML

<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Home Page</title>
</head>
<body>
  
<h3>Enter two numbers to find their Sum and Average</h3>
  
    <form action="add" method="get">
        <!-- Input the first number in x -->
        First Number: <input type="text" name="x">
        <br/>
        <!-- Input the second number in y -->
        Second Number: <input type="text" name="y">
        <br/>
  
        <input type="submit">
    </form>
  
</body>
</html>

Use etiquetas de entrada para tomar los valores del cliente, digamos x, y. Tenemos una etiqueta de formulario que asignará el servlet según el atributo de acción: «agregar» y el método «doGet» en el servlet cuando envíe la página.

Paso 2: Cree el primer servlet para obtener la solicitud y realice una operación adicional

AddNum.java

Java

import java.io.IOException;
  
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
  
@WebServlet("/add")
public class AddNum extends HttpServlet {
  
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  
        // Get the x, y parameters from the request 
        // object and save in num1, num2 variables.
        int num1 = Integer.parseInt(req.getParameter("x"));
        int num2 = Integer.parseInt(req.getParameter("y"));
  
        // Perform addition operation on num1, num2
        // and save the result in add variable.
        int add = num1 + num2;
          
        // Set the add value in 'sum' 
        // attribute of request object
        req.setAttribute("sum", add);
  
        // Get the Request Dispatcher object and pass 
        // the argument to which servlet we need to call - AvgNum.java
        RequestDispatcher reqd = req.getRequestDispatcher("avg");
        
        // Forward the Request Dispatcher object.
        reqd.forward(req, resp);
    }
  
}
  • En este servlet, tomamos los valores de entrada del objeto de solicitud y realizamos la operación de adición.
  • Ahora, para llamar a otro servlet para realizar la operación promedio, necesitamos pasar el valor ‘agregar’ a ese servlet.
  • Entonces, al usar setAttribute, necesitamos establecer el atributo ‘suma’ con el valor ‘agregar’.
  • Finalmente, obtenga el objeto Request Dispatcher y pase el argumento y reenvíe el objeto. En este ejemplo, mencionamos AddNum.java como ‘/add’ y AvgNum.java como ‘/avg’.

Paso 3: Cree un segundo servlet para realizar la operación promedio y enviar la respuesta.

NúmPromedio.java

Java

import java.io.IOException;
import java.io.PrintWriter;
  
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
  
@WebServlet("/avg")
public class AvgNum extends HttpServlet {
  
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  
        // Get the 'sum' attribute value from the request
        int sum = (int) req.getAttribute("sum");
  
        // perform the average operation and 
        // save the result in 'avg' variable.
        float avg = (float) (sum / 2.0);
          
        // Get the PrintWriter object to write 
        // the output in the response to the browser.
        PrintWriter out = resp.getWriter();
        out.println("Sum is: " + sum);
        out.println("Average is: " + avg);
  
    }
  
}
  • En este segundo servlet, obtenga el objeto de solicitud ‘sum’, que configuramos en el primer servlet.
  • Realice la operación promedio y, mediante el uso del objeto PrintWriter, envíe el resultado al cliente en la respuesta.

Ejecución:

  • Ejecute la página Home.html usando ‘Ejecutar como -> Ejecutar en el servidor’ en Eclipse.
  • Ejecute la URL: http://localhost:8081/ServletCall/Home.html, en el navegador para obtener la página de inicio.

Inicio.html

  • Introduzca los valores y haga clic en enviar.

Página de inicio

  • Una vez que se envía la página, la solicitud irá al método ‘doGet’ en el servlet AddNum.java, como mencionamos

HTML

<form action="add" method="get">
  • En el servlet AddNum.java, especificamos el servlet con

Java

@WebServlet("/add")
  • Entonces, la página Home.html se asigna al servlet AddNum.java y envía la solicitud.
  • En AddNum.java, realiza la operación de suma en los 2 valores dados y establece el valor agregado en la solicitud para enviar al otro servlet usando RequestDispatcher.

Java

// Get the Request Dispatcher object and pass the argument
// to which servlet we need to call - AvgNum.java
RequestDispatcher reqd = req.getRequestDispatcher("avg");
// Forward the Request Dispatcher object.
reqd.forward(req, resp);
  • Aquí, estamos pasando el argumento como ‘avg’, por lo que se asigna al servlet AvgNum.java como especificamos con

Java

@WebServlet("/avg")
  • En AvgNum.java, obtendremos el valor ‘suma’ y realizaremos la operación promedio.
  • Entonces, la salida será la siguiente,

Resultado – adelante()

  • Si observa la URL en el navegador, solo muestra el servlet ‘/ agregar’. Por lo tanto, la solicitud de reenvío realizada en el lado del servidor no afecta al lado del cliente.

Programa 2: Uso del método sendRedirect()

Ahora, usaremos el método sendRedirect() en lugar de forward() en el mismo ejemplo.

  • No es necesario cambiar nada en la página Home.html.
  • En el primer servlet, en lugar del método forward(), use el método sendRedirect().
  • En el segundo servlet, obtenga el atributo de la solicitud.

AddNum.java

Java

import java.io.IOException;
  
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
  
@WebServlet("/add")
public class AddNum extends HttpServlet {
  
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  
        // Get the x, y parameters from the request
        // object and save in num1, num2 variables.
        int num1 = Integer.parseInt(req.getParameter("x"));
        int num2 = Integer.parseInt(req.getParameter("y"));
  
        // Perform addition operation on num1, 
        // num2 and save the result in add variable.
        int add = num1 + num2;
          
        // Redirect the response to the
        // other servlet - AvgNum.java
        resp.sendRedirect("avg?sum="+add);
  
    }
  
}
  • Aquí, estamos usando sendRedirect() para enviar la respuesta al otro servlet sin pasar por el valor ‘agregar’.

NúmPromedio.java

Java

import java.io.IOException;
import java.io.PrintWriter;
  
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
  
@WebServlet("/avg")
public class AvgNum extends HttpServlet {
  
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  
        // Get the 'sum' parameter from the request
        int sum = Integer.parseInt(req.getParameter("sum"));
  
        // perform the average operation and
        // save the result in 'avg' variable.
        float avg = (float) (sum / 2.0);
          
        // Get the PrintWriter object to write the
        // output in the response to the browser.
        PrintWriter out = resp.getWriter();
        out.println("Sum is: " + sum);
        out.println("Average is: " + avg);
  
    }
  
}
  • Aquí obtenemos el valor ‘suma’ como parámetro de la solicitud.

Ejecución:

  • Igual que arriba, ejecute el programa ‘Ejecutar en el servidor’.
  • Ejecute la URL, http://localhost:8081/ServletCall/Home.html en el navegador.

Página de inicio

  • Introduzca los valores y haga clic en enviar.

  • Ahora, si observa la URL, podemos ver que la solicitud se redirige a otro servlet con el valor de la suma.
  • La redirección de la solicitud es visible en el lado del navegador.

Conclusión

Cuando se compara con ambas salidas,

usando adelante()

usando enviarRedireccionar()

Podemos ver que solo hay un objeto de solicitud y respuesta al usar el método forward(). Internamente, el método forward() pasará la misma solicitud de un servlet a otro servlet sin saberlo del lado del navegador. Pero al usar el método sendRedirect(), hay dos requests y respuestas, el primer servlet recibe la solicitud del navegador y redirige esa solicitud a otro servlet, por lo que se formará otra solicitud y respuesta en el segundo servlet y esa respuesta será dado al navegador.

Publicación traducida automáticamente

Artículo escrito por yaminitalisetty y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *