-1

これはこれに関する最初の質問ではないことは承知していますが、問題を解決する答えが見つかりませんでした。

私のプロジェクトでは、PrimeFaces 3.5 を使用しており、IBM WebSphere AS 7 で実行しています。

問題を説明するための非常に簡単なページを作成しました。SO コミュニティが解決に役立つことを願っています :)

だから、ここにページがあります:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:c="http://java.sun.com/jsp/jstl/core"
    xmlns:p="http://primefaces.org/ui">

    <h:head></h:head>
    <h:body>
        <p:panel>
            <c:if test="#{true}">
                <h:outputText value="WORKS!!!" />
            </c:if> 
        </p:panel>
    </h:body>
</html>

このページは、次の HTML を生成します。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <link type="text/css" rel="stylesheet" href="/APP/javax.faces.resource/theme.css.xhtml?ln=primefaces-bluesky" />
        <link type="text/css" rel="stylesheet" href="/APP/javax.faces.resource/primefaces.css.xhtml?ln=primefaces" />
        <script type="text/javascript" src="/APP/javax.faces.resource/jquery/jquery.js.xhtml?ln=primefaces"></script>
        <script type="text/javascript" src="/APP/javax.faces.resource/primefaces.js.xhtml?ln=primefaces"></script>
    </head>
    <body>
        <div id="j_idt6" class="ui-panel ui-widget ui-widget-content ui-corner-all">
            <div id="j_idt6_content" class="ui-panel-content ui-widget-content">
                WORKS!!!
            </div>
        </div>
        <script id="j_idt6_s" type="text/javascript">PrimeFaces.cw('Panel','widget_j_idt6',{id:'j_idt6'});</script>
    </body>
</html>

そして、私はわずかに変更されたページを持っています:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:c="http://java.sun.com/jsp/jstl/core"
    xmlns:p="http://primefaces.org/ui">

    <h:head></h:head>
    <h:body>
        <p:panel>
            <c:if test="#{bean != null}">
                <h:outputText value="WORKS!!!" />
            </c:if> 
        </p:panel>
    </h:body>
</html>

次の HTML が生成されます。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <link type="text/css" rel="stylesheet" href="/APP/javax.faces.resource/theme.css.xhtml?ln=primefaces-bluesky" />
    </head>
    <body>
        <div id="j_idt6" class="ui-panel ui-widget ui-widget-content ui-corner-all">
            <div id="j_idt6_content" class="ui-panel-content ui-widget-content">
                WORKS!!!
            </div>
        </div>
        <script id="j_idt6_s" type="text/javascript">PrimeFaces.cw('Panel','widget_j_idt6',{id:'j_idt6'});</script>   
    </body>
</html>

2 つのページはIDENTICALLYでレンダリングされているはずですが、異なっています。違いは、後者のページprimefaces.cssjQuery関連ライブラリが欠落していることですが、それらをロードする必要があります。これにより、より複雑なページが失敗します。しかし、これはページに初めてアクセスしたときにのみ発生します。ブラウザーの更新ボタンをクリックすると、すべてが正しい方法で生成されます。

なぜこれが起こるのかよくわかりません。私の理解によると、JSTLタグは の前に処理されていますJSFJSP通常のページのように考えることができますが、HTML後でJSFハンドラに渡される非レイアウトがあります。したがって、これはロードされるリソースに影響を与えるべきではありません。

<h:outputStylesheet>andを使用して出力リンクを強制できることはわかっていますが<h:outputScript>、そのままで動作することを期待しています。

何か案は?

4

1 に答える 1

0

JSTL を削除するだけです。JSFでそれをやってみてください。このタイプのチェックでは、preRenderView を使用できます。

問題は、JSTL コンポーネントと JSF コンポーネントのレンダリング動作が異なることです。あなたは読むことができます

そのためのBALUCのブログ。今、あなたは使用することができます

<f:event listener="#{user.isAdmin}" type="preRenderView" />

public void isAdmin(ComponentSystemEvent event){

    FacesContext fc = FacesContext.getCurrentInstance();

    if (!"admin".equals(fc.getExternalContext().getSessionMap().get("role"))){

        ConfigurableNavigationHandler nav 
           = (ConfigurableNavigationHandler) 
            fc.getApplication().getNavigationHandler();

        nav.performNavigation("access-denied");
    }       
  } 

詳細については、次のリンクを確認してください。

http://www.mkyong.com/jsf2/jsf-2-prerenderviewevent-example/

于 2013-03-07T04:00:20.320 に答える