PDA

View Full Version : Jsp,servlet,jdom,bean: primi passi


boysna
12-04-2006, 12:10
Ciao a tutti. Apro questa discussione per rivolgere domande ai piu esperti su queste tecnologie, visto che sono alle prime armi.

Il mio primo problema è questo. Ho una pagina HTML e una JSP. Ecco i codici.


<html>

<head>
<title>Scelta Compagnia</title>
</head>

<body>
<form action="benvenuto.jsp" METHOD="get">
Scegli la compagnia:<br>
<input type="radio" name="compagnia" value="Alitalia"> Alitalia <br>
<input type="radio" name="compagnia" value="KLM"> KLM <br>
<input type="radio" name="compagnia" value="British Airways"> British Airways <br>
<input type="hidden" name="pagina" value="scelta_compagnia">
<button type="submit">Vai alla Compagnia scelta</button>

</form>

</body>

</html>



<html>

<head>
<title>Benvenuto</title>
</head>

<body>
<%String compagnia = request.getParameter("compagnia");

if(request.getParameter("pagina")=="scelta_compagnia")
{out.println("Benvenuto alla pagina della compagnia di volo: " + compagnia);}
else
{out.println("Bentornato alla pagina della compagnia di volo: " + compagnia);} %>
</body>

</html>


Qualcuno mi spiega perchè la JSP stampa sempre quello che sta nell'else nonostante la condizione verificata sia quella nell'if?

Grazie.

anx721
12-04-2006, 12:27
if(request.getParameter("pagina").equals("scelta_compagnia"))
...

boysna
12-04-2006, 17:34
Ho risolto, grazie mille!!!
Ora ho un altro problema. Ho un file xml e sto scrivendo una classe java per accederci.

Questo è l'xml:


<database>
<volo>
<compagnia>Alitalia</compagnia>
<partenza>Nap</partenza>
<destinazione>rom</destinazione>
<tipo>scalo</tipo>
<oraPartenza>11</oraPartenza>
<minutiPartenza>40</minutiPartenza>
<postiBusiness>300</postiBusiness>
<postiEconomy>14</postiEconomy>
<prezzoBusiness>200</prezzoBusiness>
<prezzoEconomy>100</prezzoEconomy>
</volo>
</database>


Questa la classe per accederci. Ho fatto solo un piccolo metodo cercaVolo che, per ora, mi restituisce il nome del root.

import org.w3c.dom.Document;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import java.io.File;
import java.io.FileNotFoundException;
import javax.xml.parsers.ParserConfigurationException;
import org.xml.sax.SAXException;
import java.io.IOException;
import org.xml.sax.SAXParseException;


public class GestioneDB{

private Document document;
String file = "E:\\Programmi\\Apache Software Foundation\\Tomcat 5.5\\webapps\\appello2\\voli.xml";

//Costruttore
public GestioneDB(){
try{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setValidating(true);
DocumentBuilder builder = factory.newDocumentBuilder();

//Creao un Node che si riferisce al file "voli.xml"
document = builder.parse(new File(file));
}
catch(ParserConfigurationException e){}
catch(SAXException r){r.printStackTrace();}
catch(FileNotFoundException me){}
catch(IOException t){}}


//Metodi
public void cercaVolo(){
Document doc = (Document) document;
System.out.println(doc.getNodeName());
}
}

Ho fatto un test creando un'istanza di GestioneDB e lanciando il metodo cercaVolo ma mi da alcuni errori come: Document is invalid. No grammar found e "Document root element "database", must match DOCTYPE root "null"".

orpheus
12-04-2006, 17:40
La prima cosa che mi salta all'occhio è che il path del file ha un sacco di spazi...dalla quello che ho potuto vedere java e gli spazi nei path non vanno granchè d'accordo..prova a spostare tuo xml in un path senza spazi.

Bahamut Zero
12-04-2006, 18:10
Boysna questo mi pare proprio uguale all'esame di TSW del professor Costagliola o mi sbaglio :D

anx721
12-04-2006, 19:12
Io per l'xml uso la libreria JDom

boysna
12-04-2006, 21:50
Boysna questo mi pare proprio uguale all'esame di TSW del professor Costagliola o mi sbaglio :D

Bravo. Sto cercando di fare le tracce che ha dato in precedenza agli appelli per esercitarmi alla prova del 19 Aprile 2006. Vuoi altre informazioni? :oink:

boysna
12-04-2006, 21:59
La prima cosa che mi salta all'occhio è che il path del file ha un sacco di spazi...dalla quello che ho potuto vedere java e gli spazi nei path non vanno granchè d'accordo..prova a spostare tuo xml in un path senza spazi.
Niente da fare... Ho messo voli.xml in un path senza spazi e poi ho usato l'istruzione "System.getProperty("user.dir")" ma non va. L'errore è sempre lo stesso.
Secondo me l'errore è nel file xml, ma non vedo quale sia. Il file è di una struttura molto semplice.

boysna
12-04-2006, 22:00
Io per l'xml uso la libreria JDom
Sarebbe?

orpheus
13-04-2006, 08:32
Ne provo un'altra...nell'xml c'è l'intestazione o parte diretto col tag database ??

una cosa tipo

<?xml version="1.0" encoding="UTF-8"?>

boysna
13-04-2006, 09:15
Ho messo questo tag ma niente da fare. Comunque puoi cntrollare il codice dela classe GestioneDB se è OK? Ho qualche dubbio in merito.

boysna
13-04-2006, 10:22
Su un esempio che ho viene importato il pacchetto "com.sun.xml.tree.XmlDocument". Ho provato a importarlo ma mi dice che non esiste.
Sarà che c'è bisogno di questo pacchetto?

orpheus
13-04-2006, 10:34
Allora ho provato...sono riuscito a farmi tornare il nome del tag root ossia database.

ho modificato queste righe



factory.setValidating(false);
System.out.println(document.getDocumentElement().getTagName());

boysna
13-04-2006, 10:59
Pare che il documento xml non era valido. Mancava il DOCTYPE. Ma nonostante sia riuscito a validarlo l'errore rimane sempre.

boysna
13-04-2006, 12:06
Ho risolto.
In GestioneDB dovevo mettere builder.setErrorHandler(new MyErrorHandler) dopo l'istruzione: document = builder.parse(new File(file)). E poi creare la classe MyErrorHandler.

Poi ho modificato l'xml mettendo un attributo al "volo", cosi:

<database>
<volo id="sdhfhc">
<compagnia>Alitalia</compagnia>
<partenza>Nap</partenza>
<destinazione>rom</destinazione>
<tipo>scalo</tipo>
<oraPartenza>11</oraPartenza>
<minutiPartenza>40</minutiPartenza>
<postiBusiness>300</postiBusiness>
<postiEconomy>14</postiEconomy>
<prezzoBusiness>200</prezzoBusiness>
<prezzoEconomy>100</prezzoEconomy>
</volo>
</database>


Ora dovrei fare un metodo che va a cercare un elemento attributo che ha come elemento figlio una compagnia data in input come stringa. E ritornare l'id del volo.

Io ho fatto questo:

public void cercaVolo(String compagnia){
Element root = document.getDocumentElement();

//Ciclo sui figli di database
for (int i=0; i<root.getChildNodes().length(); i++ ) {
//Ciclo sui figli di volo
for(int j = 0; j< root.getChildNodes().item(i).getChildNodes().length(); j++){
if(root.getChildNodes().item(i).getChildNodes().item(j).getNodeName()=="compagnia"){
if(root.getChildNodes().item(i).getChildNodes().item(j).getChildNodes(1).getNodeName().isequal(compagnia)){
System.out.println(root.getChildNodes().item(i).getAttribute());
}
}

}
}

}


Purtroppo, come previsto, mi da alcuni errori.
Sopratutto perchè dice che uso metodi che non esistono. Mah...

boysna
13-04-2006, 12:34
Ho risolto il problema dei metodi non trovati. Era il length che si chiama getLength(). Comunque ora lo compila ma mi restituisce un errore di null pointer.
Ecco il codice aggiornato:

public class GestioneDB{

private Document document;
String file = System.getProperty("user.dir") + "\\" + "voli.xml";

//Costruttore
public GestioneDB(){
try{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setValidating(true);
DocumentBuilder builder = factory.newDocumentBuilder();

//Creao un Node che si riferisce al file "voli.xml"
builder.setErrorHandler(new MyErrorHandler());
document = builder.parse(new File(file));

}
catch(ParserConfigurationException e){}
catch(SAXException r){r.printStackTrace();}
catch(FileNotFoundException me){}
catch(IOException t){}}


//Metodi
public void cercaVolo(String compagnia){
Element root = document.getDocumentElement();


//Ciclo sui figli di database
for (int i=0; i<root.getChildNodes().getLength(); i++ ) {
//Ciclo sui figli di volo
for(int j=0; j< root.getChildNodes().item(i).getChildNodes().getLength(); j++){
if(root.getChildNodes().item(i).getChildNodes().item(j).getNodeName()=="compagnia"){
if(root.getChildNodes().item(i).getChildNodes().item(j).getChildNodes().item(1).getNodeName()==compagnia){
System.out.println(root.getChildNodes().item(i).getAttributes());
}
}

}
}

}

boysna
13-04-2006, 17:55
Qualcuno mi dice com'è la struttura ad albero di questo file xml?


<database>
<prodotto id="tre">
<categoria>notebook</categoria>
<marca>Asus</marca>
<modello>3200+</modello>
<quantita>5</quantita>
<prezzo>11</prezzo>
<giornoImmissione>4</giornoImmissione>
<meseImmissione>3</meseImmissione>
<annoImmissione>2006</annoImmissione>
<rata>si</rata>
<numeroRate>24</numeroRate>
</prodotto>
</database>

boysna
13-04-2006, 21:38
Allora ho provato...sono riuscito a farmi tornare il nome del tag root ossia database.

ho modificato queste righe



factory.setValidating(false);
System.out.println(document.getDocumentElement().getTagName());

Chiedo venia. Non ho visto la tua risposta. Comunque grazie mille.
Il problema ora è un altro però. Guarda piu giu. grazie e scusa ancora.

orpheus
14-04-2006, 08:45
La struttura ad albero dovrebbe essere

database ha come figlio prodotto che ha come figli tutti gli altri.

Ma sei obbligato a usare dom? perchè se usi dom4j è molto + semplice la cosa.

Bahamut Zero
14-04-2006, 11:53
Ma sei obbligato a usare dom? perchè se usi dom4j è molto + semplice la cosa.

Il nostro prof. vuole che usiamo JDOM ;)

boysna
14-04-2006, 15:41
Comunque sto capendo jDom.
L'unico problema è che devo usare la classe XmlDocument per scrivere in un file. Ho fatto l'import com.sun.xml.tree.XmlDocument ma non me la trova, come faccio?

boysna
17-04-2006, 00:05
Risolto il problema mi si è ripresentato un altro problema.

Ho creato una servlet:

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;


public class RicercaProdotto extends HttpServlet {

public void doGet (HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

GestioneDB cerca = new GestioneDB();
prodotto p = cerca.cercaProdotto(request.getParameter("marca"), request.getParameter("modello"));
gotoPage("/visualizza_prodotto.jsp?p",request,response);

}

private void gotoPage( String address,
HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
RequestDispatcher dispatcher =
getServletContext().getRequestDispatcher(address);
dispatcher.forward(request,response);
}
}


Come si vede deve richiamare una jsp visualizza_prodotto che è questa:

<HTML><HEAD><TITLE>BENVENUTO</TITLE></HEAD>


<BODY BGCOLOR="white">

<% prodotto p = request.getParameter("p");
out.println(p.getCategoria());
%>



</BODY>
</HTML>


Questa jsp l'ho messa sia sotto E:\Programmi\Apache Software Foundation\Tomcat 5.5\webapps\esercizio che sotto E:\Programmi\Apache Software Foundation\Tomcat 5.5\webapps\esercizio\work\org\apache\jsp che
E:\Programmi\Apache Software Foundation\Tomcat 5.5\webapps\esercizio\WEB-INF\classes
ma continua a darmi errore "HTTP Status 404 - /visualizza_prodotto.jsp"
"description The requested resource (/visualizza_prodotto.jsp) is not available."

Ho notato che sotto E:\Programmi\Apache Software Foundation\Tomcat 5.5\webapps\esercizio\work\org\apache\jsp sono stati creati dei file nome_jsp e nome_jsp.class per ogni jsp chiamata nome. Non so come le ho create. Comunque sono hsp raggiungibili da se,plici link e non dopo l'elaborazione di una servlet


Mi sa che dovrei creare sotto la cartella org/apache/jsp questi file anche per la jsp visualizza_prodotto, ma come faccio?

Bahamut Zero
19-04-2006, 22:21
Com'è andata la prova?Stamattina ero a Fisciano ma ho visto pochi all'appello....postaci le tracce :asd:

boysna
20-04-2006, 11:43
Il tempo era poco.
E ha messo una traccia un po intricata da capire all'inizio.
Comunque la prova era alle 15:00. Se stavi di mattina come hai fatto a vedere il numero di presenti all'appello?

Bahamut Zero
20-04-2006, 16:03
nel senso che sono venuto di mattina.....mi son fumato una sigaretta fuori facendo il giro delle aule x curiosare dalle finestre :asd:

boysna
20-04-2006, 22:36
Si ma l'appello era alle 15:00, non di mattina.

Bahamut Zero
20-04-2006, 23:04
boysna e mammamia e comm stai :asd:

mattina...pomeriggio...e c'ammà fà nu dibbattito mò? :D

boysna
21-04-2006, 09:25
Se la mattina fosse pomeriggio... non so cosa accadrebbe.

Comunque era curiosità...