Passar parâmetros para outra tela com Javascript

26/03/2009

Estou precisando de um exemplo para pegar parâmetros de uma tela e jogar para outra com javascript: mas vou ter que passar varios.

Tentei fazer assim:


<jsp:root version="1.2" xmlns:jsp="http://java.sun.com/JSP/Page" xmlns:display="urn:jsptld:http://displaytag.sf.net">
<jsp:directive.page contentType="text/html; charset=UTF8" />
<jsp:directive.page import="com.br.controle.*"  /> 
  <h2>Pessoas Cadastradas no Sistema</h2>
 
    <script type="text/javascript" language="javascript"> 
       function listaEstadoCivil(){ 
           window.opener.location ="../listas/listarestadocivil.jsp?parametro=1" ;
        } 
    </script> 
   
    <script type="text/javascript">
        function adicionaParam(usuario,senha){

            var parametro1 = document.getElementById(usuario);
            var parametro2 = document.getElementById("11");

            window.open.location ="../listas/listarestadocivil.jsp?parametro1=" + parametro1;
       
         return true;
        }
    </script>
   
    <head>
        <link rel="stylesheet" href="../../css/cruzeiro.css" type="text/css" />
    </head>
 
   <jsp:scriptlet>
        ControleLogin controleLogin = new ControleLogin();
      request.setAttribute( "colecao", controleLogin.getTodosUsuarios());
   </jsp:scriptlet>
 
 
  <display:table name="colecao" export="true" class="table" style="width:80%; text-align:center;">
      <display:setProperty name="export.pdf" value="true" />
    <display:column property="usuario" style="font-size: 12pt; "  href="javascript:adicionaParam('${colecao.usuario1}','${colecao.grupo)');"/>
    <display:column property="grupo" style="font-size: 10pt; " />                         
    <display:column property="senha" paramId="senha" style="font-size: 10pt;"/>
  </display:table>
  <td height="50"><a  target="iframe" href="/CruzeirodoSul/pages/cadastros/cadastrarusuario.jsp" style="color: black">Voltar</a></td>
</jsp:root>
Cristian Mietlicki

Cristian Mietlicki

Curtidas 0

Respostas

Henrique Weissmann

Henrique Weissmann

26/03/2009

Olá Cristian,

você está quase lá. Vamos dar uma olhada neste seu código, ok?

  <script type="text/javascript">
        function adicionaParam(usuario,senha){

            var parametro1 = document.getElementById(usuario);
            var parametro2 = document.getElementById("11");

            window.open.location ="../listas/listarestadocivil.jsp?parametro1=" + parametro1;
       
         return true;
        }
    </script>

Pois bem, para passar os vários parâmetros, você só vai precisar de concatenar a sua string, como no exemplo abaixo:

  <script type="text/javascript">
        function adicionaParam(usuario,senha){

            var parametro1 = document.getElementById(usuario);
            var parametro2 = document.getElementById("11");
            var parametro3 = documento.getElementById("parametro3")

            window.open.location ="../listas/listarestadocivil.jsp?parametro1=" + parametro1 + "&parametro2=" + parametro2 + "&parametro3=" + parametro3
       
         return true;
        }
    </script>

A sintaxe para se passar mais de um parâmetro é simples. A partir do segundo parâmetro, sempre inicie seu nome com o caractere & seguido do seu nome, como no exemplo abaixo:
http://algumaURL/?parametro1=valor1&parametro2=valor2&parametro3=valor3&parametro4=valorQueVoceQuiser

No entanto, cuidado: há um limite no número de caracteres que você pode enviar a partir de uma requisição do tipo GET. No caso, não é uma limitação do protocolo HTTP em si, mas sim dos próprios navegadores. Normalmente, este limite é de 255 caracteres.
GOSTEI 0
Cristian Mietlicki

Cristian Mietlicki

26/03/2009

Ta dando esse erro : /pages/consultas/consultarusuario.jsp(18,105) The reference to entity "parametro2" must end with the ';' delimiter.

<jsp:root version="1.2" xmlns:jsp="http://java.sun.com/JSP/Page" xmlns:display="urn:jsptld:http://displaytag.sf.net">
<jsp:directive.page contentType="text/html; charset=UTF8" />
<jsp:directive.page import="com.br.controle.*"  /> 
  <h2>Pessoas Cadastradas no Sistema</h2>
 
    <script type="text/javascript" language="javascript"> 
       function listaEstadoCivil(){ 
           window.opener.location ="../listas/listarestadocivil.jsp?parametro=1" ;
        } 
    </script> 
   
    <script type="text/javascript">
        function adicionaParam(usuario,senha){

            var parametro1 = document.getElementById(usuario);
            var parametro2 = document.getElementById(senha);

            window.open.location ="../listas/listarestadocivil.jsp?parametro1=" + parametro1 + "&parametro2=" + parametro2;
       
         return true;
        }
    </script>
   
    <head>
        <link rel="stylesheet" href="../../css/cruzeiro.css" type="text/css" />
    </head>
 
   <jsp:scriptlet>
        ControleLogin controleLogin = new ControleLogin();
      request.setAttribute( "colecao", controleLogin.getTodosUsuarios());
   </jsp:scriptlet>
 
 
  <display:table name="colecao" export="true" class="table" style="width:80%; text-align:center;">
      <display:setProperty name="export.pdf" value="true" />
    <display:column property="usuario" style="font-size: 12pt;" href="javascript:adicionaParam('${colecao.usuario1}','${colecao.grupo)');"/>
                                                                      
    <display:column property="grupo" style="font-size: 10pt; " />                         
    <display:column property="senha" paramId="senha" style="font-size: 10pt;"/>
  </display:table>
  <td height="50"><a  target="iframe" href="/CruzeirodoSul/pages/cadastros/cadastrarusuario.jsp" style="color: black">Voltar</a></td>
</jsp:root>

GOSTEI 0
Henrique Weissmann

Henrique Weissmann

26/03/2009

<script type="text/javascript">
        function adicionaParam(usuario,senha){

            var parametro1 = document.getElementById(usuario);
            var parametro2 = document.getElementById(senha);

            window.open.location ="../listas/listarestadocivil.jsp?parametro1=" + parametro1 + "&parametro2=" + parametro2;
       
         return true;
        }
    </script>

Dicas para resolver o problema:

1. Armazena a URL em uma variável e a exponha de algum modo a você quando estiver processando a página.

Algo como

<script type="text/javascript">
var parametro1 = document.getElementById(usuario);
var parametro2 = document.getElementById(senha);
var url ="../listas/listarestadocivil.jsp?parametro1=" + parametro1 + "&parametro2=" + parametro2;
alert(url)
</script>

Assim você poderá verificar qual a URL que está passando para o navegador. As vezes, pode ser que o valor de parametro1 ou 2 esteja em branco. Neste caso, é possível que você precise fazer algum tratamento.

2. Apenas por curiosidade, tente montar a sua URL com algo como
<script type="text/javascript">
var parametro1 = document.getElementById(usuario);
var parametro2 = document.getElementById(senha);
var url ="../listas/listarestadocivil.jsp?parametro1=" + parametro1 + "&parametro2=" + parametro2 + ";"
</script>

Dica: em Javascript, o ; é opcional.


GOSTEI 0
Cristian Mietlicki

Cristian Mietlicki

26/03/2009

Esse éo erro que acontece .

   /pages/consultas/consultarusuario.jsp(18,107) The reference to entity "parametro2" must end with the ';' delimiter.

Minha jsp:


<jsp:root version="1.2" xmlns:jsp="http://java.sun.com/JSP/Page" xmlns:display="urn:jsptld:http://displaytag.sf.net">
<jsp:directive.page contentType="text/html; charset=UTF8" />
<jsp:directive.page import="com.br.controle.*"  /> 
  <h2>Pessoas Cadastradas no Sistema</h2>
 
    <script type="text/javascript" language="javascript"> 
       function listaEstadoCivil(){ 
           window.opener.location ="../listas/listarestadocivil.jsp?parametro=1" ;
        } 
    </script> 
   
    <script type="text/javascript">
        function adicionaParam(usuario,senha){

            var parametro1 = document.getElementById(usuario);
            var parametro2 = document.getElementById(senha);

            //window.open.location ="../listas/listarestadocivil.jsp?parametro1=" + parametro1 + "&parametro2=" + parametro2 + ";"
            var url ="../listas/listarestadocivil.jsp?parametro1=" + parametro1 + "&parametro2=" + parametro2 + ";"
            alert(url);
            return true;
        }
    </script>
   
    <head>
        <link rel="stylesheet" href="../../css/cruzeiro.css" type="text/css" />
    </head>
 
   <jsp:scriptlet>
        ControleLogin controleLogin = new ControleLogin();
      request.setAttribute( "colecao", controleLogin.getTodosUsuarios());
   </jsp:scriptlet>
 
 
  <display:table name="colecao" export="true" class="table" style="width:80%; text-align:center;">
      <display:setProperty name="export.pdf" value="true" />
    <display:column property="usuario" style="font-size: 12pt;" href="javascript:adicionaParam('${colecao.usuario1}','${colecao.grupo)');"/>
                                                                      
    <display:column property="grupo" style="font-size: 10pt; " />                         
    <display:column property="senha" paramId="senha" style="font-size: 10pt;"/>
  </display:table>
  <td height="50"><a  target="iframe" href="/CruzeirodoSul/pages/cadastros/cadastrarusuario.jsp" style="color: black">Voltar</a></td>
</jsp:root>

GOSTEI 0
Henrique Weissmann

Henrique Weissmann

26/03/2009

O erro aparece no navegador ou no servlet?

Digo: é uma mensagem gerada pelo seu servidor de aplicações ou uma das mensagens padrão do navegador?
GOSTEI 0
Cristian Mietlicki

Cristian Mietlicki

26/03/2009

Mensagem do Navegador :

Apache Tomcat/6.0.18 - Error reportexception org.apache.jasper.JasperException: /pages/consultas/consultarusuario.jsp(18,107) The reference to entity "parametro2" must end with the ';' delimiter. org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:40) org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:407) org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:88) org.apache.jasper.compiler.JspDocumentParser.parse(JspDocumentParser.java:214) org.apache.jasper.compiler.ParserController.doParse(ParserController.java:200) org.apache.jasper.compiler.ParserController.parse(ParserController.java:103) org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:154) org.apache.jasper.compiler.Compiler.compile(Compiler.java:315) org.apache.jasper.compiler.Compiler.compile(Compiler.java:295) org.apache.jasper.compiler.Compiler.compile(Compiler.java:282) org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:586) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:317) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267) javax.servlet.http.HttpServlet.service(HttpServlet.java:717) note The full stack trace of the root cause is available in the Apache Tomcat/6.0.18 logs.



GOSTEI 0
Henrique Weissmann

Henrique Weissmann

26/03/2009

Perfeito.

Neste caso, não se trata de um erro do seu JavaScript, mas sim na execução do relatório, ou seja, nos valores passados para o servlet.


Sendo assim, vamos lá:
a primeira coisa a se mudar é o seu JavaScript.
<script type="text/javascript">
        function adicionaParam(usuario,senha){

            var parametro1 = document.getElementById(usuario);
            var parametro2 = document.getElementById(senha);

            //window.open.location ="../listas/listarestadocivil.jsp?parametro1=" + parametro1 + "&parametro2=" + parametro2 + ";"
            var url ="../listas/listarestadocivil.jsp?parametro1=" + parametro1 + "&parametro2=" + parametro2 + ";"
            alert(url);
            return true;
        }
    </script>

No caso, o problema ainda é a URL. Ao ser enviada para o tomcat, ele não a está compreendendo.

Neste caso, há ainda a seguinte alternativa. Utilize a seguinte sintaxe para montar a sua URL, tal como no código abaixo:


<script type="text/javascript">
        function adicionaParam(usuario,senha){

            var parametro1 = document.getElementById(usuario);
            var parametro2 = document.getElementById(senha);

 
            var url ="../listas/listarestadocivil.jsp?parametro1=" + parametro1 + ";&parametro2=" + parametro2 + ";"
 
 
        }
    </script>

Ou seja, antes do caractere &, insira o caractere ;

Se não me engano, o último ; é opcional.
GOSTEI 0
Cristian Mietlicki

Cristian Mietlicki

26/03/2009

/pages/consultas/consultarusuario.jsp(18,96) The reference to entity "parametro2" must end with the ';' delimiter.  mesmo erro.

<jsp:root version="1.2" xmlns:jsp="http://java.sun.com/JSP/Page" xmlns:display="urn:jsptld:http://displaytag.sf.net">
<jsp:directive.page contentType="text/html; charset=UTF8" />
<jsp:directive.page import="com.br.controle.*"  /> 
  <h2>Pessoas Cadastradas no Sistema</h2>
 
    <script type="text/javascript" language="javascript"> 
       function listaEstadoCivil(){ 
           window.opener.location ="../listas/listarestadocivil.jsp?parametro=1" ;
        } 
    </script> 
   
   <script type="text/javascript">
        function adicionaParam(usuario,senha){

            var parametro1 = document.getElementById(usuario);
            var parametro2 = document.getElementById(senha);
 
            var url ="../listas/listarestadocivil.jsp?parametro1=" + parametro1 + ";&parametro2=" + parametro2 + ";"
        }
    </script>
   
    <head>
        <link rel="stylesheet" href="../../css/cruzeiro.css" type="text/css" />
    </head>
 
   <jsp:scriptlet>
        ControleLogin controleLogin = new ControleLogin();
      request.setAttribute( "colecao", controleLogin.getTodosUsuarios());
   </jsp:scriptlet>
 
 
  <display:table name="colecao" export="true" class="table" style="width:80%; text-align:center;">
      <display:setProperty name="export.pdf" value="true" />
    <display:column property="usuario" style="font-size: 12pt;" href="javascript:adicionaParam('${colecao.usuario1}','${colecao.grupo)');"/>
                                                                      
    <display:column property="grupo" style="font-size: 10pt; " />                         
    <display:column property="senha" paramId="senha" style="font-size: 10pt;"/>
  </display:table>
  <td height="50"><a  target="iframe" href="/CruzeirodoSul/pages/cadastros/cadastrarusuario.jsp" style="color: black">Voltar</a></td>
</jsp:root>

GOSTEI 0
Henrique Weissmann

Henrique Weissmann

26/03/2009

Cristian,

fiz algumas pesquisas e descobri algumas possíveis causas para o seu problema. Vamos lá:

ao que tudo indica, não é um problema nem do Tomcat nem do JavaScript, mas sim do parseamento de um documento XML. No caso, todo o problema envolve o caractere '&'.

Na notação XML, o caractere & é utilizado para definir entidades, e necessáriamente deve ser finalizado com o caractere ;. Entidades podem ter diversas utilidades, mas a mais comum consiste na definição de caracteres especiais, como por exemplo maior que, que é &gt;

Toda entidade possui a seguinte sintaxe:
&[nome da entidade];

No caso, o que está acontecendo: o caractere & está sendo passado para seu servlet como um valor e o parser XML (que irá gerar o Servlet a partir do JSP), ao ler o documento e o encontrar, começa a buscar pelo final da entidade e não encontra o caractere ; no final.
Como consequencia, aparece a mensagem "(...) muset end with the ';' delimiter';.

A solução para este problema consiste em verificar os valores dos seus atributos. Será que no conteúdo de um deles não há um caractere &? Neste caso, a solução é inclusive fácil: basta substituir o caractere & por &amp;

&amp; equivale a entidade que representa o caractere &. No caso, isto solucionaria o problema.

Esta substituição pode ser feita no javascript que monta a sua URL.


No entanto, é importante lembrar aqui que o jasper que aparece na sua mensagem de erro não é o Jasper Report, mas sim o compilador de JSP do próprio container Tomcat. Sendo assim, o problema não é no Jasper Reports (com base nas informações passadas), mas sim nos valores passados para a URL.

Outra possibilidade: ao trabalhar com scriptlets dentro do JSP, sempre finalize cada uma das linhas de comando com um caractere ;. O Tomcat irá apontar um erro com esta mesma mensagem caso isto não seja feito.

Outra dica: verifique se a página que você está gerando está bem formada, como se fosse um documento XML. Isto ajuda muito a detectar problemas no JSP.
GOSTEI 0
Cristian Mietlicki

Cristian Mietlicki

26/03/2009

Tá dando esse erro agora:

/pages/consultas/consultarusuario.jsp(34,141) "javascript:adicionaParam('${colecao.usuario1}','${colecao.grupo)');" contains invalid expression(s): javax.el.ELException: Error Parsing: javascript:adicionaParam('${colecao.usuario1}','${colecao.grupo)');


Minha JSP:


<jsp:root version="1.2" xmlns:jsp="http://java.sun.com/JSP/Page" xmlns:display="urn:jsptld:http://displaytag.sf.net">
<jsp:directive.page contentType="text/html; charset=UTF8" />
<jsp:directive.page import="com.br.controle.*"  /> 
  <h2>Pessoas Cadastradas no Sistema</h2>
 
    <script type="text/javascript" language="javascript"> 
       function listaEstadoCivil(){ 
           window.opener.location ="../listas/listarestadocivil.jsp?parametro=1" ;
        } 
    </script> 
   
   <script type="text/javascript">
        function adicionaParam(usuario,senha){

            var parametro1 = document.getElementById(usuario);
            var parametro2 = document.getElementById(senha);
 
            var url ="../listas/listarestadocivil.jsp?parametro1=" + parametro1 + ";&amp;parametro2=" + parametro2 + ";"
        }
    </script>
   
    <head>
        <link rel="stylesheet" href="../../css/cruzeiro.css" type="text/css" />
    </head>
 
   <jsp:scriptlet>
        ControleLogin controleLogin = new ControleLogin();
      request.setAttribute( "colecao", controleLogin.getTodosUsuarios());
   </jsp:scriptlet>
 
 
  <display:table name="colecao" export="true" class="table" style="width:80%; text-align:center;">
      <display:setProperty name="export.pdf" value="true" />
    <display:column property="usuario" style="font-size: 12pt;" href="javascript:adicionaParam('${colecao.usuario1}','${colecao.grupo)');"/>
                                                                      
    <display:column property="grupo" style="font-size: 10pt; " />                         
    <display:column property="senha" paramId="senha" style="font-size: 10pt;"/>
  </display:table>
  <td height="50"><a  target="iframe" href="/CruzeirodoSul/pages/cadastros/cadastrarusuario.jsp" style="color: black">Voltar</a></td>
</jsp:root>






GOSTEI 0
Henrique Weissmann

Henrique Weissmann

26/03/2009

Cristian,

O problema está em parte neste seu JavaScript:
<script type="text/javascript">
        function adicionaParam(usuario,senha){

            var parametro1 = document.getElementById(usuario);
            var parametro2 = document.getElementById(senha);
 
            var url ="../listas/listarestadocivil.jsp?parametro1=" + parametro1 + ";&amp;parametro2=" + parametro2 + ";"
        }
</script>

O caractere & deve ser incluido dentro dele para que sejam separados os parametros.

É dentro do valor dos parametros que & deve ser substituido por &amp;

Como por exemplo na URL abaixo:

url="../listas/listarestadocivil.jsp?parametro1=coisas&amp;coisas;&parametro2=qualquer coisa;

Repare: eu coloquei o &amp; dentro do valor do parametro, mas o caractere & continua aparecendo, só que para separar os valores.
GOSTEI 0
Cristian Mietlicki

Cristian Mietlicki

26/03/2009

É isso ?
var url ="../listas/listarestadocivil.jsp?parametro1=parametro1&amp;parametro2"
GOSTEI 0
Henrique Weissmann

Henrique Weissmann

26/03/2009

var url ="../listas/listarestadocivil.jsp?parametro1=parametro1&amp;parametro2"

parte do problema (se não todo) pelo menos está aqui.

Decompondo a URL, o Tomcat vai ter o seguinte:

parametro1=parametro1&parametro2

No caso, deveria ser algo como

url="../listas/listarestadocivil.jsp?parametro1=parametro1;&parametro2=algumvalor;

Lembre-se: &amp; deve ser inserido como o valor de um dos parametros (caso esteja presente dentro do valor), não como o separador de atributos da URL.

Sendo assim, caso ocorra algum valor de parametro com o caractere &, deveria ficar como

url="../listas/listarestadocivil.jsp?parametro1=valor;&parametro2=c&amp;a;


GOSTEI 0
Cristian Mietlicki

Cristian Mietlicki

26/03/2009

Tá meio confuso , pode ser mais claro por gentilieza.
GOSTEI 0
Henrique Weissmann

Henrique Weissmann

26/03/2009

Aqui está a sua URL:
var url ="../listas/listarestadocivil.jsp?parametro1=parametro1&amp;parametro2"

Vou fazer aqui uma análise de como o Tomcat a irá interpretar, ok?

Vamos lá:
o JSP: listarestadocivil.jsp
parâmetros:

parametro1
Valor: parametro1&parametro2
a entidade &amp; será convertida para o caractere '&'.


O que ocorre aqui Cristian: o caractere & deve ser substituido apenas quando estiver contido no valor de um dos parametros. Se você quer passar mais de um parâmetro, ele deverá ser digitado exatamente como se encontra (sem conversão). Isto porque se trata de um caractere especial. No caso, o caractere responsável por separar parametros dentro de uma URL.


Exemplo: suponhamos que você tenha dois parametros, respectivamente chamados de parametro1 e parametro2.

Se parametro1 você quer que seja passado o texto "coisas da vida" e, para o parametro2, você quer que seja passado o valor C&A, a sua URL deverá ser criada da seguinte maneira:

Passo 1: substituir o caractere problemático nos valores pelo seu valor de entidade.
No caso, o valor a ser passado para a URL para o parametro2 será transformado de C&A para C&amp;A

Passo2: montando a URL separando os parametros.

A url será montada da seguinte maneira:

[nome do jsp]?(lista de parametros).

No seu caso, seria montada assim:

../listas/listarestadocivil.jsp?(aqui entrarão os parametros).

No caso dos parametros, eles sempre serão separados pelo caractere &. No entanto, convém mencionar que, no caso de haver mais de um parametro, os parametros anteriores ao último deverão ser finalizados com o caractere ';'.

Logo, montando a sua URL, seria algo como

../listas/listarestadocivil.jsp?parametro1=coisas da vida;&parametro2=C&amp;A

Ainda da para melhorar um pouco mais isto: o caractere de espaço ' ' também pode ser substituido por outra entidade. No caso, a entidade que representa um espaço é &nbsp;

Sendo assim, melhorando ainda mais a sua URL, ela poderia ficar como

../listas/listarestadocivil.jsp?parametro1=coisas&nbsp;da&nbsp;vida;&parametro2=C&amp;A

Quando o servidor receber esta URL, ele a irá transformar para o valor original (não cabe a você fazer esta transformação, é papel do servlet). Sendo assim,
parametro1 que foi recebido como "coisas&nbsp;da&nbsp;vida" virará "coisas da vida" e
parametro2 que foi recebido como "C&amp;A" será convertido para C&A.

O algoritmo basico portanto é o seguinte:
1. Para cada valor de parametro, substituir os caracteres problemáticos para as suas respectivas entidades
   (no caso, espaço vira &nbsp; e '&' vira &amp;)
2. Montar a URL seguindo a regra
[endereço]?(lista de parametros), aonde (lista de parametros) deve possuir o formato
[nome do parametro1]=(valor já transformado);&[nome do parametro2]=(valor já transformado)

Para uma lista das entidades HTML, acesse este link: http://www.w3schools.com/HTML/html_entities.asp
GOSTEI 0
Cristian Mietlicki

Cristian Mietlicki

26/03/2009

Ok, estou sem tempo agora de ver com detalhes , em casa eu dou uma olhada melhor , obrigado.
GOSTEI 0
Henrique Weissmann

Henrique Weissmann

26/03/2009

Cristian, seu problema já foi resolvido?
GOSTEI 0
Cristian Mietlicki

Cristian Mietlicki

26/03/2009

Resolvi sim , obrigado.
GOSTEI 0
POSTAR