簡體   English   中英

如何從自定義JSF組件中的支持bean加載jquery json數據?

[英]How to load with jquery json data from a backing bean in a custom JSF component?

簡而言之,在JSF 2.2中最好的方法是將JSON數據從支持bean加載到在瀏覽器中運行的javascript prog中。

我正在將骯臟的iframed入侵visjs網絡圖移植到JSF 2.2-Primefaces 6.1。 jsf標簽庫中有所有特殊標簽,就像jar模塊中的自定義UiComponent一樣。 我在標簽庫中添加了一個新的圖標簽(擴展的UiComponentBase類),並將所有帶有@ResourceDependency visjs javascript文件添加到該類中。 標記加載正常,但是jquery嘗試打開一個URL來加載json格式的圖形坐標:

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

在舊的iframe解決方案上,visjs通過此網址加載所有數據。

我閱讀了有關帶有<h:outputText> ,servlet或JAXRS REST服務終結點的單個xhtml頁面的一些內容,但是這些解決方案不適合標簽庫,必須在Web項目的web.xml中進行配置。 有沒有辦法用ajax事件或標記庫中的ajaxBehavior做到這一點?

提前致謝。

taglib中的圖形UiComponent現在可以按預期工作。 擴展數據模型填充在支持bean中,類似於primefaces數據表的惰性數據模型。 來自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;
  }
}

我希望能幫助別人,歡迎大家提出改進意見。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM