Autor |
Mensagem |
![[Post New]](/forum/templates/default/images/icon_minipost_new.gif) 27/06/2007 09:17:36
|
guilherme.pimentel
Template
![[Avatar]](/forum/images/avatar/1ff1de774005f8da13f42943881c655f.jpg)
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 |
|
 |
![[Post New]](/forum/templates/default/images/icon_minipost_new.gif) 25/07/2007 10:18:40
|
guilherme.pimentel
Template
![[Avatar]](/forum/images/avatar/1ff1de774005f8da13f42943881c655f.jpg)
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 |
|
 |
![[Post New]](/forum/templates/default/images/icon_minipost_new.gif) 25/07/2007 11:12:50
|
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...
|
|
 |
![[Post New]](/forum/templates/default/images/icon_minipost_new.gif) 25/07/2007 15:29:41
|
guilherme.pimentel
Template
![[Avatar]](/forum/images/avatar/1ff1de774005f8da13f42943881c655f.jpg)
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 |
|
 |
![[Post New]](/forum/templates/default/images/icon_minipost_new.gif) 25/07/2007 22:24:01
|
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....
|
|
 |
![[Post New]](/forum/templates/default/images/icon_minipost_new.gif) 25/07/2007 22:25:09
|
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]
|
|
 |
![[Post New]](/forum/templates/default/images/icon_minipost_new.gif) 25/07/2007 22:31:02
|
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
|
|
 |
![[Post New]](/forum/templates/default/images/icon_minipost_new.gif) 27/07/2007 14:36:53
|
guilherme.pimentel
Template
![[Avatar]](/forum/images/avatar/1ff1de774005f8da13f42943881c655f.jpg)
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 |
|
 |
![[Post New]](/forum/templates/default/images/icon_minipost_new.gif) 27/07/2007 18:57:43
|
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...
|
|
 |
![[Post New]](/forum/templates/default/images/icon_minipost_new.gif) 30/07/2007 14:06:16
|
guilherme.pimentel
Template
![[Avatar]](/forum/images/avatar/1ff1de774005f8da13f42943881c655f.jpg)
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 |
|
 |
![[Post New]](/forum/templates/default/images/icon_minipost_new.gif) 30/07/2007 21:26:19
|
rogel.garcia
Xiita
Membro desde: 17/04/2007 16:35:03
Mensagens: 275
Offline
|
tem sim...
vou montar um exemplo depois e te mando....
|
|
 |
![[Post New]](/forum/templates/default/images/icon_minipost_new.gif) 15/08/2007 13:37:52
|
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...
|
|
 |
![[Post New]](/forum/templates/default/images/icon_minipost_new.gif) 15/08/2007 19:29:47
|
pedro.goncalves
Equipe
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
 |
|
 |
![[Post New]](/forum/templates/default/images/icon_minipost_new.gif) 16/08/2007 13:37:24
|
guilherme.pimentel
Template
![[Avatar]](/forum/images/avatar/1ff1de774005f8da13f42943881c655f.jpg)
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 |
|
 |
|