Professional Documents
Culture Documents
as aes de rotao, zoom e translao. Assim possvel permitir senhado em uma posio ligeiramente diferente. Isto realizado
que o usurio gire, desloque, aproxime ou afaste o elemento que alterando-se a posio do cubo aplicando-se sobre o mesmo uma
est controlando. O construtor desta classe recebe como pri- transformao de rotao. Portanto, para cada frame uma nova
meiro parmetro o Canvas no qual o comportamento deve ser rotao do cubo deve ser calculada e aplicada.
adicionado (a classe Canvas representa a rea de desenho que a
Java3D est utilizando para mostrar os modelos geomtricos), e
como segundo parmetro um conjunto de flags, ou sinais, para
configurar os comportamentos desejados, podendo-se ativar ou
desativar a rotao, a translao e o zoom. Por padro, todas estas
aes esto ativas.
No exemplo da Listagem 2, o mtodo getCanvas() da classe Sim-
pleUniverse utilizado para obter a referncia ao Canvas e o flag
REVERSE_ALL utilizado para inverter todos os movimentos
associados ao mouse, para que a movimentao seja mais intuitiva,
pois com o comportamento padro, ao se mover o mouse para
baixo, por exemplo, uma rotao para cima executada. Ao aplicar
este flag, a rotao segue a direo do movimento do mouse.
Uma observao importante que um objeto do tipo Orbit-
Behavior precisa ser informado sobre a regio na qual os com-
portamentos definidos por ele so vlidos. Com este intuito, um
objeto do tipo BoundingSphere, com centro em (0, 0, 0) e raio
100 instanciado e fornecido como parmetro ao mtodo set- Figura 2. Rotao dos eixos usando OrbitBehavior na Listagem 2
SchedulingBonds().
Estes passos configuram o objeto orbit, que agora precisa ser O primeiro passo para permitir que um modelo possua um
associado ao viewingPlatform chamando-se o mtodo setView- comportamento no grafo de cena criar um ramo do tipo Trans-
PlatformBehavior(). Com isto feito, o usurio pode modificar formGroup e informar que o mesmo ser modificado em tempo
o ponto de viso do universo ao pressionar o boto esquerdo de execuo, com o flag ALLOW_TRANSFORM_WRITE. Se isto
do mouse e arrastar. Isto faz com que a cmera possa rodar ao no for informado, a Java3D assume que o grupo esttico e as
redor do ponto (0, 0, 0), aproximar ou afastar a cmera ou ainda transformaes aplicadas neste ramo j esto prontas, ou seja, no
transladar em qualquer direo. Na Figura 2 pode ser visto um permitido alterar os seus valores em tempo de execuo, o que
resultado da rotao aplicada aos eixos cartesianos. no possibilita uma sequncia de transformaes nos modelos,
impossibilitando a visualizao de movimentos.
Listagem 2. Permitir ao usurio mudar o ponto de viso. No ramo do grafo de cena do tipo TransformGroup podem
ser adicionados modelos e comportamentos, sendo os compor-
// Olha na direo dos eixos
universo.getViewingPlatform().setNominalViewingTransform(); tamentos aplicados a todas as geometrias pertencentes ao ramo
ViewingPlatform viewingPlatform = universo.getViewingPlatform(); do grafo de cena. Para rotacionar um cubo, precisa-se ento criar
OrbitBehavior orbit = new OrbitBehavior(universo.getCanvas(), OrbitBehavior.
e adicionar um cubo e uma transformao de rotao ao grupo.
REVERSE_ALL);
BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), Para exibir um cubo na cena, basta instanciar um objeto do tipo
100.0); ColorCube com o tamanho desejado e inclui-lo no grafo.
orbit.setSchedulingBounds(bounds);
O controle do movimento de rotao realizado por um ob-
viewingPlatform.setViewPlatformBehavior(orbit);
jeto da classe RotationInterpolator, que uma especializao
// Adiciona o grupo ao grafo de cena de Behavior. Para configurar a rotao necessrio fornecer
universo.addBranchGraph(grupo);
ao construtor de RotationInterpolator as informaes sobre o
nmero de vezes que a rotao ser aplicada e qual o tempo de
Movimento a partir da rotao cada rotao, sobre qual grupo a rotao ser aplicada, uma ma-
Os objetos que definem comportamentos na Java3D tambm triz de transformao e os ngulos mnimo e mximo da rotao
podem ser utilizados para especificar movimentos para os mode- em radianos.
los ou partes do grafo de cena. No prximo exemplo, apresentado A classe Alpha fornece os mtodos para converter um valor de
na Listagem 3, esta caracterstica demonstrada associando-se tempo em um valor no intervalo [0, 1], o que possibilita controlar
um comportamento de rotao a um cubo para fazer com que o a velocidade de rotao do cubo informando em quanto tempo,
mesmo gire em um de seus eixos. em milissegundos, deve ser completada uma volta. O primeiro
Para que o movimento de rotao seja percebido, uma sequncia parmetro do construtor da classe Alpha indica quantas vezes
de imagens deve ser gerada, sendo em cada uma delas o cubo de- o lao ser repetido, ou neste caso, quantas rotaes o cubo deve
public RotacionarCubo(){
SimpleUniverse universo = new SimpleUniverse();
BranchGroup grupo = new BranchGroup();
// Cria o n Transformgroup e inicializa-o com a matriz identidade.
TransformGroup transform = new TransformGroup();
// Habilita a capacidade de escrita TRANSFORM_WRITE, para que o objeto
// de comportamento possa modific-lo em tempo de execuo.
transform.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
// Adiciona o TransformGroup raiz do grafo.
grupo.addChild(transform);
A posio da bola na imagem controlada por dois elementos: nos quais a posio vertical deve ser alterada para cima ou para
um correspondente ao posicionamento horizontal, controlado baixo, alterando-se o valor da varivel altura. Este temporizador
pelo usurio, e outro correspondente ao posicionamento verti- iniciado ou parado no mtodo actionPerformed() juntamente
cal, controlado por um temporizador, para indicar os instantes com o evento do prprio temporizador, que ocorre a cada 30
public class BolaSaltando extends JFrame implements ActionListener, KeyListener{ SimpleUniverse universo = new SimpleUniverse(canvas3d);
universo.getViewingPlatform().setNominalViewingTransform();
private Button ini = new Button(Iniciar); universo.addBranchGraph(cena);
private TransformGroup transformGroup; }
private Transform3D matrizTransf = new Transform3D();
private float altura = 0.0f; // chamado quando uma tecla pressionada.
private float sentido = 1.0f; // subindo ou descendo public void keyPressed(KeyEvent e) {
private Timer tempo; //Verifica se a tecla pressionada foi s
private float posX = 0.0f; if (e.getKeyChar() == s) {
if(posX < 1f )
public BranchGroup criarGrafoCena() posX = posX + .01f;
{ }
// Cria a raiz do grafo de cena // Verifica se a tecla pressionada foi a
BranchGroup grupo = new BranchGroup(); if (e.getKeyChar() == a) {
transformGroup = new TransformGroup(); if(posX > -1f )
transformGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); posX = posX - .01f;
grupo.addChild(transformGroup); }
}
// Cria uma esfera e a adiciona ao grafo de cena
Sphere esfera = new Sphere(0.25f ); // chamado quando uma tecla liberada.
transformGroup = new TransformGroup(); public void keyReleased(KeyEvent e){
transformGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); }
Transform3D pos1 = new Transform3D();
pos1.setTranslation(new Vector3f(0.0f, 0.0f, 0.0f )); // chamado quando uma tecla teclada
transformGroup.setTransform(pos1); public void keyTyped(KeyEvent e){
transformGroup.addChild(esfera); }
grupo.addChild(transformGroup);
public void actionPerformed(ActionEvent e){
// Cria a luz vermelha e a adiciona ao grafo // inicia o temporizador quando o boto clicado
BoundingSphere limite = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0); if (e.getSource() == ini){
Color3f luz1Cor = new Color3f(1.0f, 0.0f, 0.2f ); if (!tempo.isRunning()) {
Vector3f luz1Direcao = new Vector3f(4.0f, -7.0f, -12.0f ); ini.setLabel(Parar);
DirectionalLight luz1 = new DirectionalLight(luz1Cor, luz1Direcao); tempo.start();
luz1.setInfluencingBounds(limite); } else {
grupo.addChild(luz1); ini.setLabel(Iniciar);
tempo.stop();
// Configura a luz ambiente e a adiciona ao grafo }
Color3f luzAmbienteCor = new Color3f(1.0f, 1.0f, 1.0f ); } else {
AmbientLight luzAmbiente = new AmbientLight(luzAmbienteCor); altura += .03 * sentido;
luzAmbiente.setInfluencingBounds(limite); if (Math.abs(altura * 2) >= 1)
grupo.addChild(luzAmbiente); sentido = -1.0f * sentido;
if (altura < -0.4f ) {
return grupo; matrizTransf.setScale(new Vector3d(1.0, .8, 1.0));
} } else {
matrizTransf.setScale(new Vector3d(1.0, 1.0, 1.0));
public BolaSaltando() { }
// Configura o ambiente do Applet matrizTransf.setTranslation(new Vector3f(posX, altura, 0.0f ));
setLayout(new BorderLayout()); transformGroup.setTransform(matrizTransf );
GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration(); }
Canvas3D canvas3d = new Canvas3D(config); }
add(Center, canvas3d);
canvas3d.addKeyListener(this); public static void main(String[] args){
tempo = new Timer(30, this); System.out.println(Programa Iniciado);
BolaSaltando bolaSaltando = new BolaSaltando();
Panel painel = new Panel(); bolaSaltando.addKeyListener(bolaSaltando);
painel.add(ini); bolaSaltando.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
add(North, painel); bolaSaltando.setSize(256, 256);
ini.addActionListener(this); bolaSaltando.setVisible(true);
ini.addKeyListener(this); }
}
// Cria uma cena e a adiciona ao universo virtual
BranchGroup cena = criarGrafoCena();
e evoluir. Em virtude disso, surge o desa- que permitam suas extenses, mas fechadas desenhada. Com isso, para cada nova
fio de criar um projeto estvel mediante para modificaes. Na Figura 3 podemos forma que necessite ser desenhada haver
essas mudanas. Vejamos o que apresenta ver no exemplo de nossa aplicao grfica mais um if para represent-la.
o Open Closed Principle (OCP) em relao como ela viola o conceito do OCP. Respon- Na Figura 4 apresentamos um exemplo
a essa meta. svel por desenhar diferentes formas geo- de design que ir suportar o OCP. Nesse
O princpio do OCP prega a criao de mtricas, do jeito que o design se encontra, design temos o mtodo abstrato dese-
comportamentos em nossas classes que podemos perceber que seramos obrigados nhar() na classe Forma sinalizando que
possam ser estendidos para outras quando a alterar o cdigo da classe EditorGrafico toda classe do tipo forma ter a capacidade
houver necessidade de mudanas por parte cada vez que uma nova forma fosse adi- de desenhar. Assim, tanto a classe Circulo,
dos requisitos. Isto porque alterar compor- cionada lgica. quanto a classe Retangulo, bem como as
tamentos j em funcionamento demanda Na Listagem 1 vemos uma representao demais formas que venham a surgir, se
um grande esforo, j que todas as depen- em cdigo sobre o design exposto que fere tornam elas prprias as responsveis por
dncias do sistema que possuem interao de forma clara o princpio do OCP. Como executar a ao de desenhar, no sendo
com as funcionalidades a serem alteradas pode ser visto no mtodo desenharFor- mais necessria quaisquer alteraes na
precisariam ser novamente testadas. ma() da classe EditorGrafico, o mtodo classe EditorGrafico.
Sendo assim, nossas entidades, mdulos possui ifs encadeados que, atravs de um Como podemos verificar, a classe Editor-
e funes devem estar abertas, de modo tipo informado, definiro qual forma ser Grafico agora recebe apenas a forma que
ser desenhada e executa o seu mtodo
desenhar(). Observe a representao desse
design em cdigo na Listagem 2. Ao criar-
mos o mtodo abstrato desenhar() na clas-
se Forma, garantimos que todas as classes
que a estendam possuam essa capacidade.
Assim, o mtodo desenharForma() da
classe EditorGrafico fica apenas com a
responsabilidade de receber um objeto
do tipo Forma como parmetro e, atravs
Figura 2. Responsabilidades separadas corretamente, respeitando o SRP
dele, invocar seu mtodo desenhar().
A partir do momento em que a respon-
sabilidade de desenhar movida para as
classes concretas, o risco de afetar fun-
cionalidades antigas quando novas so
criadas reduzido consideravelmente.
subscreva este mtodo. Como consequncia disso, as classes que Listagem 5. Exemplo da fragilidade no uso da Herana.
possuem ligao direta no iro compilar at que as alteraes
public class Horas {
para equiparar o tipo de retorno dos mtodos subscritos a partir
da superclasse sejam feitas em cada um deles. J a composio private int trabalhadas;
nos fornece uma abordagem com um cdigo mais fcil de mudar, public Horas(int trabalhadas) {
pois ao contrrio da herana, mudanas realizadas no cdigo da this.trabalhadas = trabalhadas;
classe final (antes classe me) no necessariamente resultariam }
cdigo da classe cliente ExemploUm, mesmo que sua referncia private Trabalhador trabalhador = new Trabalhador();
direta seja apenas para com a classe Funcionario. Vejamos essa
public int horasTrabalhadas() {
demonstrao na Listagem 5. Horas horas = trabalhador.horasTrabalhadas();
J na Listagem 6 podemos ver como a composio prov uma return horas.getTrabalhadas();
}
alternativa para Funcionario no momento de obter a quantidade }
de horas trabalhadas. Ao invs de estender Trabalhador, Funcio-
public class ExemploUm {
nario pode possuir uma referncia para determinada instncia de
public static void main(String[] args) {
Trabalhador e definir seu prprio mtodo horasTrabalhadas(). Funcionario funcionario = new Funcionario();
Na abordagem da composio, a classe de entrada, antiga sub- int horas = funcionario.horasTrabalhadas();
}
classe, agora passa a ter sua prpria implementao de mtodo, }
que far uma chamada explcita dele mesmo, porm, correspon-
implementam duas interfaces: ITrabalhador, que ficou apenas com Listagem 9. Exemplo de violao do DIP.
o mtodo trabalhar(); e IAlimentavel, que possui apenas o mtodo
public class Trabalhador {
comer(). Quanto s classes dos robs, elas s precisam implementar
a interface ITrabalhador, pois estes s iro trabalhar. public void trabalhar() {
A partir desse novo design a classe Robo no mais forada a //Trabalhando...
}
implementar o mtodo comer(), de forma que caso seja necessrio }
criar alguma funo especfica para robs, basta definir uma nova
interface; por exemplo, IRecarregavel, para recarregar() os robs public class Gerente {
Programao Orientada a
Objetos (POO): reusabilidade
e eficincia em seu cdigo
Parte 2
Produza cdigo correto, gil e otimizado com os
poderosos recursos da linguagem Java
Este artigo faz parte de um curso Fique por dentro
Apesar da grande maioria das organizaes j adotar linguagens
orientadas a objetos, em muitas destas a programao ainda ocorre
na forma de grandes blocos de cdigo, ignorando as vantagens da
N
o primeiro artigo da srie, introduzimos o tema orientao a objetos. Sendo assim, esse artigo apresenta os princi-
Programao Orientada a Objetos e iniciamos pais recursos da linguagem Java relativos programao orientada
a explicao sobre os conceitos bsicas desse a objetos, habilitando o programador a obter cdigo reutilizvel e
paradigma. Aprendemos o que so classes e objetos, eficiente sem complicar suas implementaes, superando metodo-
conhecemos os modificadores de acesso e tambm o logias antigas, onde os programas so caracterizados por serem uma
conceito de herana, usando classes e interfaces. coleo de blocos de cdigo.
Neste artigo continuaremos nosso estudo sobre heran-
a, agora atravs de classes abstratas, e depois aprende-
remos sobre encapsulamento e polimorfismo, cobrindo tem a funo de manter o nome e o setor do produto, incluindo a
assim os principais conceitos da Orientao a Objetos quantidade em estoque.
na prtica com Java. Como pode-se observar na linha 3, a classe Produto decla-
rada como sendo abstrata pelo uso da palavra-chave abstract.
Herana usando classes abstratas Essa classe contm trs atributos (nome, setor e estoque
Classes abstratas so classes que no podem ser ins- linhas 5 a 7), de modo que os dois primeiros so informados
tanciadas diretamente e so definidas atravs da palavra no construtor (linhas 9 a 13), e o estoque inicia com zero.
chave abstract, empregada como modificador da classe. Os getters e setters para ambos os atributos so definidos nas
Alm disso, uma classe abstrata se comporta de forma linhas 15 a 29.
parecida com uma interface, pois uma classe abstrata J nas linhas 31 a 33 definido o mtodo toString(), que retorna
pode conter mtodos abstratos (sem implementao) uma descrio textual do produto, de forma a retornar uma men-
usando ponto-e-vrgula no lugar do corpo do mtodo e sagem com o nome e o estoque. Na linha 35 declarado o mtodo
a palavra-chave abstract como modificador destes. ajustaEstoque(), que pode ser utilizado pelas classes filhas para
importante notar que uma subclasse no abstrata de ajustar a varivel estoque.
uma classe abstrata pode ser instanciada normalmente, Ao final, na linha 39, declarada a assinatura do mtodo abs-
pois ela obrigada a implementar todos os mtodos trato entradaEstoque(), e na linha 41, o mtodo saidaEstoque().
abstratos da classe me. Como exemplo de classe abs- Observe que ambos so declarados com a palavra-chave abstract
trata, proposta a classe Produto na Listagem 1, que e no contm a declarao do corpo.
implementao interna desta, prevenindo a utilizao incorreta Listagem 6. Segunda parte da classe Loja.
da mesma por objetos externos. Para que isso seja possvel, os
14. public String getApelidoLoja() {
mtodos internos so definidos como sendo privados. 15. return apelidoLoja;
Alm disso, necessrio implementar um conjunto de mtodos 16. }
que so acessveis de fora da classe, formando uma espcie de 17.
18. public void setApelidoLoja(String apelidoLoja) {
interface de acesso externa. Tais mtodos devem ser declarados 19. this.apelidoLoja = apelidoLoja;
como pblicos e, portanto, acessveis em qualquer classe da 20. }
aplicao. 21.
22. public void adicionarFuncionario(Funcionario funcionario) {
O encapsulamento muito til para esconder a implementao 23. funcionarios.add(funcionario);
interna das classes e se encaixa muito bem na criao de bibliotecas 24. }
25.
de software, implicando na criao de uma API de acesso externa
26. public void adicionarCliente(Cliente cliente) {
que esconde a complexidade do cdigo. 27 clientes.add(cliente);
Como exemplo de classe que segue o conceito de encapsulamen- 28. }
29.
to, foi apresentada a classe Produto na Listagem 1. Outra classe 30. public void realizarVenda(Vendedor vendedor, Cliente cliente,
criada seguindo os conceitos de encapsulamento a classe Loja, 31. Produto produto) {
que tem sua primeira parte declarada na Listagem 5. 32. adicionarVenda(cliente);
33. calcularComissaoVendedor(vendedor);
34. atualizarEstoque(produto);
Listagem 4. Resultados no console para o teste envolvendo as classes Abstratas. 35. }
Entrada de Estoque do Produto Fsico Notebook quantidade = [200] Listagem 7. Terceira parte da classe Loja.
Produto nome = [Notebook] estoque = [200]
Sada de Estoque do Produto Fsico Notebook quantidade = [50] 36. private void adicionarVenda(Cliente cliente) {
Produto nome = [Notebook] estoque = [150] 37. System.out.println(Compra adicionada para o cliente
Entrada de Estoque do Produto Fsico Mesa quantidade = [1000] 38. + cliente.getNome());
Produto nome = [Mesa] estoque = [1000] 39. }
Sada de Estoque do Produto Fsico Mesa quantidade = [500] 40.
Produto nome = [Mesa] estoque = [500] 41. private void calcularComissaoVendedor(Vendedor vendedor) {
42. System.out.println(Comisso calculada para o vendedor
Listagem 5. Primeira parte da classe Loja. 43. + vendedor.getNome());
44. }
01. package pkg.mercado; 45.
02. 46. private void atualizarEstoque(Produto produto) {
03. import java.util.ArrayList; 47. System.out.println(Atualizao de estoque para o produto
04. 48. + produto.getNome());
05. public class Loja extends PessoaJuridica { 49. }
06. 50. }
07. private String apelidoLoja;
08. private ArrayList funcionarios = new ArrayList();
09. private ArrayList clientes = new ArrayList();
10. Observe que os mtodos apresentados nessa listagem so priva-
11. public Loja(String nome, boolean habilitado, long CNPJ) { dos, e, portanto pertencem implementao interna da classe.
12. super(nome, habilitado, CNPJ);
13. }
Polimorfismo
Quando so definidas vrias especializaes diferentes para
Repare que a classe Loja possui trs atributos que seguem as uma mesma superclasse, ocorre que cada especializao pode
regras do encapsulamento, apelidoLoja, funcionarios e clientes, reimplementar os mtodos da superclasse de uma forma diferente.
declarados privados (linhas 7 a 9). Como Loja uma PessoaJuri- Assim, podemos ter uma coleo de objetos, mas cada um deles
dica, ela recebe no seu construtor os atributos nome, habilitado no precisa necessariamente implementar da mesma forma as
e CNPJ de PessoaJuridica (que so repassados ao construtor da operaes da superclasse.
superclasse) e seu atributo apelidoLoja. Na Listagem 6 apre- Dito isso, codificamos a classe ProdutoVirtual (Listagem 8),
sentada a segunda parte da classe Loja. que implementa os mtodos entradaEstoque() e saidaEstoque(),
Nesse cdigo encontramos os mtodos da API da classe Loja, provenientes de Produto (Listagem 1).
invocados no acesso externo s funcionalidades desta classe. Pri- Alm disso, ProdutoVirtual contm um atributo chamado link
meiro temos o getter e o setter do atributo apelidoLoja e em seguida (linha 5) e define o getter e o setter correspondentes (linhas 12 a 17),
os mtodos pblicos adicionarFuncionario() e adicionarCliente(). completando a declarao da classe.
Por ltimo, temos o mtodo pblico realizarVenda(), que recebe O conceito de polimorfismo est diretamente relacionado
como parmetro um vendedor, um cliente e um produto e chama sobrecarga de mtodos (overloading ou sobrescrita), que signi-
os mtodos privados adicionarVenda(), calcularComissaoVende- fica que uma classe filha pode sobrescrever a implementao
dor() e atualizarEstoque(), declarados na Listagem 7. dos mtodos da classe me, permitindo aos objetos da classe
Nessa listagem, utilizaremos as classes UntypedActor, Actor- Listagem 3. Cdigo da classe Login.
System e ActorRef providas pela API de concorrncia Akka, que
tambm propriedade da TypeSafe, mesma empresa detentora 01. package models;
02.
dos direitos do Play. Esta API de concorrncia adere ao modelo de 03. import javax.persistence.*;
atores (BOX 2), que visa aumentar o desempenho da aplicao e 04. import play.data.validation.Constraints;
05. import play.db.ebean.Model;
melhorar o tempo de resposta do sistema para o usurio.
06.
07. @Entity
BOX 2. Atores 08. @Table(name = login)
09. public class Login extends Model {
Resumidamente, atores so definidos pela prpria documentao do Akka como entidades que
10.
efetuam a comunicao entre si atravs da troca de mensagens. 11. private static final long serialVersionUID = 1L;
12.
13. @Id
Ao criarmos a classe SalaChat, estendemos a classe abstrata 14. @Column(name = id)
UntypedActor e, desta forma, possibilitamos a criao de um 15. private Long id;
ator. Em seguida, criamos de fato o ator, na linha 3. Para isso, 16.
17. @Column(name = name)
instanciamos a classe ActorSystem, que tem como objetivo criar 18. private String name;
e armazenar os atores, e logo aps o inicializamos, atravs da 19.
chamada ao mtodo actorOf(), na linha 4. 20. @Column(name = senha)
21. private String senha;
Feito isso, instanciamos o objeto Map para armazenar todos os 22.
usurios conectados no chat, definimos o mtodo entrarChat(), 23. public static Model.Finder<Long, Login> find = new Model.Finder
<Long, Login>(
responsvel por viabilizar a entrada dos membros na sala e pelo
24. Long.class, Login.class);
envio de uma mensagem informando que determinado usurio 25.
se conectou. 26. }
}
Definimos tambm o mtodo enviaMensagemTodos(), entre as
public static WebSocket<JsonNode> entrarChat(final String username) {
linhas 47 e 44. Como o prprio nome indica, ele serve para enviar return new WebSocket<JsonNode>() {
mensagens a todos os membros do chat.
public void onReady(WebSocket.In<JsonNode> in,
Com a classe do ator definida na camada Model, nosso prximo
WebSocket.Out<JsonNode> out) {
passo criar a classe Chat no diretrio app/controller e nela escre-
vermos alguns mtodos que sero executados diretamente da try {
ChatRoom.entrarChat(username, in, out);
camada view. A Listagem 5 apresenta o cdigo da classe Chat.
} catch (Exception ex) {
O mtodo login() ter o objetivo de abrir a pgina de login quan- ex.printStackTrace();
do solicitado pela camada view. O mtodo abreSalaChat(), por sua }
}
vez, ir exibir a sala do chat aps o usurio logar no sistema. };
Para que seja possvel estabelecer a comunicao entre a ca- }
mada View e a camada Controller, preciso que os links que }
iro chamar os mtodos estejam devidamente configurados no Listagem 7. Cdigo da pgina login.html.
arquivo routes.conf, o qual explicamos no incio do artigo. Seu
contedo apresentado na Listagem 6. 01. @(loginForm : Form[models.Login])
02.
Por ltimo, o mtodo entrarChat() invocado quando qualquer 03. <div>
usurio entra na sala chat. no momento em que este mtodo 04. <div>
05. @helper.form(action=routes.Chat.consultar()) {
acionado que o WebSocket aberto. Neste momento, ressaltamos
06. <form>
que a comunicao entre as camadas View e a classe Chat s ser 07. <fieldset>
possvel se a rota for declarada no arquivo routes.conf, conforme 08. <legend>Login</legend>
09. <div>
exibe a Listagem 6.
10. <div>
11.
Listagem 6. Cdigo do arquivo routes.conf 12. @helper.inputText(loginForm(name), _label -> Nome: )
13. @helper.inputPassword(loginForm(senha), _label -> Senha: )
01. # Routes 14.
02. # This file defines all application routes (Higher priority routes first) 15. </div>
03. 16. </div>
04. GET / controllers.Chat.login() 17. }
05. GET /room/inicializachat controllers.Chat.inicializaChat(username) 18.
06. GET /room/abresalachat controllers.Chat.abreSalaChat(username) 19. <div>
07. GET /assets/javascripts/chatroom.js controllers.Chat.chatRoomJs(username) 20. <label for=singlebutton></label>
08. POST /consultalogin controllers.Chat.consultar() 21.
09. 22. <div>
10. 23. <button id=singlebutton name=singlebutton>Entrar</button>
11. # Map static resources from the /public folder to the /assets URL path 24. </div>
12. GET /assets/*file controllers.Assets.at(path=/public, file) 25. </div>
26. </form>
27. </div>
28. </div>
No cdigo apresentado esto especificadas as rotas, ou seja,
so definidos os mtodos que sero acionados quando houver
uma solicitao da camada View a determinada URL. Em cada
linha configuramos primeiramente se a chamada ser realizada
via GET ou POST, em seguida nomeamos a rota e por ltimo
especificamos o mtodo que ser executado ao acessar a rota
declarada. Como exemplo de uso das rotas, no cdigo da pgina
salachat.html, que ser apresentado mais adiante, utilizamos a
rota descrita na linha 5 para a inicializao do chat.
Documentao do Ebean.
http://www.avaje.org/ebean/documentation.html