JSF 2.0 AJAX: Chame um método de bean a partir do javascript com jsf.ajax.request (ou de outra forma)

Alguns antecedentes: Estou construindo um componente JSF personalizado. O componente é basicamente um editor de texto e deve ter um botão “Salvar” para salvar a seqüência de conteúdo do editor. Como eu estou usando a biblioteca CodeMirror , eu preciso buscar o conteúdo (string) do editor com javascript e enviá-lo para o servidor. Portanto, nesse caso, não posso usar a chamada JS baseada em XML, como f:ajax .

A pergunta: Eu estava planejando enviar a string com jsf.ajax.request , mas ela não suporta diretamente os methods de chamada em beans. Como posso invocar um método em um bean com JSF no modo AJAX?

Há pelo menos duas maneiras de contornar isso:

  • Inclua um formulário oculto na página com o campo de input oculto. Atualize esse campo de input do javascript e, em seguida, chame jsf.ajax.request para publicar esse formulário. Ações personalizadas podem ser invocadas no getter ou setter da propriedade, se necessário.
  • Faça o pedido com XMLHttpRequest bruto (ou talvez com ajuda de alguma outra biblioteca JS). Crie um servlet e chame isso.

Ambas as formas são desajeitadas e a segunda também rompe o escopo do JSF.

Estou esquecendo de algo? Como você faz isso?

Existe uma questão bastante semelhante , mas as respostas dadas referem-se apenas a invocações AJAX baseadas em XML. Há também outra questão semelhante , mas que também se refere a chamadas AJAX baseadas em XML.

Eu não consegui descobrir como chamar os beans diretamente com o javascript, mas aqui está um hack ao redor chamando f: ajax-declaration from javascript:

1) Crie um formulário oculto com campos para todos os dados que você deseja enviar para o servidor. Inclua ah: commandButton também:

  

Como de costume, o atributo listener , #{someBean.myCoolActionOnServer()} neste caso, refere-se ao método que você deseja executar no servidor.

2) Em algum outro botão use onclick para chamar seu javascript especial E clique no botão de gatilho via javascript:

  

populateTheForm() deve preencher os dados nos campos do hiddenForm.

Esta é uma simplificação do meu caso, mas deve funcionar. Ainda à procura de uma abordagem mais conventual, no entanto.

Eu fiz essa tarefa várias vezes. Você não precisa multiplicar campos ocultos. Você pode usar apenas um campo oculto, converter todos os valores de input para o object JSON via JSON.stringify e definir nesse campo. No lado do servidor – deserialize o object JSON (há muitas bibliotecas Java para isso) em uma class Java. Isso é tudo.