2013-04-03 2 views
1

Do ViewScope beans позволяют использовать вызовы ajax?JSF-вызовы ajax, поддерживаемые компонентом ViewScope?

Например:

Вот страница XHTML:

<h:body> 
     <h:selectOneMenu value="#{test.selected}"> 
      <f:selectItem itemValue="2" itemLabel="2" /> 
      <f:selectItem itemValue="3" itemLabel="3" /> 
      <f:ajax listener="#{test.updateData()}" /> 
     </h:selectOneMenu> 
</h:body> 

Вот ViewScoped Bean:

@ViewScoped 
@Named 
public class test implements Serializable{ 
    private String selected; 


    public void updateData(){ 
     System.out.println("Ajax call successful."); 
    } 

    public String getSelected() { 
     return selected; 
    } 

    public void setTest(String test) { 
     this.selected = selected; 
    } 
} 

Когда я попробовал это, он не работает.

+0

Вы не очень ясно поняли, что «не работает». Я просто сделаю так, что вы не увидите ничего напечатанного в stdout. В будущем, пожалуйста, уточните проблему в перспективе разработчика, а не в перспективе enduser. Вызывается функция JS/ajax? (прочитайте консоль JS для ошибок) Правильно ли отправлен HTTP-запрос? (читать HTTP-монитор трафика в разделе «Сеть» в наборе инструментов разработчика браузера) Является ли компонент создан и запущены методы? (положить контрольные точки, запустить отладчик, прочитать журналы сервера для исключений и т. д.). В чем состоит тело ответа HTTP-ответа? И т.д.. – BalusC

ответ

3

На самом деле, у Вас есть 3 серьезные проблемы в коде, публикуемую до сих пор:

  1. <h:form> отсутствует. Не уверен, хотя если это неосторожная подготовка вопроса или фактического кода. Решение очевидно: поместите сгруппированные UIInput и UICommand компонентами в независимый <h:form>.

  2. В текущей версии JSF аннотация объекта JSF @javax.faces.bean.ViewScoped не работает с аннотацией управления компонентом CDI @Named.

    Есть в основном 3 решения:

    • Использование КДИ-х @ConversationScoped вместо. См. Также How to replace @ManagedBean/@ViewScope by CDI in JSF 2.0/2.1 для конкретного примера. Однако это неприятный побочный эффект, что он добавляет параметр запроса cid к каждому исходному URL-адресу.
    • Используйте MyFaces CODI для подключения JSF @ViewScoped к CDI. Однако это неприятный побочный эффект, что он добавляет параметр запроса windowId к каждому URL-адресу результата.
    • Подождите, пока выйдет JSF 2.2, чтобы вы могли использовать аннотацию @javax.faces.view.ViewScoped, совместимую с CDI, которая связывает его с состоянием просмотра JSF.


    Это, однако, вряд ли причина вашей конкретной проблемы, как действия боба должна просто быть вызвана, но фасоль будет просто вести себя как @RequestScoped.

  3. Метод установки отсутствует. Тем не менее это должно было привести к самообучающимся PropertyNotWritableException журналам сервера, когда форма успешно отправлена.

Существует четвертый возможная причина, которая не может быть точно подтверждена на основании информации, предоставленной до сих пор: отсутствующий <h:head> вызовет <f:ajax> на неудачу, потому что требуется jsf.js не может быть автоматически включен ,

1

У вас есть неправильный сеттер, который вызывает ошибку

public void setTest(String test) { 
    this.selected = selected; 
} 

Это должно быть

public void setSelected(String test) { 
    this.selected = test; 
} 

В стороне нет, этот сеттер называется для ч: selectOneMenu значение = "# {тест .selected} ", который запускается, когда элемент выбран в вашем поле со списком.

Смежные вопросы