Javascript e displaytag

Olá pessoal…

Estou com o seguinte problema:

Um dos campos na minha tabela displaytag terá que se transformar em um link, só que um link para abrir um popup que passará três valores obtidos em campos diferentes da minha tabela displaytag…

Anteriormente eu usava uma função javascript window.open passando esses valores, onde a função era chamada de dentro de um logic:iterate…

Mas agora com o displaytag?.. Não aceita javascript!

Alguém tem alguma idéia do que poderia fazer para abrir esse popup através de um link na minha tabela displaytag, passando os valores necessários?

Desde já agradeço a ajuda!!!

http://displaytag.homeip.net/displaytag-examples-1.1/example-decorator-link.jsp

Olha esse exemplo…
É só usa com o pattern decorator… :wink:

Como eu faço para referenciar a lista?

Seguindo o exemplo do tutorial dá erro:

ListObject lObject= (ListObject)getCurrentRowObject();
		int lIndex= getListIndex();
		return "<a href=\"details.jsp?index=" + lIndex + "\">" + lObject.getId() + "</a>";

O ListObject não existe…
Eu tenho que criar um? Isso não teria lógica!

Para pegar o referenciado teria que passar parâmetros, mas como fazer?

Sei lá, meio inconsistente esse exemplo, sem explicar como proceder!

ListObject, é um tipo de objeto qualquer que eles criaram, soh pra exemplo.
No meu eu fiz isso, e funcionou:

/*
 * Wrapper.java
 * Criado em: 01/06/2006 - 00:55:00
 * Copyright (c) 2006, Misael Silveira
 * All rights reserved.
 */
/**
 * @author Misael Silveira
 * @version $Id: $
 */
package br.unisc.decorator;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.jsp.PageContext;

import org.displaytag.decorator.TableDecorator;

import br.unisc.model.Contato;

public class Wrapper extends TableDecorator {

	public Wrapper() {
		super();
	}

	public String getNullValue() {
		return null;
	}

	public String getLink1() {
		PageContext context = this.getPageContext();
		String contexto = ( (HttpServletRequest) context.getRequest() ).getContextPath();
		Contato object = (Contato) getCurrentRowObject();
		return "<a href=\"" + contexto + "/Controller.java?action=viewContato&idContato="
				+ object.getId_contato() + "\">" + object.getId_contato()
				+ "</a>";
	}

	public String getLink2() {
		PageContext context = this.getPageContext();
		String contexto = ( (HttpServletRequest) context.getRequest() ).getContextPath();
		Contato object = (Contato) getCurrentRowObject();
		int id = object.getId_contato();

		return "<center><a href=\"" + contexto + "/Controller.java?action=viewContato&idContato=" + id
				+ "\">Visualizar</a> | "
				+ "<a href=\"" + contexto + "/Controller.java?action=editContato&idContato="
				+ id + "\">Editar</a> | "
				+ "<a href=\"" + contexto + "/Controller.java?action=deleteContato&idContato="
				+ id + "\">Deletar</a></center>";
	}
}

Ah, meu codigo ficou errado no exemplo, o forum filtrou algumas tags…

[editado] postei de novo e desabilitei o html[/editado]

Caramba, este méthodo esta retornando um erro em tempo de execução!!!

ClassCastException…

Diz que não encontra o método em questão, e agora?

	public String getNumero()
	{
 		PageContext context = this.getPageContext();
 		String contexto = ( (HttpServletRequest) context.getRequest() ).getContextPath();
 		
		AutorizacaoForm object= (AutorizacaoForm) getCurrentRowObject();
		if (object.getOwner() == AMH.CABESP) {		
			return "<a href=\"consultaAutorizacao.do?action=consulta&numero=" + object.getNumero() + "&owner=" + 
					object.getOwner() +"&situacao=" + object.getSituacao() +"\" class=\"limpaLink\">" + object.getNumero() + "</a>";	
		} else {
			return "<a href=\"consultaAutorizacao.do?action=consulta&numero=" + object.getNumero() + "&owner=" + 
			object.getOwner() +"&tipoItens=" + object.getSituacao() +"\" class=\"limpaLink\">" + object.getNumero() + "</a>";
		}
	}

Esse é o código…
O que tem de errado???

&lt;display:table name="sessionScope.contatos" decorator="br.unisc.decorator.Wrapper" defaultsort="2" defaultorder="ascending" pagesize="10"&gt; &lt;display:column property="link1" title="ID&nbsp;&nbsp;&nbsp;" /&gt; &lt;display:column property="nome" sortable="true" headerClass="sortable" /&gt; &lt;display:column property="sobrenome" sortable="true" headerClass="sortable" /&gt; &lt;display:column property="email" autolink="true" /&gt; &lt;display:column property="celular" /&gt; &lt;display:column property="link2" title="&lt;center&gt;Ações&lt;/center&gt;" /&gt; &lt;/display:table&gt;

Tua display tu deixou nesse estilo?
Vê as colunas que tem link1, e link2??
É o nome dos métodos na minha classe decorator que criei, só que sem os get…
Vê se não foi esse o erro…

tente fazer assim:

<display:table....>

    <display:column title="xxx">
            // coloque o link com js aqui
    </display:column>

</display:table...>

Bem, essa é minha classe:

package br.com.cabesp.commons.util;

import org.displaytag.decorator.TableDecorator;

import br.com.cabesp.autorizacao.AMH;
import br.com.cabesp.autorizacao.action.AutorizacaoForm;

public class DisplayTagDecorators extends TableDecorator {
	
	public DisplayTagDecorators() {
		super();
	} 
	
 	public String getNullValue() {
 		return null;
 	}
	
	public String getLink1()
	{ 		
		AutorizacaoForm object = (AutorizacaoForm) getCurrentRowObject();
		if (object.getOwner() == AMH.CABESP) {		
			return "<a href=\"consultaAutorizacao.do?action=consulta&numero=" + object.getNumero() + "&owner=" + 
			object.getOwner() +"&situacao=" + object.getSituacao() +"\" class=\"limpaLink\">" + object.getNumero() + "</a>";	
		} else {
			return "<a href=\"consultaAutorizacao.do?action=consulta&numero=" + object.getNumero() + "&owner=" + 
			object.getOwner() +"&tipoItens=" + object.getSituacao() +"\" class=\"limpaLink\">" + object.getNumero() + "</a>";
		}
	}
}

e essas são as tags displaytag:

<display:table name="autorizacaoList" pagesize="20" sort="list" requestURI="consultaAutorizacao.do" class="table" align="center" decorator="br.com.cabesp.commons.util.DisplayTagDecorators">
   <display:column property="link1" title="Numero" />
   <display:column property="desc_tipo" title="Tipo" />
   <display:column property="beneficiario" sortable="true" title="Paciente" />
   <display:column property="dataInicio" title="Data Inicial" />
   <display:column property="dataFinal" title="Data Final" />
   <display:column property="desc_situacao" title="Situação" />
</display:table>

Aparentemente deveria dar certo, mas quando executo ele dá um erro de propriedade:

Estou meio que sem idéias do que possa ser…
Talvez seja algo pequeno que eu esteja deixando passar despercebido…
Se tiver alguma idéia… Seria grato!!!

Tem que chamar ela na tua display como
link1

Tu chamou ela como link na declaração da tua coluna…

[ ]'s…

é que esse erro eu peguei quando estava tentando usar o nome do méthodo diferente… Estava usando getLink sem o “1”…

O erro na verdade é esse:

zirocool, uma coisa eu ainda não saquei nas DisplayTags. Se eu quero exibir o resultado de uma consulta ao BD de um dao qualquer.Por exemp.: um DAO.getUsuarios() com uma Collection com todos os usuários(e seus respectivos nomes,idades…)é só eu referenciar esse DAO no atributo name?Não há algo do Tipo:

<display:table name=“DAO.getUsuarios()” pagesize=“20” sort=“list”>
E sim :
<display:table name=“usuariosLista” pagesize=“20” sort=“list”>

Eu acho que só por akele tipo, é que ele pega a lista pela sessao, ou pela request, entende??
Geralmente é usada na camada view, com algum dispathcer antes de chegar nela…
Se tu quiser fazer o eskema na propria JSP, pode fazer como no exemplo deles, instancia numa scriptlet o teu dao, e seta a lista, à um nome de atributo qualquer na sessao, ou na request, e pega ele como no segundo exemplo.

No primeiro modo, acho que funcionaria, soh se o o teu getUsuarios() fosse um método estático.

Pra chamar uma lista direto na tua jsp é soh fazer isso:

[code]<%
DAOQualquer objeto = new DAOQualquer();
List lista = objeto.getUsuarios();

request.setAttribute(“usuariosLista”,lista);

%>

<display:table name=“listaUarios” pagesize=“20” sort=“list”> [/code]

%>

http://displaytag.homeip.net/displaytag-examples-1.1/example-sorting.jsp.source

Olha o source desse exemplo.
Nele, ele passa um atributo do tipo TestList pelo request, e recupera ele com o atributo name da tagdisplay…

é bem provável q ela faz uma instropecção na request e na sessao… :smiley:

Opa, isso eu jah havia pensado.O que na verdade eu estava pensando é que só de passar a classe e os campos na tag column ele jah achava os dados…(Tô vendo que não!) Seria estranho pois teria que haver introspecção e análise dos campos da classe e só isso implicaria em atributos públicos! :shock:
Acho que vou usar o esquema via scriptlet mesmo!

Faz a sua servlet jogar os valores no request ou na sessão…

aí é só mapear com o nome dado pela displaytag…
tipo “setAttribute(“nome_da_chave”, List / Collection / etc)”
display:table name=“nome_da_chave”

Quanto ao meu problema, ta difícil!!!

Não sei o que acontece mas o valor esta sendo passado nulo e da um erro de Casting não sei por que!!!
Já fiz um monte de coisa diferente e nada deu certo!!! Caramba!!!

eu sempre usei do jeito que te passei e sempre funcionou… vc tentou?

Eu tentei mas não consegui pegar os valores da linha em questão…

Ele retorna tudo em branco…

tentei usando request.getParameter(“algo”); e nada!!!

será que vou ter que colocar jstl pra ver se vai?

to usando struts e passando o Array para a sessão…

Só para constar, estou fazendo assim:

&lt;%@ taglib uri="http://displaytag.sf.net" prefix="display" %&gt; &lt;%@ page import="ageris.dao.MySQLRamoDeSeguroDAO,java.util.*"%&gt; &lt;% MySQLRamoDeSeguroDAO msrdsd = new MySQLRamoDeSeguroDAO(); List lista = msrdsd.retornarColecaoDeRamosDeSeguro("data"); request.setAttribute("ramoseg",lista); %&gt; &lt;h2&gt;Exibindo Ramos de Seguro:&lt;/h2&gt; &lt;display:table name="ramoseg" pagesize="10"&gt; blblabla...

Mas se o valor está sendo passado nulo, é só procurar a origem.

hugohasth, jah tentou algo do tipow:

[code]
public String getLink1(){
Object obj=this.getCurrentRowObject();

if(obj instanceof AutorizacaoForm)
//faz outra comparação com object.getOwner() == AMH.CABESP
else
… [/code]
Tô só chutando, jah que as coisas estão meio turvas…