Java servlet precisazione

di il
4 risposte

Java servlet precisazione

Salve amici

sto facendo una web app con Db e che usa javascript e Json.

allora ho un problema...
io ho due metodi ReceiveNickname e ReceiveLoginData
entrambi mi mandano i dati al server in formato Json uno serve per registrare al DB lo user, l'altro per verificare che esiste lo user.
I metodi funzionano ma ho un problema se nel metodo service della servlet li eseguo entrambi
quando faccio la submit l'operazione va in porto a metà, ovvero se schiaccio register nella pagina html mi salva tutto ma mi stampa il messaggio d'errore progettato da me invece che il Json.
vi spiego via codice
    protected void service(HttpServletRequest request,
             HttpServletResponse response) throws ServletException, IOException {
         
             try {
                receiveNickname(request, response);
                receiveLoginData(request,response);
             } catch (ClassNotFoundException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
             } catch (SQLException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
             }
             

commentando uno dei due metodi praticamente a me funziona correttamente....solo che io ho bisogno di entrambi i metodi perchè devo fare due funzioni nella stessa pagina come posso usarli in sequenza??

4 Risposte

  • Re: Java servlet precisazione

    chry1991 ha scritto:


    commentando uno dei due metodi praticamente a me funziona correttamente....solo che io ho bisogno di entrambi i metodi perchè devo fare due funzioni nella stessa pagina come posso usarli in sequenza??
    Se la logica di ciascuno dei due metodi è di "consumare" il body nella request ... ovviamente entrambi non è possibile così come hai fatto.

    Una soluzione banale è leggere lo stream del body e metterlo in un byte[] da passare ai due metodi. Ovviamente devi cambiare le cose. Comunque non è proprio il massimo: innanzitutto sprechi spazio per il byte array. Anche se immagino sia relativamente poco visto che immagino siano pochi dati di "login" o poco altro. Ma la logica di "parsing" del byte[] sostanzialmente la rifaresti in entrambi i metodi (e probabilmente per ottenere dati differenti) e questo non è il massimo.

    Ancora meglio sarebbe "modellare" il contenuto JSON in classi/oggetti (può darsi che già lo fai nei due metodi ... non è evidente dal codice), effettuare la deserializzazione da JSON e passare l'oggetto principale della tua struttura dati a entrambi i metodi. Anche qui devi comunque cambiare le cose.

    Ma ancora meglio sarebbe ragionare su quello che stai facendo: perché hai bisogno di 2 metodi? quale è la differenza concettuale tra "gestire un nickname" e "gestire un login"?
    Cerca di modellare meglio le cose e ti verranno più lineari e sensate!

    Infine, se quello che stai realizzando è sostanzialmente un web service (in stile REST?) allora invece di lavorare a livello di servlet potresti forse meglio utilizzare un apposito framework per web service REST.
  • Re: Java servlet precisazione

    Nel primo receiveNickname

    mando tutte le informazioni che mi servono e creo un oggetto di tipo user da salvare nel mio Database.

    Nel secondo ReceiveLogindata
    mando solo nickname e password e faccio un controllo con una query per vedere se ciò che ho inserito equivale a qualcosa di gia presente nel db.
    Ovviamente entrambi i metodi mandano un Json da cui io poi prendo le info. Nel primo caso se funziona la registrazione, la mia funzione ajax mi stampa il Json scritto in un message, altrimenti in caso di errore stampa ERROR DATA.
    Nella seconda invece in caso di login stampa un alert di login effettuato oppure un messaggio d'errore con scritto credenziali non esistenti o sbagliate.

    ti posto se vuoi il primo metodo che fa ReceiveNickname cosi puoi vedere come è strutturato...se poi vuoi tutta la classe della servlet per aiutarmi posto quella
        private void receiveNickname(HttpServletRequest request, HttpServletResponse response) throws IOException, ClassNotFoundException, SQLException {
              Class.forName("org.postgresql.Driver");
              Connection conn = DriverManager.getConnection("jdbc:postgresql://localhost:5432/mastermind_development","mastermind","secret");
              st = conn.createStatement();
             
             
              try {
              nicknameAsString = request.getParameter("nickname");
              emailAsString = request.getParameter("email");
              passwordAsString = request.getParameter("password");
              repeatAsString = request.getParameter("repeat");
              String json;
             
              if (nicknameAsString == null && emailAsString == null && passwordAsString == null && repeatAsString == null) {
                 json = "{}";
              } else {
                 nickname = nicknameAsString;
                 email = emailAsString;
                 password = passwordAsString;
                 repeat = repeatAsString;
                 User u = new User(nickname,email,password);
                 Map<String, Object> users = new HashMap<String, Object>();
                 users.put("nickname", nicknameAsString);
                 users.put("email", emailAsString);
                 users.put("password", passwordAsString);
                 users.put("repeat", repeatAsString);
                 json = mapToJson(users);
    
                 
           json = format("{\"nickname\": \"%s\", \"email\": \"%s\", \"password\": \"%s\", \"repeat\": \"%s\" }",
              nicknameAsString,emailAsString,passwordAsString,repeatAsString);
             
           
           
                 addUser(u);
           
             
                 }
             
              response.setContentType("application/json");
              response.getWriter().write(json);
              System.out.println(json);
             
              }catch (NumberFormatException e) {
                 response.setContentType("application/json");
                 response.getWriter().write(
                       format("{ \"error\": \"invalid value\" }"));
              }
             
           }
  • Re: Java servlet precisazione

    chry1991 ha scritto:


    ti posto se vuoi il primo metodo che fa ReceiveNickname cosi puoi vedere come è strutturato...
    Scusa ... io avevo capito che il JSON era in input nella request! Invece è in output nella response, almeno per quanto vedo in receiveNickname.

    Usare i parametri in entrambi i metodi ovviamente va bene. Non va bene (ha poco senso) se entrambi i metodi tentano di impostare un content-type e un body in response!

    Quindi ripeto il consiglio: devi "modellare" meglio le cose.
  • Re: Java servlet precisazione

    Il problema è che non riesco a capire come fare....cioè io risolto sto inghippo alla fine dopo posso fare il resto dell'app senza problema....se vuoi ti posto la classe completa e mi puoi dire come modellarla per far si che funzionino entrambi i metodi
Devi accedere o registrarti per scrivere nel forum
4 risposte