Javascript e displaytag

29 respostas
H

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!!!

29 Respostas

zirocool

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

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

H

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!

zirocool

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>";
	}
}
zirocool

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

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

H

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???

zirocool

&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…

marcelo_mococa

tente fazer assim:

<display:table....>

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

</display:table...>
H

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!!!

zirocool

Tem que chamar ela na tua display como
link1

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

[ ]'s…

H

é 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:

Ironlynx

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”>
zirocool

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:

&lt;%
DAOQualquer objeto = new DAOQualquer();
List lista = objeto.getUsuarios();

request.setAttribute("usuariosLista",lista);

%&gt;

&lt;display:table name="listaUarios" pagesize="20" sort="list"&gt;

%>

zirocool

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:

Ironlynx

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!

H

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!!!

marcelo_mococa

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

H

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…

Ironlynx

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.

Ironlynx

hugohasth, jah tentou algo do tipow:

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

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

Na realidade a origem do erro esta no Casting do Bean:

[/code]
ListObject objeto = (ListObject) getCurrentRowObject();
[code]

Aí depois acontece erro de retorno nulo, mas tudo em consequência do displaytag não conseguir fazer esse Casting da minha Lista com o método da classe TableDecorator buscando os dados da linha corrente...

Agora o motivo desse Casting não dar certo é o que não consigo descobrir!!!

Quanto ao código do Iron, é isso mesmo, só que o que eu fiz foi setar a lista no request a partir do meu servlet(que no meu caso é uma action do Struts), sendo que poderia ser setado usando o padrão MVC para livrar o jsp de código java...

Claro que esse jeito que esta sendo feito também funciona normalmente, só que fica mais difícil para o Webmaster "desenhar" a página...

H

Ótima idéia Iron, vou tentar fazer isso agora mesmo…

Mas acredito que ao invés de dar o erro de sempre, ele vai retornar sem dados, será? parece que sim, mas vou tentar agora e ver no que vai dar…

H

Realmente, o problema estava no Casting…

A dica do Iron resolveu grande parte do problema…

Isso porque minha aplicação busca os dados na mesma consulta em dois bancos, a saber DB2 e SQLServer…

Aí o desenvolvedor que fez o bean fez um para cada banco e um outro que juntava apenas os dados principais destes beans…

Por isso, ao fazer instanceof eu posso distinguir entre um bean e outro retornando assim os dados de origem para o displaytag trabalhar…

Show!!! Agora ta funcionando massa…

O grande problema agora é o desempenho, esta muuuuuuuuuito lento…

Vou pesquisar sobre a junção de AJAX com Displaytag para ver como posso melhorar isso!!!

Valeu pessoal!!!

Ironlynx

Show! :slight_smile:

Isso não está ocorrendo pq vc faz uma busca em 2 bancos?(caramba,que loucura!!!)

Ironlynx

hugo, aquele código com scriplets que eu postei acima dah erro na minha action!Minha action:

public void execute(HttpServletRequest req, HttpServletResponse response) throws ExcecaoAction { try { String pesquisa=req.getParameter("tiposeg"); System.out.println("Parâmetro passado no request:"+pesquisa); if(pesquisa.equals("data")) req.getRequestDispatcher("ramos-por-data.jsp").forward(req,response); else if(pesquisa.equals("valor")) req.getRequestDispatcher("valores-ramo").forward(req,response); else if(pesquisa.equals("seguradora")) req.getRequestDispatcher("seguradoras-ramo").forward(req,response); }catch(ServletException se){ se.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return ; }
Estranho que tenho outra action que faz a mesma coisa e não dah pau!
A diferença é que eu não chamo a execução dela de um scriptlet.

Erro:



Exception:

javax.servlet.ServletException: Servlet execution threw an exception

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:275)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)

at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:672)

at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:463)

at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:398)

at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:301)

at ageris.actions.ComandoSelecionarPesquisa.execute(ComandoSelecionarPesquisa.java:21)

at ageris.controle.Controlador.service(Controlador.java:47)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

Alguém sabe me informar pq ás vezes o log4j gera um log tão monstruoso?Eu  recebendo um log de 134KB cada vez que dah um erro!E no caso, ele repete o código do erro que foi postado acima umas 100 vezes!  :shock:
zirocool

Iron, mas com essa tua ação, tu pretende exibir os dados na tua jsp, certo? Uma jsp com display??

Se for com a display, para ti nao ter akela scriptlet que te mostrei no exemplo, tu pode pode instanciar o teu dao na tua action, e setar ela como um atributo na tua request.
Vai ser praticamente a mesma coisa, só que tu nao vai ter akele scriptletzinho na jsp…

[ ]'s,
Misael Silveira.

Ironlynx

Isso!!!

Fala em colocar Dao.getCollection nas tags?
Eu não saquei muito bem o que vc quis dizer não!

Modifica por exemplo esse que eu coloquei para eu ter uma idéia:

&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;
zirocool

Tá usando struts neh??
Eu nunca usei esse troço, entao vou fazer o teu exemplo como se fosse com uma servlet de controller normal, com get e post.

Esse seria o método get de uma servlet controladora:

doGet( HttpServletRequest request, HttpServletResponse response ) {

     if( request.getParameter("pesquisa").equals("data") ) {  
         MySQLRamoDeSeguroDAO msrdsd = new MySQLRamoDeSeguroDAO();
        List lista = msrdsd.retornarColecaoDeRamosDeSeguro("data"); 
        request.setAttribute("ramoseg",lista);         request.getRequestDispatcher("ramos-por-data.jsp").forward(request,response);
     }
}

na tua jsp “ramos-por-tada.jsp” ficaria assim então:

&lt;%@ taglib uri="http://displaytag.sf.net" prefix="display" %&gt;
&lt;h2&gt;Exibindo Ramos de Seguro:&lt;/h2&gt;
 &lt;display:table name="ramoseg" pagesize="10"&gt;
Ironlynx

Struts?!Sai de mim!!!Huaa…
Não, estou usando aquele velho estilo controller-actions, tacando cada action numa HashMap, chamando a action correspondente de acordo com a ação…

Ah, saquei!A única diferença é que isso fica numa action… vou testar aqui e lhe aviso!

Ironlynx
É… ainda não foi nãodah um erro chato:



javax.servlet.ServletException: Servlet execution threw an exception

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:275)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)

at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:672)

at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:463)

at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:398)

at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:301)

at ageris.actions.ComandoSelecionarPesquisa.execute(ComandoSelecionarPesquisa.java:28)

at ageris.controle.Controlador.service(Controlador.java:47)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

Agora, alguém  teve problemas com o log4j???PQP!!!Um dos logs de erro acabou de bater 27,6MB!!!Detalhe: apenas repetia o erro acima

Chegou atravar tudo aqui por alguns instantes  :shock:
Criado 20 de julho de 2006
Ultima resposta 22 de jul. de 2006
Respostas 29
Participantes 4