Сообщать стороне сервера JSF об изменениях состояния клиента (DOM), сделанных Jquery/Ajax

Используя компонентную платформу, такую ​​как JSF, определяется компонент для флажка:

<h:selectManyCheckbox value="#{user.favNumber1}">
    <f:selectItem itemValue="1" itemLabel="Number1 - 1" />
    <f:selectItem itemValue="2" itemLabel="Number1 - 2" />
    <f:selectItem itemValue="3" itemLabel="Number1 - 3" />
</h:selectManyCheckbox>

сгенерированный (x-html) код выглядит так:

<table>
<tr>
  <td>
    <input name="j_idt6:j_idt10" id="j_idt6:j_idt10:0" value="1" type="checkbox" />
    <label for="j_idt6:j_idt10:0" class=""> Number1 - 1</label></td>
  <td>
    <input name="j_idt6:j_idt10" id="j_idt6:j_idt10:1" value="2" type="checkbox" />
    <label for="j_idt6:j_idt10:1" class=""> Number1 - 2</label></td>
  <td>
    <input name="j_idt6:j_idt10" id="j_idt6:j_idt10:2" value="3" type="checkbox" />
    <label for="j_idt6:j_idt10:2" class=""> Number1 - 3</label></td>
  <td>
</tr>
</table>

Функция Jquery изменяет состояние этого компонента (пусть, поле со значением "1" ) на одном событии (щелчок "button"):

<script>  // or in $(document).ready(){}
   $('#button').click(function(){ 
       var $checkbox = $(this).find('#j_idt6:j_idt10:0');
       $checkbox.attr('checked', !$checkbox.attr('checked'));
   });
</script>

как я могу уведомить JSF-сторону о том, что состояние клиента изменилось. на этом уровне JSF все еще думает что флажок имеет значение, например, значение 0, тогда как оно имеет значение 1. это приводит к несогласованности состояния...

какие у меня варианты?

Я думаю о поддержке AJAX JSF на других (Rich-, Primes-, MyFaces), но я все еще не согласен использовать его, зная, что для обновления моего компонента, потому что я создаю богатый клиент с множеством функций (Манипуляции с изображениями, виджеты JQuery UI, удаленный веб-доступ, динамическое поведение, веб-службы, визуальные эффекты и т.д.). состояние клиента DOM, которое должно сильно манипулировать, и JQuery - это то, что необходимо... поэтому его нельзя оставить в стороне.

спасибо!

Ответы

Ответ 1

Поскольку вы используете JSF2, вы должны использовать f: ajax (подробнее об этом узнайте)

Подобно этому (в вашем случае не требуется jquery)

<h:selectManyCheckbox value="#{user.favNumber1}">
    <f:selectItem itemValue="1" itemLabel="Number1 - 1" />
    <f:selectItem itemValue="2" itemLabel="Number1 - 2" />
    <f:selectItem itemValue="3" itemLabel="Number1 - 3" />
    <f:ajax listener="#{user.someMethod}" />
</h:selectManyCheckbox>

где в user bean

public void someMethod(AjaxBehaviorEvent ev) {
    System.out.println(favNumber1);
}