Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2003
    Messaggi
    1,258

    compilare Servlet (su ubuntu)

    Ciao a tutti,
    volevo innanzitutto chiedere se apache tomcat, non dovrebbe compilare automaticamente le servlet. A me, a quanto pare no. Entro nella cartella dove c'è il sorgente (/usr/local/apache-tomcat-6.0.35/webapps/app01a/WEB-INF/src/app01a), e do il comando di compilazione (javac ControllerServlet.java), 18 errori perchè non trova le librerie : import javax.servlet.*
    riprovo, con: javac ControllerServlet.java -classpath "/usr/share/java/servlet-api.jar"

    il messaggio è questo:
    codice:
    ControllerServlet.java:42: cannot find symbol
    symbol  : class Product
    location: class app01a.ControllerServlet
                Product product = new Product();
                ^
    ControllerServlet.java:42: cannot find symbol
    symbol  : class Product
    location: class app01a.ControllerServlet
                Product product = new Product();
                                      ^
    2 errors
    riporto il codice sia di ControllerServlet che di Product entrambi presenti nella stessa cartella:

    ControllerServlet.java:
    codice:
    package app01a;
    
    
    
    import java.io.IOException;
    
    import javax.servlet.RequestDispatcher;
    
    import javax.servlet.ServletException;
    
    import javax.servlet.http.HttpServlet;
    
    import javax.servlet.http.HttpServletRequest;
    
    import javax.servlet.http.HttpServletResponse;
    
    
    
    public class ControllerServlet extends HttpServlet {
    
        public void doGet(HttpServletRequest request, 
    
                HttpServletResponse response)
    
                throws IOException, ServletException {
    
            process(request, response);
    
        }
    
    
    
        public void doPost(HttpServletRequest request, 
    
                HttpServletResponse response)
    
                throws IOException, ServletException {
    
            process(request, response);
    
        }
    
    
    
        private void process(HttpServletRequest request,
    
                HttpServletResponse response) 
    
                throws IOException, ServletException {
    
    
    
            String uri = request.getRequestURI();
    
            /*
    
             * uri is in the form of /contextName/resourceName, 
    
             * for example: /app01a/Product_input.action. 
    
             * However, in the case of a default context, the 
    
             * context name is empty, and uri has this form
    
             * /resourceName, e.g.: /Product_input.action
    
             */
    
            int lastIndex = uri.lastIndexOf("/");
    
            String action = uri.substring(lastIndex + 1); 
    
            // execute an action
    
            if (action.equals("Product_input.action")) {
    
                // there is nothing to be done
    
            } else if (action.equals("Product_save.action")) {
    
                // instantiate action class
    
                Product product = new Product();
    
                // populate action properties
    
                product.setProductName(request.getParameter("productName"));
    
                product.setDescription(request.getParameter("description"));
    
                product.setPrice(request.getParameter("price"));
    
                // execute action method
    
                product.save();
    
                // store action in a scope variable for the view
    
                request.setAttribute("product", product);
    
            }
    
    
    
            // forward to a view
    
            String dispatchUrl = null;
    
            if (action.equals("Product_input.action")) {
    
                dispatchUrl = "/jsp/ProductForm.jsp";
    
            } else if (action.equals("Product_save.action")) {
    
                dispatchUrl = "/jsp/ProductDetails.jsp";
    
            }
    
            if (dispatchUrl != null) {
    
                RequestDispatcher rd = request.getRequestDispatcher(dispatchUrl);
    
                rd.forward(request, response);
    
            }
    
        }
    
    }
    Product.java:
    codice:
    package app01a;
    
    
    
    import java.io.Serializable;
    
    
    
    public class Product implements Serializable {
    
        private String productName;
    
    
    
        private String description;
    
    
    
        private String price;
    
    
    
        public String getProductName() {
    
            return productName;
    
        }
    
    
    
        public void setProductName(String productName) {
    
            this.productName = productName;
    
        }
    
    
    
        public String getDescription() {
    
            return description;
    
        }
    
    
    
        public void setDescription(String description) {
    
            this.description = description;
    
        }
    
    
    
        public String getPrice() {
    
            return price;
    
        }
    
    
    
        public void setPrice(String price) {
    
            this.price = price;
    
        }
    
    
    
        public String save() {
    
    
    
            // add here code to save the product to the database
    
    
    
            return "success";
    
        }
    
    }
    che ne pensate?

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: compilare Servlet (su ubuntu)

    Originariamente inviato da Lucked
    Entro nella cartella dove c'è il sorgente (/usr/local/apache-tomcat-6.0.35/webapps/app01a/WEB-INF/src/app01a)
    Mettere i sorgenti .java della webapp stessa (se fossero .java di esempi o altro che l'utente può scaricare è un altro conto!) sotto la context-root (quella superiore a WEB-INF) o più sotto come ad esempio nella WEB-INF è comunque una cosa poco appropriata. I sorgenti della webapp dovrebbero stare altrove.

    Originariamente inviato da Lucked
    e do il comando di compilazione (javac ControllerServlet.java), 18 errori perchè non trova le librerie : import javax.servlet.*
    riprovo, con: javac ControllerServlet.java -classpath "/usr/share/java/servlet-api.jar"
    Se compili "a mano" con javac, devi essere tu a comporre correttamente il classpath. E ci deve essere come minimo di certo il jar della servlet API (quello che hai indicato) ma ... ci devono essere anche le tue classi in classpath! L'errore indica proprio che non sta trovando le tue classi.

    Originariamente inviato da Lucked
    che ne pensate?
    Che stai facendo cose abbastanza "avanzate" senza aver chiaro al 100% il concetto di classpath.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2003
    Messaggi
    1,258
    ho capito anche io l'errore, ma la soluzione? : )

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Lucked
    ho capito anche io l'errore, ma la soluzione? : )
    Supponiamo che vuoi tenere per il momento i sorgenti sotto WEB-INF/src (ripeto: non è molto appropriato ma sorvoliamo ora).

    Per non dover ogni volta passare -classpath a javac, imposta la variabile di ambiente CLASSPATH. Sei su un sistema Linux quindi:

    export CLASSPATH="/usr/share/java/servlet-api.jar:."

    Spero di aver scritto giusto, è da un po' che non uso sistemi Linux.

    Nota il punto finale, indica "directory corrente" e pertanto devi poi stare in /usr/local/apache-tomcat-6.0.35/webapps/app01a/WEB-INF/src

    e fare

    javac app01a/ControllerServlet.java
    ... ecc.. per altri eventuali sorgenti....

    Nota il app01a/ perché hai usato i package, quindi devi appunto stare nella cartella (src) che contiene il package "radice" (app01a).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2003
    Messaggi
    1,258
    Ciao...grazie per il tempo che mi hai dedicato. cosi funziona la compilazione. Metto le due classi in usr/local/apache-tomcat-6.0.35/webapps/app01a/WEB-INF/classes ma non riesco a richiamare Product_input.action pero senza ricevere errori. Infatti cosi facendo: http://localhost:8080/app01a/Product_input.action

    ottengo:

    codice:
    type Exception report
    
    message
    
    description The server encountered an internal error () that prevented it from fulfilling this request.
    
    exception
    
    javax.servlet.ServletException: Wrapper cannot find servlet class app01a.ControllerServlet or a class it depends on
    	org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:470)
    	org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    	org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
    	org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
    	org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
    	org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
    	java.lang.Thread.run(Thread.java:636)
    
    root cause
    
    java.lang.ClassNotFoundException: app01a.ControllerServlet
    	org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1680)
    	org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1526)
    	org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:470)
    	org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    	org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
    	org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
    	org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
    	org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
    	java.lang.Thread.run(Thread.java:636)
    
    note The full stack trace of the root cause is available in the Apache Tomcat/6.0.35 logs.
    questo è il mio web.xml(in usr/local/apache-tomcat-6.0.35/webapps/app01a/WEB-INF):

    codice:
    <?xml version="1.0" encoding="ISO-8859-1"?>
    
    <web-app xmlns="http://java.sun.com/xml/ns/javaee"
    
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    
        version="2.5"> 
    
    
    
        <servlet>
    
            <servlet-name>Controller</servlet-name>
    
            <servlet-class>app01a.ControllerServlet</servlet-class>
    
        </servlet>
    
        <servlet-mapping>
    
            <servlet-name>Controller</servlet-name>
    
            <url-pattern>*.action</url-pattern>
    
        </servlet-mapping>
    
    
    
        <!-- Restrict direct access to JSPs. 
    
             For the security constraint to work, the auth-constraint
    
             and login-config elements must be present -->
    
        <security-constraint>
    
            <web-resource-collection>
    
                <web-resource-name>JSPs</web-resource-name>
    
                <url-pattern>/jsp/*</url-pattern>
    
            </web-resource-collection>
    
            <auth-constraint/>
    
        </security-constraint>
    
    
    
        <login-config>
    
            <auth-method>BASIC</auth-method>
    
        </login-config>
    
    </web-app>

  6. #6
    Utente di HTML.it
    Registrato dal
    Oct 2003
    Messaggi
    1,258
    ah sono riuscito, ora scrivendo il problema mi sono reso conto che:

    <servlet-class>app01a.ControllerServlet</servlet-class>

    cioe dovevo ricreare in classes il percorso classes/app01a/

    perfetto, grazie

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Lucked
    cioe dovevo ricreare in classes il percorso classes/app01a/
    Questo sì, assolutamente (le classi "sciolte" della webapp vanno sotto WEB-INF/classes e soprattutto con i package "riflessi" nei nomi delle cartelle).

    Quello che mi sono dimenticato io di dirti è che potevi anche far andare direttamente i .class nel posto giusto usando l'opzione -d di javac.
    Quindi:

    javac -d /usr/local/apache-tomcat-6.0.35/webapps/app01a/WEB-INF/classes app01a/ControllerServlet.java

    (la classes deve già esistere, le cartelle dei package le crea javac, se necessario)
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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.