[英]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.