Ответ 1
Для <f:ajax>
требуется jsf.js
файл, включенный в HTML <head>
. Он содержит все функции JS для выполнения магии ajax JSF.
Чтобы добиться этого, убедитесь, что вы используете <h:head>
вместо <head>
в главном шаблоне. Затем JSF автоматически включит необходимый элемент <script>
, указывающий на jsf.js
.
<!DOCTYPE html>
<html lang="en"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets">
<h:head>
<title>Look, with h:head</title>
</h:head>
<h:body>
Put your content here.
</h:body>
</html>
Обратите внимание, что в немного приличном веб-браузере с небольшим приличным набором инструментов webdeveloper, например Firefox Панель инструментов веб-разработчиков и/или Firebug вы должны сразу заметить JS-ошибки, например jsf is undefined
, когда должен быть выполнен запрос ajax. Это должно было по крайней мере дать о чем подумать.
Обновить: согласно вашему обновлению
Я узнал несколько интересных вещей:
Тег
<f:ajax>
не работает на<h:link>
,<h:selectOneMenu>
,<h:button>
,<h:commandButton>
. В этом случае неправильные значения в атрибутеrender
не замечены, но неверное значение атрибутаevent
генерирует ошибку.
<h:outputLabel>
,<h:inputText>
работает с<f:ajax>
правильно.
<h:link>
и <h:button>
предназначены только для запросов GET, а не для запросов POST. Однако он должен работать как можно лучше на <h:selectOneMenu>
и <h:commandButton>
. У вас нет большего количества кода в полной картине, которую вы пропустили из вопроса для простоты? Какой JSF impl/version вы используете? Вы используете правильные библиотеки в classpath? Это похоже на то, что вы действительно должны что-то испортить.
Чтобы убедить вас (и меня самого), я просто создал следующий экземпляр copy'n'paste'n'runnable testcase
<!DOCTYPE html>
<html lang="en"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
>
<h:head>
<title>SO question 6089924</title>
</h:head>
<h:body>
<h:form>
<h:selectOneMenu value="#{bean.selected}">
<f:selectItem itemValue="#{null}" itemLabel="Select..." />
<f:selectItem itemValue="one" />
<f:selectItem itemValue="two" />
<f:selectItem itemValue="three" />
<f:ajax listener="#{bean.listener}" render="result" />
</h:selectOneMenu>
<h:commandButton value="commandButton" action="#{bean.submit}">
<f:ajax listener="#{bean.listener}" render="result" />
</h:commandButton>
<h:outputText id="result" value="#{bean.selected} #{bean.result}" />
<h:messages />
</h:form>
</h:body>
</html>
с этим bean
package com.example;
import java.io.Serializable;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.event.AjaxBehaviorEvent;
@ManagedBean
@ViewScoped
public class Bean implements Serializable {
private String selected;
private String result;
public void submit() {
System.out.println("submit");
}
public void listener(AjaxBehaviorEvent event) {
System.out.println("listener");
result = "called by " + event.getComponent().getClass().getName();
}
public String getSelected() {
return selected;
}
public void setSelected(String selected) {
this.selected = selected;
}
public String getResult() {
return result;
}
}
Он отлично работает с Mojarra 2.1.1 на Tomcat 7.0.12.
INFO: Starting Servlet Engine: Apache Tomcat/7.0.12
INFO: Initializing Mojarra 2.1.1 (FCS 20110408) for context '/playground'