Lotus Notes / Domino Sonstiges > Java und .NET mit Notes/Domino
Probleme mit Applet das auf notes Daten zugreift
qojote:
Hi,
endlich habe ich mal wieder etwas Zeit gefunden um mich mit Java zu beschäftigen und bin total frustriert.
Ich wollte einfach mal versuchen ein Applet zu schreiben das im Notes Client läuft und auf ein Feld im Names zugreift und dessen Value dann anzeigt.
Aber ich bekomm das nicht zum laufen.
Kann mir jemand helfen ??.
Ich poste mal den code aber nicht so genau hinschauen nach dem ganzen probieren ist da viel quatsch drin.
Noch eine andere frage gibt es in java sowas wie einen Alert in Javascript zum debuggen ??
Also hier der code.
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()
{
super.notesAppletInit();
Button q=new Button("1");
add(q);
}
public void notesAppletStart()
{
try
{
//NotesThread.sinitThread();
Session s=this.getSession();
//Session s=NotesFactory.createSession();
db=s.getDatabase("","names.nsf");
dc = db.getAllDocuments();
doc = dc.getFirstDocument();
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)
{
try {
test1=doc.getItemValueString("Lastname");
} catch (NotesException e) {
}
if (test1=="")
{
g.drawString("Hallo",30,70);
}
g.drawString(test1,50,90);
Button b=new Button("ok");
add(b);
}
}
wenn das totaler schrott ist kann mir vielleicht einer zeigen wie es geht.
Danke in voraus.
Qojote
Axel_Janssen:
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:
--- Code: ---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)
--- Ende Code ---
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:
--- Code: ---D:\jMy>javac -target 1.1 viewapplet.java
--- Ende Code ---
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
Axel_Janssen:
ok nach einer wilden und unstrukturierten debug-session (definitiv nicht mehr meine Art) habe ich so etwas wie ein Ergebnis.
--- Code: ---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);
}
}
--- Ende Code ---
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)).
--- Code: --- 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)
--- Ende Code ---
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
--- Code: ---test1=doc.getItemValueString("Lastname");
if (test1=="")
--- Ende Code ---
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
qojote:
Hi,
vielen Dank , daß du dir so eine mühe gemacht hast !!
IDE ist eclipse.
Ich glaub dir ja das applets mist sind aber ich möchte Daten aus verschiedenen Dbs im Notesclient (in einer view) anzeigen.
Leider bin ich dabei an den Notesclient gebunden da viele meiner Jungs die Daten auf Ihren Notebooks haben.
Die ganzen Button und so resultieren aus der ganzen Testerei zuerst hatte ich nur die sachen in der paint Methode stehen als das nicht gefunzt hat hab ich dann mal angefangen zu probieren.
Ich dachte mir eigentlich ich lese die Daten in ein globales array ein und durchlaufe dann in paint eine schleife um sie auszugeben.
Jetzt hab ich was von vectoren gelesen bietet mir das vielleicht Vorteile ??
Nochmals vielen Dank für deine Mühen
Gruß
qojote
qojote:
Nochmal Hi,
ich habs grad nochmal probiert und ich könnt mir echt in den hintern beissen.
Ich hab mich so drauf versteift das der Fehler an Java liegen muß, das ich nicht gemerkt habe das ich vergessen habe erst alle docs aus der Db zu löschen.
gruß
qojote
Navigation
[0] Themen-Index
[#] Nächste Seite
Zur normalen Ansicht wechseln