<rich:gmap in <rich:dataTable : google map is not displaied
craig12980 Mar 15, 2010 5:17 AMHi
This is my environment:
- Richfaces 3.3.2
- Spring 3.0
- J2SE 1.6.0_18-b07
- Apache tomcat 6.0.24
I wrote this code:
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" id="WebApp_ID" version="2.5"> <description>Ricerca Prestazioni</description> <display-name>Ricerca Prestazioni</display-name> <context-param> <param-name>org.jboss.jbossfaces.WAR_BUNDLES_JSF_IMPL</param-name> <param-value>true</param-value> </context-param> <context-param> <param-name>javax.portlet.faces.renderPolicy</param-name> <param-value>ALWAYS_DELEGATE</param-value> </context-param> <context-param> <param-name>javax.faces.DEFAULT_SUFFIX</param-name> <param-value>.xhtml</param-value> </context-param> <context-param> <param-name>facelets.REFRESH_PERIOD</param-name> <param-value>2</param-value> </context-param> <context-param> <param-name>facelets.DEVELOPMENT</param-name> <param-value>true</param-value> </context-param> <context-param> <param-name>javax.faces.STATE_SAVING_METHOD</param-name> <param-value>server</param-value> </context-param> <context-param> <param-name>org.richfaces.SKIN</param-name> <param-value>laguna</param-value> </context-param> <context-param> <param-name>org.richfaces.LoadStyleStrategy</param-name> <param-value>DEFAULT</param-value> </context-param> <context-param> <param-name>org.richfaces.LoadScriptStrategy</param-name> <param-value>DEFAULT</param-value> </context-param> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-beans.xml </param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <listener> <listener-class> org.springframework.web.context.request.RequestContextListener</listener-class> </listener> <filter> <display-name>Ajax4jsf Filter</display-name> <filter-name>ajax4jsf</filter-name> <filter-class>org.ajax4jsf.Filter</filter-class> </filter> <filter-mapping> <filter-name>ajax4jsf</filter-name> <servlet-name>Faces Servlet</servlet-name> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> <dispatcher>INCLUDE</dispatcher> </filter-mapping> <servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>*.jsf</url-pattern> </servlet-mapping> <login-config> <auth-method>BASIC</auth-method> </login-config> </web-app>
faces-config.xml
<?xml version="1.0"?> <faces-config version="1.2" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd"> <!--application> <view-handler> org.jboss.portletbridge.application.PortletViewHandler</view-handler> <state-manager>org.jboss.portletbridge.application.PortletStateManager</state-manager> <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver> <locale-config> <default-locale>it_IT</default-locale> <supported-locale>en_US</supported-locale> </locale-config> </application--> <!-- Va bene per le web application classiche --> <application> <view-handler>com.sun.facelets.FaceletViewHandler</view-handler> <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver> <locale-config> <default-locale>it_IT</default-locale> <supported-locale>en_US</supported-locale> </locale-config> </application> <navigation-rule> <from-view-id>/search.xhtml</from-view-id> <navigation-case> <from-outcome>next</from-outcome> <to-view-id>/results.xhtml</to-view-id> </navigation-case> </navigation-rule> <navigation-rule> <from-view-id>/results.xhtml</from-view-id> <navigation-case> <from-outcome>next</from-outcome> <to-view-id>/detail.xhtml</to-view-id> </navigation-case> <navigation-case> <from-outcome>prev</from-outcome> <to-view-id>/search.xhtml</to-view-id> </navigation-case> </navigation-rule> </faces-config>
spring-beans.xml:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <!-- Bean rappresentante il service delle prestazioni Al momento utilizzo una semplicissima implementazione che non interagisce col DB --> <bean id="prestazioniService" class="it.eng.tz.ria.application.richfaces.dao.impl.SimplePrestazioniServiceImpl"> </bean> <!-- Bean per la ricerca; viene utilizzato per la ricerca di prestazioni Ha uno scope request visto che per ogni ricerca voglio che sia creato Ha il tag scoped-proxy per l'interazione con JSF; con questo tag spring capisce che non si deve utilizzare un bean singleton ma deve generare un nuovo bean ad ogni richiesta. --> <bean id="searchBean" class="it.eng.tz.ria.application.richfaces.model.RicercaBean" scope="session"> <property name="service" ref="prestazioniService"></property> <aop:scoped-proxy /> </bean> <!-- Bean per il wizard; viene utilizzato per la navigazione Ha uno scope session visto che per ogni sessione utente voglio che sia creato Ha il tag scoped-proxy per l'interazione con JSF; con questo tag spring capisce che non si deve utilizzare un bean singleton ma deve generare un nuovo bean ad ogni avvio di sessione. --> <bean id="wizardBean" class="it.eng.tz.ria.application.richfaces.controller.WizardController" scope="session"> <property name="service" ref="prestazioniService"></property> <aop:scoped-proxy /> </bean> </beans>
And i wrote this simple bean:
package it.eng.tz.ria.application.richfaces.model;
import static it.eng.tz.ria.application.richfaces.web.utils.IPrestazioniConstants.DESCRIZIONE_PREST_CRITERIA;
import static it.eng.tz.ria.application.richfaces.web.utils.IPrestazioniConstants.NOME_PREST_CRITERIA;
import it.eng.tz.ria.application.richfaces.dao.IPrestazioniService;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.richfaces.model.DataProvider;
import org.richfaces.model.ExtendedTableDataModel;
import org.richfaces.model.selection.Selection;
import org.richfaces.model.selection.SimpleSelection;
import org.springframework.util.StringUtils;
public class RicercaBean implements Serializable {
/**
*
*/
private static final long serialVersionUID = -5060590627316226660L;
private IPrestazioniService service;
private String nomePrestazione;
private String descrizionePrestazione;
private List<GenericEntity> results = Collections.synchronizedList(new ArrayList<GenericEntity>(0));
private List<GenericEntity> choosenEntities = Collections.synchronizedList(new ArrayList<GenericEntity>(0));
private Object tableState;
private Selection selection = new SimpleSelection();
private String sortMode = "single";
private String selectionMode = "single";
private ExtendedTableDataModel<GenericEntity> dataModel;
public IPrestazioniService getService() {
return service;
}
public void setService(IPrestazioniService service) {
this.service = service;
}
public String getNomePrestazione() {
return nomePrestazione;
}
public void setNomePrestazione(String nomePrestazione) {
this.nomePrestazione = nomePrestazione;
}
public String getDescrizionePrestazione() {
return descrizionePrestazione;
}
public void setDescrizionePrestazione(String descrizionePrestazione) {
this.descrizionePrestazione = descrizionePrestazione;
}
public void doSearch() {
Map<String, String> criteria = Collections.synchronizedMap(new HashMap<String, String>(0));
if (StringUtils.hasText(getNomePrestazione())) {
criteria.put(NOME_PREST_CRITERIA, getNomePrestazione());
}
if (StringUtils.hasText(getDescrizionePrestazione())) {
criteria.put(DESCRIZIONE_PREST_CRITERIA, getDescrizionePrestazione());
}
results = service.searchEntity(criteria);
}
public void setResults(List<GenericEntity> results) {
this.results = results;
}
public List<GenericEntity> getResults() {
return results;
}
public void setSortMode(String sortMode) {
this.sortMode = sortMode;
}
public String getSortMode() {
return sortMode;
}
public void setSelectionMode(String selectionMode) {
this.selectionMode = selectionMode;
}
public String getSelectionMode() {
return selectionMode;
}
public void setTableState(Object tableState) {
this.tableState = tableState;
}
public Object getTableState() {
return tableState;
}
public void setSelection(Selection selection) {
this.selection = selection;
}
public Selection getSelection() {
return selection;
}
public void doSelect() {
choosenEntities.clear();
Iterator<Object> iterator = getSelection().getKeys();
while (iterator.hasNext()) {
Object key = iterator.next();
choosenEntities.add(getPrestazioniDataModel().getObjectByKey(key));
}
}
public ExtendedTableDataModel<GenericEntity> getPrestazioniDataModel() {
if (dataModel == null || !results.isEmpty() ){
dataModel = createOrUpdateTdm();
}
return dataModel;
}
public void setChoosenEntities(List<GenericEntity> choosenEntities) {
this.choosenEntities = choosenEntities;
}
public List<GenericEntity> getChoosenEntities() {
return choosenEntities;
}
private ExtendedTableDataModel<GenericEntity> createOrUpdateTdm(){
dataModel = new ExtendedTableDataModel<GenericEntity>(new DataProvider<GenericEntity>() {
private static final long serialVersionUID = 5054087821033164847L;
public Prestazione getItemByKey(Object key) {
for (GenericEntity genEntity : results) {
Prestazione prest = (Prestazione) genEntity;
Integer keyInteger = (Integer) key;
if (keyInteger.intValue() == ((Integer) (getKey(prest))).intValue()) {
return prest;
}
}
return null;
}
public Object getKey(GenericEntity item) {
return item.getKey();
}
public int getRowCount() {
return results.size();
}
@Override
public List<GenericEntity> getItemsByRange(int arg0, int arg1) {
return results.subList(arg0, arg1);
}
});
return dataModel;
}
}
And this is the XHTML page:
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:rich="http://richfaces.org/rich"
xmlns:a4j="http://richfaces.org/a4j"
xmlns:c="http://java.sun.com/jsp/jstl/core" template="/template.xhtml">
<a4j:form>
<a4j:loadBundle var="msg" basename="messages"/>
<h:panelGrid columns="2" title="#{msg.searchPerformance}" id="ricercaPrestazioni">
<h:outputLabel id="performanceName" for="performanceName" value="#{msg.performanceName}" />
<h:inputText value="#{searchBean.nomePrestazione}" id="nomePrestazione" />
<h:outputLabel id="perfomanceDescription" for="descrPrestazione" value="#{msg.descrizionePrestazione}" />
<h:inputText value="#{searchBean.descrizionePrestazione}" id="descrPrestazione" />
<a4j:commandButton value="#{msg.ricerca}" action="#{searchBean.doSearch}" reRender="table" />
</h:panelGrid>
</a4j:form>
<rich:spacer height="7"/>
<br />
<a4j:form id="contenitoreDeiDati">
<h:panelGrid columns="2" columnClasses="top , top" >
<rich:extendedDataTable
value="#{searchBean.prestazioniDataModel}" var="prestazione" id="table"
width="580px" height="400px"
sortMode="#{searchBean.sortMode}"
selectionMode="#{searchBean.selectionMode}"
tableState="#{searchBean.tableState}"
selection="#{searchBean.selection}" >
<rich:column sortable="true" sortBy="#{prestazione.idPrestazione}" id="col_2"
filterBy="#{prestazione.idPrestazione}" filterEvent="onkeyup" width="170px"
label="#{msg.performanceId}">
<f:facet name="header">
<h:outputText value="#{msg.performanceId}" id="performanceId"/>
</f:facet>
<h:outputText value="#{prestazione.idPrestazione}" id="prestazioneidPrestazione1"/>
</rich:column>
<rich:column sortable="true" sortBy="#{prestazione.nomePrestazione}" id="prestazioneidPrestazione2"
filterBy="#{prestazione.nomePrestazione}" filterEvent="onkeyup" width="170px"
label="#{msg.performanceName}">
<f:facet name="header">
<h:outputText value="#{msg.performanceName}" id="performanceName2"/>
</f:facet>
<h:outputText value="#{prestazione.nomePrestazione}" id="nomePrestazione3"/>
</rich:column>
<rich:column sortable="true" sortBy="#{prestazione.puntina.indirizzo}" id="prestazioneIndirizzoPrestazione2"
filterBy="#{prestazione.puntina.indirizzo}" filterEvent="onkeyup" width="170px"
label="#{msg.performanceAddress}">
<f:facet name="header">
<h:outputText value="#{msg.performanceAddress}" id="performanceAddress2"/>
</f:facet>
<h:outputText value="#{prestazione.puntina.indirizzo}" id="indPrestazione3"/>
</rich:column>
<a4j:support reRender="selectiontable" id="extended_table_bean_take_selection"
action="#{searchBean.doSelect}"
event="onselectionchange" />
</rich:extendedDataTable>
<h:panelGroup layout="block" style="width:90%">
<rich:panel>
<f:facet name="header">
<h:outputText value="#{msg.localization}" />
</f:facet>
<c:foreach var="sel" items="${searchBean.choosenEntities}">
</c:foreach>
<rich:dataTable value="#{searchBean.choosenEntities}"
var="sel" id="selectiontable" >
<rich:column>
<rich:gmap gmapVar="map" zoom="#{sel.puntina.zoom}" gmapKey="#{sel.puntina.gmapkey}" style="width:400px;height:400px" id="gmap" lat="#{sel.puntina.latitudine}" long="#{sel.puntina.longitudine}"/>
<!--h:form >
<a4j:jsFunction name="showPlace" data="#{sel.puntina}" oncomplete="map.setCenter(new GLatLng(data.latitudine, data.longitudine),data.zoom)">
<a4j:actionparam name="id" assignTo="#{sel.currentId}" />
</a4j:jsFunction>
</h:form-->
</rich:column>
</rich:dataTable>
</rich:panel>
</h:panelGroup>
</h:panelGrid>
</a4j:form>
<br />
</ui:composition>
Everything works pretty good except one thing: i can't see the map. I can't understand the reason.
Do you have any idea?
Best regards,
Angelo.