# Applet geht in Eclipse abernicht im Browser



## IceTi (4. Apr 2008)

Ich schreibe mir gerade ein Applet mit Eclipse.
Mit dem Eclipse Vorschau Applet Viewer geht auch alles super, doch wenn ich dieses mit einem Browser versuche, dann passiert nicht wenn ich auf meinen "Login Button" drücke, woran könnte das liegen?

Brauchst ihr Code??

DANKE


----------



## Drake (4. Apr 2008)

Nein wir können hellsehen, ist bestimmt ein Rechteproblem


----------



## IceTi (4. Apr 2008)

Rechte Problem könnte sein, da ich aus einer Datei lese. 

EDIT:
Habe es hinbekommen. Ich lese die Usernamen die sich einloggen dürfen aus einer DAtei. Als ich den kompletten Pfad zu dieser Datei angegeben habe ging es!


----------



## IceTi (4. Apr 2008)

hmm Lokal auf meinem PC geht es nun, wenn ich die Sachen auf meinen WebSpace hochlade, wird das Applet wieder nicht geldaen mit:


> java.security.AccessControlException: access denied (java.io.FilePermission http:\iceti.ic.funpic.de\ESE\bin\users.xml read)
> at java.security.AccessControlContext.checkPermission(Unknown Source)
> at java.security.AccessController.checkPermission(Unknown Source)
> at java.lang.SecurityManager.checkPermission(Unknown Source)
> ...



Die Datei habe ich auf 777 gesetzt, woran kann das nun wieder liegen ?


----------



## L-ectron-X (4. Apr 2008)

Signiere das Applet. Anleitung in der FAQ.


----------



## IceTi (5. Apr 2008)

Hmm, so richtig hinbekommen habe ich das nicht.
Wohin muss ich die JAR Datei kopieren und was genau muss hier hin??


if exist *.jar goto key
echo jar-Datei mit angegebenen Parametern erzeugen...
rem --> anpassen!
rem * In diesem Beispiel werden alle .class-Dateien und die Verzeichnisse bilder und etc
rem * mit ins jar-Archiv gepackt.
jar cfmv MeinJar.jar manifest.mf *.class users.xml


Ist das so richtig?


----------



## IceTi (5. Apr 2008)

Habs hinbekommen, danke!


----------



## IceTi (6. Apr 2008)

Nun klappt das leider schon wieder nicht auf dem Webspace.

Auf meinem Lokalen Browser geht es nun.. doch wenn ich das Apllet hochlade findet ihr die DAtei nun wieder nicht.

Wie setzt ich da den richtigen Pfad. IRgendwie setzt er immer den lokalemn Pfad auf meiner Festplatte als Pfad.


----------



## L-ectron-X (6. Apr 2008)

Zeig mal deine HTML-Datei.


----------



## IceTi (6. Apr 2008)

```
<HTML>
<HEAD>
   <TITLE>Applet HTML Page</TITLE>
</HEAD>
<BODY>


<applet archive="MeinJar.jar" codebase="bin" code="Main.class" width="640" height="480">
Aktivieren Sie bitte die Java-Unterstützung für Ihren Browser!
</applet>

</BODY>
</HTML>
```


----------



## L-ectron-X (6. Apr 2008)

Nimm mal für's erste das codebase-Attribut heraus. Das wird nur gebraucht, wenn das Applet auf einem anderen Rechner liegt, als die einbettende HTML-Datei.



			
				IceTi hat gesagt.:
			
		

> doch wenn ich das Apllet hochlade findet ihr die DAtei nun wieder nicht.


Du meinst die XML-Datei? Die musst du über einen Stream ins Applet laden, sonst wird immer auf dem Client-Rechner gesucht, wenn das Applet die Rechte hat.

Zeige auch mal die Ausgabe der Java-Console.


----------



## IceTi (8. Apr 2008)

Genau... die XML Datei.
Wie lade ich die den über einen Stream ins Applet?

Hier die Ausgabe:


> java.io.FileNotFoundException: C:\Dokumente und Einstellungen\***\workspace\Test\bin\users.xml (Das System kann den angegebenen Pfad nicht finden)
> at java.io.FileInputStream.open(Native Method)
> at java.io.FileInputStream.<init>(Unknown Source)
> at java.io.FileInputStream.<init>(Unknown Source)
> ...


----------



## L-ectron-X (8. Apr 2008)

Also, die XML-Datei befindet sich mit im Jar-Archiv? Dann kannst du Folgendes machen:
Um das Maß an Flexibilität und Wiederverwendung zu erhöhen, kannst du dem Applet von außen, also über die HTML-Datei, deine XML-Datei bekannt machen.

```
private BufferedReader reader;
private Vector lines;
private URL url;

//in der init()-Methode
String textfile = getParameter("TextFile");
if(textfile == null) {
   JOptionPane.showMessageDialog(this, "Fehlender Parameter: <param name=\"TextFile\" value=\"[relative URL]\">");
}
```

In der HTML-Datei sieht dann dass applet-Tag so aus:

```
<applet archive="MeinJar.jar" code="MeinApplet.class" width="640" height="480">
<param name="TextFile" value="users.xml">
</applet>
```

Die Datei lädst du dann so ins Applet:

```
//in der init()-Methode
try {
   url = new URL(getCodeBase()+textfile); //die Textdatei befindet sich neben dem Applet
   reader = new BufferedReader(new InputStreamReader(url.openStream()));
         
   String line = null;
   while((line = reader.readLine()) != null) {
      lines.add(line);
   }
}
catch(MalformedURLException e) {
   JOptionPane.showMessageDialog(this, e.getMessage());
}
catch(IOException e) {
   JOptionPane.showMessageDialog(this, e.getMessage());
}
```


----------



## IceTi (8. Apr 2008)

Nun bekomme, wenn ich das Applet aufrufe: 


```
java.lang.NullPointerException
	at Main.init(Main.java:129)
	at sun.applet.AppletPanel.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
java.lang.NullPointerException
	at Main.init(Main.java:129)
	at sun.applet.AppletPanel.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
```


Meine init() sieht so aus:

```
public void init() {
    	
    	String textfile = getParameter("TextFile");
    	if(textfile == null) {
    	   JOptionPane.showMessageDialog(this, "Fehlender Parameter: <param name=\"TextFile\" value=\"[relative URL]\">");
    	}
    	try {
    		   url = new URL(getCodeBase()+textfile); //die Textdatei befindet sich neben dem Applet
    		   reader = new BufferedReader(new InputStreamReader(url.openStream()));
    		         
    		   String line = null;
    		   while((line = reader.readLine()) != null) {
    		      lines.add(line);     <---- ZEILE 129 !!!!!
    		   }
    		}
    		catch(MalformedURLException e) {
    		   JOptionPane.showMessageDialog(this, e.getMessage());
    		}
    		catch(IOException e) {
    		   JOptionPane.showMessageDialog(this, e.getMessage());
    		}

[...]
```

Und in der Klasse Users sieht es so aus:

```
br = new BufferedReader (new FileReader ("users.xml"));
```


----------



## L-ectron-X (8. Apr 2008)

Hast du auch daran gedacht den Vector zu instanziieren?

```
lines = new Vector();
```

Ein wenig mitdenken sollte man schon...
Es handelt sich hierbei um Beispielcode, nicht um eine fertige Lösung.
Du hast dann quasi sämtliche Zeilen deiner XML-Datei in einen Vector eingelesen.
Was du du damit anfängst, musst du selbst wissen.


----------



## IceTi (8. Apr 2008)

Hmmm, wenn ich den Inhalt dann im Vector habe kann ich ja nichts mehr in die Datei schrieben oder?

Außerdem müsste ich dann ca. 10 Methoden umschrieben, wo ich z.B. bestimmte Tags in der DAtei suche und ersetzen. Geht das auch nicht anders?


----------



## L-ectron-X (8. Apr 2008)

Du kannst nichts in eine Jar-Datei schreiben, die in Benutzung ist und auch nicht auf diesem Wege etwas auf den Server schreiben.


----------



## IceTi (8. Apr 2008)

Ja, aber doch einfach in diese Datei?


----------



## L-ectron-X (8. Apr 2008)

Nur, wenn sie nicht in deinem Jar-Archiv ist. Du hast dich dazu bisher nicht geäußert.
Es wäre gut zu wissen, was wo gespeichert ist/werden soll.


----------



## IceTi (8. Apr 2008)

Okay.
Sorry das, dass alles ein bischen schwammig erleutert wurde von mir.

Die Users.xml befindet sich im selben Ordner wie die .class Dateien.
Dort stehen halt die Users drin mit entsprechenden Tags.

Diese Datei muss ausgelsen werden und auch Sachen hinein bzw. gelöscht/geändert werden.


----------



## L-ectron-X (8. Apr 2008)

Und soll die XML-Datei im Internet auf einem Server liegen, oder nur lokal gespeichert werden?


----------



## IceTi (8. Apr 2008)

auf dem server


----------



## L-ectron-X (8. Apr 2008)

Dann kannst sie zwar lesen, aber du kannst nichts drin speichern.


----------



## IceTi (8. Apr 2008)

Und da kann man nichts machen?

Das Apllet liegt auf einem kleinem Webserver auf einem BeckPC.


----------



## Wildcard (8. Apr 2008)

Wenn das Applet darauf schreiben könnte, dann könnte es jeder.
Ein Applet ist nichts anderes als ein paar class Dateien die sich der Client automatisiert runterlädt und lokal ausführt.


----------



## IceTi (8. Apr 2008)

Hmm das is ja doof.
Leider klappt das lesen aus der Datei aber auch nicht... :-(


----------



## L-ectron-X (8. Apr 2008)

Und? Wo ist deine Fehlermeldung, dein Code oder weitere Informationen, die uns helfen dir zu helfen?
Brauchst du noch Hilfe? Ich hab bald keine Lust mehr, dir alles aus der Nase ziehen zu müssen.


----------



## IceTi (8. Apr 2008)

Okay, hier mal einige Informationen:

Alle Dateien (also die *.class,die html-Seite, die users.xml und die *.jat Datei) befinden sich in einem Ordner.

Auf die users.xml Datei greife ich wie folgt zu (einmal zum lesen und einmal zum schreiebn):

```
[...]
      	br = new BufferedReader (new FileReader ("users.xml"));
[...]
    	bw = new BufferedWriter (new FileWriter ("users.xml"));
[...]
```


Wenn ich die html-Seite Lokal auf meinem Notebook ausführe, wo ich auch das Projekt angelgt habe, dann klappt alles, lade ich die Sachen auf einen Webspace kommt folgende Meldung:


```
java.io.FileNotFoundException: users.xml (Das System kann die angegebene Datei nicht finden)
	at java.io.FileInputStream.open(Native Method)
	at java.io.FileInputStream.<init>(Unknown Source)
	at java.io.FileInputStream.<init>(Unknown Source)
	at java.io.FileReader.<init>(Unknown Source)
	at Users.getAnzahlUser(Users.java:136)
	at Users.getAllUser(Users.java:62)
	at Main.init(Main.java:256)
	at sun.applet.AppletPanel.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
java.lang.NullPointerException
	at Main$5.getSize(Main.java:262)
	at javax.swing.plaf.basic.BasicListUI.updateLayoutState(Unknown Source)
	at javax.swing.plaf.basic.BasicListUI.maybeUpdateLayoutState(Unknown Source)
	at javax.swing.plaf.basic.BasicListUI.getPreferredSize(Unknown Source)
	at javax.swing.JComponent.getPreferredSize(Unknown Source)
	at javax.swing.ScrollPaneLayout.layoutContainer(Unknown Source)
	at java.awt.Container.layout(Unknown Source)
	at java.awt.Container.doLayout(Unknown Source)
	at java.awt.Container.validateTree(Unknown Source)
	at java.awt.Container.validateTree(Unknown Source)
	at java.awt.Container.validateTree(Unknown Source)
	at java.awt.Container.validateTree(Unknown Source)
	at java.awt.Container.validateTree(Unknown Source)
	at java.awt.Container.validateTree(Unknown Source)
	at java.awt.Container.validateTree(Unknown Source)
	at java.awt.Container.validate(Unknown Source)
	at sun.plugin.util.GrayBoxPainter.suspendPainting(Unknown Source)
	at sun.plugin.AppletViewer.showAppletStatus(Unknown Source)
	at sun.applet.AppletPanel.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
```


Die HTML-Seite sieht so aus:

```
<HTML>
<HEAD>
   <TITLE>Applet HTML Page</TITLE>
</HEAD>
<BODY>

<center>
<applet archive="MeinJar.jar" code="Main.class" width="640" height="480">
Aktivieren Sie bitte die Java-Unterstützung für Ihren Browser!
</applet>

</center>

</BODY>
</HTML>
```

Signiert habe ich das Applet mit diesem Script von dir (L-ectron-X).
Hmm welceh Infos braucht ihr noch.

Sorry nochmal, werde mich jetzt nicht mehr so doof anstellen.

Danke


----------



## Wildcard (8. Apr 2008)

Wie bereits erwähnt läuft ein Applet auf dem Client Rechner.
new FileReader ("users.xml")
Versucht also eine solche Datei auf dem Client zu öffnen.
Entweder du packst alles zusammen in ein jar, oder du lädst die Datei mit einer URL Connection vom Server.


----------



## IceTi (8. Apr 2008)

Wenn ich das in ein jar packe, kann ich aber trotzdem nicht reinschreiben oder?

Dann kann ich die Datei nur auslesen, oder?


----------



## Wildcard (8. Apr 2008)

genau


----------



## IceTi (8. Apr 2008)

Also wenn ich die Datei ändern möchte, müsste ich diese vom Server runterladen --> etwas reinschreiben und diese dann wieer hochladen.

Einen anderen Weg gibt es nicht!?


----------



## Wildcard (8. Apr 2008)

Du kannst die Datei gar nicht ändern.
Oder wie hast du dir das hochladen vorgestellt?


----------



## IceTi (8. Apr 2008)

Ich weiss es doch auch nicht.
Das stellt mich vor ein ziemlich großem Problem.

Oder wie würdert ihr eine Benutzerverwaltung realisieren (wo man Benutzer löschen, anlegen, bearbeiten kann) ohne die DAten in eine Datei oder Datenbank zu schreiben MIT EINEM APPLET....


----------



## Wildcard (8. Apr 2008)

Mit einem Applet kann man überhaupt keine Benutzerverwaltung realisieren, da es ein Client Programm ist.


----------



## IceTi (9. Apr 2008)

Habe das hier gefunden:


```
How do I let an applet write a file?

Applets loaded into a Java-enabled browser can't write files.

Sun's appletviewer allows applets to write files that are named on the access control list for writing. The access control list for writing is empty by default.

You can allow applets to write to your /tmp directory by setting the acl.write property in your ~/.hotjava/properties file:

	acl.write=/tmp

You can allow applets to write to a particular file by naming it explicitly:

	acl.write=/home/me/somedir/somefile

Use : to separate entries:

	acl.write=/tmp:/home/me/somedir/somefile

Bear in mind that if you open up your file system for writing by applets, there is no way to limit the amount of disk space an applet might use.
```


Nur dann brauche ich diesesn speziellen Sun Applet Viewer wie es aussieht oder ?


----------



## IceTi (9. Apr 2008)

Habe mich nun entschieden das auslesen mit derMEthode von L-ectron-X und dem Vector zu machen, dass schrieben muss ich dann wohl über einen Socket zum Server erledigen.

Eine Frage habe ich da nochmal zu dem Vector bzw. das auslesen der DAtei darüber, kann ich den Vector währenmd der Laufzeit aktuelsierenn oder geht das nur in init() ??

DANKE


----------



## L-ectron-X (9. Apr 2008)

Schreib dir einfach eine Methode, die die Datei im Bedarfsfall ausliest. Den Aufruf der Methode kannst du von Ereignissen abhängig machen. (Button klicken, per Thread nach Ablauf einer Pausenzeit etc.).


----------

