doGet und doPost in Servlets

Lesezeit: 10 Minuten

doGet und doPost in Servlets
delo

Ich habe eine HTML-Seite entwickelt, die Informationen an ein Servlet sendet. Im Servlet verwende ich die Methoden doGet() und doPost():

public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException  {

     String id = req.getParameter("realname");
     String password = req.getParameter("mypassword");
}

public void doPost(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {

    String id = req.getParameter("realname");
    String password = req.getParameter("mypassword");
}

Im HTML-Seitencode, der das Servlet aufruft, steht:

<form action="identification" method="post" enctype="multipart/form-data">
    User Name: <input type="text" name="realname">
    Password: <input type="password" name="mypassword">
    <input type="submit" value="Identification">
</form> 

Wenn ich benutze method = "get" Im Servlet erhalte ich den Wert von ID und Passwort, jedoch bei der Verwendung method = "post"ID und Passwort sind auf gesetzt null. Warum bekomme ich die Werte in diesem Fall nicht?

Eine andere Sache, die ich gerne wissen würde, ist, wie die vom Servlet generierten oder validierten Daten verwendet werden. Wenn beispielsweise das oben gezeigte Servlet den Benutzer authentifiziert, möchte ich die Benutzer-ID in meiner HTML-Seite drucken. Ich sollte in der Lage sein, die Zeichenfolge „id“ als Antwort zu senden und diese Informationen in meiner HTML-Seite zu verwenden. Ist es möglich?

  • Wie verwenden Sie die Post-Methode in HTML?

    – Igor Artamonow

    28. Februar 2010 um 1:08 Uhr

  • Und außerdem, wozu brauchst du so seltsame Schleifen über Parameternamen?

    – Igor Artamonow

    28. Februar 2010 um 1:08 Uhr

  • Haben Sie versucht, “enctype=multipart/form-data” zu entfernen? Ich vermute, das ist dein Problem.

    – Jack Leow

    28. Februar 2010 um 14:14 Uhr

  • Das war’s. Warum funktioniert das Posten nicht, wenn dies vorhanden ist? Danke für Ihre Hilfe!

    – dedalo

    28. Februar 2010 um 15:08 Uhr

doGet und doPost in Servlets
BalusC

Einführung

Du solltest benutzen doGet() wenn Sie abfangen möchten HTTP-GET-Anforderungen. Du solltest benutzen doPost() wenn Sie abfangen möchten HTTP-POST-Anforderungen. Das ist alles. Portieren Sie nicht das eine zum anderen oder umgekehrt (wie in der unglücklichen automatisch generierten Datei von Netbeans processRequest() Methode). Dies ergibt keinen absoluten Sinn.

BEKOMMEN

Normalerweise sind HTTP GET-Anforderungen idempotent. Das heißt, Sie erhalten jedes Mal genau das gleiche Ergebnis, wenn Sie die Anfrage ausführen (Autorisierung/Authentifizierung und die zeitkritische Natur der Seite – Suchergebnisse, letzte Nachrichten usw. – werden nicht berücksichtigt). Wir können über eine lesezeichenfähige Anfrage sprechen. Das Klicken auf einen Link, das Klicken auf ein Lesezeichen, das Eingeben einer Roh-URL in die Adressleiste des Browsers usw. löst eine HTTP-GET-Anforderung aus. Wenn ein Servlet auf der fraglichen URL lauscht, dann ist es doGet() Methode aufgerufen wird. Es ist normalerweise daran gewöhnt Vorverarbeitung eine Anfrage. Das heißt, einige geschäftliche Dinge zu erledigen, bevor die HTML-Ausgabe einer JSP präsentiert wird, wie z. B. das Sammeln von Daten zur Anzeige in einer Tabelle.

@WebServlet("/products")
public class ProductsServlet extends HttpServlet {

    @EJB
    private ProductService productService;

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        List<Product> products = productService.list();
        request.setAttribute("products", products); // Will be available as ${products} in JSP
        request.getRequestDispatcher("/WEB-INF/products.jsp").forward(request, response);
    }

}

Beachten Sie, dass die JSP-Datei explizit eingefügt wird /WEB-INF Ordner, um zu verhindern, dass Endbenutzer direkt darauf zugreifen können, ohne das Vorverarbeitungs-Servlet aufzurufen (und so am Ende verwirrt werden, wenn sie eine leere Tabelle sehen).

<table>
    <c:forEach items="${products}" var="product">
        <tr>
            <td>${product.name}</td>
            <td><a href="product?id=${product.id}">detail</a></td>
        </tr>
    </c:forEach>
</table>

Auch Details anzeigen/bearbeiten, wie in der letzten Spalte oben gezeigt, sind normalerweise idempotent.

@WebServlet("/product")
public class ProductServlet extends HttpServlet {

    @EJB
    private ProductService productService;

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Product product = productService.find(request.getParameter("id"));
        request.setAttribute("product", product); // Will be available as ${product} in JSP
        request.getRequestDispatcher("/WEB-INF/product.jsp").forward(request, response);
    }

}
<dl>
    <dt>ID</dt>
    <dd>${product.id}</dd>
    <dt>Name</dt>
    <dd>${product.name}</dd>
    <dt>Description</dt>
    <dd>${product.description}</dd>
    <dt>Price</dt>
    <dd>${product.price}</dd>
    <dt>Image</dt>
    <dd><img src="productImage?id=${product.id}" /></dd>
</dl>

POST

HTTP-POST-Anforderungen sind nicht idempotent. Wenn der Endbenutzer zuvor ein POST-Formular für eine URL gesendet hat, die keine Umleitung durchgeführt hat, ist die URL nicht unbedingt lesezeichenfähig. Die übermittelten Formulardaten spiegeln sich nicht in der URL wider. Das Kopieren der URL in ein neues Browserfenster/eine neue Registerkarte führt möglicherweise nicht unbedingt zu genau demselben Ergebnis wie nach dem Absenden des Formulars. Eine solche URL ist dann nicht lesezeichenfähig. Wenn ein Servlet auf der fraglichen URL lauscht, dann ist es doPost() wird angerufen werden. Es ist normalerweise daran gewöhnt Nachbearbeitung eine Anfrage. Das heißt, Daten aus einem übermittelten HTML-Formular zu sammeln und einige geschäftliche Dinge damit zu erledigen (Konvertierung, Validierung, Speichern in DB usw.). Schließlich wird das Ergebnis normalerweise als HTML von der weitergeleiteten JSP-Seite präsentiert.

<form action="login" method="post">
    <input type="text" name="username">
    <input type="password" name="password">
    <input type="submit" value="login">
    <span class="error">${error}</span>
</form>

…die in Kombination mit diesem Stück Servlet verwendet werden kann:

@WebServlet("/login")
public class LoginServlet extends HttpServlet {

    @EJB
    private UserService userService;

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        User user = userService.find(username, password);

        if (user != null) {
            request.getSession().setAttribute("user", user);
            response.sendRedirect("home");
        }
        else {
            request.setAttribute("error", "Unknown user, please try again");
            request.getRequestDispatcher("/login.jsp").forward(request, response);
        }
    }

}

Sehen Sie, wenn die User in DB gefunden wird (dh Benutzername und Passwort sind gültig), dann die User wird in den Sitzungsbereich versetzt (d. h. “eingeloggt”) und das Servlet wird auf eine Hauptseite umgeleitet (dieses Beispiel geht zu http://example.com/contextname/home), andernfalls wird eine Fehlermeldung gesetzt und die Anfrage an dieselbe JSP-Seite zurückgeleitet, damit die Nachricht von angezeigt wird ${error}.

Sie können die ggf. auch “ausblenden”. login.jsp in /WEB-INF/login.jsp sodass die Benutzer nur über das Servlet darauf zugreifen können. Dadurch bleibt die URL sauber http://example.com/contextname/login. Alles, was Sie tun müssen, ist, eine hinzuzufügen doGet() an das Servlet wie folgt:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response);
}

(und aktualisieren Sie dieselbe Zeile in doPost() entsprechend)

Allerdings bin ich mir nicht sicher, ob es nur herumspielt und im Dunkeln schießt, aber der Code, den Sie gepostet haben, sieht nicht gut aus (z compareTo() anstatt equals() und in den Parameternamen zu graben, anstatt nur zu verwenden getParameter() und das id und password scheint als Servlet-Instanzvariablen deklariert zu sein – was NICHT threadsicher ist). Daher würde ich dringend empfehlen, etwas mehr über die grundlegende Java SE-API mit dem zu lernen Oracle-Tutorials (siehe Kapitel “Trails zu den Grundlagen”) und wie man JSP/Servlets richtig verwendet diese Tutorials.

Siehe auch:

  • Unsere Servlets-Wiki-Seite
  • Java EE Webentwicklung, wo fange ich an und welche Fähigkeiten benötige ich?
  • Servlet gibt “HTTP-Status 404 Die angeforderte Ressource (/servlet) ist nicht verfügbar” zurück
  • JDBC-ResultSet in HTML auf JSP-Seite mit MVC- und DAO-Muster anzeigen

Aktualisieren: gemäß der Aktualisierung Ihrer Frage (was ziemlich wichtig ist, sollten Sie keine Teile Ihrer ursprünglichen Frage entfernen, dies würde die Antworten wertlos machen … eher addieren die Informationen in einem neuen Block) , stellt sich heraus, dass Sie den Codierungstyp des Formulars unnötigerweise auf festlegen multipart/form-data. Dadurch werden die Anforderungsparameter in einer anderen Zusammensetzung als der (Standard) gesendet. application/x-www-form-urlencoded der die Anforderungsparameter als Abfragezeichenfolge sendet (z name1=value1&name2=value2&name3=value3). Du brauchst nur multipart/form-data wann immer du eine hast <input type="file"> -Element im Formular, um Dateien hochzuladen, die keine Zeichendaten (Binärdaten) sein können. Dies ist in Ihrem Fall nicht der Fall, also entfernen Sie es einfach und es funktioniert wie erwartet. Wenn Sie jemals Dateien hochladen müssen, müssen Sie den Codierungstyp so einstellen und den Anforderungstext selbst analysieren. Normalerweise verwendet man die Apache Commons-Datei hochladen dafür, aber wenn Sie bereits auf der frischen neuen Servlet 3.0-API sind, können Sie einfach die integrierten Einrichtungen verwenden, beginnend mit HttpServletRequest#getPart(). Siehe auch diese Antwort für ein konkretes Beispiel: How to upload files to server using JSP/Servlet?

Sowohl GET als auch POST werden vom Browser verwendet, um eine einzelne Ressource vom Server anzufordern. Jede Ressource erfordert eine separate GET- oder POST-Anforderung.

  1. Die GET-Methode wird am häufigsten (und ist die Standardmethode) von Browsern verwendet, um Informationen von Servern abzurufen. Bei Verwendung der GET-Methode bleibt der 3. Abschnitt des Anforderungspakets, der Anforderungsrumpf, leer.

Die GET-Methode wird auf zwei Arten verwendet: Wenn keine Methode angegeben ist, das heißt, wenn Sie oder der Browser eine einfache Ressource wie eine HTML-Seite, ein Bild usw. anfordern. Wenn ein Formular gesendet wird und Sie die Methode auswählen =GET auf das HTML-Tag. Wenn die GET-Methode mit einem HTML-Formular verwendet wird, werden die über das Formular gesammelten Daten durch Anhängen eines „?“ an den Server gesendet. an das Ende der URL und fügt dann alle Name=Wert-Paare (Name des HTML-Formularfelds und in dieses Feld eingegebener Wert) getrennt durch ein „&“ hinzu. Beispiel: GET /sultans/shop//form1.jsp?name= Sam%20Sultan&iceCream=vanilla HTTP/1.0 optionaler Headeroptionaler Header<< leere Zeile >>>

Die Name=Wert-Formulardaten werden in einer Umgebungsvariablen namens QUERY_STRING gespeichert. Diese Variable wird an ein Verarbeitungsprogramm (z. B. JSP, Java-Servlet, PHP usw.) gesendet.

  1. Die POST-Methode wird verwendet, wenn Sie ein HTML-Formular erstellen und method=POST als Teil des Tags anfordern. Die POST-Methode ermöglicht es dem Client, Formulardaten im Anforderungstextabschnitt der Anforderung an den Server zu senden (wie zuvor besprochen). Die Daten sind codiert und ähnlich wie bei der GET-Methode formatiert, außer dass die Daten über die Standardeingabe an das Programm gesendet werden.

Beispiel: POST /sultans/shop//form1.jsp HTTP/1.0 optionaler Headeroptionaler Header<< leere Zeile >>> name=Sam%20Sultan&iceCream=vanilla

Bei Verwendung der Post-Methode ist die Umgebungsvariable QUERY_STRING leer. Vorteile/Nachteile von GET vs. POST

Vorteile der GET-Methode: Etwas schneller Parameter können über ein Formular eingegeben oder angehängt werden, nachdem die URL-Seite mit ihren Parametern mit einem Lesezeichen versehen werden kann

Nachteile der GET-Methode: Kann nur Daten im Wert von 4K senden. (Sie sollten es nicht verwenden, wenn Sie ein Textarea-Feld verwenden.) Parameter sind am Ende der URL sichtbar

Vorteile der POST-Methode: Parameter sind am Ende der URL nicht sichtbar. (Verwendung für vertrauliche Daten) Kann Daten im Wert von mehr als 4K an den Server senden

Nachteile der POST-Methode: Kann mit seinen Daten nicht mit einem Lesezeichen versehen werden

1646638031 940 doGet und doPost in Servlets
Jay Jackson

Die Implementierung des Servlet-Containers von HttpServlet.service() Methode wird automatisch weiterleiten an doGet() oder doPost() nach Bedarf, sodass Sie die Dienstmethode nicht überschreiben müssen.

1646638032 146 doGet und doPost in Servlets
Tom

Kann es sein, dass du die Daten durchkommst, nicht post?

<form method="get" ..>
..
</form>

Wenn Sie tun <form action="identification" > Für Ihr HTML-Formular werden Daten standardmäßig mit “Get” übergeben, und daher können Sie dies mit der doGet-Funktion in Ihrem Java-Servlet-Code abfangen. Auf diese Weise werden Daten unter dem HTML-Header übergeben und sind daher beim Senden in der URL sichtbar. Wenn Sie andererseits Daten im HTML-Text übergeben möchten, verwenden Sie Post: <form action="identification" method="post"> und fangen Sie diese Daten in der doPost-Funktion ab. Dies war, dass Daten unter dem HTML-Text und nicht unter dem HTML-Header übergeben werden, und Sie werden die Daten nach dem Absenden des Formulars nicht in der URL sehen.

Beispiele aus meinem HTML:

<body>  
<form action="StartProcessUrl" method="post">
.....
.....

Beispiele aus meinem Java-Servlet-Code:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        PrintWriter out = response.getWriter();
         String surname = request.getParameter("txtSurname");
         String firstname = request.getParameter("txtForename");
         String rqNo = request.getParameter("txtRQ6");
         String nhsNo = request.getParameter("txtNHSNo");

         String attachment1 = request.getParameter("base64textarea1");
         String attachment2 = request.getParameter("base64textarea2");

.........
.........

963960cookie-checkdoGet und doPost in Servlets

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy