我有一个JSF文件,需要从我从Ajax调用到Web服务的JS函数中获取的数据填充。后一部分就像一个魅力。我能够从ajax调用中检索JSON数据。我需要解析这个json数据并获取数据并使用它来填充JSF。我不确定如何从JSF / xhtml访问JS变量。
有可能在某种程度上这样做吗?我正在经历一些DWR的东西,它们会将JS发送给Java bean的ajax帖子,我可以使用JSF中的bean变量。但是,我想知道是否还有其他方法可以做到这一点。
我非常感谢任何帮助。我正在使用JSF 2.x顺便说一句。
谢谢, S上。
答案 0 :(得分:6)
您可以使用以下“hack”让JS向JSF提交信息。
使用<f:ajax>
hook创建一个不可见的JSF表单:
<h:form prependId="false" style="display:none;">
<h:inputText id="input" value="#{bean.input}">
<f:ajax event="change" execute="@form" listener="#{bean.process}" render=":something" />
</h:inputText>
</h:form>
让JS更新输入字段并触发更改事件:
<script>
function somefunction() {
var input = document.getElementById('input');
input.value = 'your JSON string';
input.onchange();
}
</script>
使用listener
方法执行Java / JSF作业:
private String input; // +getter +setter
public void process(AjaxBehaviourEvent event) {
doSomethingWith(input);
}
将所需的JSF标记放在<h:someComponent id="something">
中,当<f:ajax render=":something">
完成其工作时,listener
将重新呈现该标记:
<h:panelGroup id="something">
The JSON string was: <h:outputText value="${bean.input}" />
</h:panelGroup>
那就是说,我更喜欢在托管bean的构造函数或action方法中而不是在JS中进行webservice调用。你的方法实际上是一个回旋处。
答案 1 :(得分:2)
我认为这是不可能的。
因此,JSF在JS中运行BEFORE操作。
当然,您可以创建一个将从JavaScript调用的servlet,接收存储在JavaScript变量中的信息。但是,这将是下一步:
答案 2 :(得分:0)
您可以稍微重新审视设计,并可能完成您正在寻找的内容。不是通过客户端上的ajax访问web服务,而是可以通过直接在动作方法或创建视图之前发生的方法与其进行通信来访问服务器端(prettyfaces动作可以很好地处理这种工作)。然后,您可以根据Web服务响应的结果动态构建视图。
我不是百分百肯定会完成你正在寻找的东西,但是这个一般的想法可能适用于听起来像你想要的东西。
如果你已经渲染了一个视图并且你想用ajax做它你可以使用f:ajax使用相同的原理 - 命中操作方法,在该操作方法中与webservice服务器端通信,改变变量的状态确定视图布局并呈现响应。