2017-12-05 8 views
0

요약하면 JSF 2.2에서 브라우저에서 실행되는 javascript prog에 백업 빈의 json 데이터를로드하는 가장 좋은 방법은 무엇입니까?커스텀 JSF 컴포넌트의 백업 빈에서 jquery json 데이터를로드하는 방법은 무엇입니까?

해킹 된 iframe 처리 된 visjs 네트워크 그래프를 JSF 2.2 - Primefaces 6.1로 포팅했습니다. jsf 태그 라이브러리의 모든 특수 태그는 jar 모듈의 사용자 정의 UiComponent로 있습니다. 새로운 그래프 태그 인 UiComponentBase 클래스를 태그 라이브러리에 추가하고 @ResourceDependency과 함께 모든 visjs javascript 파일을 클래스에 넣었습니다. 미세 태그로드하지만, JQuery와 시도가 JSON 형식의 그래프는 좌표를로드 할 URL을 열 수 :

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

을 이전 iframe 솔루션에서 visjs이 URL을 통해 모든 데이터를로드합니다.

<h:outputText>, 서블릿 또는 JAXRS rest service endpoint가있는 단일 xhtml 페이지에 대한 몇 가지 사항을 읽었지만 이러한 솔루션은 taglibrary와 맞지 않으므로 웹 프로젝트의 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가 예상대로 작동합니다. 확장 된 데이터 모델은 primefaces 데이터 테이블의 lazy datamodel과 비슷한 backing 빈에 채워진다. 웹 브라우저에서 클라이언트 측의 jQuery url 요청은 사용자 정의 PhaseListener로 처리됩니다. UiViewRoot 구성 요소 트리가 비어 있었기 때문에 PhaseListener에서 UiComponent에 액세스 할 수있는 방법이 없었습니다. 그래서 그래프의 UiComponent 클래스에있는 Datamodel을 SessionMap에 넣고 PhaseListener의 datamodel에 접근 할 수 있습니다. 이렇게하는 것이 최선의 방법인지 잘 모르겠습니다. 다음은 맞춤 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; 
    } 
} 

나는 개선을위한 제안을 환영합니다.