Hi,
noch einmal die bescheidende Bitte mir zu vertrauen, wenn ich sage, dass Applets eine Technis ist, die sich eben nicht durchgesetzt hat.
Es ist vermutlich leichter eine MVC-Anwendung mit JSP/Servlets auf Tomcat zu schreiben, die über Corba auf einen Notes-Server zugreift, als ein Applet im Notes-Client.
Frage: Welche IDE benutzt du? Ist das WSAD5? Sieht verdammt so aus (vom code).
Aber o.k. ich mag Herausforderungen :-)
Ich habe es mit TextPad und jdk nachkompiliert bekommen. Dafür habe ich notes.jar in den Classpath gesetzt.
Ich habe dann eine nsf auf einem Notes-client 5.08 erstellt und habe dann eine Form erstellt, in die ich eben diese Applet aus dem Filesystem eingebunden habe.
Dann habe ich im Notes-Client Files\Tools (Datei\Wergzeuge) \\ java debug console geöffnet.
Das ist ganz o.k.
Da bekommt man den Stack trace angezeigt.
Debuggen kannst du über WSAD (falls du das benutzt) über den dortigen echt ziemlich guten debugger.
... oder (vermutlich praktikabler, wenn du mit solchen höchst komplexen Dingen wie applets in notes auseinandersetzt) mit System.out.println("ein String");
Das ist dann analog zu alert in javaScript, nur das die Meldungen in die Java-Console geschrieben werden.
ok, hiers stacktrace:
java.lang.ClassFormatError: Bad major version number
at java.lang.ClassLoader.defineClass(ClassLoader.java:219)
at COM.ibm.JEmpower.applet.AppletClassLoader.loadClass(AppletClassLoader.java:144)
at COM.ibm.JEmpower.applet.AppletClassLoader.loadCode(AppletClassLoader.java:263)
at COM.ibm.JEmpower.applet.AppletClassLoader.loadCode(AppletClassLoader.java:357)
at COM.ibm.JEmpower.applet.AppletFrame.runLoader(AppletFrame.java:660)
at COM.ibm.JEmpower.applet.AppletFrame.run(AppletFrame.java:372)
at java.lang.Thread.run(Thread.java:466)
# Applet log: load: class viewapplet.class not found.
java.lang.ClassNotFoundException: viewapplet
at COM.ibm.JEmpower.applet.AppletClassLoader.loadCode(AppletClassLoader.java:359)
at COM.ibm.JEmpower.applet.AppletFrame.runLoader(AppletFrame.java:660)
at COM.ibm.JEmpower.applet.AppletFrame.run(AppletFrame.java:372)
at java.lang.Thread.run(Thread.java:466)
Ja. Das habe ich mir schon gedacht. Weil die Notes-VM eben nur Java1.18 versteht, kann sie mit Java-1.4 nicht viel anfangen.
Es hat also diesen ersten Sicherheitscheck für code schon nicht passiert.
Sieht das bei dir auch so aus ?
Gut. Ich kompiliere so:
D:\jMy>javac -target 1.1 viewapplet.java
also mit -target 1.1 aus der Kommandozeile.
(das müsste auch über wsad gehen, falls du bestätigst das du wsad benutzt kann ich das noch mal nachchecken, wie genau.
Es wird dann nicht zu einer java1.4, sondern zu einer java1.18 Klasse.
ich erhalte eine Sicherheitsmeldung (darf nicht auf irgendwelche llotus.java Pakete zugreifen (wohl ecl-Sache).
Ich bestätige (trust signer)
... und bekomme eine neue Fehlermeldung.
irgendwas mit null-pointer exception.
cu.
sieht nicht schlecht aus.
free-your-mind-from-applet-slavery.
Kommando "Mindestens-eine-JVM > 1.3 "
axel
ok nach einer wilden und unstrukturierten debug-session (definitiv nicht mehr meine Art) habe ich so etwas wie ein Ergebnis.
import lotus.domino.*;
import java.awt.*;
import java.applet.*;
import java.util.*;
/**
* @author Standard
*
* To change this generated comment edit the template variable "typecomment":
* Window>Preferences>Java>Templates.
* To enable and disable the creation of type comments go to
* Window>Preferences>Java>Code Generation.
*/
public class viewapplet extends AppletBase {
Database db;
Document doc;
Session s;
DocumentCollection dc;
String test1;
public void notesAppletInit()
{
System.out.println("notesAppletInit() called");
System.out.println("2");
super.notesAppletInit();
System.out.println("in Init");
Button q=new Button("1");
add(q);
}
public void notesAppletStart()
{
try
{
System.out.println("notesAppletStart() called");
//NotesThread.sinitThread();
Session s=this.getSession();
//Session s=NotesFactory.createSession();
System.out.println("hier");
db=s.getDatabase("","names.nsf");
dc = db.getAllDocuments();
doc = dc.getFirstDocument();
System.out.println("doc.form=" + doc.getItemValueString("form"));
//Button q=new Button(doc.getItemValueString("LastName"));
//add(q);
}
catch (NotesException n)
{
System.out.println("Datenbank oder Session nicht gekriegt");
}
}
public void notesAppletStop()
{
}
public void notesAppletDestroy()
{
}
public void paint(Graphics g)
{
System.out.println("paint() called");
try {
test1=doc.getItemValueString("form");
} catch (NotesException e) {
}
if (test1=="")
{
g.drawString("Hallo",30,70);
}
g.drawString(test1,50,90);
Button b=new Button("ok");
add(b);
}
}
Ich weiss eigentlich nur noch recht wenig über applets.
Es gab offenbar ein Problem, dass du versuchst hast innerhalb von Methode AppletStart(), einen Button einzufügen.
Warum das so ist, ist mir jetzt auch nicht so klar, wg Applet-Life-Cycle-Wissens-Lücken.
Es ist aber schon relativ heftig, dass du in 3 (!) Standard-Life-Cycle-Callback-Methoden Gui-Komponenten anfügst:
- in appletInit()
- in appletStart() // geht nicht
- in paint()
Da solltest du dich für die Zukunft irgendwann auf eine best-practice einigen. :)
Das war die hartnäckigste Fehlermeldung,
(hab ich aus dieser Java-Console (oben beschrieben)).
at sun.awt.windows.WFontMetrics.stringWidth(WFontMetrics.java:160)
at sun.awt.windows.WButtonPeer.getMinimumSize(WButtonPeer.java:26)
at sun.awt.windows.WComponentPeer.getPreferredSize(WComponentPeer.java:128)
at sun.awt.windows.WComponentPeer.preferredSize(WComponentPeer.java:370)
at java.awt.Component.preferredSize(Component.java:1022)
at java.awt.Component.getPreferredSize(Component.java:1003)
at java.awt.FlowLayout.layoutContainer(FlowLayout.java:332)
at java.awt.Container.layout(Container.java:458)
at java.awt.Container.doLayout(Container.java:448)
at java.awt.Container.validateTree(Container.java:519)
at java.awt.Container.validateTree(Container.java:526)
at java.awt.Container.validate(Container.java:501)
at COM.ibm.JEmpower.applet.AppletFrame.run(AppletFrame.java:468)
at java.lang.Thread.run(Thread.java:466)
java.lang.NullPointerException:
at sun.awt.windows.WFontMetrics.stringWidth(WFontMetrics.java:160)
at sun.awt.windows.WButtonPeer.getMinimumSize(WButtonPeer.java:26)
at sun.awt.windows.WComponentPeer.getPreferredSize(WComponentPeer.java:128)
at sun.awt.windows.WComponentPeer.preferredSize(WComponentPeer.java:370)
at java.awt.Component.preferredSize(Component.java:1022)
at java.awt.Component.getPreferredSize(Component.java:1003)
at java.awt.FlowLayout.layoutContainer(FlowLayout.java:332)
at java.awt.Container.layout(Container.java:458)
at java.awt.Container.doLayout(Container.java:448)
at java.awt.Container.validateTree(Container.java:519)
at java.awt.Container.validateTree(Container.java:526)
at java.awt.Container.validate(Container.java:501)
at COM.ibm.JEmpower.applet.AppletFrame.run(AppletFrame.java:553)
at java.lang.Thread.run(Thread.java:466)
Naja die dürfte ja wohl sellbsterklärend sein. Ansonsten hast du deinen Beruf verfehlt.
Quatsch. Eben genau nicht. Von dieser Fehlermeldung kann kein Mensch auf das Problem schliessen: (Problem ist: füge in appletStart() keine Komponenten an!!!)
Ergo haben wir es mit einem SCHEISS-IMPLEMENTIERUNGS-PHÄNOMEN zu tun.
Dieses Phänomen trifft man btw nicht nur bei Lotus kleinem Applet-Horrorladen sondern bei wirklich professionellen Dingen wie z.B. struts oder anderen open-Source-Komponenten-frameworks wo sowieso viel mehr rein investiert wird als bei Lotus.
Ich bin mit kleinschrittigen System.out.println() draufgekommen.
In mir vertrauteren Umgebungen als Notes-Applets arbeite ich damit nicht mehr.
Aber wie gesagt, du hast bei Notes5 immer das dicke Problem, dass es nicht Java2 ist.
Der Rest waren Standard-Probleme von Java-Anfängern:
Dein code fand ein Dokument vom Typ "local" also kein "person" oder hiess es "people" ? Ein Personendokument hast du erwartest (Abfrage auf das Feld "Lastname").
Ausserdem fragst du einmal auf "Lastname" und ein anderesmal auf "lastName" ab (oder so ähnlich). Java ist case-Sensitiv.
Erschwerend kam hinzu, dass es in Dokumenten von der form "local" offenbar weder "lastName" noch "Lastname" als Feld gibt.
Wenn du dann mit
test1=doc.getItemValueString("Lastname");
if (test1=="")
kommst.
--> wird eine NullPointerException geworfen.
test1 ist null, wenn es das Feld nicht gibt.
also
if (test1 == null) // müsste so sein, habs aber nicht ausprobiert.
ehem. Und test1 == "" ist auch keine gute Idee.
Es müsste test1.equals("");
heissen.
Aber das ist eine lange Geschichte.
Also:
Notes und Applets ist wirklich eine frustrierende Sache.
Greif besser mit Swing-Clients auf Notes zu.
Das ist einfacher.
gruss axel
Leider bin ich dabei an den Notesclient gebunden da viele meiner Jungs die Daten auf Ihren Notebooks haben.
quojote,
ich hab ein Problem:
Die sitzen also disconnected an ihren NoteBook und die Applets versuchen auf andere Datenbanken zuzugreifen?
Haben die sich diese NSFs auch repliziert???
Es sieht von weiten für mich so aus, als wolltest du irgendwie Logik von dem Server auf die Clients verlagern.
Handelst du dir damit nicht einen Sack von Problemen ein?
Ich meine: Das Applets und auch sowas wie activeX nicht so einen tollen Erfolg hatten, serverseitige Technologien wie z.B. ASP, Servlets/JSP schon hat Gründe, die v.a. auch mit Synchronisierungsproblemen bei zuviel client zu tun haben...
Ich dachte mir eigentlich ich lese die Daten in ein globales array ein und durchlaufe dann in paint eine schleife um sie auszugeben.
Du willst doch Ansichten emulieren, oder?
Ansichten aus verschiedenen Datenbanken?
Eine sehr gebräuchliche straight forward Lösung wäre es wenn du die einzelnen Datensätze (Dokumente) als Objekte behandelst die du in Vektoren packst.
Also nehmen wir an du brauchst eine Ansicht "Leute" mit den Spaltenwerten "Name", "Vorname", "Geburtstag".
Dann machst du in Eclipse eine Klasse:
LeuteVO (vo für value-object :-) ) in Paket data.
da schreibst du dann einfach 3 private properties rein.
private String name;
private String vorName;
private Date geburtsTag;
Highlighte nun 1 dieser 3 Eigenschaften in der rechten gliederungs-Perspektive. Rechte Maustaste.
Da gibt es den berühmten "generate Setter and getter"-Trick. Draufklicken (generate getters and setters ist irgendwo im Kontextmenü) und einfach alles anhaken. Das ist v.a. auch OO mässig cool. Du kannst jetzt auf die 3 Eigenschaften mit settern und gettern zugreifen.
dann tust du da noch eine static factory-Methode rein:
public static LeuteVO initialize (String name, String vorName, Date date) {
LeuteVO leuteVO = new LeuteVO();
leuteVO.name = name;
leuteVO.vorName = vorName;
leuteVO.geburtsTag = date;
return leuteVO;
}
// und weil du schlau bist überschreibst du auch die toString() Methode.
public String toString() {
return "name=" + name + "\nvorName=" + vorName + "\geburtsTag=" + geburtsTag;
}
Wenn du nun die Daten aus Notes ausliest, kannst du das etwa so in die LeuteVO packen. Die LeuteVO packst du in den Vector.
(der Zugriff auf die Notes-Klassen geht vermutlich anders, bin jetzt zu faul da nachzugucken, ist dummy-code.
Vector vecLeute = new Vector();
//do notes view stuff
Document doc = view.getFirstDocument();
while (doc != null) {
Document doc = view.getDocument();
// calling static factory-method.
LeuteVO leuteVO = LeuteVO.initialize (doc.getStringItemValue("name"), doc.getStringItemValue("vorName"), doc.getDateItemValue("date"));
vecLeute.addElement(leuteVO);
doc = vw.getNextElement(doc);
}
// zum Spass mal am Ende ausdrucken....
System.out.println("vecLeute=" + vecLeute);
... so und später willst du das zwischengespeicherte auslesen.
geht dann so:
displayData() {
LeuteVO leuteVO = null;
for (Enumeration el=vecLeute.elements(); el.hasMoreElements(); ) {
// casting notwendig....
leuteVO = (LeuteVO)el.nextElement();
showInUI(leuteVO.getName());
showInUI(leuteVO.getVorname));
showInUI (leuteVO.getGeburtsTag());
}
// wobei showInUI geschrieben werden müsste.
Ich hoffe das hilft dir weiter.
Wie gesagt, überleg dir ob es nicht vielleicht eine andere Lösung gibt.