2011-05-13 151 views
4

我有一个JSF文件,需要从我从Ajax调用Web服务获得的JS函数中获取的数据填充。后半部分就像一个魅力。我能够从ajax调用中检索JSON数据。我需要解析这个json数据并获取数据并使用它来填充JSF。我不确定如何从JSF/xhtml访问JS变量。从JSF访问Javascript变量

是否可以在某些方面做到这一点?我正在浏览一些将从JS发送ajax post到Java bean的DWR,我可以使用JSF中的bean变量。但是,我想知道是否有其他方式来做到这一点。

我将不胜感激任何帮助。我使用JSF 2.x顺便说一句。

感谢, S.

+0

JSF 1.x or 2.x?在2.x中,这当然是可行的。顺便说一句:你从来没有回应,在这里以及.. .. http://stackoverflow.com/questions/5507823/updating-a-list-of-items-on-calling-setpropertyactionlistener-in-jsf这是非常重要的提及JSF spec版本,因为JSF 2.x提供了内置的ajax功能,答案很大程度上取决于此。发布JSF 2.x的答案完全是浪费时间,你毕竟使用旧的1.x. – BalusC 2011-05-13 21:56:05

+0

我很抱歉没有具体。这是JSF 2.x – 2011-05-13 22:21:54

回答

2

我觉得这是不可能的。

  • JSF在服务器上运行。
  • JavaScript在客户端(浏览器)上运行。

所以,JSF在JS中运行BEFORE动作。

当然,您可以制作一个将从JavaScript调用的servlet,接收存储在JavaScript变量中的信息。但是,这将是下一步:

  • JSF组装页面
  • JavaScript调用WebService的,得到JSON数据
  • JavaScript的JSON发送数据到服务器(servlet的)
+0

我需要渲染基于JSON数据的JSF元素基本上说,如果我得到3个元素,我需要在我的JSF上创建一个循环来创建这些多个div标记。所以,我需要在JSF页面加载时获取JSON并相应地填充数据。 – 2011-05-13 21:54:18

+0

@reg_frenzy:好的,所以你不需要使用javascript来读取JSON信息。服务器可以直接获取这个JSON数据。 – Topera 2011-05-14 10:33:02

0

你可以重温设计一点点,并可能完成你在找什么。而不是通过客户端上的ajax访问web服务,您可以直接通过与创建视图之前发生的操作方法或方法进行通信来访问服务器端(prettyfaces动作很好地处理这类工作)。然后,您可以根据Web服务的响应结果动态构建视图。

我不是100%确定能够完成您正在寻找的内容,但是这个总体想法可能适用于您想要的内容。

如果你已经提交了一个视图,并且你想用ajax来完成,你可以使用f:ajax以相同的原则 - 命中操作方法,在该操作方法中与webservice服务器端通信,更改变量的状态确定视图布局并呈现响应。

6

您可以使用以下'hack'让JS将信息提交给JSF。

创建<f:ajax>钩一种无形的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更新输入字段,并触发change事件:

<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的构造函数或操作方法的Web服务调用而不是在JS中。你的方法实际上是一个迂回。

+0

谢谢吨。这很快。我还有另一个问题。如何访问process()侦听器中的输入变量?我不确定这是否很简单,我错过了。 – 2011-05-14 00:04:22

+0

它已经设置在''输入'''的'值'后面的属性中。在我的例子中,我甚至表现出了对它的一些操作。它可以通过侦听器方法中的'input'获得。然而,这个评论表明你对JSF完全陌生,看起来你从来没有用JSF开发过表单。我建议你花更多的时间来学习JSF如何工作。本教程可能会提供新的基本见解:http://balusc.blogspot.com/2011/01/jsf-20-tutorial-with-eclipse-and.html – BalusC 2011-05-14 00:05:28