[Logo] Neo Framework Forum
  [Search] Busca   [Recent Topics] Tópicos Recentes   [Members]  Lista de Usuários   [Groups] De volta para a página principal 
[Register] Registrar / 
[Login] Entrar 
Colocar uma mensagem ao lado de uma propriedade.  XML
Índice dos Fóruns -> Dúvidas Ir para a página: Anterior  1, 2
Autor Mensagem
guilherme.pimentel
Template
[Avatar]

Membro desde: 21/06/2007 15:52:28
Mensagens: 109
Localização: BELO HORIZONTE
Offline

Ficou perfeito!!!!!!Esse framework e esse suporte são muito bons!!!

GUILHERME A. MUNCK PIMENTEL
DESENVOLVEDOR JEE
BRASIL - MINAS GERAIS - BELO HORIZONTE
guilherme.pimentel
Template
[Avatar]

Membro desde: 21/06/2007 15:52:28
Mensagens: 109
Localização: BELO HORIZONTE
Offline

Bom dia, eu fiz tudo isso e esta funcionando, o que eu quero agora é o seguinte. No combo(que é listado um codigo String) quando o usuario altera o valor eu queria fazer com que na frente do combo aparecesse a descrição do bean, para fazer isso eu teria que chamar o metodo load() do Service do respectivo bean na entrada via ajax, mas existe alguma forma mais facil de fazer isso???? deu pra entender???

GUILHERME A. MUNCK PIMENTEL
DESENVOLVEDOR JEE
BRASIL - MINAS GERAIS - BELO HORIZONTE
rogel.garcia
Xiita

Membro desde: 17/04/2007 16:35:03
Mensagens: 275
Offline

Entendi...


Não tem nenhum recurso automático do NEO para fazer isso.. vc terá que fazer utilizando os recursos normais do NEO...

Vc pode fazer assim:


no seu jsp coloque

<n:ajax functionName="executarAjax(codigo)" parameters="javascript:'codigo='+codigo" action="..." .... />

<n:property name="x" onchange="executarAjax(this.value)"/>

No servidor crie uma action que carregue o bean e faça println de um script mais ou menos assim:
out.println("document.getElementById('id do div que tera a msg').innerHTML = "+descricao);


Ficou um pouco resumido demais meu exemplo.. se não tiver entendendo me fala que eu faço um exemplo mais detalhado...
guilherme.pimentel
Template
[Avatar]

Membro desde: 21/06/2007 15:52:28
Mensagens: 109
Localização: BELO HORIZONTE
Offline

Certo... eu fiz o seguinte.. no EntradaTag.jsp coloquei essa função:

Criei uma classe para receber as requisições ajax:

Code:
 
 @Controller(path="/adm/AjaxCombo")
 public class ComboAjaxController extends MultiActionController {
 	AreaService 		areaService;	
 	ProjetoService 		projetoService;
 	....
 
 	public void setAreaService(AreaService areaService) {
 		this.areaService = areaService;
 	}
 	public void setProjetoService(ProjetoService projetoService) {
 		this.projetoService = projetoService;
 	}
                  ...
 
 
 	public void getProjeto(WebRequestContext request)throws IOException{
 		Projeto projeto = (Projeto) ServletRequestDataBinderNeo.translateObjectValue(null, request.getParameter("projeto"), null);
 		request.getServletResponse().getWriter().print(projetoService.load(projeto).getDescricao());
 	}
 	public void getArea(WebRequestContext request)throws IOException{
 		Area area = (Area) ServletRequestDataBinderNeo.translateObjectValue(null, request.getParameter("area"), null);
 		request.getServletResponse().getWriter().print(areaService.load(area).getNome());
 	}
                   .....
 }
 
 



Code:
 			var objName = '';
 			function getBean(obj){
 				objName  = obj.name;
 			    beanName = obj.name.substring(obj.name.lastIndexOf('.')+1,obj.name.length);
 			    metodo   = 'get' + beanName.substring(0,1).toUpperCase() + beanName.substring(1,beanName.length);
 				
 				if (obj.value != "<null>"){
 					sendRequest('${pageContext.request.contextPath}/adm/AjaxCombo?'+beanName+'='+obj.value,'ACAO='+metodo,'POST', setDescricaoBean, erroChamarAjax);
 				}else{
 			 		document.getElementById("msg."+objName).style.display = "none";
 		 			document.getElementById("msg."+objName).innerHTML = "";
 				}
 			}
 			function setDescricaoBean(data){
 				if (data == 'null')data = 'Descrição não preenchida';
 		 		document.getElementById("msg."+objName).style.display = "";
 		 		document.getElementById("msg."+objName).innerHTML = data;
 			}
 			function erroChamarAjax(request){
 		 		document.getElementById("msg."+objName).style.display = "";
 		 		document.getElementById("msg."+objName).innerHTML = request.responseText;
 			}		 
 


e no JSP eu coloquei o seguinte codigo

Code:
 			<n:comboReloadGroup useAjax="true">
 				<t:property name="area.projeto" label="Projeto" ONCHANGE="getBean(this)" />
 				<t:property name="area" 		label="Area" ONCHANGE="getBean(this)" />
 			</n:comboReloadGroup>
 



Ficou assim ..... será que tem como melhorar????

GUILHERME A. MUNCK PIMENTEL
DESENVOLVEDOR JEE
BRASIL - MINAS GERAIS - BELO HORIZONTE
rogel.garcia
Xiita

Membro desde: 17/04/2007 16:35:03
Mensagens: 275
Offline

É isso mesmo Guilherme.. o que tem como vc fazer para melhorar é tornar o algorítmo genérico...

Ao invés de ter uma funçao para cada bean... vc pode ter uma única funçao parametrizável.. que retorna a descriçao de acordo com o bean que foi passado como parâmetro....

rogel.garcia
Xiita

Membro desde: 17/04/2007 16:35:03
Mensagens: 275
Offline

Essa funcionalidade de mostrar a descrição do bean é comum na sua aplicação?


No label dos combos é mostrado o q?
Porque a descrição já não é mostrada diretamente no combo?

[A propriedade anotada com @DescriptionProperty será utilizada como label para os options do combo]
rogel.garcia
Xiita

Membro desde: 17/04/2007 16:35:03
Mensagens: 275
Offline

Ao invés de fazer isso
Code:
 (Projeto) ServletRequestDataBinderNeo.translateObjectValue(null, request.getParameter("projeto"), null);
 

é melhor criar um bean
Code:
 class Model {
      Object modelo;
      ..getter e settter..
 }
 

e no controller fazer
Code:
 public void getProjeto(WebRequestContext req, Model model) {
     Projeto projeto = (Projeto) model.getModelo();
 }
 

O nome do parâmetro do ajax ao invés de ser projeto ou area.. deverá ser modelo...
troque

Code:
sendRequest('${pageContext.request.contextPath}/adm/AjaxCombo?'+beanName+'='+o

por
Code:
sendRequest('${pageContext.request.contextPath}/adm/AjaxCombo?modelo='+o
guilherme.pimentel
Template
[Avatar]

Membro desde: 21/06/2007 15:52:28
Mensagens: 109
Localização: BELO HORIZONTE
Offline

A questão é o seguinte o @DescriptionProperty eu coloquei na sigla dos objetos pois serão eles que irão aparecer no grid por exemplo e nos combos eu tenho que listar ele e ao lado eu preciso de mostrar uma outroa propriedade .... ai que vem o problema como vc´s viram ... essa propriedade vai depender de bean para bean .... será que seria interessante buscar o valor da propriedade com reflexão??? outra coisa ... no exemplo que vc colocou o Model teria que ter o atributo modelo do tipo Object mesmo ou teria que ter um para cada um????

GUILHERME A. MUNCK PIMENTEL
DESENVOLVEDOR JEE
BRASIL - MINAS GERAIS - BELO HORIZONTE
rogel.garcia
Xiita

Membro desde: 17/04/2007 16:35:03
Mensagens: 275
Offline

Buscar via reflection seria interessante... O tipo no Model seria object mesmo..
Quando vc manda o parametro modelo=x.y.Z[id=3] o neo colocará um objeto tipo x.y.z se for modelo=x.y.W[id=8] o neo colocará... W

Você pode criar uma annotation @SecondDescription...
Achar essa propriedade via reflection... alterar os templates e criar um controller genérico...
Aí bastará anotar a propriedade com @SecondDescription que a funcionalidade que vc criou seria ativada...
guilherme.pimentel
Template
[Avatar]

Membro desde: 21/06/2007 15:52:28
Mensagens: 109
Localização: BELO HORIZONTE
Offline

Tem como vc explicar melhor como eu implementaria essa annotation???

GUILHERME A. MUNCK PIMENTEL
DESENVOLVEDOR JEE
BRASIL - MINAS GERAIS - BELO HORIZONTE
rogel.garcia
Xiita

Membro desde: 17/04/2007 16:35:03
Mensagens: 275
Offline

tem sim...

vou montar um exemplo depois e te mando....
rogel.garcia
Xiita

Membro desde: 17/04/2007 16:35:03
Mensagens: 275
Offline

guilherme.. para fazer essa funcionalidade genérica vc faz o seguinte..

cria um <span id=""></span> pra cada propriedade, e coloca ao lado do input no seu PropertyTag.jsp

(voce já deve ter isso)

vc deve ter algo parecido com
<span id="msg.area"></span>

No property vc coloca:
Code:
 <t:property name="area" label="Area" onchange="loadSecondDescription(this)" />
 

e cria o seguinte javascript

Code:
 <script type="text/javascript">
 	function loadSecondDescription(property){
 		var value = property.value;
 		var div = 'msg.'+property.name;
 		sendRequest('${pageContext.request.contextPath}/modulo/secondDescription', 
 		'bean='+value+'&descriptionarea='+div,
 		'POST',
 		callbackSecondDescription);
 	}
 	
 	function callbackSecondDescription(data){
 		eval(data);
 	}
 </script>
 


Você cria a anotation:

Code:
 package annotations;
 
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 
 @Target(ElementType.METHOD)
 @Retention(RetentionPolicy.RUNTIME)
 public @interface SecondDescription {
 
 }
 


e anota a propriedade desejada

Code:
 @SecondDescription
 public String getDescricao(){...}
 



Faz um controller como o seguinte:
Code:
 package controller;
 
 import java.lang.reflect.Method;
 
 import annotations.SecondDescription;
 import br.com.linkcom.neo.controller.Controller;
 import br.com.linkcom.neo.controller.DefaultAction;
 import br.com.linkcom.neo.controller.MultiActionController;
 import br.com.linkcom.neo.core.standard.ApplicationContext;
 import br.com.linkcom.neo.core.standard.Neo;
 import br.com.linkcom.neo.core.web.WebRequestContext;
 import br.com.linkcom.neo.persistence.GenericDAO;
 import br.com.linkcom.neo.util.Util;
 import br.com.linkcom.neo.view.ajax.View;
 
 @Controller(path="/modulo/secondDescription")
 public class SecondDescriptionController extends MultiActionController {
 
 	@DefaultAction
 	public void getSecondDescription(WebRequestContext request, BeanHolder beanHolder){
 		Object bean = beanHolder.getBean();
 		if(bean != null){
 			String secondDescriptionProperty = getSecondDescriptionPropertyName(bean.getClass());
 			if(secondDescriptionProperty != null){
 				GenericDAO<Object> dao = getDaoForBean(bean);
 				bean = dao.load(bean);
 				
 				ApplicationContext applicationContext = request.getApplicationContext();
 				Object secondDescriptionValue = applicationContext
 						.getBeanDescriptor(bean)
 							.getPropertyDescriptor(secondDescriptionProperty)
 								.getValue();
 				
 				String div = request.getParameter("descriptionarea");
 				String value = Util.strings.toStringDescription(secondDescriptionValue);
 				View.getCurrent()
 						.eval("document.getElementById('"+div+"').innerHTML " +
 								" = '"+value+"';");
 			}			
 		}
 	}
 
 	@SuppressWarnings("unchecked")
 	private GenericDAO<Object> getDaoForBean(Object bean) {
 		try {
 			return (GenericDAO<Object>) Neo.getObject(Class.forName("dao."+bean.getClass().getSimpleName() + "DAO"));
 		} catch (Exception e) {
 			throw new RuntimeException("Não foi possível encontrar um DAO para "+bean, e);
 		}
 	}
 
 	/**
 	 * Esse método retorna qual é o nome da propriedade que possui a anotacao @SecondDescription
 	 * ou null se nenhuma tiver...
 	 * @param classe
 	 * @return
 	 */
 	private String getSecondDescriptionPropertyName(Class classe) {
 		Method[] declaredMethods = classe.getDeclaredMethods();
 		for (Method method : declaredMethods) {
 			if(method.isAnnotationPresent(SecondDescription.class)){
 				return Util.strings.uncaptalize(method.getName().substring(3));
 			}
 		}
 		return null;
 	}
 }
 


Pronto.. com esse código voce pode carregar o second description de qualquer propriedade..
Se vc desejar que todas as propriedades tenha um secondDescription vc pode colocar o onchange no template... e o javascript em um arquivo .js dentro da pasta /js que ele será carregado pelo neo...
Você terá que alterar os paths na funcao javascript e no controller e também o pacote dos daos da sua aplicacao no método getDaoForBean...
Eu utilizei algumas classes auxiliares do neo... mas isso poderia ser feito sem elas.. com um pouco mais de trabalho..

até mais...
pedro.goncalves
Equipe
[Avatar]
Membro desde: 17/04/2007 16:12:20
Mensagens: 539
Localização: Belo Horizonte - MG
Offline

Ficou massa hein roro!!!.. mais vc num tem que por um opcional não? tipo se vc quer usar isso ou não?...

teh

Pedro Gonçalves
http://pedrogoncalves.com.br
[Email] [WWW] [MSN]
guilherme.pimentel
Template
[Avatar]

Membro desde: 21/06/2007 15:52:28
Mensagens: 109
Localização: BELO HORIZONTE
Offline

Valeu!!!!

GUILHERME A. MUNCK PIMENTEL
DESENVOLVEDOR JEE
BRASIL - MINAS GERAIS - BELO HORIZONTE
 
Índice dos Fóruns -> Dúvidas Ir para a página: Anterior  1, 2
Ir para:   
Powered by JForum 2.1.7 © JForum Team