Riprendere il controllo dopo Servlet

di il
4 risposte

Riprendere il controllo dopo Servlet

Ho preparato un'applicazione che richiede un codice in una pagina html, con un bottone lancia una servlet parametrizzata che si collega ad un database mysql, qui tramite una ricerca preleva un campo con il quale compone un url ed esegue una ricerca di immagine in una cartella a livello di WebContent e restituisce un'immagine.
Fin qui tutto ok. Il problema nasce fal fatto che non riesco ad inviare nient'altro alla pagina web dopo l'immagine (che deve restare visibile) e quindi non ho un bottone per tornare indietro o qualunque altra possibilità di rinvio ad una pagine html o jsp.... come posso aggiungere all'immagine un testo cliccabile, un bottone o qualunque altra cosa che mi permetta di proseguire nell'applicazione? Grazie infinite a tutti per un suggerimento.

ecco i due files:
---------------------l'html------------------------------
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Provo Tutto5</title>
</head>
<body>
<form method="get" action="http://localhost:8080/ProveDiServlet/Tutto5?userFiel">
scegli il compositore <input type="text" name="userField"> <br>
<input type="submit" value="Trova il file">
</form>
</body>
</html>
----------------------------- e la servlet----------------------------

import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
@WebServlet("/Tutto5")
public class Tutto5 extends HttpServlet {
private static final long serialVersionUID = 1L;
public Tutto5() { super(); }
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try{
String userName = request.getParameter("userField");
ArrayList<String> array = select(userName);
for(int i = 0; i<array.size(); i++){
String scelto =array.get(i) ;
response.setContentType("image/jpeg"); // see different MIME type
ServletOutputStream sos = response.getOutputStream();// for binary stream of image files
if ( scelto !=null )
{ String relativeWebPath = "/Images";
String absoluteDiskPath = getServletContext().getRealPath(relativeWebPath);
File f = new File(absoluteDiskPath, scelto + ".jpg");
DataInputStream dis = new DataInputStream(new FileInputStream(f));
byte[] barray = new byte[(int) f.length()];
try { dis.readFully(barray); }
catch (Exception e)
{ barray = null; }
finally
{ dis.close( ); }
sos.write(barray); // send the byte array to client
sos.close();
}
}
}
catch (Exception e) {
e.printStackTrace();
}
finally{};
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
public static ArrayList<String> select(String userName) throws Exception{
Connection con = conn();
PreparedStatement statement = con.prepareStatement("SELECT * FROM musica.anagra WHERE key_anagra = " + userName);
ResultSet result = statement.executeQuery();
ArrayList<String> array = new ArrayList<String>();
while (result.next()){
array.add(result.getString("anagra_cognome"));
}
return array;
}
public static Connection conn()throws ClassNotFoundException, SQLException{
try{
// String driver="" ;
// String driver = "{MySQL ODBC 5.6 Driver}";
String url = "jdbc:mysql://localhost:3306/test";
String username = "root";
String password = "administrator";
Class.forName("com.mysql.jdbc.Driver");
Connection connect = DriverManager.getConnection(url, username, password);
// System.out.println("Connected.");
return connect;
}
finally {}
}
}

4 Risposte

  • Re: Riprendere il controllo dopo Servlet

    sergioprogramma ha scritto:


    Il problema nasce fal fatto che non riesco ad inviare nient'altro alla pagina web dopo l'immagine (che deve restare visibile) e quindi non ho un bottone per tornare indietro o qualunque altra possibilità di rinvio ad una pagine html o jsp.... come posso aggiungere all'immagine un testo cliccabile, un bottone o qualunque altra cosa che mi permetta di proseguire nell'applicazione?
    La questione direi (ad occhio) che è posta male. Se la request è fatta per chiedere una immagine e quindi la response contiene lo stream (gif, jpeg o quello che è) della immagine, allora NON puoi inviare altro. Una response contiene una sola cosa: una pagina HTML, un CSS, una immagine. Insomma, un singolo "documento".

    A seguito del submit del form, la response dovrebbe essere una pagina HTML al cui interno metti un tag <img> il cui src farà fare al client (browser) una ulteriore request per ottenere quella immagine che si voleva fornire e in modo che poi appaia nella pagina.
    Funziona così ....


    P.S. bufferizzare l'intero contenuto del file immagine in un byte[] non è di per sé sbagliato. Ma se è appropriato o no chiaramente dipende dalla dimensione della immagine. Se mi parli di immagini di es. 5~10 Kbyte è un conto, può essere accettabile. Se mi parli di immagini di 500 KByte e hai 100 utenti in contemporanea, in quel momento ti sei fumato 50 MByte di heap space solo per questo.
  • Re: Riprendere il controllo dopo Servlet

    Penso di essere un pò "fuori" ... mi sto impegnando, ma vedo che sono abbastanza lontano dala realizzazione del mio obiettivo che è quello di creare dei quiz musicali, con immagini, video e testo interattivo.
    Mi era sembrato che l'uso delle servlet fosse la cosa più attuale da usare, ma vedo che, oltre alla difficoltà, ha anche molte limitazioni...
    Quindi, riassumendo io creo pagine HTML (o jsp) per richiedere i parametri, eseguo delle jsp per collegarmi al database, restituisco il valore alla jsp che invia l'immagine al browser, e nel contempo prepara bottoni e quant'altro per la risposta... e mi dimentico delle servlet... o sbaglio?
  • Re: Riprendere il controllo dopo Servlet

    sergioprogramma ha scritto:


    Mi era sembrato che l'uso delle servlet fosse la cosa più attuale da usare, ma vedo che, oltre alla difficoltà, ha anche molte limitazioni...
    Questa questione non è (tanto) relativa alle Servlet. Riguarda il protocollo HTTP e come viene usato in modo specifico dai browser.
    HTTP è innanzitutto request/response, il client fa 1 request e il server invia 1 response. In generale su HTTP nessuno ti vieterebbe di inviare che so uno zip che contiene più cose o un body con un content-type specifico che contiene più cose in un qualche (tuo) formato.
    Ma i browser NON funzionano così.
    Un browser si aspetta una response con Content-Type "text/html" per HTML (o "application/xhtml+xml" se fosse XHTML) per una pagina web. Si aspetta una singola immagine da una response con Content-Type "image/png", "image/gif" o altri simili.
    Non puoi fare un mix di queste cose: o un documento HTML o un documento CSS o un JS o una immagine, ecc...
    HTTP e i browser funzionano così. Punto.

    Il limite delle Servlet semmai è che sono ad un livello abbastanza "basso" nella gestione di una request HTTP. Ti offrono solo la possibilità di gestire uno dei metodi HTTP tramite un metodo Java ricevendo 2 oggetti: un HttpServletRequest e un HttpServletResponse. Stop.
    Tutto il resto della gestione: validazione, parsing dell'input, generazione della response, ecc... è tutto a tuo carico.

    Esistono framework di più alto livello: Struts, Stripes, Spring, JSF ecc... ma sicuramente sono out-of-scope per te in questo momento.

    sergioprogramma ha scritto:


    Quindi, riassumendo io creo pagine HTML (o jsp) per richiedere i parametri, eseguo delle jsp per collegarmi al database, restituisco il valore alla jsp che invia l'immagine al browser, e nel contempo prepara bottoni e quant'altro per la risposta... e mi dimentico delle servlet... o sbaglio?
    Sbagli. Nessuno ti vieterebbe di servire la request direttamente con una JSP ma è "brutto" e generalmente non si fa.
    Se vuoi fare una gestione perlomeno "pulita" con Servlet/JSP (e ripeto, senza usare framework di più alto livello), il minimo che dovresti fare è:
    - fare in modo che la request venga sempre gestita in prima battuta da una Servlet.
    - la Servlet fa la sua logica di gestione, se ha successo fa X (facendo tipicamente un forward ad una JSP che presenta i dati) altrimenti fa Y (mandando ad esempio uno status-code di errore e/o inviando una pagina HTML di errore)
    - le JSP non contengono logica ma fanno solo da "view", cioè presentazione di informazioni.
  • Re: Riprendere il controllo dopo Servlet

    Grazie! credo di aver capito ... almeno qualcosa. vedo di metterla in pratica e poi post il risultato.
Devi accedere o registrarti per scrivere nel forum
4 risposte