Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [JSP] Problema visualizzazione "error page"

    Salve a tutti,
    come da titolo, dopo averle provate tutte non sono riuscito proprio a trovare un modo per far "visualizzare" (sottolineo che il problema è solo nella visualizzazione) a browser la benedetta pagina di errore jsp.

    Spiego meglio, nel dettaglio ho una pagina web, per esempio xxx.jsp, nella quale ho dichiarato in direttiva page:
    codice:
    <%@ page
    language="java"
    errorPage="/resources/error.jsp"
    ...
    %>
    All'interno di questa xxx.jsp ci sono ovviamente diversi contenuti dinamici che vengono elaborati e restituiti da una classe Controller, la quale, in caso di eccezioni si limita a rilanciarle alla jsp chiamante. nella dichiarazione dei metodi del Controller ho quindi per es:
    codice:
    public void metodo() throws RuntimeException{...}
    In fine, la pagina di errore (situata fisicamente all'interno del progetto in /progetto/WebContent/resources/error.jsp) ha una struttura molto semplice tipo questa:
    codice:
    <%@ page
    isErrorPage="true"
    language="java"
    ...
    %>
    ...
    <%application.log("An exception occurred:"+exception.getMessage());%>
    <span>An exception occurred: <%=exception.getMessage()%></span>
    ...

    Bene, il problema sta nel fatto che gli errori vengono catturati, infatti su Console viene stampato il log dell'eccezione avvenuta, ma la pagina di errore non viene renderizzata, ovvero a browser mi viene mostrato lo sfondo della pagina nella quale viene catturata l'eccezione (es quindi lo sfondo di xxx.jsp), come quindi se il browser avesse iniziato a renderizzare xxx.jsp, ma una volta catturata l'eccezione, anzichè venire redirezionato a renderizzare la pagina error.jsp rimanesse invece impallato a metà su xxx.jsp... non so se mi sono spiegato...


    Ho inoltre già provato a vedere se la pagina error.jsp avesse qualche problema ma se la chiamo direttamente tramite url viene renderizzata senza problemi

    L'unica soluzione che ho trovato, sarebbe quella di catturare fisicamente le eccezioni nelle pagine jsp tramite try catch e poi redirezionare "a mano" il browser, quindi facendo una cosa del genere:
    codice:
    try{
    Controller.getInstance().metodo();
    }catch(RuntimeException ex){
    response.sendRedirect("/resources/error.jsp");
    }
    ma non sarebbe una soluzione troppo gradita insomma
    Qualche suggerimento per individuare dove sta il problema?
    Tnx!!!!

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    JSP è tecnologia Java e viene trattato nel forum Java.

    Sposto.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da =IngegnerCane= Visualizza il messaggio
    la pagina di errore non viene renderizzata, ovvero a browser mi viene mostrato lo sfondo della pagina nella quale viene catturata l'eccezione (es quindi lo sfondo di xxx.jsp), come quindi se il browser avesse iniziato a renderizzare xxx.jsp, ma una volta catturata l'eccezione, anzichè venire redirezionato a renderizzare la pagina error.jsp rimanesse invece impallato a metà su xxx.jsp... non so se mi sono spiegato...
    Quando c'è una eccezione, il servlet container cerca di fare un forward alla pagina di errore che hai indicato. La questione generale è che un forward può essere fatto solo se la response non è stata ancora "committata", ovvero se non è stato ancora inviato fisicamente alcun byte al client. Le pagine JSP usano un buffer (la dimensione è specifica per il server ma in genere intorno a 8kbyte). Finché non superi questa soglia, se c'è da fare un forward, viene buttato via il contenuto del buffer e si può passare alla pagina di errore, non avendo ancora inviato fisicamente nulla.
    Se superi tale soglia, il container invia fisicamente i dati al client e il forward non è più possibile (e oltretutto lancia IllegalStateException). D’altronde, se lo facesse sarebbe un macello ... un pezzo di una pagina, un pezzo di un'altra! (ovvero HTML completamente sballato)

    Il buffer si può anche espandere con una semplice direttiva nel <%@ page %> ma .... il tuo approccio non è comunque dei migliori. Le pagine JSP non dovrebbero compiere (né direttamente né indirettamente) della logica di elaborazione che può causare errori.
    Ultima modifica di andbin; 11-12-2015 a 19:21
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    Grazie veramente mille andbin!
    Proprio non la sapevo la cosa del buffer!

    Insomma consigli di gestire le eccezioni direttamente lato Controller anzichè rilanciarle alle jsp chiamanti?

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da =IngegnerCane= Visualizza il messaggio
    Insomma consigli di gestire le eccezioni direttamente lato Controller anzichè rilanciarle alle jsp chiamanti?
    "Nì", nel senso che senza usare framework specifici ma solo Servlet/JSP, l'approccio perlomeno corretto/tipico è quello di far servire la request in prima battuta ad una Servlet, che fa le elaborazioni del caso e poi fa un forward ad una JSP che si occupa solo di presentare i risultati.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Capito, guarda ti dico, nell'ambito del progetto io infatti mi sto dedicando praticamente solamente al presentation layer e proprio per questo sto facendo largo uso di jsp, in quanto tutte le elaborazioni più complesse vengono invece fatte a livello di business logic, che è stata realizzata da un'altro ragazzo, il quale ha messo su vari servizi RESTful.
    Sostanzialmente quindi il mio Controller semplicemente non fa altro che richiamare questi servizi rest, al massimo fa qualche altro controllo o elaborazione veloce e restituisce infine alle jsp tipicamente dei json con i dati/oggetti da presentare, ho diviso in questo modo proprio per avere nelle jsp solamente il codice relativo alla presentazione finale.
    Unica cosa però appunto mi rimane il dubbio ora su come e dove gestire eventuali eccezioni, per capirci, i servizi rest se falliscono per qualche motivo mi restituiscono vari status code http quali 401, 404 ecc ...avevo quindi pensato di catturarli nel Controller e rilanciarli alle jsp che a loro volta li presentavano tramite error page ...mi devo un po rivedere questa cosa

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.