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!