Neste segundo post sobre orientação a objetos com Javascript irei demonstrar como utilizar o conceito de herança.
Para se fazer uso de herança em javascript deve-se utilizar a propriedade prototype, os objetos em javascript contém uma propriedade “especial” chamada prototype que permite que seja adicionado métodos e propriedades as classes.
Quando se define um valor para a propriedade prototype, no momento em que se cria uma instância de uma classe em javascript, as propriedades prototypes são acopladas a classe.
O exemplo ira se basear em uma classe chama Pessoa com um atributo nome, seu método get e set e uma classe Amigo com um atributo telefone que irá herdar os atributos e métodos da classe Pessoa.
Primeiro o javascript para a classe Pessoa:
1
2
3
4
5
6
7
8
9
10
11
12
13
function Pessoa() {
this.nome;
this.setNome = setNome;
this.getNome = getNome;
function setNome(nome) {
this.nome = nome;
}
function getNome() {
return this.nome;
}
}
Agora o javascript para a classe Amigo:
1
2
3
4
5
6
7
8
9
10
11
12
13
function Amigo() {
this.telefone;
this.getTelefone = getTelefone;
this.setTelefone = setTelefone;
function setTelefone(telefone) {
this.telefone = telefone;
}
function getTelefone() {
return this.telefone;
}
}
E finalmente o exemplo de como aplicar herança em javascript:
1
2
3
4
5
6
7
Amigo.prototype = new Pessoa();
var amigo = new Amigo();
amigo.setNome("Rodrigo Lazoti");
amigo.setTelefone("1234-4567");
alert(amigo.getNome() +"\n"+ amigo.getTelefone());
Embora a maioria dos scripts feitos em Javascript seja feito utilizando utilizando programação estruturada, também pode-se utilizar os conceitos de orientação a objetos em Javascript.
Para exemplificar, irei me basear em uma classe chama Pessoa com atributos nome, idade e email, seus métodos getters e setters e um método chamado mostraValores que irá retorna uma string com os valores dos atributos da classe.
Veja o exemplo no código a seguir:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
function Pessoa() {
var nome;
var idade;
var email;
this.getNome = getNome;
this.getIdade = getIdade;
this.getEmail = getEmail;
this.setNome = setNome;
this.setIdade = setIdade;
this.setEmail = setEmail;
this.mostraValores = mostraValores;
function getNome() {
return nome;
}
function getIdade() {
return idade;
}
function getEmail() {
return email;
}
function setNome(_nome) {
nome = _nome;
}
function setIdade(_idade) {
idade = _idade;
}
function setEmail(_email) {
email = _email;
}
function mostraValores() {
return 'Nome: ' + nome +'nIdade: '+ idade +' anosnEmail: '+ email;
}
}
Agora vamos criar um javascript para manipular a classe Pessoa.
1
2
3
4
5
6
7
var rodrigo = new Pessoa();
rodrigo.setNome('Rodrigo Lazoti');
rodrigo.setIdade(26);
rodrigo.setEmail('rodrigo@test.com');
alert(rodrigo.mostraValores());
E com isso já temos um pequeno exemplo de uma forma de como utilizar orientação a objetos com Javascript.
O frameword Jboss Seam facilita muito o desenvolvimento, recentemente precisei incluir uma rotina de autenticação em um projeto que utiliza o seam 2.0 e achei bem tranquilo a forma de se fazer esta implementação.
Para fazer isso basta criar uma Seam Entity chamada Usuario, adicionei quatro atributos: id, nome, login e senha.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "USUARIO")
public class Usuario implements Serializable {
private Long id;
private String nome;
private String login;
private String senha;
@Id
@Column(name = "USUARIO_ID")
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Column(name="NOME", length=50)
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
@Column(name="SENHA", length=64)
public String getSenha() {
return senha;
}
public void setSenha(String senha) {
this.senha = senha;
}
@Column(name="LOGIN", length=25)
public String getLogin() {
return login;
}
public void setLogin(String login) {
this.login = login;
}
}
Na Seam Action chama UsuarioList que foi gerada pelo seam, inclui um método para fazer a pesquisa de usuário pelo seu login e senha:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import java.security.NoSuchAlgorithmException;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.framework.EntityQuery;
import com.seedts.rfid.entity.Usuario;
import com.seedts.rfid.util.Criptografia;
import com.seedts.rfid.util.UtilException;
@Name("usuarioList")
public class UsuarioList extends EntityQuery {
@Override
public String getEjbql() {
return "select usuario from Usuario usuario";
}
public Usuario login(String login, String senha) {
Usuario usuario = (Usuario) this.getEntityManager().createQuery("select u from Usuario as u where u.login = :login").setParameter("login", login).getSingleResult();
if (usuario.getSenha().equals(senha))
return usuario;
else
return null;
}
}
E para finalizar basta alterar o método authenticate() da classe Authenticator que também é gerada pelo seam:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import java.security.NoSuchAlgorithmException;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Logger;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.contexts.Contexts;
import org.jboss.seam.faces.FacesMessages;
import org.jboss.seam.log.Log;
import org.jboss.seam.security.Identity;
import com.seedts.rfid.entity.Usuario;
import com.seedts.rfid.util.UtilException;
@Name("authenticator")
public class Authenticator {
@Logger
Log log;
@In
Identity identity;
@In
FacesMessages facesMessages;
public boolean authenticate() throws NoSuchAlgorithmException, UtilException {
Usuario usuario = new UsuarioList().login(identity.getUsername(), identity.getPassword());
if (usuario != null) {
Contexts.getSessionContext().set("usuario", usuario);
identity.addRole("admin");
return true;
}
else
return false;
}
}
E com isso a autenticação básica do projeto já esta funcionando.
Há algum tempo atrás eu precisei disponibilizar senhas diferenciadas para algumas pessoas, como achava uma perda de tempo ficar “bolando” senhas de forma manual, decidi desenvolver um software para gerar senhas aleatórias.
Seu uso é muito simples basta informar a quantidade de dígitos que a senha irá contem e caso queira uma chave para ser utilizada na geração da senha.
Para executá-lo basta executar o comando dentro da pasta dist contida no arquivo zip:
1
java -jar RLPasswordGen.jar
Disponibilizei o os fontes do projeto assim como o projeto já compilado e empacotado em um arquivo .jar. O projeto foi feito no eclipse.
Para fazer o download clique aqui.
Para quem deseja utilizar os recursos do framework javascript Extjs em seus projetos java, irei dar uma dica bem legal de como utilizar este framework através de TLD para páginas jsp.
O download dos arquivos tld deve ser feito no endereço http://www.exttld.com/index.php?content=terms#download
Após o download basta descompactar o arquivo zip em um subdiretório chamado ext dentro do caminho /projeto/WEB-INF/tags/
Copie os seguintes jars para a pasta lib:
Pronto, já é possível utilizar as tags nas páginas jsp. irei colocar um pequeno exemplo da utilização de tags.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib tagdir="/WEB-INF/tags/ext" prefix="ext" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title></title>
</meta>
</head>
<body>
<ext :body debug="true" loadingMask="true"></ext>
<ext :viewport layout="table"></ext>
<ext :form.formPanel width="400" title="Cadastro">
<ext :form.textField fieldLabel="Nome" name="nome"/>
<ext :form.numberField fieldLabel="Idade" name="idade" value="0"/>
<ext :form.timeField fieldLabel="Hora Cadastro" name="hora"/>
<ext :datePicker id="Data" format="d/m/y"/>
<ext :button type="submit" text="Enviar" id="enviar" />
</ext>
</body>
</html>