9 Stimmen

JSP und XHTML (Facelets) in einem JSF2-Projekt mischen - möglich?

Ich habe einen Kunden, der JSF2 verwenden möchte und dem es gefällt, dass XHTML jetzt der Standard ist (Facelets).

Sie haben jedoch eine große Menge an "Legacy"-JSP aus ihrer JSF1.x-Codebasis.

Ich weiß, dass es wahrscheinlich nicht wünschenswert ist, aber wird es möglich sein, eine Mischung aus beiden in JSF2 zu unterstützen, zumindest für eine Übergangszeit, während sie portieren?

Ich weiß, dass es möglich war, die beiden in JSF1.x zu mischen, aber ich kann keine Informationen über diese in JSF2 finden.

Ich habe fleißig gegoogelt, aber natürlich liegt der ganze Fokus bei JSF2 auf Facelets. Auch mein kurzer Versuch zu mischen (ich bin kein Experte für JSF!) hat zum Scheitern geführt.

13voto

BalusC Punkte 1034465

Dies ist im Facelets FAQ beantwortet: Verwenden Sie die Präfixzuordnung auf FacesServlet. Sie können dann auf JSP-Seiten unter http://example.com/faces/page.jsp und auf Facelets-Seiten unter http://example.com/faces/page.xhtml zugreifen. Hier ist ein relevanter Zitat:

Wie verwende ich Facelets und JSP in derselben Anwendung?

Sie müssen die Präfixzuordnung für die Facelets-Seiten verwenden, damit dies funktioniert. Lassen Sie den DEFAULT_SUFFIX mit dem JSF-Standardwert .jsp. Konfigurieren Sie den Facelet-Parameter VIEW_MAPPINGS:

        javax.faces.DEFAULT_SUFFIX
        .jsp

        facelets.VIEW_MAPPINGS
        *.xhtml

        Faces Servlet
        javax.faces.webapp.FacesServlet

        Faces Servlet
        /faces/*

3voto

Florian Sager Punkte 660

Der Wiki-Abschnitt, auf den BalusC verweist, scheint tatsächlich veraltet zu sein. In meinem Erweiterungsmapping (*.faces) hatte ich das Problem mit dem vorgeschlagenen javax.faces.DEFAULT_SUFFIX, das auf .jsp gesetzt war, dadurch wurden Aktions-URLs innerhalb von Formular-Tags von *.xhtml-Seiten eine .jsp-Erweiterung anstelle einer .faces-Erweiterung generiert (und konnten daher nicht zugeordnet werden).

Nachdem ich mich mit den entsprechenden Klassen der Apache MyFaces 2.x-Implementierung (siehe org.apache.myfaces.shared.application.DefaultViewHandlerSupport.calculateActionURL(FacesContext context, String viewId)) beschäftigt hatte, stellte sich folgendes Setup als funktionierend heraus für unser paralleles Verwenden von JSP und Facelets View Handling.

Wie verwende ich Facelets und JSP in derselben Anwendung?

Neben dem Präfix-Mapping können Sie das Erweiterungsmapping (z.B. *.faces) für die Facelets-Seiten verwenden, damit dies funktioniert. Lassen Sie das DEFAULT_SUFFIX mit dem JSF-Standardwert von .jsp .xhtml. Konfigurieren Sie den VIEW_MAPPINGS-Parameter von Facelets:

        javax.faces.DEFAULT_SUFFIX
        .jsp .xhtml

        javax.faces.FACELETS_VIEW_MAPPINGS
        *.xhtml

        Faces Servlet
        javax.faces.webapp.FacesServlet

            Faces Servlet
            *.faces

Für diejenigen, die sich für die Details zur Verarbeitung von Aktions-URLs innerhalb von org.apache.myfaces.shared.application.DefaultViewHandlerSupport.calculateActionURL(FacesContext context, String viewId) interessieren:

        if ( mapping.isExtensionMapping() ) {
            // Siehe JSF 2.0 Abschnitt 7.5.2
            String[] contextSuffixes = _initialized ? _contextSuffixes : getContextSuffix( context );
            boolean gegründet = false;
            for ( String contextSuffix : contextSuffixes ) {
                if ( viewId.endsWith( contextSuffix ) ) {
                    builder.append( viewId.substring( 0, viewId.indexOf( contextSuffix ) ) );
                    builder.append( mapping.getExtension() );
                    founded = true;
                    break;
                }
            }
            if ( !gegründet ) {
                // Siehe JSF 2.0 Abschnitt 7.5.2
                // - Wenn das Argument viewId eine Erweiterung hat und diese Erweiterung zugeordnet ist,
                // ist das Ergebnis contextPath + viewId
                //
                // -= Leonardo Uribe =- Es ist offensichtlich, dass, wenn die Seite generiert wird, die abgeleitete
                // viewId wird mit dem
                // richtigen contextSuffix enden, und ein Navigations-Eintrag in faces-config.xml sollte Verwendung finden
                // eine solche ID,
                // dies ist nur ein Workaround
                // für die Benutzerfreundlichkeit. Es besteht ein potentielles Risiko, dass Änderungen am Mapping in einer Webanwendung
                // die gleiche Anwendung zum Absturz bringen können,
                // daher ist es keine gute Praxis, viewIds zu verwenden, die mit Mapping-Erweiterungen enden.
                if ( viewId.endsWith( mapping.getExtension() ) ) {
                    builder.append( viewId );
                } else if ( viewId.lastIndexOf( "." ) != -1 ) {
                    builder.append( viewId.substring( 0, viewId.lastIndexOf( "." ) ) );
                    builder.append( contextSuffixes[0] );
                } else {
                    builder.append( viewId );
                    builder.append( contextSuffixes[0] );
                }
            }
        } else {
            builder.append( mapping.getPrefix() );
            builder.append( viewId );
        }

1voto

Karl Kildén Punkte 2385

Der obige Vorschlag hat überhaupt nicht für mich funktioniert. Die Wiki-Seite ist wahrscheinlich veraltet. Aus der JSF2-Spezifikation habe ich den folgenden Parameter erhalten, der funktioniert hat:

    javax.faces.FACELETS_VIEW_MAPPINGS
    *.xhtml

anstatt:

    facelets.VIEW_MAPPINGS
    *.xhtml

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X