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