Creazione servlet

di il
27 risposte

Creazione servlet

Ho creato una servlet creando per prima cosa un nuovo progetto come "Web Application", poi ho selezionato l'application server (GlassFish) e successivamente ho creato nella cartella "Source Packages" una servlet.
Quello che non capisco però è il perchè mandando in esecuzione il progetto in realtà viene aperta la pagina html corrispondente a "index.html" e non alla servlet, mentre se mando in esecuzione la servlet viene aperta la pagina html che corrisponde a quello che ho scritto nella servlet.
Non dovrebbe mandare in esecuzione la servlet anche se mando in esecuzione l'intero progetto?

27 Risposte

  • Re: Creazione servlet

    newutente ha scritto:


    Non dovrebbe mandare in esecuzione la servlet anche se mando in esecuzione l'intero progetto?
    E chi l'ha detto? Di servlet ne puoi avere quante ne vuoi, ciascuna la puoi mappare ad un url-pattern ben preciso.
    Quindi innanzitutto come è mappata la tua servlet?
  • Re: Creazione servlet

    Si effettivamente la cosa che ho detto prima non ha alcun senso, posso avere anche più servlet quindi è normale che mandando in esecuzione una servlet venga visualizzato il contenuto html definito all'interno della servlet.

    comunque la servlet l'ho creata automaticamente tramite NetBeans quindi il codice è questo:
    
    public class InvocareServlet extends HttpServlet {
        protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            response.setContentType("text/html;charset=UTF-8");
            try (PrintWriter out = response.getWriter()) {
                out.println("<!DOCTYPE html>");
                out.println("<html>");
                out.println("<head>");
                out.println("<title>Servlet InvocareServlet</title>");            
                out.println("</head>");
                out.println("<body>");
                out.println("<h1>Servlet InvocareServlet at " + request.getContextPath() + "</h1>");
                out.println("</body>");
                out.println("</html>");
            }
        }
    
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            processRequest(request, response);
        }
    
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            processRequest(request, response);
        }
    
        @Override
        public String getServletInfo() {
            return "Short description";
        }
    }
    
    Quando dici di controllare come è mappata ti riferisci al fatto che eseguendo la servlet in questione verrà visualizzata una pagina che conterrà del codice html al pari di un "normale" file html che viene visualizzato tramite il browser?
  • Re: Creazione servlet

    newutente ha scritto:


    Quando dici di controllare come è mappata ti riferisci al fatto che eseguendo la servlet in questione verrà visualizzata una pagina che conterrà del codice html al pari di un "normale" file html che viene visualizzato tramite il browser?
    La mappatura della servlet a uno/più url-pattern si fa o nel web.xml oppure tramite l'annotazione @WebServlet (Servlet 3.0 in avanti)
  • Re: Creazione servlet

    Nel file web.xml il tag <url-pattern> è così definito:
    
    <url-pattern>/InvocareServlet</url-pattern>
    
  • Re: Creazione servlet

    newutente ha scritto:


    nel file web.xml il tag <url-pattern> è così definito:
    
    <url-pattern>/InvocareServlet</url-pattern>
    
    E allora la servlet può essere eseguita solo con l'url

    http://host:porta/nomecontesto/InvocareServlet

    Se chiedi solo
    http://host:porta/nomecontesto

    E c'è un index.html nella context-root, molto probabilmente prende questo (se non hai un <welcome-file-list> nel web.xml o se ce l'hai e specifica <welcome-file>index.html</welcome-file> )
  • Re: Creazione servlet

    Ora mi è più chiaro.

    non ho ben capito però la "suddivisione" delle cartelle all'interno della cartella del progetto.
    Nel momento in cui io creo il progetto per una Web Application vengono create 4 cartelle all'interno di quella del progetto e cioè:
    - Web Pages (con all'interno WEB-INF)
    - Source Packages
    - Libreries
    - Configuration files
    La cartella "Web Pages" contiene i file index.html e, all'interno della cartella "WEB-INF", web.xml.
    Il file index.html rappresenta il codice html che sarà visualizzato di default al momento dell'esecuzione dell'intero progetto, il file web.xml (linkato anche nella cartella "Configuration files") invece permette di definire alcuni parametri relativi alla servlet creata e viene modificato ad ogni creazione di nuove servlet aggiungendo le relative informazioni (nome, url-pattern, ecc.).

    La cartella "Source Packages" contiene i sorgenti creati.

    La cartella "Libreries" contiene le librerie utilizzate dall'applicazione, e al momento della creazione del progetto contiene il JDK e l'application server.

    La cartella "Configuration files" contiene il file "web.xml" e il file "MANIFEST.MF".



    Sono corrette queste considerazioni circa il contenuto della cartella del progetto? Non vorrei aver frainteso qualcosa e portarmi dietro i dubbi sulla struttura di una Web Applcation.
  • Re: Creazione servlet

    newutente ha scritto:


    non ho ben capito però la "suddivisione" delle cartelle all'interno della cartella del progetto.
    La struttura di un web module, cioè una web application che fa uso dei web component di Java EE, è ben delineata dalle specifiche Java EE. A riguardo puoi vedere qui:

    https://docs.oracle.com/javaee/7/tutorial/packaging003.htm

    In particolare vedi la immagine al fondo.

    Quella è la struttura base di come deve essere deployata una webapp impacchettata in un .war oppure "sfusa" cioè spacchettata.

    Mentre invece come è la struttura di un progetto in un IDE .... dipende. Nel senso che la struttura/presentazione del progetto può variare a seconda del IDE e del sistema di build.
    In Eclipse un conto è se fai un "Dynamic Web Project" che è il progetto nativo di Eclipse mentre un altro conto è, sempre in Eclipse, se crei e gestisci il progetto tramite Maven, che ha una struttura parecchio diversa.

    Quindi non ti "fissare" troppo su quello che vedi nel IDE, cerca di capire i concetti di fondo.
  • Re: Creazione servlet

    Faccio una domanda forse banale ma ho bisogno di chiarirmi il dubbio.
    Cosa si intende esattamente con il termine inglese "deploy"? Ok la traduzione dall'inglese ma intendo proprio in questo ambito.
  • Re: Creazione servlet

    newutente ha scritto:


    Cosa si intende esattamente con il termine inglese "deploy"?
    Installare, pubblicare la applicazione all'interno dell'application server/servlet container.
  • Re: Creazione servlet

    Stavo seguendo questo articolo ( http://www.html.it/articoli/servlet-e-multithreading-2 ) e volevo testare la servlet definita nell'articolo attraverso NetBeans utilizzando GlassFish però ho qualche problema, in sostanza non si apre la pagina "logon.html".
    Per prima cosa ho creato il progetto specificando "Web Application" e successivamente ho creato la servlet e la pagina html.
    Questo è il contenuto della directory del progetto:

    upload immagini

    Oltre a capire se ho inserito la servlet e la pagina html nel posto giusto vorrei capire dove inserire questo codice:
    
    <init-param>
      <param-name>sleep</param-name>
      <param-value>10000</param-value>
    </init-param>
    


    nell'articolo dice di specificarlo nel deployment descriptor e io pensavo si riferisse al file "web.xml" ma evidentemente non è così.
  • Re: Creazione servlet

    newutente ha scritto:


    in sostanza non si apre la pagina "logon.html".
    Tutto ciò che metti sotto WEB-INF non è e non può essere visibile "direttamente" dai client. Questo da specifica Java EE.
    Nemmeno se tenti di fare il furbo e metti nel browser un url del tipo http:// ..... /nomecontesto/WEB-INF/blabla , non funziona.

    Mettere pagine html o più tipicamente delle jsp sotto WEB-INF si fa generalmente solo quando a queste pagine ci si arriva tramite un "forward" interno alla webapp (usando il RequestDispatcher).

    newutente ha scritto:


    Oltre a capire se ho inserito la servlet e la pagina html nel posto giusto
    Le servlet tecnicamente possono anche stare nel package di "default" ma se definisci un tuo package è meglio e più chiaro per tutto il resto della applicazione.

    newutente ha scritto:


    vorrei capire dove inserire questo codice:
    
    <init-param>
      <param-name>sleep</param-name>
      <param-value>10000</param-value>
    </init-param>
    
    Si capisce che è un parametro custom per un tempo di sleep. Ma dove e a cosa serve lo puoi sapere solo tu.
    Gli <init-param> sono specifici per ciascuna Servlet/Filter. Esistono anche per il contesto (quindi globali) ma il tag si chiama <context-param> .

    newutente ha scritto:


    nell'articolo dice di specificarlo nel deployment descriptor e io pensavo si riferisse al file "web.xml" ma evidentemente non è così.
    Il Deployment Descriptor (abbreviato tipicamente DD) è proprio appunto il web.xml sotto WEB-INF
  • Re: Creazione servlet

    andbin ha scritto:


    Tutto ciò che metti sotto WEB-INF non è e non può essere visibile "direttamente" dai client. Questo da specifica Java EE.
    Nemmeno se tenti di fare il furbo e metti nel browser un url del tipo http:// ..... /nomecontesto/WEB-INF/blabla , non funziona.

    Mettere pagine html o più tipicamente delle jsp sotto WEB-INF si fa generalmente solo quando a queste pagine ci si arriva tramite un "forward" interno alla webapp (usando il RequestDispatcher).
    si effettivamente riflettendo nella cartella WEB-INF sono presenti le classi lato server, i file .jar di librerie usate dalle classi lato server e i descrittori .xml.
    quindi deduco che la pagina html va messa sotto Web Pages.

    andbin ha scritto:


    Gli <init-param> sono specifici per ciascuna Servlet/Filter. Esistono anche per il contesto (quindi globali) ma il tag si chiama <context-param> .
    ma quindi quel parametro va inserito tra i tag che specificano la servlet cioè <servlet>, giusto?
  • Re: Creazione servlet

    newutente ha scritto:


    quindi deduco che la pagina html va messa sotto Web Pages.
    Ovunque sia utile sotto la context-root ... eccetto appunto WEB-INF

    newutente ha scritto:


    ma quindi quel parametro va inserito tra i tag che specificano la servlet cioè <servlet>, giusto?
    <servlet>
      <servlet-name>  ......  </servlet-name>
      <servlet-class>  ......  </servlet-class>
    
      <init-param>
        <param-name>sleep</param-name>
        <param-value>10000</param-value>
      </init-param>
    </servlet>
    Poi si legge il parametro "tipicamente" nel init() della Servlet sfruttando il ServletConfig con il suo getInitParameter .
  • Re: Creazione servlet

    Comunque vorrei cercare di capire bene come funziona una Web Application.
    nell'articolo linkato c'è scritto questo:
    Salviamo la nostra pagina HTML come “logon.html” ed effettuiamo il deploy della servlet sul nostro application server (ad esempio, Tomcat), avendo cura di specificare nel deployment descriptor il seguente parametro di inizializzazione:
    
    <init-param>
      <param-name>sleep</param-name>
      <param-value>10000</param-value>
    </init-param>
    
    secondo me una volta salvata la pagina (dentro Web Pages), creata la servlet (dentro Source Packages) e modificato il file web.xml bisogna avviare la pagina html creata.
    in questo modo parte l'application server (nel mio caso GlassFish) che non fa altro che "collegare" la pagina html con il file web.xml, che "conosce" la servlet, e da lì inizia l'esecuzione della servlet.
    Come analisi è corretta? Faccio questa domanda perchè ho qualche difficoltà a capire proprio quello che accade nel momento in cui viene lanciato il progetto e parte l'application server.


    EDIT: la lettura del parametro ora mi è più chiara, grazie. volevo capire però se in generale l'analisi fatta è ok.
Devi accedere o registrarti per scrivere nel forum
27 risposte