AJUDA : RichFaces + GMap + ManagedBean

Bom pessoal?
Estou apanhando um pouco com o GMap do RichFaces.

Gostaria de salvar a Latitude e a Longitude selecionada em uma instancia do Rich:GMap.

O meu mapa está assim:

<rich:gmap gmapVar="map" style="width:500px; height:500px"
	gmapKey="#{gmapBean.gmap_key}" zoom="#{gmapBean.zoom}" id="gmap"
	mapType="G_NORMAL_MAP" lat="#{anuncioBean.anuncio.latitude}"
	lng="#{anuncioBean.anuncio.longitude}" showGScaleControl="false"
	showGLargeMapControl="false" showGMapTypeControl="false"
	oninit="InitEventHandler()" />

E logo abaixo dele tenho, por exemplo, dois campos:

<h:outputText value="Latitude: " id="txtLatitude" />
<h:outputText value="--" id="txtInputLatitude" />
<br />
&lt;h:outputText value="Longitude: " id="txtLongitude" /&gt;
&lt;h:outputText value="--" id="txtInputLongitude" /&gt;

Para a minha página em questão, eu tenho um ManagedBean chamado AnuncioBean.java.
No AnuncioBean, eu possuo o seguinte construtor:

public AnuncioBean()
{
	this.anuncio = new Anuncio(); 
	this.anuncio.setLatitude(-21.193935);
	this.anuncio.setLongitude(-47.810655);
}

E também nele eu tenho o meu método Cadastrar:

public String cadastrar() {

	try {
		System.out.println("Latitude : " + this.getAnuncio().getLatitude() + "\nLongitude : " + this.getAnuncio().getLongitude());
		this.getAnuncioService().salvar(this.getAnuncio());

	} catch (Exception e) {

		FacesUtils.adicionarMensagem("base_message", e, "Ocorreu uma falha ao tentar efetuar o cadastro do anuncio.");

		return null;
	}

	FacesUtils.adicionarMensagem("base_message", GenericExceptionMessageType.INFO, "O cadastro do anuncio foi realizado com sucesso!");

	this.limpar();

	return "sucesso";
}

No construtor eu tenho definido a minha localização Default na qual o Rich:GMap será renderizado:

Construtor do Bean:

this.anuncio.setLatitude(-21.193935);
this.anuncio.setLongitude(-47.810655);

Página:
<rich:gmap … lat="#{anuncioBean.anuncio.latitude}" lng="#{anuncioBean.anuncio.longitude}" … />

O problema é que ao chamar o meu método Cadastrar do AnuncioBean, ele não está com a Latitude e Longitude atualizada, caso eu altere esses valores andando pelo Rich:GMap. Eu sei que o GMap está com novos valores de Latitude e Longitude, pois através do javascript, eu consigo visualizar esses valores nos campos que eu coloquei abaixo do GMap:

&lt;h:outputText value="--" id="txtInputLatitude" /&gt;
e
&lt;h:outputText value="--" id="txtInputLongitude" /&gt;

Só que no método Cadastrar do Bean, esses valores (latitude e longitude) ainda estão com os valores Default, -21.193935 e -47.810655 (respectivamente).

Alguém tem alguma idéia de como eu posso atualizar os valores do BEAN???
Pois o valor está sendo atualizado do lado do cliente (javascript). Será que tem como eu atualizar o valor do lado servidor (bean). Até onde eu conheço, só pelo fato dos valores latitude e longitude do meu rich:gmap já estarem vinculados a um atributo no meu Bean, isso deveria funcionar.

<rich:gmap … lat="#{anuncioBean.anuncio.latitude}" lng="#{anuncioBean.anuncio.longitude}" … />

Se for necessário, abaixo está o meu Javascript onde trabalho com o GMap:

<script>
var geocoder;
var address;

function InitEventHandler() {
	GEvent.addListener(map, "dblclick", getAddress);
	//map.setCenter(new GLatLng(-21.193935, -47.810655), 5);
	
	geocoder = new GClientGeocoder();
}

function getAddress(overlay, latlng) {
	if (latlng != null) {
		address = latlng;
		geocoder.getLocations(latlng, showAddress);
	}
}

function showAddress(response) {
	map.clearOverlays();
	if (!response || response.Status.code != 200) {
		alert("Erro ao processar a localizacao escolhida.\nStatus Code:" + response.Status.code);
	} else {
		place = response.Placemark[0];
		point = new GLatLng(place.Point.coordinates[1],
				place.Point.coordinates[0]);

		var cifraoIcon = new GIcon(G_DEFAULT_ICON);
		cifraoIcon.image = "#{facesContext.externalContext.request.contextPath}/img/icones/cifrao_20.png";
		markerOptions = { icon:cifraoIcon };
		
		marker = new GMarker(point, markerOptions);
		
		map.addOverlay(marker);
		marker.openInfoWindowHtml('<b>orig latlng: </b>' + response.name
				+ '<br/>' + '<b>Latitude: </b>' + place.Point.coordinates[1]
				+ '<br/>' + '<b>Longitude: </b>' + place.Point.coordinates[0]
				+ '<br/>' + '<b>Status Code: </b>' + response.Status.code
				+ '<br/>' + '<b>Status Request: </b>' + response.Status.request
				+ '<br/>' + '<b>Endereco: </b>' + place.address
				+ '<br/>' + '<b>Precisao: </b>' + place.AddressDetails.Accuracy
				+ '<br/>' + '<b>Codigo do pais: </b>' + place.AddressDetails.Country.CountryNameCode);
		map.setCenter(point);

		var obj1 = document.getElementById("form_anuncio_cadastro:txtInputLatitude");
		var obj2 = document.getElementById("form_anuncio_cadastro:txtInputLongitude");

		obj1.innerHTML = point.x; //poderia ser place.Point.coordinates[1];
		obj2.innerHTML = point.y; //poderia ser place.Point.coordinates[0];

	}
}

</script>

[quote=mlcalache]Bom pessoal?
Estou apanhando um pouco com o GMap do RichFaces.

Gostaria de salvar a Latitude e a Longitude selecionada em uma instancia do Rich:GMap.

O meu mapa está assim:

	&lt;rich:gmap gmapVar="map" style="width:500px; height:500px"
		gmapKey="#{gmapBean.gmap_key}" zoom="#{gmapBean.zoom}" id="gmap"
		mapType="G_NORMAL_MAP" lat="#{anuncioBean.anuncio.latitude}"
		lng="#{anuncioBean.anuncio.longitude}" showGScaleControl="false"
		showGLargeMapControl="false" showGMapTypeControl="false"
		oninit="InitEventHandler()" /&gt;

E logo abaixo dele tenho, por exemplo, dois campos:

	&lt;h:outputText value="Latitude: " id="txtLatitude" /&gt;
	&lt;h:outputText value="--" id="txtInputLatitude" /&gt;
	<br />
	&lt;h:outputText value="Longitude: " id="txtLongitude" /&gt;
	&lt;h:outputText value="--" id="txtInputLongitude" /&gt;

Para a minha página em questão, eu tenho um ManagedBean chamado AnuncioBean.java.
No AnuncioBean, eu possuo o seguinte construtor:

	public AnuncioBean()
	{
		this.anuncio = new Anuncio(); 
		this.anuncio.setLatitude(-21.193935);
		this.anuncio.setLongitude(-47.810655);
	}

E também nele eu tenho o meu método Cadastrar:

public String cadastrar() {

		try {
			System.out.println("Latitude : " + this.getAnuncio().getLatitude() + "\nLongitude : " + this.getAnuncio().getLongitude());
			this.getAnuncioService().salvar(this.getAnuncio());

		} catch (Exception e) {

			FacesUtils.adicionarMensagem("base_message", e, "Ocorreu uma falha ao tentar efetuar o cadastro do anuncio.");

			return null;
		}

		FacesUtils.adicionarMensagem("base_message", GenericExceptionMessageType.INFO, "O cadastro do anuncio foi realizado com sucesso!");

		this.limpar();

		return "sucesso";
	}

No construtor eu tenho definido a minha localização Default na qual o Rich:GMap será renderizado:

Construtor do Bean:

...
this.anuncio.setLatitude(-21.193935);
this.anuncio.setLongitude(-47.810655);
...

Página:

&lt;rich:gmap ... lat="#{anuncioBean.anuncio.latitude}" lng="#{anuncioBean.anuncio.longitude}" ... /&gt;

O problema é que ao chamar o meu método Cadastrar do AnuncioBean, ele não está com a Latitude e Longitude atualizada, caso eu altere esses valores andando pelo Rich:GMap. Eu sei que o GMap está com novos valores de Latitude e Longitude, pois através do javascript, eu consigo visualizar esses valores nos campos que eu coloquei abaixo do GMap:

	&lt;h:outputText value="--" id="txtInputLatitude" /&gt;
	e
	&lt;h:outputText value="--" id="txtInputLongitude" /&gt;

Só que no método Cadastrar do Bean, esses valores (latitude e longitude) ainda estão com os valores Default, -21.193935 e -47.810655 (respectivamente).

Alguém tem alguma idéia de como eu posso atualizar os valores do BEAN???
Pois o valor está sendo atualizado do lado do cliente (javascript). Será que tem como eu atualizar o valor do lado servidor (bean). Até onde eu conheço, só pelo fato dos valores latitude e longitude do meu rich:gmap já estarem vinculados a um atributo no meu Bean, isso deveria funcionar.

&lt;rich:gmap ... lat="#{anuncioBean.anuncio.latitude}" lng="#{anuncioBean.anuncio.longitude}" ... /&gt;

Se for necessário, abaixo está o meu Javascript onde trabalho com o GMap:

&lt;script&gt;
	var geocoder;
	var address;

	function InitEventHandler() {
		GEvent.addListener(map, "dblclick", getAddress);
		//map.setCenter(new GLatLng(-21.193935, -47.810655), 5);
		
		geocoder = new GClientGeocoder();
	}

	function getAddress(overlay, latlng) {
		if (latlng != null) {
			address = latlng;
			geocoder.getLocations(latlng, showAddress);
		}
	}

	function showAddress(response) {
		map.clearOverlays();
		if (!response || response.Status.code != 200) {
			alert("Erro ao processar a localizacao escolhida.\nStatus Code:" + response.Status.code);
		} else {
			place = response.Placemark[0];
			point = new GLatLng(place.Point.coordinates[1],
					place.Point.coordinates[0]);

			var cifraoIcon = new GIcon(G_DEFAULT_ICON);
			cifraoIcon.image = "#{facesContext.externalContext.request.contextPath}/img/icones/cifrao_20.png";
			markerOptions = { icon:cifraoIcon };
			
			marker = new GMarker(point, markerOptions);
			
			map.addOverlay(marker);
			marker.openInfoWindowHtml('<b>orig latlng: </b>' + response.name
					+ '<br/>' + '<b>Latitude: </b>' + place.Point.coordinates[1]
					+ '<br/>' + '<b>Longitude: </b>' + place.Point.coordinates[0]
					+ '<br/>' + '<b>Status Code: </b>' + response.Status.code
					+ '<br/>' + '<b>Status Request: </b>' + response.Status.request
					+ '<br/>' + '<b>Endereco: </b>' + place.address
					+ '<br/>' + '<b>Precisao: </b>' + place.AddressDetails.Accuracy
					+ '<br/>' + '<b>Codigo do pais: </b>' + place.AddressDetails.Country.CountryNameCode);
			map.setCenter(point);

			var obj1 = document.getElementById("form_anuncio_cadastro:txtInputLatitude");
			var obj2 = document.getElementById("form_anuncio_cadastro:txtInputLongitude");

			obj1.innerHTML = point.x; //poderia ser place.Point.coordinates[1];
			obj2.innerHTML = point.y; //poderia ser place.Point.coordinates[0];

		}
	}
&lt;/script&gt;

[/quote]

Por favor, coloque a tag [code] para facilitar a visualização!

Abraços

Agora tentando t ajudar … rsrs

Qual tipo de form você está usando a4j:form ou h:form?

Deve funcionar colocando a tag:

<t:saveState value="#{anuncioBean.anuncio.longitude}" />
<t:saveState value="#{anuncioBean.anuncio.latitude}" />

Esse trecho faz com que ele guarde os valores da latitude e longitude durante o request e response da sua página!

Ah essa propriedade é do Tomahawk!

Abraços

[quote=markinho]Agora tentando t ajudar … rsrs

Qual tipo de form você está usando a4j:form ou h:form?

Deve funcionar colocando a tag:

<t:saveState value="#{anuncioBean.anuncio.longitude}" />
<t:saveState value="#{anuncioBean.anuncio.latitude}" />

Esse trecho faz com que ele guarde os valores da latitude e longitude durante o request e response da sua página!

Ah essa propriedade é do Tomahawk!

Abraços[/quote]

complementando essa resposta e lembrando que o cara está usando o RichFaces, pode-se usar o a4j:keepalive que é equivalente ao t:saveState do Tomahawk

Obrigado pela dica da tag CODE.
E vou testar as respostas assim que possível.
Obrigado!
Respondo aqui caso dê certo ou errado.

[quote=markinho]Agora tentando t ajudar … rsrs

Qual tipo de form você está usando a4j:form ou h:form?

Deve funcionar colocando a tag:

<t:saveState value="#{anuncioBean.anuncio.longitude}" />
<t:saveState value="#{anuncioBean.anuncio.latitude}" />

Esse trecho faz com que ele guarde os valores da latitude e longitude durante o request e response da sua página!

Ah essa propriedade é do Tomahawk!

Abraços[/quote]

Estou utilizando o <h:form>.
Vou tentar com o a4j:keepalive.

[quote=alias][quote=markinho]Agora tentando t ajudar … rsrs

Qual tipo de form você está usando a4j:form ou h:form?

Deve funcionar colocando a tag:

<t:saveState value="#{anuncioBean.anuncio.longitude}" />
<t:saveState value="#{anuncioBean.anuncio.latitude}" />

Esse trecho faz com que ele guarde os valores da latitude e longitude durante o request e response da sua página!

Ah essa propriedade é do Tomahawk!

Abraços[/quote]

complementando essa resposta e lembrando que o cara está usando o RichFaces, pode-se usar o a4j:keepalive que é equivalente ao t:saveState do Tomahawk [/quote]

Nunca utilizei o a4j:keepalive e nem nada do Tomahawk.
Poderia me ajudar com a sua dica do keepalive?

fiz assim:

<a4j:keepAlive beanName="anuncioBean" ></a4j:keepAlive>

Mas não obtive resultado. Como posso fazer?

ps: anuncioBean é o alias configurado no faces.config para a class AnuncioBean. Ou seja, devo usar o alias ou o nome da classe bean mesmo?

Cara nunca trabalhei com GMAP, mas, dá uma olhada no DEMO e ve se ajuda: http://livedemo.exadel.com/richfaces-demo/richfaces/gmap.jsf?c=gmap&tab=usage !

abraço !!

[quote=mate42]Cara nunca trabalhei com GMAP, mas, dá uma olhada no DEMO e ve se ajuda: http://livedemo.exadel.com/richfaces-demo/richfaces/gmap.jsf?c=gmap&tab=usage !

abraço !![/quote]

Já vi esse demo. Afinal, ele é o inicio de tudo hahaha. Mas nele está só um exemplo de exibição.

Minha aplicação eu crio 1 marcador no mapa, então eu tenho que salvar a lat e lng desse marcador, que no caso coincide com o centro do mapa também (pois eu centralizo no marcador).

Eu acabei conseguindo de uma forma meio que ‘gambiarra’.
Eu estou conseguindo jogar esses valores para um h:inputText e o value deste está atribuido a um campo do Bean (neste caso, ao lat="#{anuncioBean.anuncio.latitude}"
lng="#{anuncioBean.anuncio.longitude}"). Aí desta forma deu certo.

Aí acabou ficando legal pois se o usuário quiser ele mesmo digitar os valores de LAT e LNG nos InputText, ele poderá. Aí eu só mando o mapa ser renderizado com um marcador na localização conforme os inputs do usuários nos inputtext.

Valeu pessoal. Quem tiver interesse, me peça que eu envio o fonte.

Prezado mlcalache,

Estou começando a desenvolver uma aplicação que utiliza RichFaces e GMap e gostaria de obter os fontes de seu trabalho para servir de referência.

Desde já agradeço,

Jakie

Me passe o seu email. Vou providenciar para você o fonte necessário. Falou.

Tudo bem mlcalache?

Estou desenvolvendo algo semelhante ao que você desenvolveu. Se puder me ceder os fontes agradeço. Meu email é : rafael.rodrigues1607@gmail.com. Valeu!