"getParameter" trazendo valor nulo de um FORM

7 respostas
N

Olá pessoal, estou com o seguinte problema:

possuo um form em um JSP, com dois botões: Click e Clear. Ao acioná-los, invoco métodos em um arquivo JS para efetuar umas validações.

Caso eu acione o botão Click com um valor preenchido no input text do form, uma servlet será invocada para que possa pegar o valor entrado no input text e exibi-lo em um alert javascript.

A questão é que no momento de fazer a seguinte passagem na minha servlet:

String valor = req.getParameter("inputbox");

não está trazendo o valor e assim, no alert é exibido nulo.

Será algum problema ao invocar a minha servlet?

Seguem os códigos:

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	id="WebApp_ID" version="2.5">
	<display-name>JSPJS</display-name>
	<servlet>
		<servlet-name>JSAjax</servlet-name>
		<servlet-class>br.js.servlets.TesteJS</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>JSAjax</servlet-name>
		<url-pattern>/ajax</url-pattern>
	</servlet-mapping>
	<welcome-file-list>
		<welcome-file>JSteste.jsp</welcome-file>
	</welcome-file-list>
</web-app>

JSP

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
	pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<script type="text/javascript" src="js/field_validate.js"></script>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>JSP</title>
</head>
<body>
<form name="myform" method="post">
Enter something in the box: <BR>
<input type="text" name="inputbox" value=""/><P>
<input type="button" name="button1" value="Click" onclick="testResults(this.form)">
<input type="button" name="button2" value="Clear" onclick="cleanResults(this.form)">
</form>
</body>
</html>

JavaScript

var req;
var isIE;

function initRequest(url) {
	
	if (window.XMLHttpRequest) {
		req = new XMLHttpRequest();
		
	} else if (window.ActiveXObject) {
		isIE = true;
		req = new ActiveXObject("Microsoft.XMLHTTP");
		
	} else {
		req = new ActiveXObject("Msxml2.XMLHTTP");
	}
}

function testResults(form) {

	var TestVar = form.inputbox.value;

	if( TestVar == "" ) {

		alert("Deve-se digitar algo!");

	} else {

		var url = "ajax";
		initRequest(url);
		req.onreadystatechange = processRequest;
		req.open("GET", url, true);
		req.send(null);
	}
}

function cleanResults( form ) {

	var TestVar = form.inputbox.value;

	if( TestVar == "" ) {
		alert("Nada para limpar!");

	} else {
		form.inputbox.value = "";
	}
}

function processRequest() {
	if (req.readyState == 4) {
		if (req.status == 200) {
			var texto = req.responseText;
			alert(texto);
		}
	}
}

Servlet

@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {

			String valor = req.getParameter("inputbox");

			resp.setContentType("text/xml;charset=UTF-8");
			resp.setHeader("Cache-Control", "no-cache");
			
			resp.getWriter().write( "Você digitou: " + valor );
	}

Qualquer dica ajudará bastante.

Abs.

7 Respostas

A

Olá!

O problema deve estar no form do seu JSP.
Mude o atributo method da linha

&lt;form name="myform" method="post"&gt;
...

para para get, desta forma:

&lt;form name="myform" method="get"&gt;
...

O atributo getParameter do Request só retorna os valores passados como variáveis de URL. O atributo method=“get” envia os valores do campos do formulário via variáveis de URL, possibilitando que o getParameter consiga retorná-los.

[]'s

P

Você não está enviando o campo para o servlet!

Mude a linha 28 para:

var url = "ajax?inputbox=" + TestVar ;
P

Use este script:

function send( url, type, dados ){
        request = null;

        if( window.XMLHttpRequest ){
            request = new XMLHttpRequest();
        }
        else{
            try {
                request = new ActiveXObject("Msxml2.XMLHTTP");
            }
            catch( e ){
                try {
                    request = new ActiveXObject("Microsoft.XMLHTTP");
                }
                catch( e ){
                }
            }
        }


        request.open( type, url, true );
        request.setRequestHeader('Content-Type' , 'application/x-www-form-urlencoded' );
        request.setRequestHeader('Content-length' , dados.length );
        request.setRequestHeader('Connection' , 'Keep-Alive' );

        request.onreadystatechange = function(){
            if( request.readyState == 1 )
                window.status = "Iniciando...";
            else
            if( request.readyState == 2 )
                window.status = "Enviando dados...";
            else
            if( request.readyState == 3 )
                window.status = "Recebendo dados...";
            else
            if( request.readyState == 4 )
                window.status = "";

            //alert( "readyState: " + request.readyState );
            if( request.readyState == 4 ){
                //alert( "readyState: " + request.readyState + " request error: " + url );
                if(request.status==200){
                    try{
                        response = request.responseText;
                        if( response.length != 0 )
                            exec( "try{ " + response + " } catch( e ){ alert( e.message ) }" );
                    }
                    catch( e ){
                        alert( dados );
                        alert( request.responseText );
                        alert( e.description );
                    }
                }else
                    alert( request.status );
            }
        };
        
        request.send( dados );
    }

    function exec( code ){
        if( window.execScript )
            window.execScript( code );
        else
            window.eval( code );
    }

    function getValor0( element ){
    
        if( element.type == 'radio' ){
            if( element.checked )
                return element.value;
        }
        else
        if( element.type == 'checkbox' ){
            if( element.checked )
                return element.value;
        }
        else
        if( element.type == 'select-one' ){
			var i=0;
            for(i=0;i<element.options.length;i++ ){
                if(element.options[i].selected )
                    return element.options[i].value;
            }

        }
        else
            return element.value;

		return null;
    }

    function getValor( element ){
        return getValor0( element );
    }

    function urlEncode( str ){
        
        str = escape(str);
        str = str.replace('+', '%2B');
        str = str.replace('%20', '+');
        str = str.replace('*', '%2A');
        str = str.replace('/', '%2F');
        str = str.replace('@', '%40');
        
        /*
        str = str.replace('&', '%26');
        str = str.replace('%', '%25');
        str = str.replace(' ', '+');
        */
        return str;
    }

    function getData( form ){
        i=0;
        data = "";
        for( i=0;i<form.elements.length;i++){
            element = form.elements[i];
            
            value = getValor( element );
            
            if( value != null ){
                if( data.length != 0 )
                    data += "&";
		            
                data += urlEncode(element.name);
                data += "=";
                data += urlEncode( value );
            }
        }
        return data;
    }

    function enviar( form ){
        dados = getData( form );
        send( form.action, form.method, dados );
    }

para enviar o form você usa:

enviar( objForm );

mude o servlet para:

protected void service(HttpServletRequest req, HttpServletResponse resp)   
    throws ServletException, IOException {   
  
    String valor = req.getParameter("inputbox");   
  
    resp.setContentType("text/xml;charset=UTF-8");   
    resp.setHeader("Cache-Control", "no-cache");   

    String cmd = "alert( '&s' )";
    cmd = cmd.replace( "&s", "Você digitou: " + valor );

    resp.getWriter().write( cmd );
}

não testei o código!

N

Olá andre.santos, valeu pela dica cara, mas ela não funcionou.

plic_ploc, a sua primeira dica resolveu a questão. Acreditava que o objeto request recebido pela servlet, ainda referenciava a minha sessão de form. Pelo jeito não.

Fazendo dessa forma então terei que passar os valores via hard code para a servlet.

Aproveitando, você saberia me dizer como poderia enviar esses paramêtros para a servlet através de js/ajax sem ter que colocar os valores como variáveis? (Como no meu caso TestVar)

Vou estudar esse código que vc sugeriu e testar.

Obrigado pelas dicas caras.

Abs.

P

O script que te passei pega todos os campos do formulário e envia para o endereço informado no action do form.
Esse script se equivale a apertar o botão submit do formulário e seu retorno tem que ser um script.

Obs: O script não suporta todos os tipos de campos.

R

Para enviar os dados via Post no ajax vc tem que setar a configuração o objeto de “GET” para “POST” fazer uma função que concatene todos os resultados e enviar atravéz do objeto:

O javascript do plic_ploc funciona perfeitamente.

N

Olá ralphsilver,

teria como você dar um exemplo?

Obrigado,

Abs.

Criado 19 de agosto de 2009
Ultima resposta 19 de ago. de 2009
Respostas 7
Participantes 4