Passar parâmetro do JSP [RESOLVIDO]

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

[code]
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);	[/code]

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.

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…

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?

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.

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

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

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

[code]   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" />[/code]

no seu servlet

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…

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);

vou fazer uns testes aqui… valeu

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

[code]// 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);[/code]

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…

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

[code]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);[/code]

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…

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);

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 }

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

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

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…

o método é esse:

[code]
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);

}[/code]