web-dev-qa-db-de.com

Versteckte Parameter mit response.sendRedirect () übergeben

Wie würde ich versteckte Parameter übergeben? Ich möchte eine Seite aufrufen (test.jsp), aber auch 2 versteckte Parameter wie einen Beitrag übergeben.

response.sendRedirect("/content/test.jsp");
25
Ashish Anand

TheNewIdiots Antwort erklärt erfolgreich das Problem und den Grund, warum Sie in einer Anforderung keine Attribute über eine Weiterleitung senden können. Mögliche Lösungen:

  1. Weiterleitung verwenden Dadurch können Anforderungsattribute an die Ansicht übergeben werden, und Sie können sie in Form von ServletRequest#getAttribute oder mithilfe von Expression Language und JSTL verwenden. Kurzes Beispiel (Wiederverwendung des Antwort-Codes von TheNewIdiot).

    Controller (Ihr Servlet)

    request.setAttribute("message", "Hello world");
    RequestDispatcher dispatcher = servletContext().getRequestDispatcher(url);
    dispatcher.forward(request, response);
    

    View (Ihre JSP)

    Scriptlets verwenden:

    <%
        out.println(request.getAttribute("message"));
    %>
    

    Dies ist nur für Informationszwecke. Verwendung von Scriptlets muss vermieden werden: Wie vermeide ich Java-Code in JSP-Dateien? . Unten sehen Sie das Beispiel mit EL und JSTL.

    <c:out value="${message}" />
    
  2. Wenn Sie die Weiterleitung nicht verwenden können (weil Ihnen dies nicht gefällt oder Sie es nicht so empfinden oder eine Umleitung verwenden müssen), würde eine Option eine Nachricht als Sitzungsattribut speichern und dann zu Ihrer Ansicht umleiten , stellen Sie das Sitzungsattribut in Ihrer Ansicht wieder her und entfernen Sie es aus der Sitzung. Denken Sie daran, Ihre Benutzersitzung immer nur mit relevanten Daten zu haben. Code-Beispiel

    Controller

    //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");
    

    Aussicht

    Zeigt dies erneut mit Skriptlets und dann mit EL + JSTL:

    <%
        out.println(session.getAttribute("message"));
        session.removeAttribute("message");
    %>
    
    <c:out value="${sessionScope.message}" />
    <c:remove var="message" scope="session" />
    
44
Luiggi Mendoza

Im Allgemeinen können Sie keine POST - Anforderung mit der Methode sendRedirect () senden. Sie können RequestDispatcher für forward () - Anforderungen mit Parametern innerhalb derselben Webanwendung im selben Kontext verwenden.

RequestDispatcher dispatcher = servletContext().getRequestDispatcher("test.jsp");
dispatcher.forward(request, response);

Die HTTP-Spezifikation gibt an, dass alle Weiterleitungen in Form eines GET (oder HEAD) vorliegen müssen. Sie können erwägen, Ihre Abfragezeichenfolgeparameter zu verschlüsseln, wenn Sicherheit ein Problem darstellt. .__ Eine andere Möglichkeit ist, dass Sie POST zum Ziel können, indem Sie ein verstecktes Formular mit der Methode POST haben und es mit Javascript senden, wenn die Seite geladen wird.

4
NINCOMPOOP

Mit session habe ich erfolgreich einen Parameter (name) von Servlet # 1 an Servlet # 2 übergeben, wobei response.sendRedirect in Servlet # 1 verwendet wurde. Servlet # 1-Code:

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");

In Servlet # 2 müssen Sie name nicht zurückbekommen. Es ist bereits mit der Sitzung verbunden. Sie könnten String name = (String) request.getSession().getAttribute("name"); --- tun, aber Sie brauchen das nicht.

Wenn Servlet # 2 eine JSP aufruft, können Sie name auf der JSP-Webseite folgendermaßen anzeigen:

<h1>Welcome ${name}</h1>

1
Raymond Gan