quarta-feira, 10 de abril de 2013

Bug $.post

Na construção de funções que utilizam os métodos para ajax do jquery, notei que existem diferenças na passagem de parâmetros.

Que diferenças são essas ?

De acordo com a documentação do jquery você realizar uma requisição ajax através dos métodos:

jQuery.ajax()
jQuery.get()
jQuery.post()

O método jQuery.ajax() ou $.ajax() realizam uma requisição ajax podendo ser GET ou POST. O método jQuery.get() realiza uma requisição GET para carregar dados do servidor, é uma "abreviação" do método $.ajax, ou seja, é equivalente à:

$.ajax({
  url: url,
  data: data,
  success: success,
  dataType: dataType
});

Finalmente o método jQuery.post() realiza uma requisição POST para carregar dados do servidor, é uma "abreviação" do método $.ajax, ou seja, é equivalente à:


$.ajax({
  type: "POST",
  url: url,
  data: data,
  success: success,
  dataType: dataType
});


Vamos analisar aqui o método $.post(). Nesse método podemos passar parâmetros de duas formas, a primeira forma é via uma string, exemplo:

function foo(){
       var valor1 = 1;
       var valor2 = 'Joao Paulo';
       $.post("sua_url", "parametro1=" + valor1 + '&parametro2=' + valor2,
                 function(retornoAjax){},
       "html");
}

Nesse exemplo, realizamos uma requisição ajax ao servidor passando dois parâmetros. Quando esses dados chegarem no servidor, o parametro1 vai chegar com o valor "1" e o parametro2 vai chegar com o valor "Joao Paulo". A integridade dos dados vai ser mantida mas, se mudarmos só um pouco o exemplo teremos um problema.


function foo(){
       var valor1 = 1;
       var valor2 = 'João Paulo';
       $.post("sua_url", "parametro1=" + valor1 + '&parametro2=' + valor2,
                 function(retornoAjax){},
       "html");
}

Quando esses dados chegarem no servidor, o parametro1 vai continuar com o valor 1 mas, o parametro2 vai vir com caracteres estranhos, "quebrados", quadradinhos e afins. Para solucionar esse problema, temos que passar os parâmetros de uma outra forma, via JSON. Passando os parâmetros via JSON, conseguimos manter a integridade dos dados quando eles chegam no servidor. Para passar parâmetros via JSON, teremos de modificar um pouco nossa função.


function foo(){
       var valor1 = 1;
       var valor2 = 'João Paulo';
       $.post("sua_url", {parametro1: valor1, parametro2: valor2},
                 function(retornoAjax){},
       "html");
}

Caso você tenha dúvidas de como trabalhar com JSON, recomendo dar uma lida em outro post aqui do blog. Desse jeito podemos manter a integridade dos nossos dados e, o valor do parametro2 chegar no servidor como "João Paulo". Podemos também alterar um pouco mais nossa função caso queiramos passar mais parâmetros.


function foo(){
       var valor1 = 1;
       var valor2 = 'João Paulo';
       var parametros = {

      'parametro1' : valor1,
              'parametro2' : valor2
       };
       $.post("sua_url", parametros,

                 function(retornoAjax){},
       "html");
}


Leia Mais ››

segunda-feira, 1 de abril de 2013

Passar parâmetros no forward da action

Existem várias formas de passar paramêtros em uma querystring. Para quem não sabe o que é uma querystring, querystring é tudo que se localiza após o ? em uma url, exemplo:

www.meusite.com.br/blablabla?minhaquerystring

A função da querystring é passar parâmetros para suas classes de servidor. Quando se constrói um sistema usando struts, às vezes é necessário passar parâmetros pelo forward no seu struts-config. Agora, você pensa, "isso é fácil" e, realmente é, segue exemplo:

<action path="/minhaAction" name="meuForm" type="caminhodaminhaaction.MinhaAction" scope="request" validate="false">
            <forward name="fwd-sucesso" path="/minhaActionForward.do?parametro1=valor" redirect="false"></forward>
</action>

Nesse exemplo, passamos só um parâmetro pelo forward da action mas, e se quisessemos passar mais ? Então você pensa, "isso também é fácil, é só por o & depois do valor do parâmetro1". Só que você está


ENGANADO

Se você fizer isso, sua aplicação vai gerar um erro dizendo que não consegue reconhecer o sinal de &. Procurando por uma solução, achei o link abaixo, que descreve a solução.

http://www.guj.com.br/java/45037-struts-parametros-via-url-no-forward-de-um-action-

A solução é simples, ao invés de por o &, ponha &amp; e construa sua querystring normalmente, segue exemplo:

<action path="/minhaAction" name="meuForm" type="caminhodaminhaaction.MinhaAction" scope="request" validate="false">
               <forward name="fwd-sucesso" path="/minhaActionForward.do?parametro1=valor&amp;parametro2=valor&amp;parametro3=valor" redirect="false"></forward>
</action>
Leia Mais ››

quarta-feira, 13 de março de 2013

Máscara para valores decimais negativos

Máscaras para valores decimais negativos é sempre algo bem chato e complicado de achar, nas minhas pesquisas na net não achei nada que me ajudasse, o plugin maskedinput não pode me ajudar nessa situação pois, ele se encaixa muito bem para valores fixos tipo, datas, horários, cpf/cnpj, rg e por ai vai.

Outro plugin que achei que talvez fosse me ajudar era o maskedmoney(ou alguma coisa assim) mas, também não era o que eu queria. Então pensei:

"Porque não faço a minha própria máscara ?"

Mãos à obra.

Já sabia que iria ter d fazer uma regex em javascript se queria uma solução limpa e eficaz, só que ai surgia um outro grande problema, como fazer a tal Regex ? Depois de quebrar muito a cabeça e ter ajuda de um guru do javascript, Leonardo Dutra, conseguimos construir uma regex que pudesse validar campos decimais negativos e positivos.

/^-?[0-9]{1,3}(?:\.[0-9]{2})?$/

Ai está a obra prima mas, agora precisamos entender o que isso faz para que possamos construir outras no futuro. Em javascript, a barra / no início e no fim é obrigatório, isso é próprio da linguagem pois, quando você constrói uma regex um objeto RegExp é gerado, logo você deverá sempre por.

O símbolo ^ denota início de sentença, logo estamos construindo uma regex que vai validar inícios de sentença.

Os símbolos -? significam que eu posso ter 1 ou nenhuma ocorrência do sinal negativo(-), o ? dá esse significado de 1 ou 0 ocorrências.

[0-9] significa que eu posso ter um número de 0 à 9. {1,3} significa que você pode ter de 1 à três ocorrências mas, de que ? Note que o [0-9] e o {1,3} estão juntos, logo eu posso ter de 1 à 3 ocorrências de números que vão de 0 à 9.

O segredo de entender uma regex é saber avaliar as partes mas, também saber avaliar o todo.

Os parênteses () significam agrupamento e, o ?: significa que realizo um agrupamento sem guardar dados em um vetor interno mas, hein ? Quando você monta uma regex agrupada os valores capturados por ela são guardados em um vetor para utilização futura.

A contra barra \ significa caracter de escape, por que usei isso ?A máscara deve aceitar ponto como separador decimal mas, o caracter . têm significado próprio no contexto da regex, logo uso a contra barra para dizer ao javascript que o caracter ponto não deve ser levado em conta como sendo uma regex. Logo, após o ponto encontramos outro [0-9], já sabemos o que significa.

O {2} significa que só posso ter duas ocorrências de ?:\.[0-9], ou seja, eu só posso ter duas casas depois da vírgula. Logo, após o fecha parênteses ) encontramos um ?. Isso significa que 1 ou nenhuma ocorrência de (?:\.[0-9]{2}), ou seja, que eu posso ter duas casas depois da vírgula ou não para que tais valores sejam aceitos:

-7
-85
-856
85
99
2
856.55
-856.55

O sinal de $ denota fim de sentença, logo estamos validando também o fim da sentença também. Podemos notar que construimos uma regex fechada. Para por em prática essa regex podemos usar métodos especiais para isso, como o test() que valida se um valor passado como parâmetro está de acordo com a regex ou não, retornando true ou false.

Qualquer dúvida é só comentar.

Leia Mais ››

quinta-feira, 21 de fevereiro de 2013

Gifs para loading

Um dia estava precisando de um gif para loading e achei vários site que disponibilizavam download mas, o que mais me interessou foi o site:

http://www.ajaxload.info/

Nesse site é possível você escolher um tipo de gif e personalizá-lo, mudar sua cor e por ai vai. Depois de escolher as características de seu gif é só gerá-lo e fazer o download. Ferramenta muito útil e ótimo quebra galho.
Leia Mais ››

segunda-feira, 18 de fevereiro de 2013

Chamdas de funções nos browsers

Esse tópico é algo muito curioso e particular do IE6. Em javascript é possível tem uma função recebendo x parâmetros, onde x é um número maior que 0 e é possível chamá-la não passando todos os parâmetros, segue exemplo:

function foo(param1, param2, param3){
/*código*/
}

function foo2(){
      foo("a", "b");

}

Note que só passei dois paramêtros na chamada de foo em foo2, quando todo esse código for executado o que virá como valor no param3?

É aí que entra a grande questão. Nos browsers ie7( e versões superiores), firefox, chrome, opera e safari o parâmetro que falta vai com o valor de "undefined" para a função foo(), porém no ie6 ele usa o último valor da pilha de chamada de função.

COMO ASSIM ?

O ie6 usa o último valor de parâmetro passado quando ele nota que numa função que recebe x parâmetros são passados menos que x. Um exemplo deve esclarecer as coisas.

Vamos continuar utilizando a função foo() definida lá em cima.

function foo3(){
    foo('a', 'b', 'c');
   /*codigo*/
   foo('a', 'b');
}

Na segunda chamada de foo, o valor de param3 virá como 'c' mesmo eu não tendo passado nada para ele na segunda chamada, logo ele utiliza o último valor da pilha de chamadas de funções. Isso pode causar problemas em seus scripts quando você quer construir um sistema que rode em todos os browsers. Uma das soluções para esse problema é sempre passar todos os parâmetros ou forçar a passada de "undefined" para a função.
Leia Mais ››

quarta-feira, 26 de dezembro de 2012

Acessando posições de lista JSTL

Vamos supor que você queira acessar uma posição específica da sua lista com JSTL, em casa posição da lista existe um objeto da classe Pessoa, que possui os seguintes atributos:

class Pessoa{
 private String id;
 private String nome;
 private String email;

 /*getters e setters*/
}

Vamos supor também que na sua jsp você queira acessar especificamente a primeira posição da lista, somente a primeira posição e você não quer utilizar um <c:forEach>. Como fazer isso sem iterar a lista ? Devo por no request o objeto na primeira posição da lista ? E se quiser um outro objeto da lista ? Devo settar no request também ?

A solução para isso é mais simples do que parece, vamos supor que você setou a lista request com o nome de lista. Na JSP, você deverá acessar a primeira posição desta forma:

${lista[0]}

Desta forma você terá acesso ao objeto da classe Pessoa, que está na primeira posição mas, se você quiser acessar o nome, ou o email ou o id ?

Para acessar o nome: ${lista[0]}.nome
Para acessar o email: ${lista[0]}.email
Para acessar o id: ${lista[0]}.id
Leia Mais ››

quarta-feira, 19 de dezembro de 2012

Configuração de SSL no Apache

Esse post é sobre como gerar os certificados SSL no CentOS utilizando o OpenSSL e ativá-los no Apache para permitir conexões criptogradas ao seu servidor Web, para isso precisamos inicialmente instalar os pacotes necessários (caso ainda não estejam instalados):

# yum install mod_ssl openssl

Agora iremos gerar a chave privada:

# openssl genrsa -out ca.key 1024

Gere o arquivo CSR:
# openssl req -new -key ca.key -out ca.csr

You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [GB]:BR
State or Province Name (full name) [Berkshire]:Rio de Janeiro
Locality Name (eg, city) [Newbury]:Rio de Janeiro
Organization Name (eg, company) [My Company Ltd]:Exemplo
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your servers hostname) []:www.exemplo.com
Email Address []:admin@exemplo.com

Please enter the following extra attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

OBS.: Common Name deverá ser a URL do serviço, nesse exemplo www.exemplo.com.

Assine o arquivo CSR utilizando a chave privada para gerar o certificado:

# openssl x509 -req -days 365 -in ca.csr -signkey ca.key -out ca.crt

Mova os arquivos para a localização correta:

# mv ca.crt /etc/pki/tls/certs
# mv ca.key /etc/pki/tls/private/ca.key
# mv ca.csr /etc/pki/tls/private/ca.csr

Caso não utilize Virtual Host no seu servidor Apache, basta alterar as linhas abaixo no arquivo de configuração do SSL:

# vim /etc/httpd/conf.d/ssl.conf

SSLCertificateFile /etc/pki/tls/certs/ca.crt
SSLCertificateKeyFile /etc/pki/tls/private/ca.key

E reinicie o serviço:

# /etc/init.d/httpd restart

Caso utilize Virtual Host será necessário alterar o arquivo de configuração do Virtual Host ao invés do arquivo de configuração do SSL, abra o arquivo e adicione no início do arquivo:

# vim /etc/httpd/conf.d/meu_vhost.conf

NameVirtualHost *:443

E após a configuração do <VirtualHost *:80> adicione a entrada referente ao SSL:

# vim /etc/httpd/conf.d/meu_vhost.conf


SSLEngine on
SSLCertificateFile /etc/pki/tls/certs/ca.crt
SSLCertificateKeyFile /etc/pki/tls/private/ca.key

AllowOverride All

DocumentRoot /var/www/vhosts/exemplo.com/htdocs
ServerName www.exemplo.com

Feito isso reinicie o serviço:

# /etc/init.d/httpd restart

Pronto! Basta acessar seu servidor ou Virtual Host pelo seu navegador/browser preferido utilizando https para verificar o certificado criado!
Leia Mais ››