Can't make ajax tags work properly on autocomplete/calendar
jonathan.man Mar 18, 2012 12:11 PMHi everyone.
I'm having trouble making ajax work with richfaces component.
I played with autocomplete and calendar, and my results are :
Both component :
- Change event : call to listener and rendering both ok
- Autocomplete :
blur : listener never called, render done only with a4j:ajax tag, but not with f:ajax
selectitem : same as blur
- Calendar :
inputblur : listener never called, render never done even with a4j:ajax
dateselect : same as inputblur
I search the net for similar problems, but ended up on Jiras marked as resolved with richfaces 4.0 or 4.1.
My setup :
Eclipse indigo 3.7.2
Tomcat 7.0.25
jdk1.7.0
Mojarra 2.1.7
Richfaces 4.2.0
This is my setup at home, but i encountered similar problems at work with a different setup.
My setup at work is jdk1.6 and Indigo 3.7.0.
In fact, my problems at work were the reason i tried it at home with a different setup.
I even built an entire app with many test cases (f:ajax tag, a4j tag, different events...)
Here is one of these test case. Events tested are blur (autocomplete) and inputblur (calendar), both with f:ajax tag.
For autocomplete, using a4j:ajax would make the rendering work, but still not the listener.
<h:form> <rich:panel header="Autocomplete Test"> <h:panelGrid columns="2"> <h:outputText value="Chose value : " /> <rich:autocomplete value="#{autocompleteTestBean.value}" autocompleteList="#{autocompleteTestBean.values}" showButton="true"> <f:ajax event="blur" listener="#{autocompleteTestBean.onEventTested}" render="autoSelectedValue autoNumCall messages" /> </rich:autocomplete> <h:outputText value="Chosen value : " /> <h:outputText id="autoSelectedValue" value="#{autocompleteTestBean.value}" /> <h:outputText value="Number of calls to listener : " /> <h:outputText id="autoNumCall" value="#{autocompleteTestBean.count}" /> </h:panelGrid> </rich:panel> <rich:panel header="Calendar Test"> <h:panelGrid columns="2"> <h:outputText value="Chose value : " /> <rich:calendar value="#{calendarTestBean.value}" enableManualInput="true" datePattern="dd-MM-yyyy"> <f:ajax event="inputblur" listener="#{calendarTestBean.onEventTested}" render="calSelectedValue calNumCall messages" /> </rich:calendar> <h:outputText value="Chosen value : " /> <h:outputText id="calSelectedValue" value="#{calendarTestBean.value}" /> <h:outputText value="Number of calls to listener : " /> <h:outputText id="calNumCall" value="#{calendarTestBean.count}" /> </h:panelGrid> </rich:panel> <h:messages id="messages"/> </h:form>
The change event works fine for both.
Here is my basic bean, since code is similar for both component :
package fr.testcomp; import java.io.Serializable; import javax.faces.event.AjaxBehaviorEvent; import org.richfaces.event.ItemChangeEvent; public class BaseTestComp implements Serializable { private static final long serialVersionUID = -408484402711572130L; private int count = 0; private Object value = null; public void onEventTested() { this.doCall("void do()"); } public void onEventTested(AjaxBehaviorEvent event) { this.doCall("void do(javax.faces.event.AjaxBehaviorEvent event)"); } public void onEventTested(ItemChangeEvent event) { this.doCall("void do(org.richfaces.event.ItemChangeEvent event)"); } private void doCall(String pSignature) { System.out.println("Listener call - Signature : " + pSignature); System.out.println("Listener call - Class : " + this.getClass()); System.out.println("Listener call - Value : " + this.value); System.out.println(); this.count++; } //getters and setters }
Both my managed beans inherits this one, with @ManagedBeans and @ViewScope annotations.
The autocomplete one adds a random list of value :
package fr.testcomp.autocomplete; import java.util.ArrayList; import java.util.List; import javax.faces.bean.ManagedBean; import javax.faces.bean.ViewScoped; import fr.testcomp.BaseTestComp; @ManagedBean @ViewScoped public class AutocompleteTestBean extends BaseTestComp { private static final long serialVersionUID = 5379541731429097364L; private List<String> values = null; public AutocompleteTestBean() { //init the list with some values } //getter and setter }
The calendar bean extends BaseTestComp without adding anything.
Here my dependancies.
<properties> <!-- <slf4j.version>1.6.4</slf4j.version> --> <spring.version>3.0.6.RELEASE</spring.version> <mojarra.version>2.1.7</mojarra.version> <richfaces.version>4.2.0.Final</richfaces.version> <hibernate.version>4.0.1.Final</hibernate.version> <junit.version>3.8.1</junit.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.richfaces</groupId> <artifactId>richfaces-bom</artifactId> <version>${richfaces.version}</version> <scope>import</scope> <type>pom</type> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>com.sun.faces</groupId> <artifactId>jsf-api</artifactId> <version>${mojarra.version}</version> </dependency> <dependency> <groupId>com.sun.faces</groupId> <artifactId>jsf-impl</artifactId> <version>${mojarra.version}</version> </dependency> <dependency> <groupId>org.richfaces.ui</groupId> <artifactId>richfaces-components-ui</artifactId> </dependency> <dependency> <groupId>org.richfaces.core</groupId> <artifactId>richfaces-core-impl</artifactId> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>javax.el</groupId> <artifactId>el-api</artifactId> <version>2.2</version> <!--<scope>provided</scope>--> </dependency> </dependencies>
Here is web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> <display-name>Test components</display-name> <context-param> <param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name> <param-value>true</param-value> </context-param> <context-param> <param-name>javax.faces.DATETIMECONVERTER_DEFAULT_TIMEZONE_IS_SYSTEM_TIMEZONE</param-name> <param-value>true</param-value> </context-param> <servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>*.jsf</url-pattern> </servlet-mapping> </web-app>
faces-context.xml is empty.
I probably could make it work with a jsFunction, but I have that feeling that I must be missing something.
And i'm afraid i'll encounter that behaviour on other components as well.
Maybe I misunderstand the ajax tags?
Sorry for the long post, it doesn't look like it, but i tried to make it short.