Problemi con il salvataggio dei dati su PDF da servlet

di il
4 risposte

Problemi con il salvataggio dei dati su PDF da servlet

Buonasera a tutti,
Ho un problema con il mio progetto Dynamic Web.
L'esercitazione che mi è stata assegnata prevede la creazione di una pagina jsp iniziale ,chiamata index.jsp, contenente un tasto di tipo submit che,al click dell'utente, fa partire una servlet che carica semplicemente dal database i dati di alcuni studenti presentandoli in una tabella nella pagina elenco.jsp. E fin qui funziona tutto correttamente.
Sotto la tabella con i risultati degli studenti, vi è un tasto di tipo submit che si collega alla seguente servlet che serve per salvare i risultati in un file PDF:
package it.meucci;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import it.meucci.PDFmanager;
/**
 * Servlet implementation class ServletPDF
 */
@WebServlet("/pdf")
public class ServletPDF extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public ServletPDF() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String nome= request.getParameter("nome");
		System.out.println(nome);
		PDFmanager pdf=new PDFmanager();
		pdf.writeStudents();
		pdf.saveAndClose(nome);
		response.sendRedirect("Elenco.jsp");
	}

}
Per fare ciò, la servlet richiama i metodi della seguente classe, chiamata PDFmanager:

package it.meucci;
import java.io.IOException;
import java.util.ArrayList;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.font.PDFont;
import org.apache.pdfbox.pdmodel.font.PDType1Font;
import it.meucci.dbManager;

public class PDFmanager {
	private PDDocument document;
	private PDPage page;
	private dbManager db;
	
	public PDFmanager() {
		System.out.println("sonoqui");
		db=new dbManager();
		// Creo documento vuoto
		document = new PDDocument();
		// Creo una nuova pagina bianca da aggiungere al documento
		page = new PDPage();
		document.addPage(page);
	}
	
	public void writeStudents() {
		//vengono caricati i dati del database nel vettore
		ArrayList<Studente>studenti=db.studenteLoad();
		System.out.println("ciao sto scrivendo");
		try {
			// Creo in nuovo oggetto font e imposto il carattere
			PDFont font = PDType1Font.HELVETICA_BOLD;
			          
			// Instanzio un nuovo stream che contiene l'oggetto creato
			PDPageContentStream contentStream 
			  = new PDPageContentStream(document, page);
			
			// Definisco un flusso di contenuti di testo utilizzando 
			// il carattere selezionato, spostando il cursore
			          
			contentStream.beginText();
			contentStream.setFont(font, 12);
			contentStream.moveTextPositionByAmount(100, 700);
			contentStream.drawString("STUDENTI");
			for(int i=0;i<studenti.size();i++) {
				contentStream.drawString(studenti.get(i).getCognome());
			}
			contentStream.endText();
			          
			// Chiudo lo stream
			contentStream.close();

		}catch (Exception e) {
			System.out.println("Errore: errore nella scrittura del file");
		}
		
	}
	
	public void saveAndClose(String nomeFile)  {
		try {
			System.out.println("ciao sto salvando");
			// Salvo il documento
			document.save(nomeFile+".pdf");
			System.out.println("Salvato");
			//Chiudo il documento
			document.close();
			
		}catch (Exception e) {
			System.out.println("Errore:File non salvato");
		}
	
	}
	
	
	
	public static void main(String[] args) {
		//TEST
		PDFmanager pdf=new PDFmanager();
		pdf.writeStudents();
		pdf.saveAndClose("ou");

	}

}
Il problema è il seguente: se eseguo la classe PDFmanager, usando il main per fare il test, i metodi funzionano tutti correttamente e mi ritrovo il file PDF con tutti i risultati nella root del progetto; se invece eseguo tutti i passaggi, partendo dall'index.jsp ed arrivando alla servlet che dovrebbe salvarmi il file, esegue tutti i metodi, ma evidentemente non salva niente nella root del progetto.
Come potete notare, ho inserito alcuni system.out per vedere se la servlet accedeva ai metodi della classe, cosa che effettivamente succede.
Come potrei risolvere? Qualcuno mi potrebbe dare alcune dritte, considerando che sono una studentessa di quinto superiore e sto ancora imparando?

4 Risposte

  • Re: Problemi con il salvataggio dei dati su PDF da servlet

    Whalien52 ha scritto:


    Il problema è il seguente: se eseguo la classe PDFmanager, usando il main per fare il test, i metodi funzionano tutti correttamente e mi ritrovo il file PDF con tutti i risultati nella root del progetto; se invece eseguo tutti i passaggi, partendo dall'index.jsp ed arrivando alla servlet che dovrebbe salvarmi il file, esegue tutti i metodi, ma evidentemente non salva niente nella root del progetto.
    Partiamo da una questione: il nome/percorso del file dipende dal valore del parametro chiamato "nome". Non è un buon approccio che il client debba passare al server il nome di un file da scrivere sul server ma .. trattandosi di una esercitazione accettiamolo pure.

    Comunque cosa viene passato realmente (lo sai tu sicuramente) in quel parametro? Passa un percorso "assoluto" o "relativo"? Se è relativo, lo è rispetto alla directory "corrente". Purtroppo nelle web application JavaEE il concetto di "directory corrente" generalmente non è usabile, perché dipende da svariati fattori.

    E poi cosa intendi per "root del progetto"? La cartella principale del progetto dove hai i sorgenti? O la directory che corrisponde alla context-root, cioè quella "mappata" sul url http://host/nomecontesto/ ? (nota la barra /)
    Sono due cose differenti ...
  • Re: Problemi con il salvataggio dei dati su PDF da servlet

    Il parametro "nome" viene preso da un campo di testo della pagina Elenco.jsp in cui l'utente inserisce il nome con cui vuole salvare il file.
    Per root del progetto intendo la cartella principale del progetto dove ho tutto il resto.
  • Re: Problemi con il salvataggio dei dati su PDF da servlet

    Whalien52 ha scritto:


    Il parametro "nome" viene preso da un campo di testo della pagina Elenco.jsp in cui l'utente inserisce il nome con cui vuole salvare il file.
    Per root del progetto intendo la cartella principale del progetto dove ho tutto il resto.
    Se l'utente passa solo es. "documento1" (il saveAndClose aggiunge ".pdf"), questo nome di file è relativo alla directory "corrente" che nelle web application JavaEE, lo ripeto, generalmente/tipicamente NON è usabile poiché "vago" (dipende da vari fattori).

    E comunque quando l'applicazione è in esecuzione, i sorgenti "non contano" più, e la applicazione di per sé non ha alcuna nozione di dove siano i sorgenti (detto in generale).

    Morale: la cosa più semplice, rendi configurabile nella applicazione il percorso assoluto ad una cartella dove vuoi siano salvati i file, poi "appendi" dietro il nome che arriva in input.
  • Re: Problemi con il salvataggio dei dati su PDF da servlet

    Va bene, grazie mille per l'aiuto
Devi accedere o registrarti per scrivere nel forum
4 risposte