2

JSF1.2 アプリケーションを JSF 2.1 に移行しています。Faceletsテンプレートを使用するログインページがあります。また、テンプレート ページには h:head タグがあります。ログインページには、ui:composition/ui:define/h:form/a4j:outputPanel/h:panelGrid/h:panelGroup タグ内にタグ h:selectBooleanCheckbox があります。

<h:selectBooleanCheckbox value="#{bean.alogin}" >
  <a4j:ajax event="click" execute="@form" render="loginPanel" />    
</h:selectBooleanCheckbox>

チェック ボックスをクリックすると、ブラウザ エラー コンソールに「ReferenceError: RichFaces が定義されていません」というメッセージが表示されます。

f:ajax タグを使用しても問題は同じで、

<h:outputScript name="jsf.js" library="javax.faces" target="head"/>

テンプレートページ/ログインページ。

この問題 (js ライブラリが見つからない/読み込まれない) は、ログイン ページの最初の読み込みでのみ発生します。つまり、アプリケーションにログインしてログアウトし、上記のチェック ボックスを使用しても問題はありません。

ポインタを指示してください。それは非常に役立ちます。よろしくお願いします。

そして、head タグで生成された html は次のとおりです。

<script src="/myapp/javax.faces.resource/jsf.js.faces?ln=javax.faces" type="text/javascript">&lt;!--
//--&gt;</script>

web.xml に 2 つの *.faces マッピングがあります。1 つは CustomFilter (javax.servlet.Filter を実装) で、もう 1 つは CustomServlet (org.apache.myfaces.webapp.MyFacesServlet を拡張) です。

4

1 に答える 1

2

ReferenceError: RichFaces / jsf が定義されていません

これは JavaScript エラーです。これは、どちらvar RichFaces = ...;var jsf = ...;JavaScript コンテキストでどこにも定義されていないことを意味します。これは、JSF および RichFaces 提供の JavaScript ファイルの自動インクルードが失敗したことを意味しjsf.jsますrichfaces.js<h:head>これは、コンポーネントを使用して、JSF が JavaScript ファイルを自動インクルードするための必須フックである HTML ヘッドを宣言していないことが原因である可能性があります。

どうやら交換するのを忘れていたようです

<head>
    ...
</head>

あなたのテンプレートで

<h:head>
    ...
</h:head>

それに応じて修正します。

を使用<h:outputScript name="jsf.js" library="javax.faces" target="head"/>すると、エラーの JSF 部分のみが修正され、RichFaces 部分は修正されず、実際には回避策であり、解決策ではありません。


更新: 質問の更新に従って、それらのリソースの正確な URL パターンに一種のログインをマッピングしたことを確認しましたFilter(少なくとも、これまでに説明した問題の症状と組み合わせたフィルター名「セッション フィルター」は、ユーザーがログインしていないリクエストをブロックしている)。JSF リソースは を*.faces介し​​て URL パターンによっても提供さFacesServletれるため、そのフィルターによってもチェックされます (生成された<script src>URL を詳しく調べたことがあれば、そのことに気付いたはずです)。

Filterこれらのリソースがログイン ページにもリダイレクトされないように、これらのリソースのログイン チェックをスキップするように変更する必要がある可能性があります。ResourceHandeler.RESOURCE_IDENTIFIERリクエスト URI がURLに関係していないかどうかを確認することで、これを行うことができます。

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    HttpServletRequest req = (HttpServletRequest) request;
    HttpServletResponse res = (HttpServletResponse) response;

    if (req.getRequestURI().startsWith(req.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER)) {
        chain.doFilter(request, response); // Skip JSF resources (CSS/JS/Images/etc)
        return;
    }

    // ... Continue your login check here.
}
于 2012-08-27T17:04:30.970 に答える