简而言之,JSF2.2中将json数据从后台bean加载到在浏览器中运行的javascript prog中的最佳方法是什么。
我正在将一个肮脏的、被黑客攻击的iframed网络图移植到JSF2.2-PrimeFaces6.1。jsf标记库中的所有特殊标记都是jar模块中的自定义UiComponent标记。我向标记库中添加了一个新的图形标记,一个扩展的UiComponentBase类,并将带有@ResourceDependency的所有visjs文件放入类中。该标记加载良好,但是jquery尝试打开一个url来加载json格式化的图形坐标:
$.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?
提前谢谢。
发布于 2018-02-04 20:20:16
标签库中的图形UiComponent现在按照预期工作。扩展数据模型填充在支持bean中,类似于primefaces的惰性数据模型。web浏览器中来自客户端的jQuery url请求由自定义PhaseListener处理。无法从UiComponent访问PhaseListener,因为UiViewRoot组件树是空的。因此,我将图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;
}
}我希望这能帮助别人,希望改进的建议是受欢迎的。
https://stackoverflow.com/questions/47656094
复制相似问题