首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从自定义JSF组件中的后台bean加载jquery数据?

如何从自定义JSF组件中的后台bean加载jquery数据?
EN

Stack Overflow用户
提问于 2017-12-05 14:33:56
回答 1查看 324关注 0票数 0

简而言之,JSF2.2中将json数据从后台bean加载到在浏览器中运行的javascript prog中的最佳方法是什么。

我正在将一个肮脏的、被黑客攻击的iframed网络图移植到JSF2.2-PrimeFaces6.1。jsf标记库中的所有特殊标记都是jar模块中的自定义UiComponent标记。我向标记库中添加了一个新的图形标记,一个扩展的UiComponentBase类,并将带有@ResourceDependency的所有visjs文件放入类中。该标记加载良好,但是jquery尝试打开一个url来加载json格式化的图形坐标:

代码语言:javascript
复制
$.ajax({
    url: "/ajax/getNetwork",
    type: "POST",
    data: "",
    dataType: "json",
    success: showNetwork,
    error: showError
});

在旧的iframe解决方案中,visjs通过这个url加载所有数据。

我阅读了一些关于带有<h:outputText>、servlet或JAXRS rest服务端点的xhtml页面的内容,但是这些解决方案不适合标签库,必须在web项目的web.xml中进行配置。是否有一种方法来处理ajax事件,或者标记库中的ajaxBehavior?

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-04 20:20:16

标签库中的图形UiComponent现在按照预期工作。扩展数据模型填充在支持bean中,类似于primefaces的惰性数据模型。web浏览器中来自客户端的jQuery url请求由自定义PhaseListener处理。无法从UiComponent访问PhaseListener,因为UiViewRoot组件树是空的。因此,我将图UiComponent类中的数据模型放入SessionMap中,并可以访问PhaseListener中的数据模型。我不确定这是最好的办法,这样做。以下是自定义的PhaseListener:

代码语言:javascript
复制
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;
  }
}

我希望这能帮助别人,希望改进的建议是受欢迎的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47656094

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档