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

    Se HttpServletRequest è un interfaccia...i metodi che fanno?

    Salve,

    Per creare una servlet è necessario passare come argomenti al metodo doGet e/o doPost le interfacce HttpServletRequest ed HttpServletResponse che rappresentano, rispettivamente, la request e la response utili per la comunicazione client/server.

    In Java un'interfaccia è una classe con tutti metodi pubblici (e costanti) astratti che la sottoclasse DEVE implementare.

    Tra i metodi di HttpServletRequest vi è, per esempio, il metodo getMethod() che mi restituisce il nome del metodo HTTP con il quale è stata fatta la richiesta, per esempio GET o POST.

    Detto questo, quando io nella mia servlet uso questo metodo, non lo implemento ma semplicemente lo uso e ottengo il risultato voluto. Com'è possibile ciò se questi altro non è che un metodo astratto (cioè un metodo che non fa niente!)?

    Qualcosa non mi è chiaro...

    Grazie dell'attenzione,
    Matteo.
    Gutta cavat lapidem
    [La goccia scava la pietra]
    ***
    (Ovidio)

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,326
    I metodi doGet() e doPost() ricevono degli oggetti HttpServletRequest... questo significa che loro ricevono qualunque tipo di oggetto che implementi questa interfaccia.
    A loro non interessa sapere qual è la classe reale dell'oggetto, l'importante è che implementino questa interfaccia.

    Questa si chiama "Ereditarietà multipla" in altri linguaggi.

    In buona sostanza, a tali metodi viene passato un oggetto di una classe X (non gliene frega niente a nessuno di quale sia realmente tale classe) che implementa (implementa in tutti i sensi!!) tale interfaccia, quindi i relativi metodi non sono affatto vuoti.


    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
    Non ho capito

    Il concetto di ereditarietà multipla mi è abbastanza chiaro. In pratica, onde evitare casini stile C++, è possibile estendere una sola classe attraverso la parola chiave extends. Se si vuole ereditare qualche altra classe allora si implementano le interfacce, attraverso la parola chiave implement. Le classi implementate devono essere delle interfacce, cioè classi con tutti metodi astratti, metodi cioè in cui c'è solo la firma senza implementazione. Ovviamente le sottoclassi hanno poi l'obbligo di sovrascrivere, e quindi implementare, questi metodi.

    Quello che non capisco è come avviene ciò nelle Servlet. Procedo per gradi, in modo da far capire cos'è che non capisco. Allora:

    1. Se voglio creare una servlet faccio una classe che estende la classe astratta HttpServlet. Questa classe ha tre metodi importanti (service, doGet e doPost) i quali devono essere implementati nella sottoclasse.

    2. Quando il mio Servlet Container, nella fattispecie Tomcat, vede una Servlet chiama prima il metodo init che HttpServlet ha ereditato da GenericServlet; poi service ed infine destroy.

    3. Il metodo service altro non fa che controllare il tipo di richiesta del client e, in caso di corrispondenza, chiama il metodo appropriato.

    Cioè se nel form scrivo:
    Codice PHP:
    <form action="MyServlet" method="GET"
    allora il metodo service dopo un controllo di questo tipo:
    Codice PHP:
    if(method.equals(METHOD_GET)){
       ...
       
    doGet(reqresp);
       ...

    4. Il metodo doGet della classe HttpServlet è implementato in questo modo:
    Codice PHP:
    protected void doGet(HttpServletRequest reqHttpServletResponse resp)
       
    throws ServletExceptionIOException   {
             
    String protocol req.getProtocol();
             
    String msg lStrings.getString("http.method_get_not_supported");
             if (
    protocol.endsWith("1.1")) {
                 
    resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWEDmsg);
             } else {
                 
    resp.sendError(HttpServletResponse.SC_BAD_REQUESTmsg);
             }
       } 
    5. Quando io poi vado ad implementare il mio metodo doGet nella mia Servlet, posso scrivere una cosa di questo tipo:
    Codice PHP:
    public void doGet(HttpServletRequest reqHttpServletResponse resp)
       
    throws ServletExceptionIOException   {
       
       
    resp.setContentType("text/html");
       
    PrintWriter out resp.getWriter();
       
    out.println("Metodo = " +req.getMethod());

    6. La chiamata al metodo getMethod() di HttpServletRequest mi restituisce quindi il metodo con il quale il client ha interrogato la Servlet, cioè GET.
    Ma se vado a vedere nel codice sorgente, l'interfaccia HttpServletRequest ha tutti metodi astratti, tant'è che del metodo getMethod ha solo la firma, cioè:
    Codice PHP:
    public String getMethod(); 
    DOMANDA : Come si spiega allora che nella mia Servlet invece il metodo getMethod effettivamente fa quello che deve fare, chi è che lo implementa?

    Insomma, potrei prenderla come verità rivelata ed usarlo e basta, tanto fa quello che devo fare...ma non mi sembra il modo migliore di impararne il funzionamento

    Grazie per l'attenzione e mi scuso per la prolissità,
    Matteo.
    Gutta cavat lapidem
    [La goccia scava la pietra]
    ***
    (Ovidio)

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,326
    Come ho già detto prima, l'oggetto che viene passato alla doGet() è un oggetto di classe X.
    Da qualche parte esiste una classe (che io non so che classe è e non mi interessa, la chiamo X) così definita:
    codice:
    public class X extends ... implements HttpServletRequest {
       ...
       public String getMethod() {
          return qualcosa;
       }
    }
    Ora, quando viene effettuata una richiesta, nella realtà viene fatto qualcosa del genere:
    codice:
    tuaServlet.doGet(new X(...), new Y(...));
    La risposta alla tua domanda, quindi, diventa: lo implementa la classe X di cui noi non sappiamo niente.

    Per quel che ne so può andar bene anche una HttpServletRequestWrapper (è l'unica classe che implementa l'interfaccia HttpServletRequest, per quanto riguarda la J2EE api).


    E' più chiaro ora?


    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

  5. #5
    Si ora mi è più chiaro
    Forse a volte voglio scavare troppo a fondo...dimenticando che il successo di Java è dovuto, tra le altre cose, proprio alle sue immense librerie di cui mi interessa solo quello che vogliono e quello che danno e non come lo fanno

    Grazie per la pazienza
    Gutta cavat lapidem
    [La goccia scava la pietra]
    ***
    (Ovidio)

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.