PDA

View Full Version : [Java] Problema con Servlet


innaig86
11-09-2007, 12:20
Buongiorno. :D
Ho un problemino con una servlet che dovrebbe generare una pagina rss.
Per generarla devo accedere ad un database mySql e leggere dei dati.

Il problema è: su Internet Explorer 6 non vuole saperne di andare.
Se gli do http://localhost:8080/feed (comando a TomCat per chiamare la servlet), semplicemente non fa niente, ma mi dice nella Barra di Stato: Completato.

Se do lo stesso URL a Firefox, invece, riesco a vedere il risultato (e cioè l'albero dei tag arricchito con i dati)

Da cosa potrebbe dipendere?
Se per rispondermi avete bisogno del codice della servlet lo posto dopo ;)

Grazie.

usernameIsAlreadyInUse
11-09-2007, 12:25
Molto probabilmente è solo un fatto di visualizzazione del browser, vedi se tutti i tag sono ok. Manda il contenuto del file.

innaig86
11-09-2007, 12:40
import java.io.*;
import java.sql.*;
import javax.servlet.ServletException;
import javax.servlet.http.*;

public class feedRSS extends HttpServlet
{
private Connection conn;

//parametri del database
private String myPass = "XXX";
private String myUser = "XXX";
private String myHost = "XXX";
private String myPort = "XXX";
private String myName = "XXX";

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException
{
String channelTitle = "BORGCalendar - Public Calendar";
String channelLink = "";
String channelDescription = "My Public Calendar ...";

PrintWriter out = response.getWriter();

out.println("<?xml version=\"1.0\"?>");
out.println("<rss version=\"2.0\">");
out.println("<channel>");
out.println("<title>" + channelTitle + "</title>");
out.println("<link>" + channelLink + "</link>");
out.println("<description>" + channelDescription + "</description>");

try
{
ResultSet rs = doQuery("SELECT * FROM appointments WHERE (appt_date = CURDATE()) OR (todo = 1);");
ResultSetMetaData rsm = rs.getMetaData();
int colNumber = rsm.getColumnCount();
while (rs.next()){
out.println("<item>");

String t = rs.getString("text");
String subj = "";
String det = "";
if(t == null)
t = "";
int nli = t.indexOf('\n');
if(nli != -1)
{
subj = t.substring(0, nli);
det = t.substring(nli + 1);
} else
subj = t;

for (int i=1; i<= colNumber; i++){
switch (i){
case 1:
out.println("<pubDate>" + rs.getDate("appt_date") + "</pubDate>");
break;
case 5:
out.println("<title>" + subj + "</title>");
out.println("<description>" + det + "</description>");
break;
case 16:
out.println("<category>" + rs.getString("category") + "</category>");
break;
case 13:
if (rs.getInt("todo") == 1){
out.println("<todo>si</todo>");
} else
out.println("<todo>no</todo>");
}
}
out.println("</item>");
}
}
catch(Exception e)
{
e.getMessage();
}
out.println("</channel>");
out.println("</rss>");
out.close();
}

private ResultSet doQuery(String sqlString)
throws Exception
{
Connection conn = connectDB();
Statement stmt = conn.createStatement();
stmt.execute(sqlString);
ResultSet rs = stmt.getResultSet();
return rs;
}

private Connection connectDB()
throws Exception
{
Class.forName("com.mysql.jdbc.Driver");
String myConn = "jdbc:mysql://" + myHost + ":" + myPort + "/" + myName + "?user=" + myUser + "&password=" + myPass + "&autoReconnect=true";
conn = DriverManager.getConnection(myConn);
return conn;
}
}

usernameIsAlreadyInUse
11-09-2007, 12:41
Intendevo il risultato non il codice della servlet...

innaig86
11-09-2007, 12:45
ops...scusa :D
rispetto alle specifiche ho aggiunto il tag <todo>, ma anche senza di quello il problema era uguale..
risultato:

<?xml version="1.0"?>
<rss version="2.0">
<channel>
<title>BORGCalendar - Public Calendar</title>
<link></link>
<description>My Public Calendar ...</description>
<item>
<pubDate>2007-08-07</pubDate>
<title>Questo campo si chiama Subject</title>
<description>Questo sembra una Descrizione</description>

<todo>si</todo>
<category>null</category>
</item>
<item>
<pubDate>2007-08-10</pubDate>
<title>Questo è il secondo appuntametno</title>
<description></description>
<todo>si</todo>
<category>Categoria 2</category>
</item>
<item>

<pubDate>2007-09-11</pubDate>
<title>soggetto dell'11 settembre</title>
<description>descrizione dell'11 settembre</description>
<todo>no</todo>
<category>null</category>
</item>
<item>
<pubDate>2007-09-12</pubDate>
<title>testo del 12 sett</title>
<description>descrizione del 12 sett</description>

<todo>si</todo>
<category>null</category>
</item>
</channel>
</rss>

usernameIsAlreadyInUse
11-09-2007, 13:00
A me lo visualizza anche IE..potresti usare questo http://www.validome.org/rss-atom/validate
per validare il tuo rss.

innaig86
11-09-2007, 13:06
ie versione 6?

usernameIsAlreadyInUse
11-09-2007, 13:09
Si

innaig86
11-09-2007, 13:13
ho fatto una piccola modifica e ora almeno ie inizia a leggerlo... ma si ferma qua

Carattere non valido nel contenuto di testo. Errore durante l'elaborazione della risorsa "http://localhost:8080/feed". Rig...

<title>Questo


credo sia la "e accentata" che gli da problemi..
anche quel validatore mi da errore

Line Column: 15
17 Error: Invalid byte 2 of 3-byte UTF-8-sequence.
to Sourceline 17 Error Position:

<title>Questo

innaig86
11-09-2007, 13:18
ho tolto dal database quella e accentata e ora anche ie me l'ha letto...
ma come faccio se voglio utilizzarle?
come posso impostargli un charset adatto?

innaig86
11-09-2007, 13:39
fatto :D

grazie mille :D

usernameIsAlreadyInUse
11-09-2007, 13:45
Come hai risolto?

innaig86
11-09-2007, 14:06
nel codice della classe, all'inizio, ho messo questo

response.setContentType("text/xml");
out.println("<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>");

che prima mancava..

usernameIsAlreadyInUse
11-09-2007, 14:08
Perfetto!