<f:ajax>
требует, чтобы jsf.js
файл был включен в HTML <head>
. Он содержит все функции JS для выполнения магии JSF ajax.
Для этого убедитесь, что вы используете <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>
Обратите внимание, что в немного приличном веб-браузере с немного приличным набором инструментов для веб-разработчиков, таким как Панель инструментов веб-разработчика 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 вы используете? Вы используете правильные библиотеки в classpath? Похоже, вы действительно что-то напутали.
Чтобы убедить вас (и себя), я только что создал следующий тестовый экземпляр copy'n'paste'n'runnable
<!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>
с этим бобом
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'