Passar parâmetro do JSP [RESOLVIDO]

24 respostas
P

Pessoal,

Tenho uma página em JSP que recebe parâmetros (via check box) e gero uma lista que envio para a Servlet e logo em seguida para as classes para consultar no BD e retornar o resultado em uma tabela, até aqui beleza.

Só que eu tenho um botão de gerar arquivo (Em EXCEL) que tenho que utilizar o mesmo parâmetro do início (selecionado no check box) para enviar uma lista para gerar o arquivo, e não sei como fazer isso... tenho a funcionalidade de gerar arquivo pronta, só não sei como enviar estes mesmos parâmetros (lista) para gerá-lo.

A primeira lista que mando para o servlet é a MultiplosDadosHist

<td style="border-color:white" style="border-style:groove">		
				<INPUT TYPE=CHECKBOX VALUE="Ativo" name="MultiplosDadosHist">Ativo<BR>
				<INPUT TYPE=CHECKBOX VALUE="Bloqueado" name="MultiplosDadosHist">Bloqueado<BR>
				<INPUT TYPE=CHECKBOX VALUE="Cancelado" name="MultiplosDadosHist">Cancelado<BR>
				<INPUT TYPE=CHECKBOX style="visibility:hidden;"><BR>
				<INPUT TYPE=CHECKBOX style="visibility:hidden;"><BR>
			</td>

Servlet

String[] MultiplosDadosHist = request.getParameterValues("MultiplosDadosHist"); // PArÂMETRO QUE EU PRECISO PEGAR NOVAMENTE
			
relatorioHistorico = vrGera.VerificadorHist(MultiplosDadosHist); // ENVIO PARA A CLASSE E RECEBO O RESULTADO....
			
				request.setAttribute("relatorioHistorico", relatorioHistorico);			
				request.getRequestDispatcher("geraRelatorioHistorico.jsp").forward(
						request, response);

24 Respostas

E

cara primeiro de tudo é entender como o html é gerado e cuspido para o browser. ex:

<INPUT TYPE="checkbox" NAME="OPCAO" VALUE="op1"> opcao1 <INPUT TYPE="checkbox" NAME="OPCAO" VALUE="op2" CHECKED> opcao2 <INPUT TYPE="checkbox" NAME="OPCAO" VALUE="op3"> opcao3

ou seja vc vai ter q marcar a opçao marcada como checked, pra isso vc vai ter q fazer alguma regrinha na sua jsp para isso

tipo faça em todos os checks isso

<INPUT TYPE="checkbox" NAME="OPCAO" VALUE="op1" ${sua variavel == 'op1' ? 'checked':''}> opcao1
<INPUT TYPE="checkbox" NAME="OPCAO" VALUE="op2" ${sua variavel == 'op2' ? 'checked':''}> opcao2
<INPUT TYPE="checkbox" NAME="OPCAO" VALUE="op3" ${sua variavel == 'op3' ? 'checked':''}> opcao3

essa é a diferença entre usar um framework e não usar nada, vc vai ter q bolar a soluçao…, mais tudo é fácil, sempre veja o codigo fonte gerado e vá ajustando.

P

Olá Edu…

Não entendi muito bem o que quer dizer com isso…

É assim, eu recebo essa lista e está beleza… ela é enviada e retorna os valores e monta uma tabela na tela com os resultados…

Só que…

Tenho um botão na tela, onde será gerado o arquivo em excel, e para isso… eu preciso bolar uma maneira de ter deixado gravado os parâmetros consultados, para utilizar eles novamente…

Eu tentei criar um outro vetor de String [] MultiplosDadosHist2 que recebe os parâmetros consultados na primeira vez (MultiplosDadosHist) e jogar oculto para a jsp, e assim que clicar o botão de gerar arquivo, eu pego esse vetor de novo, para enviar para a classe de gerar arquivo… só que como ele grava um endereço de memória da NULL POINTER…

E

esse checkbox está na mesma tela q vc quer gerar o excel? ou está em outra tela e vc quer passar como parametro input hidden?

P

está na mesma tela… o processo é assim…

JSP 1 --> Servlet --> Classe --> BD --> Servlet – JSP 1

Ou seja, ele consulta e retorna o valor na mesma tela… e nesse mesma tela tem a opção de baixar o resultado em excel… ai preciso do mesmo parâmetro que utilizei na primeira consulta.

E

isso amigo
seu checkbox sempre quando volta pra tela volta sempre SEM a utlima opçao checada marcada e vc tem q fazer isso

P

Entendi… o que eu não entendi como colocar essa sua verificação… não consegui adicionar…

E

cara eu acho mais facil criar um componente tld doq ficar fazendo isso, mais vamos lá

ex pra fazer usando um opçao checada

na sua jsp

opcao = ${opcao}
		</br>
		<INPUT TYPE="checkbox" NAME="OPCAO" VALUE="op1" ${opcao == 'op1' ? 'checked':''}> opcao1  
    	<INPUT TYPE="checkbox" NAME="OPCAO" VALUE="op2" ${opcao == 'op2' ? 'checked':''}> opcao2  
    	<INPUT TYPE="checkbox" NAME="OPCAO" VALUE="op3" ${opcao == 'op3' ? 'checked':''}> opcao3  
    	<input type="submit" value="submit" />

no seu servlet

request.setAttribute("opcao", request.getParameter("OPCAO"));
P

Oi Edu… valeu pelas dicas…

Mas para mim não é viável isso…

Pois é preferível eu mandar uma lista… pois são 12 parâmetros que podem ser enviado… então para tratar isso na classe separado seria muito trabalhoso…

por isso estava tentando uma maneira de enviar uma lista com os dados…

E

cara existem trocentas maneiras de fazer isso

vc pode criar um componente pra isso

ou vc pode usar a mesma lógica que eu fiz pra passar 1 parametro só q passar mais parametros

ou vc pode simplesmente chunchar, q eu acho q é oq vc quer hahahaha

na jsp coloque

no servlet

System.out.println(request.getParameter("opcoes"));

String[] teste = request.getParameterValues("MultiplosDadosHist");
		
		String retorno = "";
		
		if(teste!= null){
			for (String s : teste) {
				retorno  += s+",";
			}
		}
request.setAttribute("opcoes", retorno);
P

vou fazer uns testes aqui… valeu

P

Fiz uns testes....

Agora ta enviando os valores... mas para "Setar a outra lista para enviar para a classe ta dando null pointer...

Eu pego ao clicar no botão gerar arquivo a "nova lista"::

// PEGAR A LISTA REENVIADA
		//String statusLinha = request.getParameter("status");
		String[] MultiplosDadosHist2 = request.getParameterValues("MultiplosDadosHist2");
		
		VerificarRegistroGeraRelatorioHist vr;
		try {
			vr = new VerificarRegistroGeraRelatorioHist();

			// MANDAR A LISTA
			vr.CriadorArquivoHist(MultiplosDadosHist2);

Só que quando entra na classe da null pointer

nessa partte

public void CriadorArquivoHist(
			String[] MultiplosDadosHist2) {

		GeraRelatorioDAO dao = new GeraRelatorioDAO();
		List<Integer> tecnologias = new ArrayList<Integer>();
		List<Integer> operadoras = new ArrayList<Integer>();
		List<Integer> status = new ArrayList<Integer>();
		int cod = 0;

		for (String mult : MultiplosDadosHist2) { // QUANDO ENTRA AQUI DA NULL POINTER
			System.out.println("Valor do Vetor: " + mult);

Outro detalhe é que não sei como preencher essa lista de novo, pois com vírgula ou não teria que tratar os valores em separado...

E

vou dar um exmplo baseado noq vc fez, só lembrando q isso é gambiarra

<input type="hidden" value="${opcao}" name="opcao"/>
		</br>
		<td style="border-color:white" style="border-style:groove">         
		    <INPUT TYPE=CHECKBOX VALUE="Ativo" name="MultiplosDadosHist">Ativo<BR>  
		    <INPUT TYPE=CHECKBOX VALUE="Bloqueado" name="MultiplosDadosHist">Bloqueado<BR>  
		    <INPUT TYPE=CHECKBOX VALUE="Cancelado" name="MultiplosDadosHist">Cancelado<BR>  
		    <INPUT TYPE=CHECKBOX style="visibility:hidden;"><BR>  
		    <INPUT TYPE=CHECKBOX style="visibility:hidden;"><BR>  
		</td>  
    	<input type="submit" value="submit" />

no servlet

String[] teste = request.getParameterValues("MultiplosDadosHist");
		
		String retorno = "";
		if(teste!= null){
			for (String s : teste) {
				retorno  += s+",";
			}
		}
		System.out.println("dados q vieram do formulario name MultiplosDadosHist: "+retorno);
		System.out.println("dados q vieram do input hidden: "+request.getParameter("opcao"));
		
		request.setAttribute("opcao", retorno);
P

Então Edu… sei que é gambiarra…

Mas eu fiz isso… o seu opção é o meu “MultiplosDadosHist2” que coloquei no GET para pegar o arquivo e fazer o tratamento correto…

Fiz isso que você passou, funcionou, só que ao tentar pegar novamente (post anterior meu) ele ta vindo nulo… mesmo que ele mostre na tela o valor correto…

P

Consegui Edu…

Só estou com um problema na montagem dos dados… pois ele está passando separadamente os valores ao invés de juntos…

se mandar um só beleza, funciona,

se eu mandar dois parâmetros, ele não monta com os dois juntos… e sim, manda um, depois o outro… gerando consultas diferentes…


Eu entendi o que está acontecendo… ele está enviando tudo junto com vírgula separando o valor A do B… então ele ta pegando apenas o primeiro valor dentro do for para “desmontar o vetor” …

Vc sabe como posso validar isso separado?

faço a verificação assim:

for (String mult : MultiplosDadosHist2) {
			System.out.println("Valor do Vetor 2: " + mult);

			if (mult.contains("Alarmes") || mult.contains("AA")
					|| mult.contains("AB") || mult.contains("AC")
					|| mult.contains("AD")) {

				if (mult.contains("Alarmes")) {
					cod = 22;
				} else if (mult.contains("AD")) {
					cod = 26;
				} else if (mult.contains("AB")) {
					cod = 24;
				} else if (mult.contains("AC")) {
					cod = 25;
				} else {
					cod = 23;
				}

				System.out.println("Tecnologia: " + cod);

				// CRIA LISTA DE TECNOLOGIAS
				tecnologias.add(cod);
E

cara na verdade não entendi muita coisa

vc vai receber os códigos

String []split = "abc,def,ghi".split(","); for (String cod : split) { //faiz oq vc tem q fazer com cada codigo //se tiver q fazer um por um entao usa só o cod //se tiver q usar tudo usa só o split }

P

Edu, desculpe a ignorância, rsrs…

Eu estou enviando em forma de vetor String []MultiplosDadosHist2

ai entra no for (String mult : MultiplosDadosHist2) {

Só que aqui ele só entra o primeiro valor, e não a combinação dos parâmetros

E

request.getParameterValues retorna um array de string

request.getParameter retorna uma string

uma string pode ter um codigo “22” como tb pode ter um codigo “22,33,35” dai vc separa por split

um array de string vai ter em cada posiçao uma string q pode ser “22” ou “22,33,35”

vc precisa printar mais com System.out.println ou debugar mais, isso vai fazer vc saber certinho oq tem em cada objeto

P

Valeu mais uma vez Edu…

então eu faço isso… ele está vindo assim… abcd, abc, ab, …

eu não to conseguindo usar o split… ou melhor não estou sabendo usar…

Pois é assim…

os dados que vem da tela são em texto, na classe eu verifico assim:

Se TEXTO contain (abcd) faça cod(int) = 1;

e no final pego esse código e jogo em uma lista de inteiros…

P

o método é esse:

public void CriadorArquivoHist(
			String[] MultiplosDadosHist2) {
		
		GeraRelatorioDAO dao = new GeraRelatorioDAO();
		List<Integer> tecnologias = new ArrayList<Integer>();
		List<Integer> operadoras = new ArrayList<Integer>();
		List<Integer> status = new ArrayList<Integer>();
		int cod = 0;

		// Quando chega aqui, ele está vindo como se fosse tudo um só registro, e não mais de um
		for (String mult : MultiplosDadosHist2) {
			System.out.println("Valor do Vetor 2: " + mult);

			if (mult.contains("A") || mult.contains("B")
					|| mult.contains("C") || mult.contains("D")
					|| mult.contains("E")) {

				if (mult.contains("A")) {
					cod = 22;
				} else if (mult.contains("B")) {
					cod = 26;
				} else if (mult.contains("C")) {
					cod = 24;
				} else if (mult.contains("D")) {
					cod = 25;
				} else {
					cod = 23;
				}

				System.out.println("Tecnologia: " + cod);

				// CRIA LISTA DE TECNOLOGIAS
				tecnologias.add(cod);

			} else if (mult.contains("CLARO") || mult.contains("TIM")
					|| mult.contains("OI") || mult.contains("VIVO")) {

				if (mult.contains("CLARO")) {
					cod = 10;
				} else if (mult.contains("TIM")) {
					cod = 11;
				} else if (mult.contains("OI")) {
					cod = 12;
				} else {
					cod = 13;
				}

				System.out.println("Operadora: " + cod);

				// CRIA LISTA DE OPERADORAS
				operadoras.add(cod);

			} else if (mult.contains("Ativo") || mult.contains("Bloqueado")
					|| mult.contains("Cancelado")) {

				if (mult.contains("Ativo")) {
					cod = 16;
				} else if (mult.contains("Bloqueado")) {
					cod = 15;
				} else {
					cod = 14;
				}

				System.out.println("Status: " + cod);

				// CRIA LISTA DE STATUS
				status.add(cod);

			} else {
				System.out.println("Campos vazios: " + mult);

			}
			
		}

		dao.geraArquivoExcelHist(tecnologias, operadoras, status);
		System.out.println("tec "+ tecnologias + " op " +operadoras + " sts " + status);

	}
E
// Quando chega aqui, ele está vindo como se fosse tudo um só registro, e não mais de um

for (String mult : MultiplosDadosHist2) {

System.out.println(Valor do Vetor 2: " + mult);

faça um for aqui e coloque toda a regra dentro, esse multi tem os codigos separados por virgula não?

String []split = mult.split(”,");

for (String cod : split) {

System.out.println("Valor do cod: " + cod );

}
P

Não… esse mult está com as vírgulas…

eu estava fazendo esse for antes do FOR citado acima para tirar a vírgula… ta tirando, mas mesmo assim não esta tratando como vários itens, e sim como se fosse um só

for (int i=0; i <= MultiplosDadosHist2.length; i++){
		
		for (String mult : MultiplosDadosHist2) {
			
			String frase = mult;   
			array = new String[MultiplosDadosHist2.length];   
	  
			array = frase.split(";"); 
		}
	}

Exemplo (estava assim “A, B, C, D” vendo como se fosse um único registro) e continuou assim ( “A B C D”) só que ainda continua contando como único registro.

E

bicho roda isso

String[] multiplosDadosHist2 = new String[]{"A,B,C,D"}; for (String codigos : multiplosDadosHist2) { String split[] = codigos.split(","); for (String cod : split) { if(cod.equals("A")){ System.out.println(22); }else if(cod.equals("B")){ System.out.println(26); }else { System.out.println("ha ha"); } } }

P

Edu… to quase… tenha mais um pouco de paciência, rsrs…

me explica uma coisa… qunado declaro o new String {“A,B,C,D”}; Eu coloco aqui todas as possibilidades que eu tenho? ou coloco apenas um tamanho? (podendo colocar o Lenght?)
Pq não coloquei informação exata como A, B, e mesmo assim ele imprimiu 22, 26… então é a quantidade?

e outra ajudinha,
nesse for que recebe os dados:

String[] teste = MultiplosDadosHist; String retorno = ""; if(teste!= null){ for (String s : teste) { retorno += s+","; } } request.setAttribute("MultiplosDadosHist2", retorno);

ele está imprimindo o último valor como “,” (A,B,C,)

P

AEEEEE>..... VALEU EDU.. CONSEGUI, entenid a lógica do negócio....

Muito obrigado pela paciência....

Só mudei o começo...

public void CriadorArquivoHist(
			String[] MultiplosDadosHist2) {

		int cod = 0;

		for (String codigos : MultiplosDadosHist2) {   
            String split[] = codigos.split(",");   
            for (String mult : split) { 
			System.out.println("Valor do Vetor 2: " + mult);
Criado 25 de abril de 2013
Ultima resposta 30 de abr. de 2013
Respostas 24
Participantes 2