# JSF 1.2 unter Netbeans 6 mit Tomcat 6.0 ->Navigationsprob



## Guest (20. Jan 2008)

Hallo zusammen!

Ich versuche seit einiger Zeit eine JSF Navigation mit Netbeans 6.0 / Tomcat 6 zu realisieren. Das klappt soweit auch prima wie gewohnt aus Netbeans 5.5, doch sobald die quelldatei im WEB-INF Ordner liegt, funktionieren meine Verweise nicht mehr, und ich bekomme die Meldung: 

HTTP Status 404 -

type Status report

message

description The requested resource () is not available.
Apache Tomcat/6.0.14

unter Netbeans 5.5 mit Tomcat 5.5 hat dies immer wunderbar funktioniert.

3 Files zur erläuterung: Verzeichnisstruktur

/welcomeJSF.jsp
/WEB-INF/JSP/enter.jsp
/WEB-INF/JSP/login.jsp

*Aufruf von welcomeJSF.jsp nach /WEB-INF/JSP/enter.jsp*

Ausschnitt faces-config.xml:


```
<navigation-rule>
        <from-view-id>/welcomeJSF.jsp</from-view-id>
            <navigation-case>
                <from-outcome>toLogin</from-outcome>
                <to-view-id>/WEB-INF/JSP/enter.jsp</to-view-id>
            </navigation-case>
    </navigation-rule>
```
...

Aufruf aus welcomeJSF.jsp: 

```
<f:view>
              <h:form>
	           <h:commandButton value="enter" action="toEnter"></h:commandButton>
	      </h:form> 
        </f:view>
```

*soweit so gut, die verlinkung funktioniert ohne Probleme, nun von WEB-INF/JSP/enter.jsp nach WEB-INF/JSP/login.jsp*

Ausschnitt faces-config.xml:


```
<navigation-rule>
        <from-view-id>/WEB-INF/JSP/enter.jsp</from-view-id>
        <navigation-case>
            <from-outcome>toLogin</from-outcome>
            <to-view-id>/WEB-INF/JSP/login.jsp</to-view-id>
        </navigation-case>
    </navigation-rule>
```
...

Aufruf aus /WEB-INF/JSP/enter.jsp

```
<f:view>
         <h:form>
	     <h:commandButton value="Login" action="toLogin"></h:commandButton>
	  </h:form> 
        </f:view>
```

hier kommt nun immer die oben angesprochene Fehlermeldung, während es unter Netbeans 5.5 (JSF 1.1) mit Tomcat 5.5 einwandfrei funktioniert.

Hat jemand vielleicht einen Rat?


----------



## Gast (20. Jan 2008)

entschuldigt, ich habe mich natürlich vertippt, bei der ersten verlinkung ist das <from-outcome> attribut natürlich toEnter


----------



## maki (20. Jan 2008)

Der Client (Browser) darf nicht auf WEB-INF zugreifen, es können nur Server-interne forwards auf Dateien unter WEB-INF gemacht werden.

Aus der Servlet SPec 2.4:


> SRV.9.5 Directory Structure
> ...
> A special directory exists within the application hierarchy named “WEB-INF”.
> This directory contains all things related to the application that aren’t in the document root of the application. The WEB-INF node is not part of the public document tree of the application. No file contained in the WEB-INF directory may be served directly to a client by the container. However, the contents of the WEBINF directory are visible to servlet code using the getResource and getResource- AsStream method calls on the ServletContext, and may be exposed using the RequestDispatcher calls. Hence, if the Application Developer needs access, from servlet code, to application specific configuration information that he does not wish to be exposed directly to theWeb client, he may place it under this directory.
> Since requests are matched to resource mappings in a case-sensitive manner, client requests for ‘/WEB-INF/foo’, ‘/WEb-iNf/foo’, for example, should not result in contents of the Web application located under /WEB-INF being returned, nor any form of directory listing thereof.


----------



## Gast (20. Jan 2008)

danke für die schnelle Antwort, ganz ist es mir leider noch nicht klar.

so wie ich das bisher verstanden habe, werden die JSF Rules ja über ein JSF-ControllerServlet realisiert, wären somit serverintern, nicht wahr?

und unter Netbeans 5.5 war WEB-INF ja auch bereits "non public", und dort funktioniert es über die JSF Navigation.

Oder kann ich in WEB-INF gelegene JSPs gar nicht mehr navigieren über JSF?


----------



## maki (20. Jan 2008)

> Oder kann ich in WEB-INF gelegene JSPs gar nicht mehr navigieren über JSF?


Doch, kannst du, hast du doch schon gemacht und es hat funktoniert, aber eben nur Server intern.

Was aber nicht geht ist folgendes:

```
<h:commandButton value="Login" action="toLogin"></h:commandButton>
```
Hierbei wird _toLogin_ ersetzt durch den richtigen Pfad, welcher naürlich in WEB-INF/JSP Verzeichniss zeigt, der Browser darf ber nicht darauf zugreifen.

Ich finde es sehr unglücklich, sich mit JSF auseinander zu setzen ohne die grundlengenden Technologien (Servlets und JSPs) verstanden zu haben, mit anderen Worten: Das kann nix werden.


----------



## Gast (20. Jan 2008)

ich gebe zu, was Servlets und JSPs betrifft bin ich nicht 100% fit, da ich beides erst vor kurzem gelernt habe, aber ich denke eine gewisse Grundkenntnis bringe ich mit.

Die selbe Übung habe ich bereits ohne JSF mit einem Controller Servlet und JSPs programmiert. Dort hatte ich natürlich ein ähnliches Problem was den Zugriff auf WEB-INF/ betrifft, was man dort im Controller über den getRequestDispatcher lösen konnte.



> Hierbei wird toLogin ersetzt durch den richtigen Pfad, welcher naürlich in WEB-INF/JSP Verzeichniss zeigt, der Browser darf ber nicht darauf zugreifen.



Wenn die Ursache dafür ist, dass ich nicht auf einen Pfad zugreifen darf, der in WEB-INF/JSP liegt, warum kann ich überhaupt erst mit JSF auf enter.jsp zugreifen, welche ja auch im WEB-INF/ verzeichnis liegt?

Daher schein ich ja nur nicht forwarden zu können, wenn die Quelljsp ebenfalls im WEB-INF/Verzeichnis liegt.

Tut mir leid, wenn es wirklich an etwas grundsätzlichen fehlen sollte, dann setz ich mich damit gern nochma auseinander, aber das Problem erschließt sich mir einfach noch nicht ganz, zumal es ja auch unter Netbeans 5.5 (mit tomcat 5.5) im Browser funktionierte, und nur unter 6.0 (mit tomcat 6.0) nicht mehr. Dein Statement klang eher, als wäre es allgemein gültig, oder irre ich mich?

Nochmals Danke für deine Hilfe


----------



## maki (20. Jan 2008)

> Wenn die Ursache dafür ist, dass ich nicht auf einen Pfad zugreifen darf, der in WEB-INF/JSP liegt, warum kann ich überhaupt erst mit JSF auf enter.jsp zugreifen, welche ja auch im WEB-INF/ verzeichnis liegt?


In deiner JSP (!) schreibt du eine Action, die als Ziel eine JSP unter WEB-INF hat. Dann müsste der Browser auf das WEB-INF Verz. zugreifen, und genau das geht ja nicht.

Ein "from-outcome" wird komplett Serverseitig abgehandelt, da die Managedbean den outcome liefert, es wird also ein forward intern auf dem Server gemacht, das geht, da ja Servlets auf WEB-INF zugreifen dürfen.



> Tut mir leid, wenn es wirklich an etwas grundsätzlichen fehlen sollte, dann setz ich mich damit gern nochma auseinander, aber das Problem erschließt sich mir einfach noch nicht ganz, zumal es ja auch unter Netbeans 5.5 (mit tomcat 5.5) im Browser funktionierte, und nur unter 6.0 (mit tomcat 6.0) nicht mehr. Dein Statement klang eher, als wäre es allgemein gültig, oder irre ich mich?


Ich denke es wäre am besten für dich, wenn du Servlets sehr gut verstehst, bevor du dich an JSF wagst, ansonsten ist das sehr frustrierend, da du nicht wirklich verstehst was da passiert (oder auch nicht passiert), und man kann nunmal keine JSF Anwendungen schreiben ohne Servlets zu verstehen, JSP ist nur eine "kleinere" Erweiterung zu Servlets, soll heissen: Einmal Servlets verstanden, sind JSPs sehr leicht.

Meiner Meinung nach hat Netbeans da einen Fehler, denn laut Spek ist es absolut verboten das ein Client direkt auf WEB-INF zugreift, dass war schon immer so, stand in jeder Servlet Spek die ich jemals gelesen habe.

Wichtig ist, dass du deine Anwendung so schreibst, dass sie auf dem Server läuft, nicht nur in der IDE.
Die Servlet Spek. definiert den Standard, wenn du dich daran hälst, läuft deine Anwednung sogar auf jedem Servlet Container, dass alleine ist sehr viel Wert.


----------

