doGet e doPost in Servlet

Ho sviluppato una pagina HTML che invia informazioni a un servlet. Nel Servlet, sto usando i metodi doGet() e 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"); } 

Nel codice della pagina html che chiama Servlet è:

 
User Name: Password:

Quando utilizzo method = "get" nel servlet, ottengo il valore di id e password, tuttavia quando si utilizza method = "post" , id e password sono impostati su null . Perché non ottengo i valori in questo caso?

Un’altra cosa che vorrei sapere è come utilizzare i dati generati o convalidati dal Servlet. Ad esempio, se il Servlet mostrato sopra autentica l’utente, mi piacerebbe stampare l’id utente nella mia pagina HTML. Dovrei essere in grado di inviare la stringa “id” come risposta e utilizzare queste informazioni nella mia pagina HTML. È ansible?

introduzione

Dovresti usare doGet() quando vuoi intercettare le richieste GET HTTP . Dovresti usare doPost() quando vuoi intercettare le richieste POST HTTP . È tutto. Non portare l’uno all’altro o viceversa (come nel sfortunato metodo processRequest() Netbeans). Questo non ha assolutamente senso.

OTTENERE

Di solito, le richieste HTTP GET sono idempotenti . Ad esempio, si ottiene esattamente lo stesso risultato ogni volta che si esegue la richiesta (lasciando l’authorization / l’autenticazione e la natura sensibile al tempo della pagina – risultati di ricerca, ultime notizie, ecc.). Possiamo parlare di una richiesta segnalibro. Facendo clic su un collegamento, facendo clic su un segnalibro, immettendo l’URL non elaborato nella barra degli indirizzi del browser, eccetera verrà triggersta una richiesta HTTP GET. Se un servlet è in ascolto sull’URL in questione, verrà chiamato il suo metodo doGet() . Solitamente è usato per preelaborare una richiesta. Cioe ‘facendo alcuni affari prima di presentare l’output HTML da un JSP, come la raccolta di dati per la visualizzazione in una tabella.

 @WebServlet("/products") public class ProductsServlet extends HttpServlet { @EJB private ProductService productService; @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { List products = productService.list(); request.setAttribute("products", products); // Will be available as ${products} in JSP request.getRequestDispatcher("/WEB-INF/products.jsp").forward(request, response); } } 
  
${product.name} detail

Anche visualizzare / modificare i collegamenti di dettaglio come mostrato nell’ultima colonna sopra sono in genere idempotenti.

 @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); } } 
 
ID
${product.id}
Name
${product.name}
Description
${product.description}
Price
${product.price}
Image

INVIARE

Le richieste POST HTTP non sono idempotenti. Se l’utente finale ha inviato in anticipo un modulo POST su un URL, che non ha eseguito un reindirizzamento, l’URL non è necessariamente bookmarkable. I dati del modulo inviato non si riflettono nell’URL. Copypasting l’URL in una nuova finestra / scheda del browser potrebbe non produrre necessariamente esattamente lo stesso risultato dopo il submit del modulo. Tale URL non è quindi bookmarkable. Se un servlet è in ascolto sull’URL in questione, verrà chiamato doPost() . Solitamente è usato per poscanvasborare una richiesta. Raccogliendo dati da un modulo HTML inviato e facendo alcuni elementi aziendali con esso (conversione, convalida, salvataggio in DB, eccetera). Finalmente solitamente il risultato viene presentato come HTML dalla pagina JSP inoltrata.

 
${error}

… che può essere utilizzato in combinazione con questo pezzo di Servlet:

 @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); } } } 

Vedete, se l’ User è trovato in DB (cioè nome utente e password sono validi), allora l’ User verrà messo in ambito di sessione (cioè “connesso”) e il servlet reindirizzerà su qualche pagina principale (questo esempio va a http://example.com/contextname/home ), altrimenti imposterà un messaggio di errore e inoltrerà la richiesta alla stessa pagina JSP in modo che il messaggio venga visualizzato da ${error} .

Se necessario, puoi anche “hide” il login.jsp in login.jsp in modo che gli utenti possano accedervi solo tramite il servlet. Ciò mantiene l’URL pulito http://example.com/contextname/login . Tutto quello che devi fare è aggiungere un doGet() al servlet in questo modo:

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

(e aggiorna la stessa riga in doPost() conseguenza)

Detto questo, non sono sicuro che sia solo giocare e sparare al buio, ma il codice che hai postato non sembra buono (come usare compareTo() invece di equals() e scavare nei parameternames invece di solo usando getParameter() e l’ id e la password sembrano essere dichiarati come variabili di istanza di servlet – che NON è protetto da thread ). Quindi consiglio vivamente di imparare un po ‘di più sulle API Java SE di base usando le esercitazioni Oracle (controlla il capitolo “Percorsi che trattano le basi”) e come usare JSP / Servlet nel modo giusto usando questi tutorial .

Guarda anche:

  • La nostra pagina wiki di servlet
  • Sviluppo web Java EE, da dove comincio e di quali competenze ho bisogno?
  • Servlet restituisce “Stato HTTP 404 La risorsa richiesta (/ servlet) non è disponibile”
  • Mostra JDBC ResultSet in HTML nella pagina JSP usando pattern MVC e DAO

Aggiornamento : come per l’aggiornamento della tua domanda (che è piuttosto importante, non dovresti rimuovere parti della tua domanda originale, questo renderebbe le risposte inutili .. piuttosto aggiungi le informazioni in un nuovo blocco), si scopre che sei impostare inutilmente il tipo di codifica del modulo su multipart/form-data . Ciò invierà i parametri della richiesta in una composizione diversa rispetto application/x-www-form-urlencoded (predefinita) application/x-www-form-urlencoded che invia i parametri della richiesta come stringa di query (ad es. name1=value1&name2=value2&name3=value3 ). Hai solo bisogno di multipart/form-data ogni volta che hai un elemento nel modulo per caricare file che potrebbero essere dati non-character (dati binari). Questo non è il tuo caso, quindi rimuovilo e funzionerà come previsto. Se è necessario caricare i file, sarà necessario impostare il tipo di codifica in modo tale da analizzare autonomamente il corpo della richiesta. Solitamente si utilizza Apache Commons FileUpload per, ma se si è già sulla nuova e nuova API Servlet 3.0, è ansible utilizzare solo le funzioni incorporate che iniziano con HttpServletRequest#getPart() . Vedi anche questa risposta per un esempio concreto: come caricare file sul server usando JSP / Servlet?

Sia GET che POST vengono utilizzati dal browser per richiedere una singola risorsa dal server. Ogni risorsa richiede una richiesta GET o POST separata.

  1. Il metodo GET è più comunemente (ed è il metodo predefinito) utilizzato dai browser per recuperare informazioni dai server. Quando si utilizza il metodo GET, la terza sezione del pacchetto di richiesta, che è il corpo della richiesta, rimane vuota.

Il metodo GET viene utilizzato in due modi: quando non viene specificato alcun metodo, ovvero quando tu o il browser richiedete una risorsa semplice come una pagina HTML, un’immagine, ecc. Quando viene inviato un modulo e scegliete il metodo = OTTIENI sul tag HTML. Se il metodo GET viene utilizzato con un modulo HTML, i dati raccolti tramite il modulo vengono inviati al server aggiungendo un “?” alla fine dell’URL e quindi aggiungendo tutte le coppie nome = valore (nome del campo modulo html e valore immesso in tale campo) separate da un “&” Esempio: GET /sultans/shop//form1.jsp?name= Sam% 20Sultan & iceCream = vaniglia HTTP / 1.0 header headerzionale opzionale << riga vuota >>>

I dati del modulo name = value verranno archiviati in una variabile di ambiente denominata QUERY_STRING. Questa variabile verrà inviata a un programma di elaborazione (come JSP, servlet Java, PHP ecc.)

  1. Il metodo POST viene utilizzato quando si crea un modulo HTML e si richiede il metodo = POST come parte del tag. Il metodo POST consente al client di inviare i dati del modulo al server nella sezione del corpo della richiesta della richiesta (come discusso in precedenza). I dati sono codificati e sono formattati in modo simile al metodo GET, tranne per il fatto che i dati vengono inviati al programma attraverso l’input standard.

Esempio: POST /sultans/shop//form1.jsp HTTP / 1.0 header headerzionale opzionale << riga vuota >>> nome = Sam% 20Sultan & iceCream = vaniglia

Quando si utilizza il metodo post, la variabile di ambiente QUERY_STRING sarà vuota. Vantaggi / svantaggi di GET vs. POST

Vantaggi del metodo GET: leggermente più veloce I parametri possono essere inseriti tramite un modulo o aggiungendoli dopo che la pagina URL può essere aggiunta ai segnalibri con i suoi parametri

Svantaggi del metodo GET: può inviare solo 4K di dati. (Non dovresti usarlo quando usi un campo textarea) I parametri sono visibili alla fine dell’URL

Vantaggi del metodo POST: i parametri non sono visibili alla fine dell’URL. (Utilizzare per dati sensibili) Può inviare più di un valore 4K di dati al server

Svantaggi del metodo POST: Imansible non essere contrassegnato con i relativi dati

L’implementazione del servlet container del metodo HttpServlet.service () verrà automaticamente inoltrata a doGet () o doPost () in base alle necessità, pertanto non è necessario eseguire l’override del metodo di servizio.

Potrebbe essere che stai passando i dati attraverso get, non post?

 
..

Se si esegue

per il proprio modulo html, i dati verranno passati utilizzando “Get” per impostazione predefinita e, pertanto, è ansible rilevarlo utilizzando la funzione doGet nel codice del servlet Java. In questo modo i dati verranno passati sotto l’intestazione HTML e quindi saranno visibili nell’URL quando inviati. D’altra parte, se vuoi passare i dati nel corpo HTML, usa US Post:

e cattura questi dati nella funzione doPost. Questo era, i dati saranno passati sotto il corpo html e non l’intestazione html, e non vedrai i dati nell’URL dopo aver inviato il modulo.

Esempi dal mio html:

  
..... .....

Esempi dal mio codice servlet Java:

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