DisplayTag + Struts2

4 respostas
mgarcia

Fala galera…

estou com um problema com a utilização de displaytag…
é o seguinte…
na minha displaytag, estou criando links que devem ser exibidos, em uma div da página… ou seja… quando clicar no link, a página não é recarregada, apenas o div q eu apontar no targets do link…

o que acontece é o seguinte… isso funciona muito bem… o problema é que, se eu der sort em qualquer coluna, ou clicar em outra página, o link não funciona corretamente… ele vai para o endereço certo, porém não faz o link com a div, e sim recarrega a página…

alguém sabe como resolver isso??

Vlw!

4 Respostas

Mordor

Estou com o mesmo problema tentei resolver com o ajaxtags e não funcionou, se vc conseguir resolver posta ai.

mgarcia

ainda não consegui resolver, mas estou caminhando…
pelo q percebi, o link é trocado após o sort de

aaa

para

aaa

dessa forma, o target não funciona…

mgarcia

Então…

o displaytag parece ser um pouco limitado nessa situação…
por não encontrar solução rápida, optei por utilizar o jMesa (feito pelo google), que na minha opinião está bem mais completo que o displaytag…

a quem interessar segue o link: http://code.google.com/p/jmesa/

vlw!

mgarcia

Consegui solucionar o caso para displaytags…
a solução foi não utilizar ajaxtags e sim jquery e montar links que atualizem divs com a própria jquery e nao com o struts 2…
portanto, para funcionar corretamente, basta fazer o seguinte…

crie um arquivo javascript com o seguinte conteúdo (este arquivo terá a mesma função que a tag ajax:displaytag do ajaxtags):

function changeLinks()
{
    done=true;
    var linkData, queryArr, action, qryStr;
    selector = 'span.pagelinks>a';
    changeUsingSelector(selector);
    selector = 'table#dispTable>thead>tr>th>a';
    changeUsingSelector(selector);
}
function changeUsingSelector(selector)
{
    $(selector).each(function()
    {
        linkData = $(this).attr("href");
        queryArr = linkData.split("?");
        action = queryArr[0];
        qryStr = queryArr[1];
        newStr = "JavaScript:doAjax('"+action+"','"+qryStr+"','ajxDspId');";
        $(this).attr("href",newStr);
        $(this).attr("onMouseOver","window.status='Pagination Links have been Ajaxified!!';return false;");
        $(this).attr("onMouseOut","window.status='';return false;");
    });    

}
   
    
jQuery(function($) {
    changeLinks();
}); 


function doAjax(url, data, eleId)
{
    //if you need additional params to be passed - add to the data variable
    $.ajax
    ({
        url: url,
        data:  data,
        async: false,
        success: function(resp){
            var d = $(resp); 
            htmlStr="";
            for(i=0;i<d.length;i++)
            {
                var node = d[i];
                if (node.id == eleId)
                {
                    htmlStr=$(node).html(); 
                    break;
                }
            }
            $('#'+eleId).html(htmlStr);
            changeLinks();
        }

    });
}

inclua este arquivo no seu jsp que contém a displaytag, juntamente com o jquery.js (arquivo necessário para utilizar jquery):

<script src="${pageContext.request.contextPath}/js/jquery.js" type="text/javascript"></script>
<script src="${pageContext.request.contextPath}/js/displayTagAjax.js" type="text/javascript"></script>

Agora, basta seguir as seguintes regras para a displaytag:
Ela deve estar dentro de uma div chamada ajxDspId e seu id deve ser dispTable:

<div id="ajxDspId">
	<display:table 	id="dispTable" name="lista" class="displaytag".....>
</div>

Feito isso, o ajax fará com que a página inteira não seja recarregada ao paginar e ordenar a tabela…

Para fazer os links faça o seguinte…

crie na sua página o seguinte script:

<script>
	function link(id){
			$.get('${pageContext.request.contextPath}/editarBonus.action?id=' + id, function(data){
					$("#cadastro").html(data)
			});
	}
	
</script>

sendo que aonde está #cadastro, substitua por #div_a_ser_carregado e o primeiro parametro de get deve ser o local em que sua action está. (O parametro de entrada id é opcional. ele é utilizado apenas para passar parametros na chamada da action)

agora basta fazer um link dentro da displaytag chamando esta função:

<display:column>
	<a href="#" onclick="link('parametroParaChamarAction');">link</a>
</display:column>

Feito isso, você terá uma displaytag funcionando perfeitamente com ajax, e com a possibilidade de atualizar divs sem problemas…

Criado 4 de novembro de 2008
Ultima resposta 5 de nov. de 2008
Respostas 4
Participantes 2