> Inhalt: Entwickeln von Web-Anwendungen mit Java-Server-Faces |
|
Letzte
Bearbeitung dieses Dokuments: |
Voraussetzungen für das Verständnis dieses Dokuments:Keine. |
Ungefährer Zeitbedarf zum Durcharbeiten dieses Dokuments:Dieses
Dokument ist eine Sammlung von möglichen Fehlern und
Hinweisen zu deren Behebung. |
'Verwöhnt' durch die sofortige Syntaxprüfung beim Codieren von Java in Eclipse ist das Codieren von JSF für mich am Anfang eine Quelle von Frust.
Nicht nur Tippfehler sondern auch gewöhnungsbedürftige Konventionen für die Verwendung von 'Properties' (Werten) in den Web-Seiten sind für den Anfang nicht leicht zu findende Ursache für kryptische Fehlermeldungen und nicht gewünschte Ergebnisse.
Auswirkung(en) |
Möglicher Fehler |
Kryptische Meldung beim Aufrufen der verlinkten Web-Seite. [Detailbeschreibung] |
Die Referenz des Links (<a href="xxxx.jsf") zu einer Datei mit JSF-Anweisungen muss die Dateierweiterung '.jsf' haben obwohl die Erweiterung der Datei '.jsp' ist.. [Detailbeschreibung] |
Aufrufen der Folgeseite funktioniert nicht. [Detailbeschreibung] |
In der Datei 'faces-config.xml' sind Tippfehler im XML-Element <navigation-rule>. [Detailbeschreibung] |
Fehlermeldung "Property 'xxx' not found on type package.class" beim Aufrufen einer Seite. [Detailbeschreibung] |
In JSF bestehen sehr strikte Namenskonventionen für die 'Properties' in einer Web-Seite und den zugehörigen get- und set-Methoden. [Detailbeschreibung] |
Kryptische
Meldung beim Aufrufen der 'verlinkten' Web-Seite
Wenn
eine Web-Seite aufgerufen wird erscheint folgende Fehlermeldung
(Ausschnitt):
Diese
Meldung scheint anzuzeigen, dass innerhalb des Bereiches mit den
JSF-Anweisungen ein Fehler existiert.
Mit hoher Wahrscheinlichkeit
wurde aber beim Erstellen des 'Links' in der aufrufenden Seite als
Referenz der 'wirkliche' Dateiname – mit der
Dateinamenerweiterung '.jsp' – verwendet.
Hintergrundinformation:
Wenn
innerhalb einer Web-Site (mehrere Dateien mit Web-Seiten, die
innerhalb der gleichen Datei mit dem Web-Archive (WAR) gepackt sind)
auch Dateien mit Anweisungen für 'Java-Server-Pages' (JSP)
enthalten sind, dann würde durch die Verarbeitung von
JSF-Anweisungen bei den JSP-Dateien ein Fehler auftreten.
Ist
kompliziert zu Beschreiben – probieren Sie es aber einmal aus !
Um
Dateien mit JSF-Anweisungen von Dateien mit JSP-Anweisungen
unterscheiden zu können wird in der Konfigurationsdatei
'web.xml' (im Verzeichnis 'WEB-INF') festgelegt, dass die Klassen für
die Verarbeitung von JSF-Anweisungen nur Dateien mit der
Dateinamenerweiterung '.jsf' verarbeiten.
Das ist im
XML-Element
<servlet-mapping>
<servlet-name>Faces
Servlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>
festgelegt.
Eine Eigenheit dieser XML-Konfiguration zur Verarbeitung von JSF-Anweisungen ist dann aber, dass bei einem Link die Dateinamenerweiterung '.jsf' erwartet wird – auch wenn die Datei mit der anzuzeigenden Web-Seite (und den inkludierten JSF-Anweisungen) die Dateinamenserweiterung '.jsp' hat.
Falsch
– in diesem Beispiel hat die
Referenz für den Link die Dateinamenerweiterung jsp
:
<a
href="page_step03.jsp">Link
zum Dokument in der Datei 'page_step03.jsp.</a>
Richtig
– in
diesem Beispiel hat die Referenz für den Link die
Dateinamenerweiterung jsf
:
<a
href="page_step03.jsf">Link
zum Dokument in der Datei 'page_step03.jsp.</a>
Welche
Folgeseite aufgerufen wird ist abhängig von der 'action' (dem
Ergebnis einer Verarbeitung der erfassten Daten).
Der Zusammenhang
zwischen den Dateien mit den jeweiligen Web-Seiten und der 'action'
ist in der Datei 'faces-config.xml' festgelegt und zwar im
XML-Element <navigation-rule>.
In den XML-Elementen <from-view-id> und <to-view-id> (für die Dateien mit den Web-Seiten) ist die komplette Verzeichnisstruktur vor dem Dateinamen erforderlich – auch wenn die Datei mit der Folgeseite im gleichen Verzeichnis ist.
Richtig:
<navigation-rule>
<from-view-id>/shop/de/payment1.jsp</from-view-id>
<navigation-case>
<from-outcome>success</from-outcome>
<to-view-id>/shop/de/payment2.jsp</to-view-id>
</navigation-case>
</navigation-rule>
Falsch
(ohne vollständige
Verzeichnisstruktur):
<navigation-rule>
<from-view-id>payment1.jsp</from-view-id>
<navigation-case>
<from-outcome>success</from-outcome>
<to-view-id>payment2.jsp</to-view-id>
</navigation-case>
</navigation-rule>
Auch
wenn die Dateien mit den Web-Seiten direkt im 'root'-Verzeichnis
liegen ist das durch den Verzeichnis-Trenner (/)
anzugeben:
<navigation-rule>
<from-view-id>/payment1.jsp</from-view-id>
<navigation-case>
<from-outcome>success</from-outcome>
<to-view-id>/payment2.jsp</to-view-id>
</navigation-case>
</navigation-rule>
Wenn
eine Web-Seite aufgerufen wird erscheint folgende Fehlermeldung
(Ausschnitt):
Das
bedeutet, dass die JSF-Anweisung (Beispiel PersonName)
nicht den Namenskonventionen entspricht oder
keine entsprechende
get- und/oder set- Methode (für das Beispiel: getPersonName()
bzw. setPersonName(...)
vorhanden ist.
Wahrscheinlich wurde bei der Namensgebung der 'Property' oder den get- und set- Methoden nicht beachtet, dass das JSF-Framework sehr strikte Namenskonventionen verlangt.
Konvention
für das Verbinden von 'Properties' in JSF-Anweisungen mit den
zugehörigen get- und set-Methoden der Java-Klasse:
Keine get-Methode für eine JSF-Anweisung inputText
Auch wenn der Wert einer Eingabe nach der Verarbeitung nicht wieder angezeigt werden soll ist eine passende get-Methode notwendig.
Die
JSF-Anweisung
<h:inputText
id="name"
value="#{PersonBeanForJSF.personName}"/>
benötigt
folgende Methoden in der zugehörigen Java-Klasse:
public
String
getpersonName()
{
.
. . . .
.
. . . .
und
(selbstverständlich)
public
String
setpersonName() {
.
. . . .
.
. . . .
Muster
asdf.