JSF2アプリケーションを実行していて、問題なく動作しています。私がJSFで抱えている問題は、リソースバンドルにあります。すべてのリソースには.xhtml
接尾辞が追加されています。したがって、ブラウザにロードされたときにmain.css
なります。main.css.xhtml
リソースに追加されないようにしたいと.xhtml
思います(ページ自体は気にしないでください)。
リソースに追加できない方法はありますか?.xhtml
理想的には、サイトの内部動作を変更する必要はありません。私は以下にアイデアをリストしましたが、私はこれらが本当に好きではないと言わざるを得ません。どこかで解決策をお探しですか?
Glassfish3.1.2.2でMajorrav.2.1.17を使用しています。
web.xmlのように現在のFacesサーブレットをロードしています(更新)
<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>
この質問が他の質問と異なる理由
- CDNを使用したJSF2リソース?。リソースをCDNに配置するつもりはありませんが、リソースをサーバーに残して、CDNにプッシュするようにしています。
- リソースURLの/javax.faces.resourceプレフィックスを変更します。プレフィックスを変更したくありません。接尾辞だけを変更したい。私はなりたいです
<link type="text/css" rel="stylesheet" href="/javax.faces.resource/main03.css.xhtml?ln=styles">
:<link type="text/css" rel="stylesheet" href="/javax.faces.resource/main03.css?ln=styles">
拡張子なし.xhtml
。 - JSFプレフィックスをサフィックスマッピングに変更すると、CSS背景画像にマッピングを再適用する必要があります。リソースの読み込みに問題はないので。サイトは機能しているので、Webページとリソースを区別するのに苦労しています(拡張機能だけを見ているため)。
推論
確かに、なぜ私がこれを必要とするのかと私に尋ねているかもしれません。さて、私たちはアプリケーションをAkamaiCDNによって提供されるように移動しています。
サイトの統合で発生している問題は、静的コンテンツをエッジサーバーにキャッシュしようとしていることです。これは、ファイル拡張子(つまり、.js、.doc、.png、cssなど)を照合することによって行われます。xhtml
これは静的コンテンツだけでなくすべてのページをキャッシュするため、一致させることはできません。それによって、セッションなどで問題が発生します。
試みられた解決策
BalusCの回答に沿って、提案どおりにリソースハンドラーを実装しました。以下の回答にあるので、ここではコードを書き直しません。
ただし、複合コンポーネントをロードするときにエラーが発生します。私はそのようなエラーを受け取っています:
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)
...
ResourceHandler
作成したばかりの新しいコンポーネントを「登録解除」するとロードされるため、コンポジットコンポーネントは正しくロードされます。スタックトレースは、リソースでこのコンポーネントを見つけるのではなく、Javaクラスでこのコンポーネントを見つけようとしていると私に信じさせます。これによるとgrepcode
、エラーが発生するこの最後の行(975)になります:
String packageName = componentResource.getLibraryName();
String className = componentResource.getResourceName();
className = packageName + '.' + className.substring(0, className.lastIndexOf('.'));
つまりresourceName
、別名className
はnull
、私が取得しているエラーがであるためですjava.lang.NullPointerException
。ResourceHandler
複合コンポーネントに対して、がどのように/どこで呼ばれるのか理解できないようです。この最後の問題を理解するのに何か助けはありますか?