2017-12-05 8 views
0

要するに、バッキングBeanからjsonデータをブラウザで実行されるjavascript progにロードするJSF 2.2の最良の方法は何ですか。カスタムJSFコンポーネントのバッキングBeanからjquery jsonデータをロードする方法は?

私は、汚れたハッキン​​グされたiframeされたvisjsネットワークグラフをJSF 2.2 - Primefaces 6.1に移植します。 jsfタグライブラリ内のすべての特別なタグはjarモジュールのカスタムUiComponentとして持っています。私は新しいグラフタグ、拡張UiComponentBaseクラスをタグライブラリに追加し、すべてのvisjs javascriptファイルを@ResourceDependencyでクラスに追加しました。 JSON形式のグラフの座標をロードするためのURLを開こうとする罰金が、jqueryのタグのロード:

$.ajax({ 
    url: "/ajax/getNetwork", 
    type: "POST", 
    data: "", 
    dataType: "json", 
    success: showNetwork, 
    error: showError 
}); 

古いiframeソリューションで、visjsはこのURLを介してすべてのデータをロードします。

<h:outputText>、サーブレットまたはJAXRSレストサービスエンドポイントを持つ単一のxhtmlページについてはいくつか読んでいますが、これらのソリューションはタグライブラリには適合せず、Webプロジェクトのweb.xmlで設定する必要があります。 ajaxイベント、またはタグライブラリのajaxBehaviorでそれを行う方法はありますか?

ありがとうございます。

+0

https://stackoverflow.com/questions/5675017/calling-a-javascript-function-from-managed-bean –

+0

カスタムUiComponentとしてタグライブラリに必要です。 PhaseListenerを使用してテストします。この記事でも同様のソリューションが説明されています(https://community.oracle.com/docs/DOC-983160)。それが動作すれば、私はここに投稿します –

答えて

0

taglibのグラフUiComponentが期待どおりに動作します。拡張データモデルはバッキングBeanに埋め込まれています。これは、プライムフェイスデータテーブルの遅延データモデルと同様です。 Webブラウザのクライアント側からのjQuery urlリクエストは、カスタムのPhaseListenerで捕捉されます。 UiViewRootコンポーネントツリーが空だったため、PhaseListenerからUiComponentにアクセスする方法はありませんでした。そこで、グラフのUiComponentクラスのデータモデルをSessionMapに入れ、PhaseListenerのデータモデルにアクセスできます。私はそれが最良の方法であるかどうかはわかりません。ここにカスタムPhaseListenerがあります:

public class GraphPhaseListener implements PhaseListener { 
    private TopologyModel topoModel; 

    private PhaseId phaseId = PhaseId.RENDER_RESPONSE; 

    @Override 
    public void beforePhase(PhaseEvent event) {   
    FacesContext context = event.getFacesContext(); 
    Object obj = context.getExternalContext().getRequest(); 
    if(!(obj instanceof HttpServletRequest)) { 
     return; 
    } 
    HttpServletRequest request = (HttpServletRequest) obj; 
    if(!("true").equals(request.getHeader("networkAjax")) || !request.getMethod().equals("POST")) { 
     return; 
    } 


    Map<String, Object> sessionMap = event.getFacesContext().getExternalContext().getSessionMap(); 
    Object object = sessionMap.get(EnhancedGraphRenderer.GRAPH_TOPOLOGIE_KEY); 
    if(object == null || !(object instanceof TopologyModel)) { 
     return; 
    } 
    topoModel = (TopologyModel) object; 
    String graphAction = request.getHeader("graphAction"); 
    String actionResponse = ""; 
    if(graphAction==null) { 
     return; 
    } 
    switch(graphAction) { 
     case "getNetwork": 
      actionResponse = topoModel.getJsonNetwork(); 
     break; 
     case "getNodeTypes": 
      actionResponse = topoModel.getJsonNodeTypes(); 
      //actionRespoonse = topoModel.getFromAction("{node_type:switch, node_id: 2, request: children}") 
     break; 
     default: 
      actionResponse = "{}"; 
    } 

    HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse(); 
    try { 
     PrintWriter output = response.getWriter(); 
     output.print(actionResponse); 
     context.responseComplete(); 
    } catch (IOException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 

    } 

    @Override 
    public void afterPhase(PhaseEvent arg0) { 

    } 

    @Override 
    public PhaseId getPhaseId() { 
     return phaseId; 
    } 
} 

私は他の人に役立つことを望み、改善のための願望を歓迎します。

関連する問題