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

    [JAVA]Applet in web application

    Sto sviluppando un Dynamic Web project java con Eclipse e mi trovo davanti a un problema che non sò risolvere. Questo progetto contiene servlet(contenute nella cartella src/common/) pagine html e jsp(contenute in WebContent). Il progetto richede anche la presenza di applet che interagiscano con le servlet, ma non riesco a far partire nessun tipo di applet, neanche quelel banali! Proprio per capire in cosa sbagliavo ho creato una applet che fa apparire un bottone sfoglia al centro della pagina.
    codice:
    public class UploadApplet extends JApplet {
    	JButton sfoglia;
    	int i;
    	public void init() {
    		
    		
    		Container c = getContentPane();
    		c.setLayout(new FlowLayout());
    		
    		sfoglia = new JButton ("Sfoglia");
    		c.add(sfoglia);
    }
    }
    questo codice java è presente nella cartella src/common/ come tutti gli altri file .java. Tali file vengono compilati nella cartella mybuild/common. Le pagine html che deve caricare l'applet è questa e si trova nella cartella WebContent/

    codice:
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
    <title>Insert title here</title>
    </head>
    <body>
    <applet CODE="mybuild/common/UploadApplet.class" WIDTH=100 HEIGHT=100 ></applet>
    </body>
    </html>
    Ma quando accedo alla pagina prova.html mi viene dato questo errore
    codice:
    caricamento: classe mybuild/common/UploadApplet.class non trovata.
    java.lang.ClassNotFoundException: mybuild.common.UploadApplet.class
    	at sun.plugin2.applet.Applet2ClassLoader.findClass(Unknown Source)
    	at java.lang.ClassLoader.loadClass(Unknown Source)
    	at java.lang.ClassLoader.loadClass(Unknown Source)
    	at sun.plugin2.applet.Plugin2ClassLoader.loadCode(Unknown Source)
    	at sun.plugin2.applet.Plugin2Manager.createApplet(Unknown Source)
    	at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
    	at java.lang.Thread.run(Unknown Source)
    Caused by: java.io.IOException: open HTTP connection failed:http://127.0.0.1:8080/Tesi2/mybuild/...et/class.class
    	at sun.plugin2.applet.Applet2ClassLoader.getBytes(Unknown Source)
    	at sun.plugin2.applet.Applet2ClassLoader.access$000(Unknown Source)
    	at sun.plugin2.applet.Applet2ClassLoader$1.run(Unknown Source)
    	at java.security.AccessController.doPrivileged(Native Method)
    	... 7 more
    Eccezione: java.lang.ClassNotFoundException: mybuild.common.UploadApplet.class
    non capisco xkeeeeee Help please

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

    Re: [JAVA]Applet in web application

    Originariamente inviato da kinguzzo
    codice:
    <applet CODE="mybuild/common/UploadApplet.class" WIDTH=100 HEIGHT=100 ></applet>
    Innanzitutto la classe della applet (e qualunque altra tua classe specifica di cui abbia bisogno) devono ovviamente essere "visibili" dal client. Quindi non possono certo stare sotto WEB-INF o altre cartelle eventualmente protette.

    Poi comunque l'attributo CODE della applet non deve essere un path!!! Deve essere il nome (completamente qualificato se in package) della classe con .class aggiunto al fondo. Es. CODE="com.pippo.Prova.class".

    La locazione fisica dei file .class dipende dalla presenza o meno dell'attributo CODEBASE e se è in un jar (elencato nell'attributo ARCHIVE) o no. E la struttura dei package va comunque sempre "riflessa" nella struttura delle cartelle.

    Supponi questo:
    codice:
    <APPLET CODE="com.pippo.Prova.class" WIDTH="200" HEIGHT="200"></APPLET>
    Non c'è ARCHIVE e nemmeno CODEBASE. Il file .class è quindi "sciolto" nel file-system e non in jar. Il codebase è implicitamente quello della pagina web.

    Se l'URL della pagina è:
    http://blabla.com/tuaapp/prova/applet.jsp

    allora il client andrà a scaricare il file della applet da:

    http://blabla.com/tuaapp/prova/com/pippo/Prova.class

    Ti è più chiaro ora?
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Mh... non sò se ho capito male io ma anche seguendo i tuoi consigli mi esce sempre lo stesso errore. Questa sono le directory del mio progetto (cosi si vede meglio)
    [IMG][/IMG]

    anche scrivendo nel file html

    codice:
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
    <title>Insert title here</title>
    </head>
    <body>
    <applet CODE="common.UploadApplet.class" codebase="mybuild/common/" WIDTH=100 HEIGHT=100 ></applet>
    </body>
    </html>
    la classe non la trova.

    Nella disperazione più totale ho provato anche le combinazioni :

    CODE="mybuild.common.UploadApplet.class" codebase="mybuild/common/"

    CODE="common.UploadApplet.class" codebase="Tesi2/mybuild/common/"

    CODE="mybuild.common.UploadApplet.class" codebase="Tesi2/mybuild/common/"


  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da kinguzzo
    la classe non la trova.
    Il progetto della tua web application non "sa" nulla di applet. Se tu metti un UploadApplet.java sotto i sorgenti della tua web application, esso verrà compilato e messo banalmente sotto una qualche directory di "build" (in classpath sicuramente quando si avvia la webapp), che non è ovviamente "visibile" al client!! (e se fai un WAR, andrà sotto WEB-INF/classes, che altrettanto non è visibile al client)

    Ti conviene creare un altro progetto specifico per la applet, compilare e quindi mettere i file .class necessari (o un jar unico, meglio ancora) nel progetto della tua web application, seguendo i concetti che ho descritto io sopra.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    (messaggio sotto)

  6. #6
    Ok. Abbandono l'idea di fare tutto un progetto. Però ora, dopo aver fatto un altro progetto sempre per creare l'applet banale del bottone che ti ho mostrato prima, dopo aver testato che l'applet funziona (ho creato un file prova.html che ho messo dentro la cartella del file appletprova.class e aprendo il file prova.html mi appare lo stramaledettissimo bottone), dato che lavoro con eclispe ho fatto "export" sul progetto dell'aplet creando un file .jar contenete queste cose:

    applet.jar
    +defaultpackage
    -appletprova.class
    +META-INF
    -MANIFEST.MF

    Vado sul progetto Tesi2 faccio "import" e importo applet.jar. Ora ritorno sul file prova.html (del progetto tesi2) e inserisco

    <applet code="appletprova" archive="appletprova.jar"></applet>

    Risultato



    caricamento: classe appletprova non trovata.
    java.lang.ClassNotFoundException: appletprova
    at sun.plugin2.applet.Applet2ClassLoader.findClass(Un known Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.plugin2.applet.Plugin2ClassLoader.loadCode(Unk nown Source)
    at sun.plugin2.applet.Plugin2Manager.createApplet(Unk nown Source)
    at sun.plugin2.applet.Plugin2Manager$AppletExecutionR unnable.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
    Caused by: java.io.IOException: open HTTP connection failed:http://127.0.0.1:8080/Tesi2/appletprova.class
    at sun.plugin2.applet.Applet2ClassLoader.getBytes(Unk nown Source)
    at sun.plugin2.applet.Applet2ClassLoader.access$000(U nknown Source)
    at sun.plugin2.applet.Applet2ClassLoader$1.run(Unknow n Source)
    at java.security.AccessController.doPrivileged(Native Method)
    ... 7 more
    Eccezione: java.lang.ClassNotFoundException: appletprova

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da kinguzzo
    codice:
    applet.jar
       +defaultpackage
          -appletprova.class
       +META-INF
          -MANIFEST.MF
    <applet code="appletprova" archive="appletprova.jar"></applet>
    Con la struttura appena postata, si evince che appletprova è in un package, che deve essere menzionato nell'attributo CODE (ma non hai letto cosa dicevo prima???).

    Quindi:

    <applet code="defaultpackage.appletprova.class" archive="applet.jar" width="xxx" height="yyy">
    (specifica xxx/yyy)

    E il file jar deve stare nella stessa locazione della pagina, dal momento che il nome nel archive è solo "applet.jar" senza alcun path.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    Allora: L'applet è partita!
    il tag è questo
    <applet code="appletprova" archive= "appletprova.jar" WIDTH=500 HEIGHT=500 ></applet>

    se metto code ="appletprova.class" mi vede appletprova come una directory e class come il file da cercare quindi cerca class.class.

    Inoltre non metto (default package) nel percorso proprio perche essendo quello che crea di default non è un verio e proprio package ma un contenitore fittizio.

    La mossa vincente è stata mettere il file .jar insieme al file .html anche se l'ho dovuto trascinare dentro a mano dato che se lo importi non va li!

    Grazie dell 'aiuto

  9. #9
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da kinguzzo
    il tag è questo
    <applet code="appletprova" archive= "appletprova.jar" WIDTH=500 HEIGHT=500 ></applet>

    se metto code ="appletprova.class" mi vede appletprova come una directory e class come il file da cercare quindi cerca class.class.
    La documentazione ufficiale della Sun dice di mettere .class finale (non lo dico io ....). Anche se da altre parti ho letto che con certi browser potrebbe non essere necessario.

    Originariamente inviato da kinguzzo
    Inoltre non metto (default package) nel percorso proprio perche essendo quello che crea di default non è un verio e proprio package ma un contenitore fittizio.
    Senti .... non so che roba hai fatto: nel sorgente della applet non hai messo all'inizio: package qualcosa; ?? Allora vuol dire che la classe è nel package di "default" e questo significa che nel jar il file .class deve stare direttamente alla "radice", non dentro qualche cartella.

    Se la classe è nel package di default e tu hai messo nel jar il file appletprova.class dentro una cartella qualunque, è sbagliato.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  10. #10
    Altro problemino riguardante le applet. L'applet che sono andato a sviluppare si collega a una servlet e invia una serie di file i cui nomi stanno dentro a un array di stringhe. La mia idea è di creare una connessione per file mettendo nella URL di richiesta di connessione alla servlet il nome che di volta in volta cambia!
    Questo è il codice con cui l'applet si connette alla servlet;
    codice:
    File file=new File(tex[i]);
            		 
           	   		 try
            
            		 {
            	
            
            			 FileInputStream in = new FileInputStream(file);
             
            			 byte[] buf=new byte[in.available()];
            
            			 int bytesread = 0;
            
            			 String nome = nomi[i];
            			 //String nomeURL = URLEncoder.encode(nome,"UTF-8");
            			 String toservlet = "http://localhost:8080/Tesi2/servletupload?n="+nome;
            			 System.out.println(toservlet);
            			 URL servleturl = new URL(toservlet);
            			 URLConnection servletconnection = servleturl.openConnection();
            			 servletconnection.setDoInput(true);
            			 servletconnection.setDoOutput(true);
            			 servletconnection.setUseCaches(false);
            			 servletconnection.setDefaultUseCaches(false);
            			 DataOutputStream out=new DataOutputStream(servletconnection.getOutputStream());
            			 
            			 
            			 while( (bytesread = in.read( buf )) > -1 ){
            				          
            				 out.write( buf, 0, bytesread );
             
            			 }
            
            			 out.flush();
            			 out.close();
            			 in.close();
            			 System.out.println("file inviato");
            
            			 BufferedInputStream inputFromClient = new BufferedInputStream(servletconnection.getInputStream());
    
            			 inputFromClient.close();
            		 }
            		 catch(Exception e1)
            		 {
            			 e1.printStackTrace();
            		 }
    Questo è il codice di ricezione della servlet
    codice:
     try
            {
        	System.out.println("ENTRATO NELLA SERVLET");
           // String fileName = URLDecoder.decode(req.getParameter("nome"),"UTF-8");
            String path = ServletGestioneCartelle.getRoot()+(File.separator)+req.getParameter("nome");// se imposto qui il nome del file a mano il trasferimento file funziona
            System.out.println(path);
         
           
            File yourFile = new File(path);
            FileOutputStream toFile = new FileOutputStream( yourFile );
            DataInputStream fromClient = new DataInputStream( req.getInputStream() );
           
            byte[] buff = new byte[1024];
            int cnt = 0;
                while( (cnt = fromClient.read( buff )) > -1 ) {
                toFile.write( buff, 0, cnt );
            }
            toFile.flush();
            toFile.close();
            fromClient.close();
           
        }
        catch(Exception e)
            {
            e.printStackTrace();
        }
    Il problema è che il parametro nome che metto nella querystring crea un warning nella servlet

    codice:
    13:29:08,000 WARN  [Parameters] Parameters: Character decoding failed. Parameter skipped.
    java.io.CharConversionException: isHexDigit
    	at org.apache.tomcat.util.buf.UDecoder.convert(UDecoder.java:88)
    	at org.apache.tomcat.util.buf.UDecoder.convert(UDecoder.java:49)
    	at org.apache.tomcat.util.http.Parameters.urlDecode(Parameters.java:429)
    	at org.apache.tomcat.util.http.Parameters.processParameters(Parameters.java:412)
    	at org.apache.tomcat.util.http.Parameters.processParameters(Parameters.java:363)
    	at org.apache.catalina.connector.Request.parseParameters(Request.java:2562)
    	at org.apache.catalina.connector.Request.getParameter(Request.java:1060)
    	at org.apache.catalina.connector.RequestFacade.getParameter(RequestFacade.java:355)
    	at common.servletupload.doPost(servletupload.java:37)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    	at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:235)
    	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    	at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:190)
    	at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:92)
    	at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.process(SecurityContextEstablishmentValve.java:126)
    	at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.invoke(SecurityContextEstablishmentValve.java:70)
    	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    	at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:158)
    	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:330)
    	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:829)
    	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:598)
    	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
    	at java.lang.Thread.run(Unknown Source)
    Apparentemente la servlet riceve il parametro "nome" e crea anche il file, ma il file è di 0 byte.
    Il tutto funziona bene se nella servlet imposto a mano il nome del nuovo file. Ho letto in giro che è un problema di codifica dell'URL e quindi ho porvato a fare
    String nomeURL = URLEncoder.encode(nome,"UTF-8"); lato applet
    String fileName = URLDecoder.decode(req.getParameter("nome","UTF-8"); lato servlet
    Sugerimenti?
    Oltre alla query string quale sarebbe secondo voi un altro metodo per passare alla servlet il nome del file da creare di volta in volta?
    GRAZIE
    P.S. sono bene accetti tutti i consigli per migliorare il codice

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.