Gestire l'inserimento di valori nulli in un form di una Servlet

di il
6 risposte

Gestire l'inserimento di valori nulli in un form di una Servlet

Ho una Servlet che mi da questo errore:
HTTP Status 500 – Internal Server Error
Type Exception Report
Message empty String
Description The server encountered an unexpected condition that prevented it from fulfilling the request.
Exception
java.lang.NumberFormatException: empty String
	java.base/jdk.internal.math.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1842)
	java.base/jdk.internal.math.FloatingDecimal.parseDouble(FloatingDecimal.java:110)
	java.base/java.lang.Double.parseDouble(Double.java:543)
	web1.GestioneCoordinate.doPost(GestioneCoordinate.java:28)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:660)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
Note The full stack trace of the root cause is available in the server logs.
Apache Tomcat/9.0.10
Il problema si presenta quando lascio un campo vuoto di un tag input dentro un form e premo invio.
Perché se scrivo questo non risolvo?
public class GestioneCoordinate extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // Verifico l’esistenza di un utente autenticato.
        HttpSession session = request.getSession();
        if (session.getAttribute("UserID")!=null){
            String UserID = request.getParameter("UserID");
            Double Latitudine = null;
            try {
                Latitudine = Double.parseDouble(request.getParameter("Latitudine"));
            }catch (Exception e){
                response.sendRedirect("route.jsp");
            }
route.jsp è ovviamente la pagina in cui è presente il form. In pratica vorrei che la Servlet verificasse l'esistenza di un dato accettabile nel tag input e in caso contrario rimandasse l'utente alla pagina chiamante da cui è partita la richiesta.
Posso lasciare il tag vuoto oppure scrivere un numero con la virgola come 23,567 invece di 23.567 ma in ciascuna delle circostanze questo response.sendRedirect("route.jsp") non parte e non rimanda il browser a route.jsp.
Perché?

6 Risposte

  • Re: Gestire l'inserimento di valori nulli in un form di una Servlet

    Ho risolto ma senza capire al 100% il perché, c'è qualcuno che sta leggendo questa discussione e quindi interessa che continui a scrivere?
  • Re: Gestire l'inserimento di valori nulli in un form di una Servlet

    giannino1995 ha scritto:


                try {
                    Latitudine = Double.parseDouble(request.getParameter("Latitudine"));
                }catch (Exception e){
                    response.sendRedirect("route.jsp");
                }
    
    Se getParameter dà una stringa vuota (""), parseDouble lancia NumberFormatException (funziona così, è ben noto). Con il catch di Exception, quindi si DEVE per forza entrare in quel catch. Non ci sono altre possibilità. Le regole sono regole ...

    Se non ti risulta così ... potresti non aver ricompilato il codice dopo l'aggiunta del catch, o cose del genere. Ripeto: DEVE entrare in quel catch.


    Comunque, riguardo il sendRedirect, se ci sono errori di "validazione" sui parametri di un form, generalmente si fa un "forward" alla pagina JSP del form. Perché scrivendo opportunamente la JSP è possibile rimettere nei campi (e quindi ripresentare all'utente) i dati errati con magari messaggi o colori particolari per evidenziare l'errore (o errori). Con un sendRedirect, tutto questo non sarebbe possibile.
  • Re: Gestire l'inserimento di valori nulli in un form di una Servlet

    Ciao andbin, prima di tutto grazie per la risposta!
    Quello che scrivi è esatto. Il codice entra nel blocco catch ma a non funzionare è proprio response.sendRedirect("route.jsp"). Se scrivo questo invece non ho problemi:
    
    @WebServlet(name = "GestioneCoordinate", urlPatterns = "/coordinate.jsp")
    public class GestioneCoordinate extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            HttpSession session = request.getSession();
            String Errore = "";
            try {
                StringBuilder sb = new StringBuilder("");
                sb.append("<strong>ERRORE:</strong><br>");
                sb.append("Le cause del tuo errore possono essere le seguenti:<br>");
                sb.append("1).Non &egrave; stato inserito alcun valore; <br>");
                sb.append("2).Hai utilizzato la virgola al posto del punto o viceversa;<br>");
                sb.append("3).Hai inserito un valore non accettabile ovvero fuori range;<br>");
                sb.append("4).La tua marca temporale suggerisce una velocit&agrave; di percorrenza troppo elevata.<br>");
                sb.append("Prova a reinserire i dati di input.<br>");
                sb.append("Grazie");
                Errore = sb.toString();
            }catch(Exception g){
                throw new RuntimeException(g);
            }
            if (session.getAttribute("UserID")!=null){
                Double Latitudine = null;
                try {
                    Latitudine = Double.parseDouble(request.getParameter("Latitudine"));
                }catch (Exception e){
                    request.setAttribute("Errore", Errore);
                    request.getRequestDispatcher("route.jsp").forward(request, response);
                }
    
    Come dicevo in precedenza non capisco appunto perché sendRedirect() non funzioni mentre getRequestDispatcher() si. Mi piacerebbe sapere il motivo. Inoltre se uso getRequestDispatcher() l’attributo Errore in “route.jsp” non risulta esistere. Infatti se in route.jsp scrivo:
    
        <%
            if (request.getSession().getAttribute("Errore")!=null){
        %>
        <p class="rosso-porpora"><%= request.getSession().getAttribute("Errore").toString() %></p>
        <% } %>
    
    non visualizzo nulla.
    getRequestDispatcher() non spedisce il browser a route.jsp ma carica route.jsp nella Servlet infatti l’URL è quello della Servlet.
    Usando getRequestDispatcher() in sostanza non riesco ad informare l’utente in merito agli errori che sta commettendo.
    Vorrei appunto colorare di rosso il tag input con la stringa sbagliata e mettere un avviso in fondo alla pagina.
    Sempre grazie
  • Re: Gestire l'inserimento di valori nulli in un form di una Servlet

    giannino1995 ha scritto:


    non capisco appunto perché sendRedirect() non funzioni
    Attenzione ad una cosa, hai messo "route.jsp" come url. Leggi bene la documentazione di che è molto chiara su come tratta l'url se è relativo o assoluto.

    E se vuoi verificare bene cosa succede, usa i developer tools del tuo browser per tracciare la chiamata alla servlet e vedere la response che fornisce il redirect al browser.

    giannino1995 ha scritto:


    Inoltre se uso getRequestDispatcher() l’attributo Errore in “route.jsp” non risulta esistere.
    Qui:
    request.setAttribute("Errore", Errore);

    imposti un attributo nel "request scope".

    Qui:
    request.getSession().getAttribute("Errore")

    cerchi un attributo nel "session scope".

    Sono due scope DIFFERENTI.

    giannino1995 ha scritto:


    getRequestDispatcher() non spedisce il browser a route.jsp ma carica route.jsp nella Servlet infatti l’URL è quello della Servlet.
    Il "forward" infatti è un meccanismo interno al servlet container (il client non ne "sa" nulla). Il redirect invece lo fa il client (browser) cambiando la location.

    giannino1995 ha scritto:


    Usando getRequestDispatcher() in sostanza non riesco ad informare l’utente in merito agli errori che sta commettendo.
    Certo che si può fare ... ma devi ancora imparare di più in questo ambito.
  • Re: Gestire l'inserimento di valori nulli in un form di una Servlet

    Grazie andbin,
    Grazie ai tuoi suggerimenti ho risolto tutto.
    JAVA ha un sistema bellissimo per assegnare le URL relative che non conoscevo!
    Salvavo “Errore” da un’altra parte, qui ero proprio fesso…
    Questo pomeriggio provo a fare altre modifiche e ti faccio sapere.
  • Re: Gestire l'inserimento di valori nulli in un form di una Servlet

    giannino1995 ha scritto:


    JAVA ha un sistema bellissimo per assegnare le URL relative che non conoscevo!
    Java come linguaggio non c'entra. E' la Servlet API che funziona così.

    La documentazione del sendRedirect come detto è chiara: If the location is relative without a leading '/' the container interprets it as relative to the current request URI.
Devi accedere o registrarti per scrivere nel forum
6 risposte