Div remoto do Struts 2 + paginação no Display Tag

4 respostas
D

Fala galera.... to com umas duvidas aqui nesse breguets q estou fazendo...

Peço a ajuda d vcs...

Tenho esse JSP...
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
	pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="s" uri="/struts-tags"%>

<s:form action="listarGrupos!buscar" method="post" id="form"
	theme="ajax">
	<s:textfield name="palavraChave" label="Grupo" size="20" maxlength="50" />
	<s:submit value="buscar" targets="listaGrupos" loadingText="Aguarde..." />
</s:form>

<br />

&lt;s:div id="listaGrupos" theme="ajax" refreshOnShow="true"
	executeScripts="true"&gt;&lt;/s:div&gt;

Q chama uma action do struts2, pega uma lista de grupos dessa busca ai do jsp no hibernate e chama esse jsp ai ó...

&lt;%@ page language="java" contentType="text/html; charset=ISO-8859-1"
	pageEncoding="ISO-8859-1"%&gt;
&lt;%@ taglib prefix="s" uri="/struts-tags"%&gt;
&lt;%@ taglib prefix="display" uri="http://displaytag.sf.net"%&gt;
&lt;%@ taglib prefix="ajax" uri="http://ajaxtags.org/tags/ajax"%&gt;

&lt;ajax:displayTag id="displayTagFrame" ajaxFlag="displayAjax"&gt;

	&lt;display:table class="displaytag"	
		requestURI="listarGrupos!buscar.action" sort="list"
		
		name="sessionScope.grupos" uid="item"&gt;

		&lt;display:caption class="caption"&gt;Lista de Grupos&lt;/display:caption&gt;

		&lt;display:column autolink="true"&gt;
			&lt;s:url id="urlEditarGrupo" action="cadastrarGrupo!editar"&gt;
				&lt;s:param name="id" value="#attr.item.id" /&gt;
			&lt;/s:url&gt;
			&lt;s:a cssClass="linkEditarGrupo" id="linkEditarGrupo"
				href="%{urlEditarGrupo}" theme="ajax" targets="divConteudo"
				loadingText="Aguarde..."&gt;editar&lt;/s:a&gt;
		&lt;/display:column&gt;

		&lt;display:column title="Descrição"
			sortable="true" property="descricao" /&gt;
		
	&lt;/display:table&gt;

&lt;/ajax:displayTag&gt;

Blz... tá funcionando... porém tem um problema e uma duvida...

Problema:
Ao clicar na ordenação, o link q o struts gerou se perde... ai não chama a action no target certo.. e sim no topo da página...
Eu queria chamar essa action dentro do div divConteudo... assim como acontece na primeira vez q a lista aparece na tabela...

A duvida:
Como fazer para o display tag recuperar os dados do request do struts2?
Pq estou colocando a lista na session.. por enquanto...

Valeu se puderem ajudar.

4 Respostas

rodrigo_corinthians
Sobre a dúvida pode fazer assim.
ActionStruts {
   HttpServletRequest request = (HttpServletRequest) ActionContext.getContext().get(StrutsStatics.HTTP_REQUEST);
   request.setAttribute("grupos", grupos);
}

Jsp
<%@ taglib uri="http://displaytag.sf.net/el" prefix="display" %> 
<display:table name="${grupos}"...
Se não funcionar retira o EL e cria métodos get e set para o List de grupos que irá funcionar. Agora sobre o problema é meio chatinho de resolver porq os links(paginação, ordernação e exportação) do displaytag quando clicados atualiza a página inteira então para resolver isto criei uma função javascript que após carregar o html gerado do displaytag muda o caminho das url's apontando para o componente de Ajax(Prototype), ficou mais ou menos assim...
<display:table id="tableList">
</display:table>

<script>
function replaceLinks(tableList) {
	if(!isSmartphone()){
		if($(tableList)){
			var sortLinks = $(tableList).getElementsByTagName('thead')[0]
			                             .getElementsByTagName('a');
			ajaxLinks(sortLinks, true);
			if (document.getElementsByClassName('pagelinks').length > 0) {
			    var pagelinks = document.getElementsByClassName('pagelinks')[0]
			                            .getElementsByTagName('a');
			    ajaxLinks(pagelinks, false);
			}

			if(document.getElementsByClassName('exportlinks').length > 0){
			    var links = document.getElementsByClassName('exportlinks')[0]
			                            .getElementsByTagName('a');
			    exportLinks(links);
			}
		}
	}
}

function exportLinks(links) {
	for (i=0; i < links.length; i++) {
	    links[i].onclick = function() {
			var url = this.href;
			url += "&pageNumber="+getPageNumber(this.href);
			url += "&export=true";
			var windowFocus = window.open(url, 'export', '');
			windowFocus.focus();
			return false;
	    }
	}
}

function ajaxLinks(links, sort) {
	for (i=0; i < links.length; i++) {
	    links[i].onclick = function() {
			var url = this.href;
			var pars = "pageNumber=";
			if(sort){
				pars += $("pageNumber").value;
			} else {
				pars += getPageNumber(this.href);
			}
			//pars += getFields(document.forms[0]);
			var myAjax = new Ajax.Request(
				url, 
				{
					method: 'post',
					parameters: pars, 
					onFailure: showError,
					onComplete: showRequest
				});
			return false;
	    }
	}
}

function getPageNumber(stringUrl) {
	var pageNumber = 1;
	if(stringUrl != ""){
		var splitUrl = stringUrl.split("=");
		pageNumber = (parseInt(splitUrl[splitUrl.length - 1], 10) - 1);
		$("pageNumber").value = pageNumber;
	}
	return pageNumber;
}

function isSmartphone() {
	var browserName = new String(navigator.appName);
	return browserName.toLowerCase().indexOf("pocket") != -1;
}

replaceLinks("tableList"); // Nome(tableList) do Id do displaytag
</script>
Lembrando que onde tem o $() e Ajax.Request é Prototype, digamos que foi uma solução não muito elegante mas funcionou e não tive problemas até hoje. :wink:
D

é pessoal… tentei fazer conforme as sugestões…
mas não tive exito…

Rodrigo, coloquei teu script aqui, mas qdo eu clico pra ordenar nao executa o script…

mgarcia

dac… vc conseguiu alguma solução para o target?

I
<display:table class="displaytag" requestURI="listarGrupos!buscar.action" sort="list"
requestURI="nome da jsp principal que faz a chamada do div remoto"
Criado 25 de outubro de 2007
Ultima resposta 25 de out. de 2007
Respostas 4
Participantes 4