java - parametros - Pasar los parámetros ocultos usando response.sendRedirect()
response sendredirect con parametros (3)
¿Cómo pasaría los parámetros ocultos? Quiero llamar a una página (test.jsp) pero también paso 2 parámetros ocultos, como una publicación.
response.sendRedirect("/content/test.jsp");
Al usar la session
, pasé con éxito un parámetro ( name
) del servlet # 1 al servlet # 2, usando response.sendRedirect
en el servlet # 1. Código del servlet n. ° 1:
protected void doPost(HttpServletRequest request, HttpServletResponse response) {
String name = request.getParameter("name");
String password = request.getParameter("password");
...
request.getSession().setAttribute("name", name);
response.sendRedirect("/todo.do");
En Servlet # 2, no necesita recuperar su name
. Ya está conectado a la sesión. Podría hacer String name = (String) request.getSession().getAttribute("name");
--- pero no necesitas esto.
Si el servlet # 2 llama a un JSP, puede mostrar el name
esta manera en la página web de JSP:
<h1>Welcome ${name}</h1>
En general, no puede enviar una solicitud POST utilizando el método sendRedirect() . Puede usar RequestDispatcher para forward() solicitudes con parámetros dentro de la misma aplicación web, en el mismo contexto.
RequestDispatcher dispatcher = servletContext().getRequestDispatcher("test.jsp");
dispatcher.forward(request, response);
La especificación HTTP establece que todos los redireccionamientos deben tener la forma de un GET (o HEAD). Puede considerar encriptar los parámetros de cadena de consulta si la seguridad es un problema. Otra forma es que puede POSTAR al objetivo al tener un formulario oculto con el método POST y enviarlo con javascript cuando se carga la página.
La respuesta de TheNewIdiot explica con éxito el problema y la razón por la que no puede enviar atributos solicitados a través de un redireccionamiento. Soluciones posibles:
Usando reenvío. Esto permitirá que los atributos de solicitud se pasen a la vista y puede usarlos en forma de
ServletRequest#getAttribute
o utilizando Expression Language y JSTL . Ejemplo corto (reutilizando el código de respuesta de TheNewIdiot).Controlador (su servlet)
request.setAttribute("message", "Hello world"); RequestDispatcher dispatcher = servletContext().getRequestDispatcher(url); dispatcher.forward(request, response);
Ver (su JSP)
Usando scriptlets:
<% out.println(request.getAttribute("message")); %>
Esto es solo para fines informativos . El uso de Scriptlets debe evitarse : ¿cómo evitar el código de Java en los archivos JSP? . A continuación está el ejemplo que usa EL y JSTL.
<c:out value="${message}" />
Si no puede usar el reenvío (porque no le gusta o no lo siente de esa manera o porque debe usar un redireccionamiento), entonces una opción sería guardar un mensaje como un atributo de sesión, luego redireccionar a su vista , recupere el atributo de sesión en su vista y elimínelo de la sesión. Recuerde siempre tener su sesión de usuario con solo datos relevantes. Ejemplo de código
Controlador
//if request is not from HttpServletRequest, you should do a typecast before HttpSession session = request.getSession(false); //save message in session session.setAttribute("helloWorld", "Hello world"); response.sendRedirect("/content/test.jsp");
Ver
Nuevamente, mostrando esto usando scriptlets y luego EL + JSTL:
<% out.println(session.getAttribute("message")); session.removeAttribute("message"); %> <c:out value="${sessionScope.message}" /> <c:remove var="message" scope="session" />