PDA

View Full Version : [JAVA]n-esima applet che non si carica


KNX
01-11-2006, 21:44
...per voi però, perchè per me è la prima... :)

ho fatto quest'oggi la mia prima applet ma purtroppo non riesco a visualizzarla nella pagina html a cui l'ho aggiunta.
Praticamente ho creato una classe AppletPanel extends JPanel, il cui costruttore mi "costruisce" un JPanel con alcuni JComponent aggiunti.
Dopodichè nella classe dell'applet (classe in cui c'è la public void init()) ho creato un'istanza di AppletPanel e l'ho aggiunta all'applet tramite la funzione add()...

Posto i codici:

applet
package applet;

import appletPanel.Panel;
import javax.swing.*;

public class Applet extends JApplet
{

public void init()
{
Panel pannelloIscrizioni = new Panel();
this.add(pannelloIscrizioni);
}

}

HTML
Il file .html si trova nella stessa cartella in cui è sita Applet.class

<html>
<head>
<title>Iscrizioni Dietisti</title>
</head>
<body>
<applet code="Applet.class" width=200 height=200> </applet>
</body>
</html>


avviando l'html vedo solamente una X rossa e un messaggio in basso a sinistra del browser che mi dice che è stato impossibile carica l'applet...

cosa devo fare? a me sembra tutto giusto, eppure...

grazie mille in anticipo

andbin
01-11-2006, 21:54
cosa devo fare? a me sembra tutto giusto, eppure...Tutto giusto no .... hai usato un package di nome 'applet'. Quindi: (a) Il file .class deve stare sotto una directory di nome 'applet' (b) Nel file html devi mettere code="applet/Applet.class" (e ovviamente la directory applet deve stare nella stessa directory del html).

KNX
01-11-2006, 22:37
Tutto giusto no .... hai usato un package di nome 'applet'. Quindi: (a) Il file .class deve stare sotto una directory di nome 'applet' (b) Nel file html devi mettere code="applet/Applet.class" (e ovviamente la directory applet deve stare nella stessa directory del html).

Ok ho fatto come mi hai detto, ho modificato l'HTML in questo:
<applet code="applet/Applet.class" width=200 height=200> </applet>

e si il file Applet.class si trova nella stessa directory (E:\Programmazione\Programmi Java\it.casa.form\applet) del file .html...

ho provato ma niente... sempre una X rossa, e la console Java dice:

----------------------------------------------------
caricamento: classe applet/Applet.class non trovata.
java.lang.ClassNotFoundException: applet.Applet.class
at sun.applet.AppletClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.applet.AppletClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.applet.AppletClassLoader.loadCode(Unknown Source)
at sun.applet.AppletPanel.createApplet(Unknown Source)
at sun.plugin.AppletViewer.createApplet(Unknown Source)
at sun.applet.AppletPanel.runLoader(Unknown Source)
at sun.applet.AppletPanel.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.io.FileNotFoundException: E:\Programmazione\Programmi Java\it.casa.form\applet\applet\Applet\class.class (Impossibile trovare il percorso specificato)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(Unknown Source)
at java.io.FileInputStream.<init>(Unknown Source)
at sun.net.www.protocol.file.FileURLConnection.connect(Unknown Source)
at sun.net.www.protocol.file.FileURLConnection.getInputStream(Unknown Source)
at sun.applet.AppletClassLoader.getBytes(Unknown Source)
at sun.applet.AppletClassLoader.access$100(Unknown Source)
at sun.applet.AppletClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
... 10 more

andbin
02-11-2006, 09:45
e si il file Applet.class si trova nella stessa directory (E:\Programmazione\Programmi Java\it.casa.form\applet) del file .html...No, è la directory 'applet' che deve stare nella stessa directory del file html!!! Cioè devi avere una cosa del tipo:
<una directory>
|
+-- file.html
|
+-- applet
|
+-- Applet.classInoltre c'è un'altra cosa importante: tu hai usato un altro package 'appletPanel' con dentro una classe 'Panel' (che suppongo abbia fatto tu). E questa classe/package dove l'hai messa???

Tieni presente una cosa importante: in Java i nomi e la struttura dei package si devono "riflettere" nella struttura delle directory!

KNX
02-11-2006, 16:39
Ok scusa hai ragione ho rispostato l'.html dove mi hai detto tu e questa volta la Console Java ha sputato questo:

java.security.AccessControlException: access denied (java.lang.RuntimePermission accessClassInPackage.sun.jdbc.odbc)
at java.security.AccessControlContext.checkPermission(Unknown Source)
at java.security.AccessController.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkPackageAccess(Unknown Source)
at sun.applet.AppletSecurity.checkPackageAccess(Unknown Source)
at sun.applet.AppletClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at applet.InserimentoDB.<init>(InserimentoDB.java:28)
at appletPanel.Panel$2.<init>(Panel.java:101)
at appletPanel.Panel.<init>(Panel.java:99)
at applet.Applet.init(Applet.java:11)
at sun.applet.AppletPanel.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

ti ringrazio per tutti i consigli e aiuti che mi stai fornendo...

Ecco così vedi com'è composto il tutto:

it.casa.form
|
|----> iscrizioni
| |
| |----> iscrizioni.mdb
|
|----> applet
| |
| |---->applet.class\.java
| |---->inserimentoDB.class\.java
|
|----> appletPanel
| |
| |----> Panel.class\.java
|
|----> Applet.html

andbin
02-11-2006, 16:52
java.security.AccessControlException: access denied (java.lang.RuntimePermission accessClassInPackage.sun.jdbc.odbc)Ma nella tua applet stai cercando di fare qualcosa con i database??? Credo che, per i soliti motivi di sicurezza, qualcosa venga impedito.
Comunque leggi <qui> (http://java.sun.com/developer/onlineTraining/Programming/BasicJava1/dba.html), parla proprio dell'uso di JDBC nelle applet.

KNX
03-11-2006, 12:16
Allora ho spulciato il link (messo ampiamente tra preferiti :)) e...

1)Dato che quando provo ad avviare l'Applet la Console Java mi dice

java.security.AccessControlException: access denied
(java.lang.RuntimePermission
accessClassInPackage.sun.jdbc.odbc )

2)ho fatto come scritto sul sito e cioè ho aperto il Policytool e aggiustato la Policy inserendo il permesso

grant {
permission java.lang.RuntimePermission
"accessClassInPackage.sun.jdbc.odbc";
};

3)Nonostante ciò continua a non aprirmisi e a darmi lo stesso messaggio di errore (la Console Java dico)

4)ho notato però che quando uso il Policytool nel momento in cui creo il nuovo permesso, ho la possibilità di specificare la classe.
Mi spiego con un esempio: accessClassInPackage.<nome package> questo è ciò che il Policytool mi dice, quindi ti chiedo: che package devo specificare quello contenente l'applet, quello contenente le direttive per la connessione al DB o quello contenente il DB stesso (che cmq in realtà nn è un package ma una cartella)?

grazie mille

KNX
03-11-2006, 12:25
aspetta aspetta nuovo sviluppo:
ho dato all'applet il permesso per tutto e tramite l'appletviewer (specificando il nome del file policy) riesco a farla partire ma se apro il .html a cui è annessa ancora una X rossa e stesso messaggio di errore...

appletviewer -J-Djava.security.policy=lucapolicy Applet.html con questo parte

andbin
03-11-2006, 12:36
Eh ... guarda, mi prendi un po' alla sprovvista perchè devo ammettere che delle questioni relative alla sicurezza in Java (policy, ecc...) ne so ancora poco. :(

Comunque una cosa so. Tu passi all'appletviewer un parametro. Questo però vale solo per l'appletviewer. Se vuoi che valga in generale per il runtime delle applet, devi andare in Pannello di controllo -> Java -> Impostazioni runtime applet Java e quindi impostare il parametro per il JRE.
A questo punto credo che valga per tutti i browser che usano quel JRE.

PGI-Bis
03-11-2006, 16:58
Ne saprai anche poco ma c'hai preso in pieno :).

Nella "Console Java", che puoi aprire quando parte il plug-in Java, in alto c'è scritto quale versione del JRE sia usata. Annotala, nel caso tu ne abbia più d'una.

Apri il pannello di controllo di Java, vai nella scheda Java, nella sezione "impostazioni runtime applet java" premi il pulsante "visualizza".

C'è una tabella con i nomi dei JRE installati. Individua quello corrispondente al JRE del plug-in (determinato attraverso la console Java), fai doppio click nella cella della colonna "Parametri runtime Java" e scrivi i valori necessari a caricare il tuo file policy. Occhio alla sintassi. Ad esempio:

java -Djava.security.manager -Djava.security.policy=file:C:/aa aa/bb/cc cc/pgi.policy

C:/aa aa/bb/cc cc/pgi.policy sta per il percorso completo del file con le politiche di sicurezza. Niente apici, anche se il percorso contiene nomi di directory con degli spazi.

Specifica sempre un codebase al tuo grant, giusto per evitare che nel caso in cui dimentichi di eliminare i permessi di sicurezza sperimentali qualcuno faccia porcate con le applet :D.

KNX
07-11-2006, 00:20
siete stati dei grandi tutti e due e vi ringrazio molto per l'aiuto... ;)
dal mio computer adesso, dopo aver passato il file .policy con i dovuti permessi e quindi aver configurato le opzioni runtime delle applet, è tutto ok riesco a visualizzare l'applet e interagire col DB.
Ora dovrei fare il passo successivo e cioè pubblicarla sulla mia pagina web. Per questo diciamo che ho cambiato (nell'HTML della mia pagina web) l'URL dell'applet mettendo quello appropriato, ma neanche a dirlo non riesco a visualizzarla ne sul mio PC ne da quello di una seconda persona.
Il messaggio di errore che compare nella console java è uguale a quello che mi compariva in precedenza:

java.security.AccessControlException: access denied (java.lang.RuntimePermission accessClassInPackage.sun.jdbc.odbc)


Ho pensato allora che:

1) Dovevo cambiare anche l'URL del DB
2) Dovevo altresì cambiare quello del .policy

Per questo vi chiedo:
cosa devo aggiungere a String DBurl "jdbc:odbc:...??????...:<nomeMioDB>" l'URL completo di dove si trova il DB? C'è una sintassi particolare?

grazie mille

KNX
07-11-2006, 11:38
up...

andbin
07-11-2006, 12:49
dal mio computer adesso, dopo aver passato il file .policy con i dovuti permessi e quindi aver configurato le opzioni runtime delle applet, è tutto ok riesco a visualizzare l'applet e interagire col DB.
Ora dovrei fare il passo successivo e cioè pubblicarla sulla mia pagina web. Per questo diciamo che ho cambiato (nell'HTML della mia pagina web) l'URL dell'applet mettendo quello appropriato, ma neanche a dirlo non riesco a visualizzarla ne sul mio PC ne da quello di una seconda persona.
Il messaggio di errore che compare nella console java è uguale a quello che mi compariva in precedenza: Non è necessario cambiare nella pagina HTML l'URL della applet. Cioè basta lasciare ad esempio:

<applet code="applet/Applet.class" ....

Dopotutto ... è relativo alla posizione del file HTML.

Quello che invece sicuramente devi cambiare è il codeBase all'interno del file di policy.

KNX
07-11-2006, 16:46
Quello che invece sicuramente devi cambiare è il codeBase all'interno del file di policy.

Cioè devo andare su Pannello di Controllo --> Java e dirgli, fra i parametri di runtine Java, di cercare il .policy da un'altra parte?

PGI-Bis
07-11-2006, 16:55
CODEBASE è l'attributo che qualifica l'applicazione di un insieme di politiche di sicurezza. E' quello che c'è subito di fianco ai "grant" nei file policy.

In file policy può contenere più insiemi di permessi ognuno dei quali applicabili a diverse categorie di applicazioni, identificate o in base alla provenienza (il codebase) o all'identità del firmatario (nel caso di applicazione certificata) o a entrambi.

Controlla che il grant del tuo file policy in cui sono inseriti i permessi per l'accesso al package sun.* abbia un codebase compatibile con la provenienza dell'applet su internet.

KNX
07-11-2006, 17:55
Allora, ho fatto un pò di confusiona ma adesso rimedio:

1) sto usando il server ftp Tiscali (ftp.tiscali.it)

2) il codice del file .policy presente sul server è: AUTOMATICALLY GENERATED ON Tue Apr 16 17:
:59 EDT 2002
DO NOT EDIT


grant {
permission java.security.AllPermission;

3) sto usando un database MS Access nominato Iscrizioni.mdb

4) questo URL (da passare come parametro a DriverManager.getConnection) è giusto?String msAccessURL = "jdbc:odbc://ftp.tiscali.it/Iscrizioni;user=xxxx;password=xxxx";

5) cosa devo fare per quanto riguarda i driver di connessione? Attraverso questa linea di codice (Class.forName("sun.jdbc.odbc.JdbcOdbcDriver")), da quello che ho potuto capire, carico i driver locali. Come faccio se il mio DB sta appunto su un server, anche i relativi driver per effettuare una connessione con esso devono essere sul server?

grazie mille per essere stati così pazienti, purtroppo mi sono addentrato in una cosa più grande di me... :cry:

PGI-Bis
07-11-2006, 19:40
Io non sono un esperto di access ma non so se sia sufficiente mettere su una macchina il file mdb perchè si possa accedere alla base dati in esso contenuta. Se non vado errato, occorre anche che quel file sia impostato come origine dati (sul server).

Per il file policy, un grant senza niente è un grant in cui il codebase è ALL (da ogni dove).

Trascurando il fatto che prima di applicare quelle particolari politiche di sicurezza che hai realizzato sarebbe consono gridare "sì, fammi male bestia, dai, dai", per far usare al plug-in quelle politiche suicide la sintassi dovrebbe essere:

-Djava.security.policy=ftp:indirizzoftpdelfilepolicy

Dico dovrebbe perchè non so se il sistema vada oltre l'http, in termini di protocollo supportato (la documentazione dice ogni URL valido ma gli esempi trattano di http e file).