Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    J2EE - Problema con forward da servlet a jsp

    Ciao a tutti!
    Sono nuovo del forum e relativamente niubbo di programmazione, sto studiando Java e le sue potenzialità per creare applicazioni web. Quello che sto realizzando è per scopo di studio.

    Ho creato le mie prime webapp (insulse, tipo HelloWorld et similia), ora son passato a qualcosa di più complesso:

    - un pagina html statica composta da un form con due radio in cui seleziono "nome" o "cognome" e un text field in cui inserire la stringa da cercare. al submit la pagina chiama una servlet col metodo POST e le passa i due parametri tramite l'oggetto request

    - una servlet che, verificate alcune condizioni, si connette ad un Db MySQL ed esegue la query; dopodichè, i risultati vengono salvati in sessione (perchè mi sto esercitando con le sessioni) assieme ad altri dati come il numero di risultati etc.
    Fatto ciò, con un

    codice:
    RequestDispatcher dsp=getServletContext().getRequestDispatcher("/results.jsp");   		dsp.forward(request,response);
    eseguo il forward ad una jsp che stampa o l'assenza di risultati o l'elenco dei risultati prendendo gli attributi dalla sessione.

    Funziona tutto, tranne il forward. Non riesco a capire il problema. Ho realizzato prima una versione della servlet che stampasse direttamente a video una pagina html contentente i risultati, per verificare che tutti i passaggi fossero ok (connessione al db, query, ciclo di stampa dei risultati cin ResultSet, etc); in seguito una versione della servlet senza response ma che ceda alla jsp il compito di stampare l'output (secondo il pattern MVC).

    Guardando anche il sorgente generato dalla servlet con output HTML, vedo come l'esecuzione si fermi proprio al forward, quindi è indubbio che il problema sia lì.

    Qualcuno può aiutarmi? Sono impantanato da un bel po'...

    Vi posto tutto, la pagina HTML:

    codice:
    <!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>Ricerca in un database</title> </head> <body>  <h1>Cerca un nome nel db!</h1>  
    
     	<form action="http://localhost:8080/dbsearch/Search" method="post"> 		<label> 			Scegli il campo da cercare:</label> 			<select name="campo"> 				<option value="nome">Nome</option> 				<option value="cognome">Cognome</option> 			</select> 		 	
    
     		<label> 			Inserisci il nome da cercare: 			<input type="text" name="nome"/> 			<input type="submit" value="Cerca!"/> 		</label> 	</form>  </body> </html>

    La servlet:

    codice:
      import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement;  import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import javax.servlet.RequestDispatcher;  /**  * Servlet implementation class Search  */ public class Search extends HttpServlet { 	private static final long serialVersionUID = 1L;             /**      * @see HttpServlet#HttpServlet()      */     public Search() {         super();              }    //definisco i parametri di connessione al db 	   	private static final String host_porta="localhost";   	   	private static final String nome_db="antonio";   	   	private static final String user="root";   	   	private static final String password="root";   	   	private static final String indirizzo_connessione="jdbc:mysql://"+ host_porta + "/" + nome_db + "?user="+user+"&password="+password+"";   	   	   	   	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {   		   		try {   			   			  			   			   			// creo la sessione   			HttpSession session1=request.getSession();   			   			   		   		// recupero il campo e il valore da cercare inseriti dall'utente   		String field=request.getParameter("campo");   		String search_term=request.getParameter("nome");   		   		// oltre ad assegnarli a delle variabili per la lavorazione in locale, li salvo in sessione   		session1.setAttribute("searchField", request.getParameter("campo"));   		session1.setAttribute("searchTerm", request.getParameter("nome"));   		   		boolean fields_filled=true; // booleano che mi dice se l'utente ha riempito i campi.   		// se risulterà falso la jsp ritornerà una pagina di errore   		   		   		// mess d'errore se uno dei due campi è vuoto   		if (field.equals("") | search_term.equals("")) {   			fields_filled=false;   					   		}   		   		   		// altrimenti verifico se i campi sono validi ed eseguo la query   		else {   		   		   		// carico il driver per la connessione al db   		Class.forName("com.mysql.jdbc.Driver");   			   		// ora mi connetto al db e cerco con una SELECT tutti i record   		// in cui il campo scelto dall'utente contenga la parola inserita dall'utente   		   		Connection conn=DriverManager.getConnection(indirizzo_connessione);   		   		   		Statement stmt=conn.createStatement();   		   		String query="SELECT * FROM anagrafica WHERE "+ field +"=\"" + search_term+"\"";   		   		   		ResultSet res=stmt.executeQuery(query);   		   		   		/*   		 ciclo che finchè ci sono valori nell'oggetto ResultSet (che è una tabella)   		 * li inserisce nella sessione tramite il metodo setAttribute   		 *    		 * uso il metodo .next() di resultSet che resistuisce true finchè ci sono righe   		 */   			   		// con questo indice so quanti sono i record che soddisfano la ricerca   		int i=0;   		   		if (res.next()) {   				   		    			do {   				session1.setAttribute("nome"+i, res.getString("nome"));   				session1.setAttribute("cognome"+i, res.getString("cognome"));   				i++;   			   		 			} while (res.next());   		}   		else {   			i=0;   		} 			   		// salvo in sessione l'indice i   		session1.setAttribute("resultsNumber", i);   		return;   		   		   		} // fine else che verifica se i campi sono stati riempiti   		   		   		// salvo fields_filled in sessione   		session1.setAttribute("fields_filled", fields_filled);   		   		   	// ora devo eseguire il forward alla jsp che recupererà i dati e li invierà al client   		// String forward_url="/results.jsp";   		RequestDispatcher dsp=getServletContext().getRequestDispatcher("/results.jsp");   		dsp.forward(request,response);   		   		   		}   		   		catch (Exception e) {   		}   		   	}  }


    E la jsp:

    codice:
    <%@ page language="java" contentType="text/html; charset=ISO-8859-1"     pageEncoding="ISO-8859-1" import="javax.servlet.http.HttpSession"%> <!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>Risultati della ricerca</title> </head> <body>  <% String resultsNumber=(String) session.getAttribute("resultsNumber"); int rN=Integer.parseInt(resultsNumber); String searchField=(String) session.getAttribute("searchField"); String searchTerm=(String) session.getAttribute("searchTerm");  %>  <h3>Risultati della ricerca:</h3> 
    
     	E' stato cercato il <% out.print(searchField);%> "<% out.print(searchTerm);%>".
     	Sono stati trovati <% out.print(resultsNumber);%> risultati. 	 	<% 		 		if (rN>0) { 			 			String nomi_trovati[]=new String[rN]; 			String cognomi_trovati[]=new String[rN]; 			 			int i; 			for (i=0; i<nomi_trovati.length; i++) { 			nomi_trovati[i]=(String) session.getAttribute("nome"+i); 			cognomi_trovati[i]=(String) session.getAttribute("cognome"+i); 			out.println("Nome: "+nomi_trovati[i]+" - Cognome: "+cognomi_trovati[i]); 			} 		} 		 		else { 		out.println("Nessun risultato trovato. <a href=\"/index.html\">Clicca qui</a> per ripetere la ricerca usando altre parole chiave."); 		} 	%>  </body> </html>


    Grazie di cuore a chunque vorrà aiutarmi!

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Per favore... riposta i codici NON USANDO il pulsante "code", ma scrivendo il tag a mano, all'interno dell'area del messaggio, in questo modo:

    [code]
    poi incolli il codice
    [/code]

    In questo modo il codice viene scritto indentato e formattato.
    Il pulsante serve per postare una sola riga di codice... di conseguenza, tutto quello che incolli nella finestrella viene renderizzato su una sola riga. Risultato: codice illeggibile.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3

    risolto!

    Ciao LeleFT!
    è che ho letto (male mi sa) le regole prima di postare, e pensavo di averle seguire alla lettera..però in effetti mi sembrava un metodo un po' scomodo!

    Correggo!

    Premetto che ho RISOLTO, c'era un errore di casting nella jsp, solo che io da ignorante mi aspettavo che il browser me lo segnalasse..invece ci sono i log per questo! grazie ad eclipse.

    Posto il tutto casomai qualcuno dovesse avere un problema simile!


    Form HTML
    codice:
    <!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>Ricerca in un database</title>
    </head>
    <body>
    
    <h1>Cerca un nome nel db!</h1>
    
    
    
    
    	<form action="http://localhost:8080/dbsearch/Search" method="post">
    		<label>
    			Scegli il campo da cercare:</label>
    			<select name="campo">
    				<option value="nome">Nome</option>
    				<option value="cognome">Cognome</option>
    			</select>
    		
    	
    
    
    		<label>
    			Inserisci il nome da cercare:
    			<input type="text" name="nome"/>
    			<input type="submit" value="Cerca!"/>
    		</label>
    	</form>
    
    </body>
    </html>

    Servlet:

    codice:
    
    
    import java.io.IOException;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.Statement;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    import javax.servlet.RequestDispatcher;
    
    /**
     * Servlet implementation class Search
     */
    public class Search extends HttpServlet {
    	private static final long serialVersionUID = 1L;
           
        /**
         * @see HttpServlet#HttpServlet()
         */
        public Search() {
            super();
            
        }
    
      //definisco i parametri di connessione al db
    	
      	private static final String host_porta="localhost";
      	
      	private static final String nome_db="antonio";
      	
      	private static final String user="root";
      	
      	private static final String password="root";
      	
      	private static final String indirizzo_connessione="jdbc:mysql://"+ host_porta + "/" + nome_db + "?user="+user+"&password="+password+"";
      	
      	
      	
      	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      		
      		try {
      			
      			  			
      			
      			// creo la sessione
      			HttpSession session1=request.getSession();
      			
      			
      		
      		// recupero il campo e il valore da cercare inseriti dall'utente
      		String field=request.getParameter("campo");
      		String search_term=request.getParameter("nome");
      		
      		// oltre ad assegnarli a delle variabili per la lavorazione in locale, li salvo in sessione
      		session1.setAttribute("searchField", request.getParameter("campo"));
      		session1.setAttribute("searchTerm", request.getParameter("nome"));
      		
      		boolean fields_filled=true; // booleano che mi dice se l'utente ha riempito i campi.
      		// se risulterà falso la jsp ritornerà una pagina di errore
      		
      		
      		// mess d'errore se uno dei due campi è vuoto
      		if (field.equals("") | search_term.equals("")) {
      			fields_filled=false;
      					
      		}
      		
      		
      		// altrimenti verifico se i campi sono validi ed eseguo la query
      		else {
      		
      		
      		// carico il driver per la connessione al db
      		Class.forName("com.mysql.jdbc.Driver");
      			
      		// ora mi connetto al db e cerco con una SELECT tutti i record
      		// in cui il campo scelto dall'utente contenga la parola inserita dall'utente
      		
      		Connection conn=DriverManager.getConnection(indirizzo_connessione);
      		
      		
      		Statement stmt=conn.createStatement();
      		
      		String query="SELECT * FROM anagrafica WHERE "+ field +"=\"" + search_term+"\"";
      		
      		
      		ResultSet res=stmt.executeQuery(query);
      		
      		
      		/*
      		 ciclo che finchè ci sono valori nell'oggetto ResultSet (che è una tabella)
      		 * li inserisce nella sessione tramite il metodo setAttribute
      		 * 
      		 * uso il metodo .next() di resultSet che resistuisce true finchè ci sono righe
      		 */
      			
      		// con questo indice so quanti sono i record che soddisfano la ricerca
      		int i=0;
      		
      		if (res.next()) {
      				
      		 
      			do {
      				session1.setAttribute("nome"+i, res.getString("nome"));
      				session1.setAttribute("cognome"+i, res.getString("cognome"));
      				i++;
      			
      		
    			} while (res.next());
      		}
      		else {
      			i=0;
      		}
    		
      		String resultsNumber=Integer.toString(i);
      		
      		
      		// salvo in sessione l'indice i
      		session1.setAttribute("resultsNumber", resultsNumber);
    
      		
      		
      		} // fine else che verifica se i campi sono stati riempiti
      		
      		
      		// salvo fields_filled in sessione
      		session1.setAttribute("fields_filled", fields_filled);
      		
      		
      		
      	// ora devo eseguire il forward alla jsp che recupererà i dati e li invierà al client
      		// String forward_url="/results.jsp";
      		RequestDispatcher dsp=getServletContext().getRequestDispatcher("/results.jsp");
      		dsp.forward(request,response);
      		
      		
      		}
      		
      		catch (Exception e) {
      		}
      		
      	}
    
    }

    Pagina JSP:

    codice:
    <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
        pageEncoding="ISO-8859-1" import="javax.servlet.http.HttpSession"%>
    <!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>Risultati della ricerca</title>
    </head>
    <body>
    
    <%
    String resultsNumber=(String) session.getAttribute("resultsNumber");
    String searchField=(String) session.getAttribute("searchField"); String searchTerm=(String) session.getAttribute("searchTerm");
    int rN=Integer.parseInt(resultsNumber);
    %>
    
    <h3>Risultati della ricerca:</h3>
    
    
    
    	E' stato cercato il <%=searchField %> "<%=searchTerm%>".
    
    	Sono stati trovati <%=resultsNumber%> risultati.
    
    	<%
    		
    		if (rN>0) {
    			
    			String nomi_trovati[]=new String[rN];
    			String cognomi_trovati[]=new String[rN];
    			
    			int i;
    			for (i=0; i<nomi_trovati.length; i++) {
    			nomi_trovati[i]=(String) session.getAttribute("nome"+i);
    			cognomi_trovati[i]=(String) session.getAttribute("cognome"+i);
    			out.println("Nome: "+nomi_trovati[i]+" - Cognome: "+cognomi_trovati[i]+"
    ");
    			}
    		}
    		
    		else {
    		out.println("Nessun risultato trovato. <a href=\"/index.html\">Clicca qui</a> per ripetere la ricerca usando altre parole chiave.");
    		}
    	%>
    
    </body>
    </html>

  4. #4
    PS: non posso editare il primo post, volevo mettere [RISOLTO] nel titolo...se qui da voi si usa così, posso chiedere a te che sei moderatore di farlo?
    Grazie ancora e alla prossima!

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Originariamente inviato da Marzolinus
    PS: non posso editare il primo post, volevo mettere [RISOLTO] nel titolo...se qui da voi si usa così, posso chiedere a te che sei moderatore di farlo?
    Grazie ancora e alla prossima!
    Da noi non si usa inserire il tag RISOLTO, in modo che se qualcun altro ha lo stesso problema, possa eventualmente aggiungere i propri dettagli.
    Va bene così.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.