0

JSF2.0 と richfaces を使用してテスト プロジェクトを作成しました。チャートをプロットしようとしています。これで、データベースから Bean およびデータテーブルに値を取得しました。この値をjavascript変数に渡したいと思ったとき、The BalusCからのこの回答は非常に便利でした。正常に動作しますが、javascript 変数が oncomplete="jsonDemo('#{kpilist.json}')" の後に取得する値です。つまり、#{kpilist.json} の値は最新ではなく、最後の値です。

#{kpilist.json} の値を出力しました。データテーブルの後に出力されている場合、値は現在のものです。データテーブルの前に出力された場合、それは最後の値です。a4j:ajax の oncomplete 属性はすべてが完了した後に実行されるため、#{kpilist.json} が最新の値を表示しないのはなぜですか? richfaces と jsf コンポーネントのさまざまなリスナーと oncomplete 属性の実行順序は?

私のマネージドBean:

@ManagedBean(name = "kpilist")
@ViewScoped
public class KPIListController implements Serializable {

    private static final long serialVersionUID = 1L;
    boolean state = true;
    String selectedKPIType;
    String selectKPITime = "D";
    boolean renderDatatable;
    String json;



    public String getJson() {
        return json;       
    }


    public boolean isRenderDatatable() {
        return renderDatatable;
    }

    public void setRenderDatatable(boolean renderDatatable) {
        this.renderDatatable = renderDatatable;
    }

    public boolean isState() {
        return state;
    }

    public List<String> showViewList() {
        Logger.getLogger(KPIListController.class.getName()).warning("Show view List:");
        KPIDAO kpiDAO = new KPIDAO();
        try {
            Logger.getLogger(KPIListController.class.getName()).info("Into show view List ---select One");
            return kpiDAO.showViewList(selectKPITime);
        } catch (SQLException ex) {
            ex.printStackTrace();
            Logger.getLogger(KPIListController.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    }

    public void setState(boolean state) {
        this.state = state;
    }

    public String getSelectedKPIType() {
        return selectedKPIType;
    }

    public void setSelectedKPIType(String selectedKPIType) {
        this.selectedKPIType = selectedKPIType;
    }

    public String getSelectKPITime() {
        return selectKPITime;
    }

    public void setSelectKPITime(String selectKPITime) {
        this.selectKPITime = selectKPITime;
    }

    public List<KPI> getKPI() {
        Logger.getLogger(KPIListController.class.getName()).warning("Get KPI Values:");
        KPIDAO kpiDAO = new KPIDAO();        
         List<KPI> kpiList = new ArrayList<KPI>();

        try {
            kpiList = kpiDAO.getKPI(selectedKPIType);  
            Logger.getLogger(KPIListController.class.getName()).warning("KPI List:"+kpiList.size());            

        } catch (SQLException ex) {
            ex.printStackTrace();
            return null;
        }
         Gson gson = new Gson();
        json= gson.toJson(kpiList);
        return kpiList;
    }

    public void resetFormValues() {       
        Logger.getLogger(KPIListController.class.getName()).warning("Reset form:");
        selectedKPIType = "--";
    }
}

私の見解:

<html xmlns="http://www.w3.org/1999/xhtml" 
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:rich="http://richfaces.org/rich" 
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:a4j="http://richfaces.org/a4j"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:c="http://java.sun.com/jsp/jstl/core">
    <h:head>

    </h:head>
    <h:body>
        <ui:composition template="/contentTemplate.xhtml">
            <ui:define name="windowTitle">KPI Index</ui:define>
            <ui:define name="content" >

                <h:outputScript name="js/graphics/jquery.js"/>   
                <h:outputStylesheet name="/css/jquery-ui-1.8.22.custom.css"/>
                <h:outputScript name="js/graphics/jquery-ui-1.8.22.custom.min.js"/>
                <h:outputScript name="js/OpenLayers/OpenLayers.js"/>

                <h:outputScript name="js/graphics/raphael-min.js"/>
                <h:outputScript name="js/graphics/canvg.js"/>
                <h:outputScript name="js/graphics/paths.js"/> 
                <h:outputScript name="js/graphics/draw.js"/> 

                <h:form id="ins_sel_form">
                    <h:outputText value="KPI TIME FRAME"/>
                    <h:selectOneRadio value="#{kpilist.selectKPITime}"  >
                        <f:selectItem itemLabel="DAILY" itemValue="D"   />
                        <f:selectItem itemLabel="WEEKLY" itemValue="W"  />
                        <f:selectItem itemLabel="LAST WEEK" itemValue="LW"  />    
                        <a4j:ajax event="change" render="ins_sel_form:selectOnemenu dataPnl"  listener="#{kpilist.resetFormValues()}" /> 
                    </h:selectOneRadio>

                    <h:outputText value="Major KPI Type"/>
                    <h:selectOneMenu id="selectOnemenu" value="#{kpilist.selectedKPIType}"  >
                        <f:selectItem itemValue="--" itemLabel="--"></f:selectItem>
                        <f:selectItems itemValue="#{item.toString()}" var="item" itemLabel="#{item.toString()}" value="#{kpilist.showViewList()}"/>
                        <a4j:ajax event="change" render="dataPnl"  oncomplete="jsonDemo('#{kpilist.json}')" /> 
                    </h:selectOneMenu>

                    <h:outputText value="Show / Hide Map"/>

                </h:form>
                <rich:panel  id ="dataPnl">

                        <rich:dataTable id="kpiValueTable" value="#{kpilist.KPI}" var="kpi" style="width:100%" rows="20" rendered="#{kpilist.selectedKPIType!=null and kpilist.selectedKPIType !='--' }" >                            

                            <rich:column>
                                <f:facet name="header" >
                                    <h:outputText value ="Value"></h:outputText>
                                </f:facet>
                                <h:outputText value="#{kpi.KPIValue}"></h:outputText>
                            </rich:column>

                        </rich:dataTable>
                    JSON String :  <h:outputText  id="json" value ="#{kpilist.json}"/>   
                        <center><rich:dataScroller for="kpiValueTable" rendered="#{kpilist.selectedKPIType!=null and kpilist.selectedKPIType!='--'}"/></center>
                    </rich:panel>

                <rich:panel id="map" style="display: none;">
                </rich:panel>


            </ui:define>
        </ui:composition>
    </h:body>
</html>

Javascript:

function jsonDemo(jsonString){

    console.log("Chart data already retrieved: " + jsonString);
    var data = $.parseJSON(jsonString);    
    $.each(data,function(i,val){
         console.log("The value of i: "+i+" The val: "+val.NCELLCLUSTER);
    });

}
4

2 に答える 2

1

あなたの EL 式はoncomplete、HTML/JS コードが JSF によって生成された時点で評価されます (したがって、最初の HTTP 要求で)。oncompleteあなたが期待しているように、JSで実行された時点では評価されていません。EL 式を評価するのは Web ブラウザーではなく、Web サーバーです。ちなみに、oncompleteは の後に実行されたばかりrenderです。HTTP トラフィック デバッガーと JS デバッガー (Chrome/IE9/Firebug で F12 キーを押す) を使用すると、簡単に追跡できます。

これを解決するには、いくつかの可能性があります。

  1. jQuery で$.get()orを呼び出して、代わりに通常のサーブレットでジョブを実行するか、JAX-RS Web サービスの方がよいでしょう。$.getJSON()

    function jsonDemo() {
        $.getJSON("servletURL", function(jsonData) {
            // ...
        });
    }
    
  2. ajaxでレンダリング/更新するoncompleteものに置き換えます。<h:outputScript>

    <a4j:ajax ... render="json" />
    ...
    <h:panelGroup id="json">
        <h:outputScript rendered="#{not empty bean.json}">jsonDemo(#{bean.json});</h:outputScript>
    </h:panelGroup>
    

具体的な問題とは関係ありませんが、JSON データの受け渡しに関する概念上の誤りがあります。そのように引数として渡しながら文字列化してからjsonDemo('#{kpilist.json}')、後で を使用して JSON を解析しています$.parseJSON()。これは意味がありません。このように引数を囲む単一引用符を削除すると、その行はもうjsonDemo(#{kpilist.json})必要ありません。$.parseJSON()データはすでにJSON 形式になっています。

于 2012-08-01T14:31:27.833 に答える
0

a4j:ajaxからに変更してみてくださいf:ajax

a4j:ajaxプレーンな JSF コンポーネントで動作するかどうかわからない

于 2012-08-01T14:24:51.273 に答える