Verhindern suffix Hinzugefügt wird, um Ressourcen, wenn die Seite geladen ist
Ich habe einen JSF2-Anwendung laufen und arbeiten kein problem. Das Problem habe ich mit JSF ist mit dem Ressource-bundle. Alle Ressourcen haben, die .xhtml
suffix angehängt. So main.css
wird main.css.xhtml
wenn im browser geladen. Ich möchte es so haben das .xhtml
ist nicht apended auf die Ressourcen (nicht Geist über die Seiten selbst).
Ist es eine Möglichkeit, wo wir können NICHT haben .xhtml
angehängt Ressourcen?
Ich würde im Idealfall nicht ändern, die interne Funktionsweise der Website. Ich habe Ideen unten aufgeführt, aber ich muss sagen, ich weiß nicht wirklich, wie diese. Hoffnung für eine Lösung irgendwo?
Ich bin mit Majorra v. 2.1.17 auf Glassfish 3.1.2.2.
Aktuelle Faces Servlet laden wie in web.xml (aktualisiert)
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/javax.faces.resource/*</url-pattern>
</servlet-mapping>
, Warum diese Fragen von anderen unterscheidet
- JSF 2 Ressourcen mit CDN?. Ich bin nicht auf der Suche, um meine Ressourcen auf ein CDN aus, aber meine Ressourcen bleiben auf meinem server, sind aber wenig in ein CDN.
- Ändern /javax.Gesichter.Ressourcen-Präfix der Ressource-URLs. Ich will nicht das Präfix ändern. Ich will nur, um die suffix. Ich würde mir wünschen
<link type="text/css" href="/javax.faces.resource/main03.css.xhtml?ln=styles">
zu werden :<link type="text/css" href="/javax.faces.resource/main03.css?ln=styles">
OHNE die.xhtml
Erweiterung. - Ändern JSF-Präfix-suffix-mapping zwingt mich, erneut die Zuordnung auf CSS-hintergrund-Bilder. Da habe ich kein Problem mit dem laden der Ressourcen. Die Website funktioniert, wir sind einfach eine harte Zeit differrentiating eine Webseite aus einer Ressource (Da blicken wir auf die Erweiterung allein).
Argumentation
Sicher, Sie könnte mich Fragen, warum brauche ich das. Gut, wir verschieben unsere Anwendung, um bedient zu werden, die von der Akamai-CDN.
Das Problem, das wir mit der integration des Standortes ist, dass wir versuchen, den cache für statische Inhalte auf dem edge-Server. Dies geschieht durch die entsprechenden Datei-Erweiterungen ("ie: .js, .doc .png, css, etc). Wir können nicht übereinstimmen xhtml
denn dies würde die Zwischenspeicherung werden alle Seiten als statische Inhalte. Die durch, die Probleme verursacht, mit Sitzungen und so.
Lösungsversuch
Im Einklang mit der Antwort von BalusC, ich habe implementiert die Ressource-handler wie vorgeschlagen. Ich will nicht code umgeschrieben werden hier, da es in der Antwort weiter unten.
Aber ich erhalte eine Fehlermeldung beim laden von composite-Bauteilen. Ich erhalte eine Fehlermeldung wie folgt :
WARNING: StandardWrapperValve[Faces Servlet]: PWC1406: Servlet.service() for servlet Faces Servlet threw exception
java.lang.NullPointerException
at com.sun.faces.application.ApplicationImpl.createComponent(ApplicationImpl.java:975)
at com.sun.faces.facelets.tag.jsf.CompositeComponentTagHandler.createComponent(CompositeComponentTagHandler.java:162)
at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.createComponent(ComponentTagHandlerDelegateImpl.java:494)
at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:169)
...
Composite-Komponente ist ordnungsgemäß geladen, weil, wenn ich "Abmelden" die neue ResourceHandler
wir gerade erstellt laden. Der stack-trace führt mich zu glauben, dass es versucht, zu finden diese Komponente in eine java-Klasse, statt finden Sie in den Ressourcen. Nach grepcode
dies wäre an dieser letzten Zeile (975), wo der Fehler passiert :
String packageName = componentResource.getLibraryName();
String className = componentResource.getResourceName();
className = packageName + '.' + className.substring(0, className.lastIndexOf('.'));
Bedeutung, dass die resourceName
aka className
ist null
da der Fehler bin ich immer java.lang.NullPointerException
. Ich kann nicht scheinen, um herauszufinden, wie/wo die ResourceHandler
genannt wird vis-a-vis einer composite component. Jede Hilfe, herauszufinden, in dieser letzten Ausgabe?
- Erstellen Sie eine benutzerdefinierte Ressource-handler.
- so etwas in der Art würde das dann machen (in einer css-Datei zum Beispiel) so etwas wie dieses :
background: #14311b url("#{resource['templateImages:background.jpg']}") no-repeat 0 0;
funktioniert nicht, da jsf würde nicht ausgeführt werden, auf "nicht-xhtml" - Dateien. Wäre es dann eine gute Idee, fügen Sie "*.css" als Muster für die jsf-servlet? Oder benutzen Sie einfach die statische Holen? Was ist mit Ressourcen, die sich inln=javax.faces
? - Eine benutzerdefinierte Ressource-handler würde ermöglichen es Ihnen, hinzufügen
/javax.faces.resource/*
zu faces servlet mapping. - Wenn ich dies Tue, ich dachte, ich wäre in der Lage, Zugang zu meinen Ressourcen als solche :
http://localhost:8080/myApp/javax.faces.resource/main03.css?ln=styles
. Dies funktioniert nicht, aberhttp://localhost:8080/myApp/javax.faces.resource/main03.css.xhtml?ln=styles
tut. Ich weiß, ich bin etwas fehlt. - Korrektur. Also es war mein Missverständnis, dass nur hinzufügen das Präfix, wäre ich noch mit ihm in der gleichen Weise. So
/javax.faces.resource/*
Hinzugefügt servlet-mapping. Aber jetzt :javax.faces.resource/resources/styles/main03.css
Zugriff auf dieses Blatt, das stylesheet ist noch nicht verarbeitet werden durch jsf - Wie gesagt in der 1. Kommentar, erstellen Sie eine benutzerdefinierte Ressource-handler.
- Ich habe bearbeitet die Frage, um zu zeigen ein bisschen besser, was ich Tat und meine Umsetzung von dem, was ich denke, meine benutzerdefinierte Ressource-handler Aussehen würde. Aus den Kommentaren habe ich das Gefühl, etwas zu verpassen, ich appologize für diese, die vielleicht trivial erscheinen. (jede Hilfe ist sehr geschätzt).
- Nein, es ist nicht trivial 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist machbar mit einem benutzerdefinierten
ResourceHandler
die Renditen increateResource()
eineRessourcen
die wiederum gibt eine "nicht zugeordnete" URL auf- Ressource#getRequestPath()
. Sie müssen nur hinzufügen, die Standard-JSF-Ressourcen-Präfix/javax.faces.resource/*
zu den<url-pattern>
Liste derFacesServlet
mapping, um es zu bekommen, ausgelöst zu werden, sowieso.Weiter, die Sie überschreiben müssen
isResourceRequest()
um zu überprüfen, ob die URL beginnt mit der JSF-Ressourcen-Präfix und auch diehandleResourceRequest()
zu lokalisieren und streamen Sie die richtige Ressource.Alles, sollte dies tun:
Registrieren Sie es wie folgt in
faces-config.xml
:Erweitern die
FacesServlet
URL-Muster mitResourceHandler.RESOURCE_IDENTIFIER
:handleResourceRequest
, noch hätte ich gewusst, wie. Ich bin immer diese Fehlermeldung tho :WARNING: StandardWrapperValve[Faces Servlet]: PWC1406: Servlet.service() for servlet Faces Servlet threw exception java.lang.NullPointerException at com.sun.faces.application.ApplicationImpl.createComponent(ApplicationImpl.java:974)
aber nur beim laden von composite-Bauteilen... irgendwelche Ideen?<cc:interface componentType>
denn ich hatte in meiner test-composite), dann funktioniert es einwandfrei. Entfernen Sie in der Tat ergibt sich genau das problem. Die Ursache ist tatsächlich peinlich:ResourceWrapper
fließt nichtgetResourceName()
undgetLibraryName()
(undgetContentType()
) an alle! Diese Aufsicht wurde in JSF 2.2. In der Zwischenzeit haben Sie, um wickeln Sie es sich selbst. Ich habe aktualisiert die Antwort.Haben, könnten Sie einen Blick auf Umschreiben. Umschreiben können, um die URLs zu ändern, die wiedergegeben werden, die Seite und ändern Sie Sie in irgendeiner Weise Sie wollen. Sie konnte etwas tun, wie das hinzufügen eines CDN Für Ihre Website:
Ich denke, es sollte einfach zu implementieren ist Ihre Anforderung mit Schreiben.
Haben Sie einen Blick auf die Beispiel-Konfigurationen erfahren Sie mehr über die Funktionen umschreiben.
*.xhtml
angehängt wird, um alle Ressourcen, daher können Sie nicht erkennen, statischen Ressourcen aus dynamische diejenigen.