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 );
}