Έχω αναπτύξει μια σελίδα HTML που στέλνει πληροφορίες σε ένα Servlet. Στο Servlet, χρησιμοποιώ τις μεθόδους doGet()
και 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");
}
Στον κώδικα της σελίδας html που καλεί το Servlet είναι:
<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>
Όταν χρησιμοποιώ τη μέθοδο method = "get"
στο Servlet, λαμβάνω την τιμή του id και του password, ωστόσο όταν χρησιμοποιώ τη μέθοδο method = "post"
, το id και το password παίρνουν την τιμή null
. Γιατί δεν λαμβάνω τις τιμές σε αυτή την περίπτωση;
Ένα άλλο πράγμα που θα ήθελα να ξέρω είναι πώς να χρησιμοποιήσω τα δεδομένα που παράγονται ή επικυρώνονται από το Servlet. Για παράδειγμα, αν το Servlet που φαίνεται παραπάνω πιστοποιεί τον χρήστη, θα ήθελα να εκτυπώσω το id του χρήστη στη σελίδα HTML μου. Θα πρέπει να μπορώ να στείλω τη συμβολοσειρά 'id' ως απάντηση και να χρησιμοποιήσω αυτές τις πληροφορίες στη σελίδα HTML μου. Είναι δυνατόν;
Θα πρέπει να χρησιμοποιείτε την [doGet()
][1] όταν θέλετε να αναχαιτίσετε [αιτήσεις HTTP GET][2]. Θα πρέπει να χρησιμοποιείτε το [doPost()
][3] όταν θέλετε να υποκλέψετε [αιτήσεις HTTP POST][4]. Αυτά είναι όλα. Μην μεταφέρετε το ένα στο άλλο ή το αντίστροφο (όπως στην ατυχή αυτοδημιουργούμενη μέθοδο processRequest()
του Netbeans). Αυτό δεν έχει κανένα απολύτως νόημα.
Συνήθως, τα αιτήματα HTTP GET είναι [idempotent][5]. Δηλαδή, παίρνετε ακριβώς το ίδιο αποτέλεσμα κάθε φορά που εκτελείτε την αίτηση (αφήνοντας την εξουσιοδότηση/ταυτοποίηση και τη χρονικά ευαίσθητη φύση της σελίδας -αποτελέσματα αναζήτησης, τελευταίες ειδήσεις κ.λπ.- εκτός εξέτασης). Μπορούμε να μιλήσουμε για ένα αίτημα που μπορεί να καταχωρηθεί με σελιδοδείκτη. Κάνοντας κλικ σε έναν σύνδεσμο, κάνοντας κλικ σε έναν σελιδοδείκτη, εισάγοντας την ακατέργαστη διεύθυνση URL στη γραμμή διευθύνσεων του προγράμματος περιήγησης κ.λπ. θα πυροδοτήσουν όλα ένα αίτημα HTTP GET. Εάν ένα Servlet ακούει την εν λόγω διεύθυνση URL, τότε θα κληθεί η μέθοδος doGet()
του. Συνήθως χρησιμοποιείται για την προεπεξεργασία ενός αιτήματος. Δηλαδή, για να κάνει κάποια επιχειρησιακά πράγματα πριν παρουσιάσει την έξοδο HTML από ένα JSP, όπως για παράδειγμα να συλλέξει δεδομένα για εμφάνιση σε έναν πίνακα.
@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);
}
}