Esempi di programmi JSP: modulo di registrazione e accesso

โšก Riepilogo intelligente

Gli esempi di programma JSP qui presentati creano tre moduli: un modulo di registrazione, un modulo di accesso e disconnessione e una pagina di elaborazione dei moduli. Ciascun modulo collega una vista JSP a un controller servlet, in modo che la distinzione tra architettura MVC e MVC rimanga chiara anche ai principianti.

  • ๐Ÿ”˜ Flusso di registrazione: Il file Register_1.jsp raccoglie sei campi e li invia alla servlet guru_register, che reindirizza a una pagina di successo solo quando tutti i campi sono stati compilati.
  • โ˜‘๏ธ Accesso e disconnessione: Register_3.jsp invia le credenziali a guru_login; Register_4.jsp dร  il benvenuto all'utente e lo reindirizza alla pagina di login per effettuare il logout.
  • โœ… Ruoli MVC: Le pagine JSP fungono da vista, la servlet da controller e RequestDispatcher instrada la richiesta tra di loro.
  • ๐Ÿงช Elaborazione del modulo: I metodi getParameter(), getParameterValues(), getParameterNames() e getInputStream() leggono i dati inviati all'interno di una pagina JSP o di una servlet.
  • ๏ธ GET contro POST: GET aggiunge valori codificati al URL e ha una lunghezza limitata; POST trasmette i valori nel corpo della richiesta, il che รจ adatto alle password.
  • โš ๏ธ Nota sulla versione: Questi esempi importano javax.servlet, quindi funzionano su Tomcat 9 o versioni precedenti; Tomcat 10 e versioni successive richiedono i pacchetti jakarta.servlet.

Esempi di programmi con moduli di registrazione e accesso JSP

Questi esempi pratici mostrano come sviluppare programmi di esempio con JSP e come implementare l'architettura MVC attorno ad essi. Vengono costruiti tre moduli in sequenza:

  • il modulo d'iscrizione
  • Modulo di accesso e disconnessione
  • Modulo JSP

Come creare un modulo di registrazione in JSP

Nel modulo di registrazione รจ presente uno spazio da compilare con tutti i dati richiesti, tra cui nome, nome utente, password, indirizzo, numero di telefono, ecc.

Questo modulo ci aiuta a registrarci con l'applicazione. Prende tutti i nostri dati e li memorizza in un banca dati o cache.

In questo esempio prenderemo il โ€œGuru Modulo di registrazioneโ€, che presenta i seguenti campi:

  1. Nome
  2. Cognome
  3. Nome utente
  4. Password
  5. Indirizzo
  6. Numero Cellulare

Dopo aver inserito tutti questi dettagli, รจ presente un pulsante di invio; cliccando su tale pulsante, tutti i dati vengono inviati al servlet.

Esempio 1: Register_1.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Guru Registration Form</title>
</head>
<body>
<h1>Guru Register Form</h1>
<form action="guru_register" method="post">
			<table style="with: 50%">
				<tr>
					<td>First Name</td>
					<td><input type="text" name="first_name" /></td>
				</tr>
				<tr>
					<td>Last Name</td>
					<td><input type="text" name="last_name" /></td>
				</tr>
				<tr>
					<td>UserName</td>
					<td><input type="text" name="username" /></td>
				</tr>
					<tr>
					<td>Password</td>
					<td><input type="password" name="password" /></td>
				</tr>
				<tr>
					<td>Address</td>
					<td><input type="text" name="address" /></td>
				</tr>
				<tr>
					<td>Contact No</td>
					<td><input type="text" name="contact" /></td>
				</tr></table>
			<input type="submit" value="Submit" /></form>
</body>
</html>

Spiegazione del codice:

Code Linea 11: Qui stiamo prendendo un modulo che ha un'azione, ovvero la servlet a cui verrร  inviata la richiesta, e il nome della servlet รจ guru_register.java. La richiesta verrร  elaborata tramite il metodo POST.

Code Linea 14-16: Qui stiamo prendendo come input il tipo di testo e il nome รจ first_name.

Code Linea 18-20: Qui stiamo prendendo come input il tipo di testo e il nome รจ last_name.

Code Linea 22-24: Qui stiamo utilizzando il tipo di input testo e il nome รจ username.

Code Linea 26-28: Qui utilizziamo il tipo di input "password" (in questo modo la password viene nascosta durante la digitazione) e il nome come password.

Code Linea 30-32: Qui stiamo utilizzando il tipo di input testo e il nome come indirizzo.

Code Linea 34-36: Qui utilizziamo il tipo di input testo e il nome contatto.

Code Linea 37: Qui stiamo prendendo un pulsante di tipo "submit" il cui valore รจ anch'esso "Submit". Facendo clic su questo pulsante, l'azione viene indirizzata alla servlet guru_register corrispondente, dove tutti i valori dei parametri vengono passati nella richiesta.

Nota: l'attributo della tabella in Code La riga 12 recita style="with: 50%". La proprietร  CSS corretta รจ widthPertanto, l'elenco viene riprodotto esattamente come pubblicato, ma la tabella non verrร  ridimensionata finchรฉ l'errore di battitura non verrร  corretto nella tua copia.

Esempio 2: Guru_register.java

package demotest;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class guru_register
 */
public class guru_register extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    
     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		String first_name = request.getParameter("first_name");
		String last_name = request.getParameter("last_name");
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		String address = request.getParameter("address");
		String contact = request.getParameter("contact");
		
		if(first_name.isEmpty() || last_name.isEmpty() || username.isEmpty() || 
				password.isEmpty() || address.isEmpty() || contact.isEmpty())
		{
			RequestDispatcher req = request.getRequestDispatcher("register_1.jsp");
			req.include(request, response);
		}
		else
		{
			RequestDispatcher req = request.getRequestDispatcher("register_2.jsp");
			req.forward(request, response);
		}
	}

}

Spiegazione del codice:

Code Linea 14: Qui definiamo la servlet guru_register, che estende HttpServlet.

Code Linea 18: Questo รจ il metodo doPost(), che viene chiamato quando specifichiamo POST come attributo del metodo nel modulo JSP sopra.

Code Linea 20-25: Qui stiamo recuperando i valori dalla richiesta, ovvero first_name, last_name, username, password, address e contact, utilizzando request.getParameter.

Code Linea 27-32: Qui utilizziamo una condizione if per verificare se uno qualsiasi dei parametri recuperati dalla richiesta รจ vuoto. Se un parametro รจ vuoto, il controllo entra in questa condizione ( first_name.isEmpty() || last_name.isEmpty() || username.isEmpty() || password.isEmpty() || address.isEmpty() || contact.isEmpty()) e recuperiamo un oggetto RequestDispatcher dall'oggetto request, che invia la richiesta a register_1.jsp. Qui includiamo anche gli oggetti request e response.

Code Linea 33-37: Questo ramo viene eseguito quando nessuno dei parametri รจ vuoto. Recuperiamo un oggetto RequestDispatcher dall'oggetto request, che inoltra la richiesta a register_2.jsp. Qui stiamo inoltrando gli oggetti request e response.

La differenza tra i due rami รจ importante: include() esegue register_1.jsp e restituisce il controllo alla servlet, mentre forward() inoltra la richiesta a register_2.jsp e non restituisce nulla.

Esempio 3: Register_2.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Guru Success Page</title>
</head>
<body>
           <a><b>Welcome User!!!!</b></a>
</body>
</html>

Spiegazione del codice:

Code Linea 10: Qui visualizziamo il messaggio di benvenuto. Questa pagina JSP viene richiamata quando tutti i parametri sono stati compilati.

Quando si esegue il codice sopra riportato, si ottiene il seguente output.

Produzione:

La pagina di registrazione visualizza i sei campi etichettati con un singolo pulsante Invia, come mostrato di seguito.

Guru Modulo di registrazione in JSP con campi per nome, cognome, nome utente, password, indirizzo e contatti.

Una volta compilati tutti i campi e cliccato su Invia, guru_register reindirizza a register_2.jsp e viene visualizzata la pagina di conferma.

Pagina di successo Register_2.jsp che mostra il messaggio di benvenuto all'utente dopo la registrazione.

Quando clicchiamo su register_1.jsp, visualizziamo un modulo con nome, cognome, nome utente, password, indirizzo e contatto. Dopo aver compilato tutti i campi e cliccato sul pulsante Invia, compare il messaggio "Benvenuto utente".

Come creare un modulo di login e logout in JSP

Analogamente al modulo di registrazione, ora creeremo un modulo di accesso e uno di disconnessione.

In questo esempio, abbiamo preso un modulo di accesso con due campi, "nome utente" e "password", e un pulsante di invio.

Quando clicchiamo sul pulsante "Invia", riceviamo un messaggio di benvenuto con un pulsante per uscire.

Quando clicchiamo sul pulsante di disconnessione, torniamo al modulo di accesso.

Esempio 1: Register_3.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Guru Login Form</title>
</head>
<body>
<form action="guru_login" method="post">
		<table style="with: 50%">

			<tr>
				<td>UserName</td>
				<td><input type="text" name="username" /></td>
			</tr>
				<tr>
				<td>Password</td>
				<td><input type="password" name="password" /></td>
			</tr>
		</table>
		<input type="submit" value="Login" /></form>
</body>
</html>

Spiegazione del codice:

Code Linea 10: Qui stiamo prendendo un modulo la cui azione รจ la servlet guru_login.java. Il metodo tramite il quale vengono trasmessi i dati รจ POST.

Code Linea 13-16: Qui stiamo prendendo un campo di input "username", che รจ di tipo testo.

Code Linea 17-20: Qui stiamo prendendo un campo di input "password", che รจ di tipo password.

Code Linea 22: Qui abbiamo un pulsante "Invia" con il valore "Accedi". Cliccandoci sopra, il controllo passa alla servlet guru_login, dove entrambi i campi vengono letti utilizzando l'oggetto request.

Esempio 2: Guru_login.java (servlet)

package demotest;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class guru_login
 */
public class guru_login extends HttpServlet {

    public guru_login() {
        super();
        // TODO Auto-generated constructor stub
    }

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		if(username.isEmpty() || password.isEmpty() )
		{
			RequestDispatcher req = request.getRequestDispatcher("register_3.jsp");
			req.include(request, response);
		}
		else
		{
			RequestDispatcher req = request.getRequestDispatcher("register_4.jsp");
			req.forward(request, response);
		}
	}

}

Spiegazione del codice:

Code Linea 5-9: Qui stiamo importando le classi necessarie nel codice.

Code Linea 14: Qui dichiariamo la servlet guru_login, che estende HttpServlet.

Code Linea 21: Qui utilizziamo il metodo doPost() perchรฉ il modulo utilizza il metodo POST.

Code Linea 23-24: Qui leggiamo i parametri utilizzando l'oggetto richiesta, ovvero nome utente e password.

Code Linea 25-29: In questo modo utilizziamo una condizione "if" che verifica se username e password sono vuoti. Se uno dei due รจ vuoto, otteniamo un oggetto RequestDispatcher che invia il controllo a register_3.jsp con gli oggetti request e response.

Code Linea 30-34: Questo ramo viene eseguito se entrambi i parametri non sono vuoti; in tal caso, inoltra la richiesta a register_4.jsp con gli oggetti di richiesta e risposta.

Esempio 3: Register_4.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Guru Logged In</title>
</head>
<body>
	<table style="with: 50%">
	<tr><td>
	<% String username = request.getParameter("username"); %>
<a>Welcome   <% out.println(username); %> User!!!! You have logged in.</a></td></tr>
<tr></tr><tr><td></td><td></td><td><a href="register_3.jsp"><b>Logout</b></a></td></tr>
</table>
</body>
</html>

Spiegazione del codice:

Code Linea 12: Qui otteniamo il parametro "username" dall'oggetto request e lo memorizziamo nell'oggetto String username. Questo funziona perchรฉ forward() mantiene intatta la richiesta originale e, di conseguenza, i suoi parametri.

Code Linea 13: Qui abbiamo un messaggio di benvenuto con il nome utente.

Code Linea 14: Qui troviamo il link di logout, che reindirizza l'utente alla pagina register_3.jsp.

Quando si esegue il codice sopra riportato, si ottiene il seguente output.

Produzione:

Aprendo il file register_3.jsp vengono visualizzati i due campi per le credenziali e un pulsante di accesso.

Guru Modulo di accesso in JSP con campi per nome utente e password e un pulsante di accesso.

Dopo aver cliccato sul pulsante Accedi, visualizzerai il messaggio seguente insieme a un link per disconnetterti.

La schermata di benvenuto Register_4.jsp accoglie l'utente connesso con un link di disconnessione.

Facendo clic sul link "Esci" si viene reindirizzati alla pagina di accesso mostrata qui.

La pagina di accesso viene visualizzata nuovamente nel browser dopo che l'utente ha cliccato su "Esci".

Nota: Questo esempio confronta solo i valori vuoti, quindi qualsiasi nome utente non vuoto viene accettato. Un login di produzione deve verificare le credenziali rispetto a un archivio e mantenere le password crittografate, mai in chiaro.

Elaborazione del modulo JSP utilizzando getParameter()

I moduli sono il metodo piรน comune per raccogliere dati nell'elaborazione web. Dobbiamo inviare informazioni al server web e poi leggerle nuovamente sul server.

Esistono due metodi comunemente utilizzati per inviare e recuperare informazioni al server web.

Metodo OTTIENI:

  • Questo รจ il metodo predefinito per passare le informazioni dal browser al server web.
  • Invia le informazioni codificate aggiunte alla pagina URL, separati dal carattere ?.
  • Esiste anche un limite di dimensione; la linea guida classica indica circa 1024 caratteri per richiesta, sebbene il limite effettivo sia stabilito dal browser e dal server piuttosto che dalla specifica HTTP.
  • Dovremmo evitare di inviare password e informazioni sensibili tramite il metodo GET.

Metodo POST:

  • Il metodo POST รจ il metodo piรน affidabile per inviare informazioni al server.
  • Invia le informazioni come corpo del messaggio separato anzichรฉ nella barra degli indirizzi.
  • Poichรฉ i valori non compaiono mai dopo il ? nel URLnon vengono memorizzati nella cronologia del browser o nei registri di accesso del server.
  • Viene comunemente utilizzato per inviare informazioni sensibili.

JSP gestisce l'elaborazione dei dati dei moduli utilizzando i seguenti metodi:

  1. getParameter(): utilizzato per ottenere il valore di un singolo parametro del modulo.
  2. getParameterValues(): utilizzato per restituire i valori multipli di un parametro.
  3. getParameterNames(): utilizzato per ottenere i nomi di tutti i parametri.
  4. getInputStream(): utilizzato per leggere i dati binari inviati dal client.

Esempio:

In questo esempio, abbiamo preso un modulo con due campi, "nome utente" e "password", e un pulsante di invio.

Action_form.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Guru Form</title>
</head>
<body>
<form action="action_form_process.jsp" method="GET">
UserName: <input type="text" name="username">
<br />
Password: <input type="text" name="password" />
<input type="submit" value="Submit" />
</form>
</body>
</html>

Action_form_process.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>

<h1>Form Processing</h1>

<p><b>Welcome User:</b>
   <%= request.getParameter("username")%>
</p>

</body>
</html>

Spiegazione del codice: Action_form.jsp

Code Linea 10: Qui abbiamo definito un modulo la cui azione viene elaborata da un altro JSPNell'attributo action aggiungiamo la pagina JSP a cui il modulo deve essere inviato tramite il metodo GET.

Qui utilizziamo il metodo GET per trasmettere le informazioni, ovvero nome utente e password.

Code Linea 11-14: Qui stiamo prendendo campi come nome utente e password, che sono campi di testo, e stiamo raccogliendo l'input dall'utente.

Questi dati di input possono essere recuperati utilizzando il metodo getParameter. รˆ presente anche un pulsante di invio che passa i valori del campo al file action_form_process.jsp.

Action_form_process.jsp

Code Linea 14: Qui recuperiamo i valori dei campi di input da action_form.jsp utilizzando il metodo getParameter dell'oggetto request.

Eseguendo il codice sopra riportato, otteniamo il seguente output.

Produzione:

Il file Action_form.jsp visualizza innanzitutto il modulo a due campi mostrato di seguito.

Il file Action_form.jsp visualizza i campi di testo Nome utente e Password con un pulsante Invia.

Dopo l'invio, action_form_process.jsp restituisce il nome utente letto tramite getParameter().

Pagina di output Action_form_process.jsp che visualizza l'intestazione Elaborazione modulo e il messaggio di benvenuto.

Quando eseguiamo action_form.jsp, otteniamo un modulo con due campi, nome utente e password, e un pulsante di invio. Dopo aver inserito nome utente e password, clicchiamo su Invia e la richiesta viene elaborata dalla pagina successiva, che ci riporta alla pagina di elaborazione del modulo con un messaggio di benvenuto.

Nota sulla versione: Entrambi i servlet sopra menzionati importano javax.servlet, il che รจ corretto per Tomcat 9 e versioni precedenti. Jakarta EE 9 ha rinominato l'API, quindi su Tomcat 10 o versioni successive ogni importazione di javax.servlet diventa jakarta.servlet, oppure l'applicazione deve essere convertita con Apache Tomcat Migration Tool per Jakarta EE.

DOMANDE FREQUENTI

Gli elenchi si riferiscono a Tomcat 9 e versioni precedenti, dove l'API risiede in javax.servlet. Jakarta EE 9 ha rinominato il namespace, quindi Tomcat 10 e versioni successive richiedono l'importazione di jakarta.servlet e una ricompilazione, oppure l'utilizzo del Tomcat Migration Tool.

Non memorizzarlo mai in chiaro. Esegui l'hashing con un algoritmo lento e con salt, come BCrypt o Argon2, prima che raggiunga il database e confronta gli hash al momento dell'accesso. La servlet di esempio controlla solo i valori vuoti, quindi รจ necessario aggiungere l'hashing.

La funzione include() esegue la risorsa di destinazione e restituisce il controllo alla servlet chiamante, quindi entrambi gli output vengono visualizzati. La funzione forward() inoltra l'intera richiesta alla destinazione e non restituisce mai il controllo, quindi la servlet non deve aver prima inviato la risposta.

Le pagine JSP rappresentano la vista, la servlet รจ il controller che legge i parametri e decide la direzione da seguire, mentre un database o un livello di bean fornisce il modello. RequestDispatcher funge da collegamento tra controller e vista.

Gli assistenti IA possono creare rami di validazione, individuare controlli null mancanti su getParameter(), suggerire librerie di hashing e spiegare lo stack tracSรฌ. Tratta ogni suggerimento come una bozza: verifica la versione dell'API servlet e testa il codice generato prima di rilasciarlo.ping esso.

Copilot รจ bravo con il boilerplate ripetitivo come stub doPost, letture di parametri e chiamate al dispatcher. Spesso utilizza per impostazione predefinita importazioni javax.servlet piรน vecchie, quindi controlla il namespace, la logica di validazione e l'escaping di qualsiasi input utente che produce.

Aggiungi un livello JDBC alla servlet: apri una connessione in pool, usa un PreparedStatement per l'inserimento o la ricerca delle credenziali e chiudi le risorse in un blocco finally. Mantieni il codice SQL fuori dalla JSP in modo che la vista rimanga solo di presentazione.

Poichรฉ guru_login verifica solo se i campi sono vuoti, un nome utente o una password vuoti comportano il reinserimento nella pagina di login anzichรฉ il reindirizzamento, il che funge da semplice meccanismo di validazione piuttosto che da vera e propria autenticazione.

Riassumi questo post con: