Доступ к переменным Javascript из JSF - PullRequest
4 голосов
/ 14 мая 2011

У меня есть файл JSF, который должен быть заполнен данными, полученными из функции JS, которую я получаю при вызове Ajax веб-службы.Последняя часть работает как шарм.Я могу получить данные JSON из вызова ajax.Мне нужно проанализировать эти данные JSON и взять данные и использовать их для заполнения JSF.Я не уверен относительно того, как я получу доступ к переменным JS из JSF / xhtml.

Возможно ли это как-то сделать?Я просматривал некоторые DWR-файлы, которые отправляли ajax-сообщение из JS в Java-бин, и я мог использовать переменную bean-компонента из JSF.Но я хочу знать, есть ли другой способ сделать это.

Буду очень признателен за любую помощь.Я использую JSF 2.x кстати.

Спасибо, С.

Ответы [ 3 ]

6 голосов
/ 14 мая 2011

Вы можете использовать следующий хак, чтобы JS отправил информацию в JSF.

Создайте невидимую форму JSF с <f:ajax> hook:

<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>

Выполните задание Java / JSF в методе listener:

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>

Тем не менее, я бы предпочел выполнять вызов веб-службы в конструкторе или методе действия управляемого компонента, а не в JS. Ваш подход буквально окольный.

2 голосов
/ 14 мая 2011

Я думаю, что это невозможно.

  • JSF работает на сервере.
  • JavaScript работает на клиенте (браузере).

Итак, JSF запускает ПЕРЕД действием в JS.

Конечно, вы можете создать сервлет, который будет вызываться из JavaScript, получая информацию, хранящуюся в переменных JavaScript. Но это будет на следующем шаге:

  • JSF собирает страницу
  • JavaScript вызывает WebService, получает данные JSON
  • JavaScript отправляет данные JSON на сервер (сервлет)
0 голосов
/ 14 мая 2011

Вы можете немного пересмотреть дизайн и, возможно, выполнить то, что ищете.Вместо того, чтобы обращаться к веб-сервису через ajax на клиенте, вы можете получить доступ к нему на стороне сервера, напрямую связавшись с ним с помощью метода действия или метода, который происходит до создания представления (действия prettyfaces прекрасно справляются с такой работой).Затем вы можете построить свое представление динамически на основе результатов ответа веб-службы.

Я не уверен на 100%, что достигнет того, что вы ищете, но эта общая идея может сработать для того, что звучит так, как вы собираетесь.

Если вы уже рендерили представление и хотите сделать это с помощью ajax, вы можете использовать f: ajax с тем же принципом - метод действия hit, общение со стороной сервера веб-сервиса в этом методе действия, изменение состоянияпеременных, которые определяют макет представления и отображают ответ.

...