Feed Artigos Comentários

Noticias & Java & Desenvolvimento de Software Hildebrando em 08 Jul 2007

Projeto querotrabalharcomjava.com.br

Colocamos no ar um produto 2Solutions chamado “www.querotrabalharcomjava.com.br”. Basicamente é uma iniciativa para capacitar o pessoal que esta querendo entrar no mercado de trabalho Java.

Vale a pena para pessoas que tem conhecimento na linguagem (fizeram cursos ou aprenderam na faculdade) mas não conseguiram o seu emprego na área pois as empresas querem pessoas com experiência (mesmo para Junior - contraditório não ?), ou mesmo para quem esta procurando uma recolocação para a área de desenvolvimento Java.

Para valores e mais informaçoes acessar o site http://www.querotrabalharcomjava.com.br.

Java & Desenvolvimento de Software Hildebrando em 01 Jun 2007

Projeto OpenSource (GPL) - Hibernate Web Paginator

Colocamos no java.net o projeto Hibernate Web Paginator. É uma biblioteca para facilitar a criação de tabelas de paginação nas aplicações que usam Hibernate. O grande diferencial da biblioteca frente a outras implementações é a simplicidade e também a integração com Hibernate, possibilitando paginações com recursos de maxResults, ou seja, evitar apenas as paginações com dados de sessão.

Se quiser participar é só entrar no endereço https://hibernatewebpaginator.dev.java.net

Dicas Hildebrando em 22 Fev 2007

Chega de Spam

Se ja não bastasse os spams que preenchem as nossas caixas de correio, agora os novos alvos são os blogs. Por se tratarem de sites com muitas visitas, a publicação de propagandas de algum produto/serviço “maravilhoso” pode ser um ótimo negócio.

Infelizmente muitos blogs ainda não estão preparados para esse ataque e acabam tendo informações inoportunas publicadas. Este blog, por exemplo, é bombardeado com 10 tentativas diárias. Nossa única proteção é pedir aprovaçao das mensagens publicadas, e ao identificar que o conteúdo é spam então bloquear o emissor.

Portanto, faça o seu blog, publique seus pensamentos e opiniões, discuta fatos, mas tenha paciência, porque eles tambêm chegaram nos blogs.

Desenvolvimento de Software Hildebrando em 30 Jan 2007

Você sabe o significado das licensas de Software?

Ao baixar a documentação da nova versão do JFreeChart (API Java para construção de gráficos) um ponto chamou a atenção. Como o nome da biblioteca á JFreeChart suponho que posso fazer o que eu quiser com a biblioteca, como baixar, usar, alterar, incorporar, vender e ate mudar de nome. Porém ao ler com mais detalhes a licensa percebi algumas restrições.

São estas restrições que definem o tipo de licensa. Existem inúmeras licensas para software. O motivo disso é que uma pessoa pode desenvolver um determinado aplicativo ou biblioteca e, mesmo disponibilizando gratuitamente, quer manter o controle de atualizações, por exemplo.


Public Domain
GNU General Public License - GPL
GNU Library General Public License - LGPL
BSD
Apache Licenses

no link (livro) http://www.oreilly.com/catalog/opensources/book/perens.html o autor detalha algumas licensas.

Desenvolvimento de Software Hildebrando em 28 Jan 2007

Trabalho colaborativo entre equipe de programação e design.

O desenvolvimento de qualquer software envolve fazes iterativas que, com a união de diversos artefatos, resultam no produto final. Existem inúmeras tecnicas para esse desenvolvimento, no entanto, a que eu considero das mais produtivas é quando partimos de um protótipo funcional.

Neste modelo o analista, o designer (visual e HTML) e o cliente desenvolvem o sistema baseado nas telas e na navegação entre elas. É uma abordagem interessante pois o cliente ja esta vendo o sistema e assim consegue criticar e requisitar mudanças de forma mais precisa. Após a aprovação do protótipo funcional a equipe de programação faz a mágica, ou seja, adiciona ao HTML estático alguma tecnologia dinâmica (ASP,JSP,PHP,…).

Após a finalização desta etapa surgem as manutenções, e é ai que começam os problemas.

Agora as telas não são mais simples HTML que podem ser editados em qualquer aplicativo, eles são telas que contêm codigo dinâmico que interagem com banco de dados. Se o seu designer realizar as mudanças no HTML e passar para o programador, este tera um trabalho dobrado de identificar aonde foram feitas as mudanças.

Para evitar isso estou descrevendo um modelo de desenvolvimento colaborativo que suporta ambos trabalharem sobre os mesmos arquivos e com a utilização de repositórios (CVS e SVN) para facilitar a integração.

1 - Diferença de ferramentas

O Designer utiliza um conjunto de ferramentas completamente diferente das ferramentas utilizadas pelo programador. Não adianta impor ferramentas para nenhum dos dois pois isto, ao invés de ajudar, pode comprometer a produtividade.

Para isso servem os clientes de repositorio. As ferramentas utilizadas pela equipe de programação, na maioria das vezes, ja suportam versionadores (CVS e SVN) por tanto o que falta é adicionar estas funcionalidades para o designer. Uma ferramenta interessante é o Tortoise. O fato de ele integrar o seu repositorio com o Windows Explorer facilita para o designer pois este pode editar seus arquivos na ferramenta que ele deseja e, na hora de “commitar”, basta faze-lo pelo Explorer mesmo.

2 - Configurando o ambiente

Para baixar um projeto do repositorio :
a) Entre no Windows Explorer
b) Crie um diretorio para armazenar seus projetos. (Ex. REPOSITORIO)
c) Dentro deste diretorio clique com o botão direito e selecione “CVS Checkout”
d) Informe todos os dados do seu servidor e finalize.

Com os arquivos baixados o que precisamos fazer é configurar o banco de dados e web server para possibilitar que o designer trabalhe com os arquivos ja aproveitando os recursos dinâmicos.


Infraestrutura
1 - liberação do acesso ao banco de dados de desenvolvimento pelo usuario do designer.
2 - Configuração do Web Server para acessar o banco de dados de forma remota.

No tomcat 5.5 crie um arquivo NomeDoSeuProjeto.xml e coloque na pasta TOMCAT_HOME/conf/Catalina/localhost.

O conteudo do arquivo deve indicar a localização fisica dos seus arquivos.

<Context docBase=”C:\TORTOISE-CVS_FOLDER\FusorOnLine\WebContent” path=”/FusorOnLine” reloadable=”true”>
</Context>

3 - Classes

Para uma manutenção sobre codigo ja existente é preciso que as modificações funcionem com acesso a banco e tudo mais. Para habilitar isso a equipe de programação precisa gerar um arquivo contendo os .class gerados. Este arquivo deve ser copiado para o diretorio /WEB-INF/lib. Se possível configure para ignorar este arquivo no ato do versionamento do diretorio.

O motivo principal deste arquivo é evitar que se versione os .class

4 - Dinâmica

O designer agora tem acesso a todo o código utilizado pela equipe de programação. Uma alteração na tela ja pode ser atualizada. Para uma maior produtividade um pequeno treinamento sobre JSTL e Expression Language, para o seu designer, pode resultar no modelo utópico de separação de responsabilidades em que o programador se preocupa apenas com regra de negócio, persistencia, validação e o deisgner fica responsavel por 100% da parte de apresentação.

Tutorias Hildebrando em 22 Dez 2006

Vale a pena aprender JSON. Entenda porque.

JSON (JavaScript Object Notation) is a lightweight data-interchange format. It is easy for humans to read and write. It is easy for machines to parse and generate. (http://www.json.org/).

Devido ao advento de tecnologias como AJAX, a forma como sua tela em HTML deve conversar (via JavaScript) com o servidor teve alguns conceitos alterados. O principal é que apesar de a tarefa de enviar dados para o servidor continuar sendo a mesma, o retorno precisa ser decodificado para identificar os valores que foram retornados. Formas de retorno:

1 - O servidor enviar uma sequencia de valores com um separador, por exemplo :

Rua Joao da Pitangueira|231|Bairro XYZ|São Paulo

Prós :
1 - Quantidade de informação pequena, agilizando o retorno
2 - Facil recuperação dos valores, bastando apenas um split(’|')

Contras :
1 - Manutenção ineficiente ao adicionar ou remover informações devido a perda da identificação dos campos

2 - O servidor envia um XML


<endereco>
<rua>Rua Joao da Pitangueira</rua>
<numero>231</numero>
<bairro>Bairro XYZ</bairro>
<cidade>São Paulo</cidade>
</endereco>

Prós :
1 - Facil identificação de campos/valores navegando no XML.
2 - XML é padrão de mercado no assunto transmissão de mensagens (vide WebServices)

Contra :
1 - Necessita conhecer uma API de parse XML para Javascript.
2 - Gerar o XML de saida de seus objetos/dados do lado do servidor. (conhecer uma biblioteca para isso)
3 - Aumento do tamanho da resposta devido a inclusão das TAGs XML.

3 - O Servidor envia uma resposta JSON

O processo é bem simples. O servidor ao enviar os dados para o cliente gera uma mensagem em formato JSON, decodificando o objeto/dado em questão. Para isso é interessante a utilização de uma biblioteca (http://json-lib.sourceforge.net/usage.html).


class MyBean{
private String name = "json";
private int pojoId = 1;
private char[] options = new char[]{'a','f'};
private String func1 = "function(i){ return this.options[i]; }";
private JSONFunction func2 = new JSONFunction(new String[]{"i"},"return this.options[i];");

// getters & setters
...
}

JSONObject jsonObject = JSONObject.fromObject( new MyBean() );
PrintWriter out = response.getWriter();
out.println( jsonObject );
/* prints
{"name":"json","pojoId":1,"options":["a","f"],
"func1":function(i){ return this.options[i];},
"func2":function(i){ return this.options[i];}}
*/

No lado do cliente é necessário decodificar esta mensagem JSON. Como o JSON é um subset do Javascript existe uma certa facilidade, necessitando apenas entender como é a estrutura do JSON.

var myObject = eval('(' + myJSONtext + ')');

Assim você ja tem a estrutura do seu objeto criado na variavel myObject.

Prós :
1 - Linguagem leve para a representação dos dados.
2 - Facilidade de leitura e escrita (com as bibliotecas).

Contra :
1 - Necessidade de utilizar uma biblioteca no lado do servidor.
2 - Apesar de simples, é uma nova linguagem.

Conclusão

A forma de transmissão de mensagens entre o client e server da sua aplicação deve ser escolhida com muita caltela pois esta pode levar a problemas de performance, ou segurança ou necessidade de recursos de banda. O JSON entra para servir de facilitador pois possue o melhor de dois mundos, tanto a parte lightweight quanto a parte performatica (um parser JSON é muito mais rapido que um XML).

Eu sugiro a leitura tanto do site oficial http://www.json.org, para entendimento da estrutra e particularidades, quanto do artigo http://blogs.msdn.com/mikechampion/archive/2006/12/21/the-json-vs-xml-debate-begins-in-earnest.aspx que debate um comparativo entre JSON e XML.

Dicas & Banco de Dados Hildebrando em 28 Nov 2006

Oracle para desenvolvedores Java

Estou fazendo uma analogia a um artigo publicado na Java Magazine com o titulo ‘MySQL para desenvolvedores Java’. Minha principal motivação é uma recente instalação/configuração de um Oracle aqui na empresa.

Se você é um desenvolvedor então a sua função é produzir código, fazer levantamentos, criar modelos e afins. Toda a responsabilidade do banco de dados fica por conta do DBA da empresa. E o papel (Database Administrator) exige uma administração completa do banco, com acompanhamentos, configurações, otimizações. Porém você não precisa se tornar um DBA, mas pode te ajudar em algumas situações se voce souber o necessário.

1 - Instalação

O download é gratuito, basta acessar a pagina da Oracle e lá você encontrara a versão do banco que deseja.

A instalação no Windows é muito facil, tanto que muitos livros preferem abordar apenas instalações em Unix/Linux pois nestes é necessário algumas configurações. É o famoso NNF (Next,Next,Finish). E voce deve utilizar assim mesmo. Nosso objetivo não é customiza-lo, e sim utiliza-lo.

2 - Estrutura

Depois que o Oracle foi instalado é criado alguns usuarios padrão. O mais importante é o SYS. Ele é o usuario com perfil ADM para a instancia do banco que foi criada. Você deve utilizar o banco ORCL, o padrão configurado pelo Oracle.

Administre o banco pela interface WEB. Cada banco fica em uma porta, portanto acesse a padrão:

http://localhost:5500/em (A porta pode variar)

login : SYS
senha :
perfil : SYSDBA

3 - Usuarios

O Oracle trabalha focado nos usuarios, ou seja, quando é criado um usuario junto é criado um schema com mesmo nome. Portanto crie quantos usuarios forem necessários. Após a criação dos usuarios, faça o login com os mesmos e assim siga criando as estruturas como Tabelas, Sinonimos, Triggers, Indices, Sequences, etc.

4 - Acessando do Java

Não se preocupe em baixar o client do Oracle, pois o driver JDBC consegue fazer a integração tranquilamente. Para baixar o driver novamente acesse o endereço da Oracle e adicione o jar no seu CLASSPATH. O unico detalhe é quanto a url de conexao.

jdbc:oracle:thin:@localhost:1521:ORCL

Versões mais antigas do Oracle, para voce conseguir executar sem o client instalado.

jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCL)))

lembre-se de utilizar o usuario criado anteriormente para acessar as tabelas.

5 - Conclusão

É isso ai. Não tem segredo. O resto esta relacionado com tarefas de administração, inclusive toda a parte de dar direitos e tudo mais. Pode parecer simples mas o mundo ADM é uma outra realidade. Um DBA tem preocupações com um foco diferente, inclusive o Oracle é tem a fama do banco com mais parafusos para apertar, cada uma com uma função que pode ajudar muito no gerenciamento dos dados.

Java Hildebrando em 24 Nov 2006

Trabalhando imagens com Java.

A API de Java para tratamento de imagens é bem complexa. Envolve decodificadores, renderizadores, byte[] para ca, byte[] para la, BufferedImage, etc. Para servir de repositorio tanto para mim quanto para quem visitar esta pagina sempre que eu (ou alguem que ajudar) desenvolver um novo util para tratar imagens eu posto aqui.


public static void gerarThumbnail(InputStream inputStream, OutputStream out, int thumbAltura, float quality) throws Exception{

Image image = null;
int largura = 0;
int altura = 0;

try {
//Recuperar os valores de LARGURA/ALTURA e ALTERAR no registro da FOTO
image = ImageIO.read(inputStream);
largura = image.getWidth(null);
altura = image.getHeight(null);
} catch (Exception e) {
throw new Exception("ERRO ALTERANDO TAMANHO DA IMAGEM " + e);
}

try {

//Fazer a geracao do TumbNail levando em conta o tamanho da ALTURA
MediaTracker mediaTracker = new MediaTracker(new Container());
mediaTracker.addImage(image, 0);
mediaTracker.waitForID(0);

// determine thumbnail size from WIDTH and HEIGHT
double thumbPorcentagem = ((thumbAltura*100.0)/altura)/100.0;
int thumbLargura = (int)(largura * thumbPorcentagem);

// draw original image to thumbnail image object and
// scale it to the new size on-the-fly
BufferedImage thumbImage = new BufferedImage(thumbLargura,thumbAltura, BufferedImage.TYPE_INT_RGB);
Graphics2D graphics2D = thumbImage.createGraphics();
graphics2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BICUBIC); //For speed better use RenderingHints.VALUE_INTERPOLATION_BILINEAR
graphics2D.drawImage(image, 0, 0, thumbLargura, thumbAltura, null);

// save thumbnail image to OUTFILE
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(thumbImage);

param.setQuality(quality, false); //The quality argument from the command line is converted from the interval 0 to 100 to the interval 0.0f to 1.0f, because that's what the codec expects (I mostly use 0.75f).
encoder.setJPEGEncodeParam(param);
encoder.encode(thumbImage);
out.close();

} catch (Exception e) {
throw new Exception("ERRO SALVANDO O THUMBNAIL DA IMAGEM " + e);
}
}

public static void gerarWatermark(InputStream imagemOriginal, InputStream imagemWatermark, OutputStream imagemGerada){

try {

BufferedImage im = ImageIO.read(imagemOriginal);
BufferedImage im2 = ImageIO.read(imagemWatermark);
Graphics2D g = im.createGraphics();
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.4f));
g.drawImage(im2, (im.getWidth()-im2.getWidth())/2, (im.getHeight()-im2.getHeight())/2, null);
g.dispose();
ImageIO.write(im, "jpeg", imagemGerada);

} catch (Exception e) {
System.out.println(e);
}
}

public static void gerarWatermark(InputStream imagemOriginal, String textoWatermark, OutputStream imagemGerada){

try {

BufferedImage im = ImageIO.read(imagemOriginal);

//Preparando o Graphics 2D para incluir o texto na imagem
Graphics2D g = im.createGraphics();
g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
g.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

//Setar a font utilizada no texto
g.setFont(new Font("Lucida Bright", Font.ITALIC, 60));

//Efeitos de rotacao no texto
g.rotate(-Math.PI/4, im.getWidth()/2, im.getHeight()/2);

//Setando o valor do texto
TextLayout tl = new TextLayout(textoWatermark, g.getFont(), g.getFontRenderContext());

//???
Rectangle2D bounds = tl.getBounds();
double x = (im.getWidth()-bounds.getWidth())/2 - bounds.getX();
double y = (im.getHeight()-bounds.getHeight())/2 - bounds.getY();

//
Shape outline = tl.getOutline(AffineTransform.getTranslateInstance(x+2, y+1));

//Montando a saida
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.3f));
g.setPaint(Color.WHITE);
g.draw(outline);
g.setPaint(new GradientPaint(0, 0, Color.WHITE, 30, 20, new Color(128,128,255), true));
tl.draw(g, (float)x, (float)y);
g.dispose();

ImageIO.write(im, "jpeg", imagemGerada);

} catch (Exception e) {
System.out.println(e);
}
}

Desenvolvimento de Software Hildebrando em 05 Nov 2006

Convention over Configuration

Você só deve configurar aquilo que for específico, o que for padrão deve ser utilizado normalmente. Assim como padrões de projeto talvez você ja utilize mas nem sabia, portanto aqui vai um exemplo.

Imagine que você tem uma tela de edição de dados de uma pessoa. Junto a esta tela você tem o Controller (Servlet), o objeto de dominio (POJO) e a tabela PESSOA. Além desta tela você tem outra tela de pesquisa de pessoas. Se você seguir o padrão de nomenclatura, por exemplo. A Classe Pessoa esta ligada a tabela PESSOA, por tanto o arquivo de tela é o Pessoa.jsp você esta seguindo uma determinada convenção, evitando criar arquivos de configuração para montar o fluxo.

O conceito é bem simples. Para as situações normais basta seguir as convenções que o seu sistema ja deve estar preparado para tratar estes padrões.

Com o Struts uma forma interessante da utilização de CoC é com os wildcards das Actions. Se todas as suas Actions forem SalvarProduto, SalvarCliente, SalvarPedido você pode declarar a Action Salvar* , e por convenção pode se chegar ao componente de serviço ou de domínio.

Um link sobre o assunto Struts - Wildcard http://www.twdata.org/struts-wildcard/

Desenvolvimento de Software Hildebrando em 05 Nov 2006

A produtividade de Ruby on Rails - I.

Você ja teve ter ouvido falar de uma nova linguagem que pretende revolucionar o desenvolvimento de software. Ele chama Ruby e foi inventada a algum tempo visando produtividade.

Eu olho novas tecnologias com uma certa desconfiança, isso se deve a inumeras que ja vi chegar, ficar e passar. Porém vou começar um estudo pesado em Ruby pois pode contribuir com o nosso processo.

A Linguagem Ruby é uma linguagem bem simples, com tipagem fraca e outros recursos mais dinâmicos.

Sugiro o tutorial http://kb.reflectivesurface.com/br/tutoriais/rubyOnRails/

1 - Comece fazendo o download do Ruby.

2 - De uma analisada na documentação. Se você tem uma base de OO vai entender o porque da linguagem simples.

3 - Na instalação Windows (que eu utilizei) você ira encontrar um aplicativo chamado de RubyGems. É como se fosse um gerenciador de pacotes. Portanto qualquer novo pacote deve ser feito utilizando seus comandos. O pacote que iremos utilizar é o Rails.

gem install rails --include-dependencies

Na instalação ja foi adicionado no PATH o diretorio /ruby/bin.

Devido a todas as dependencias a instalação demora alguns minutos. Infelizmente sem barra de progresso portanto tenha paciência se a tela ficar estática por um tempo. O resultado final deve ser :


Bulk updating Gem source index for: http://gems.rubyforge.org
Successfully installed rails-1.1.6
Successfully installed activesupport-1.3.1
Successfully installed activerecord-1.14.4
Successfully installed actionpack-1.12.5
Successfully installed actionmailer-1.2.5
Successfully installed actionwebservice-1.1.6
Installing ri documentation for activesupport-1.3.1...
Installing ri documentation for activerecord-1.14.4...
Installing ri documentation for actionpack-1.12.5...
Installing ri documentation for actionmailer-1.2.5...
Installing ri documentation for actionwebservice-1.1.6...
Installing RDoc documentation for activesupport-1.3.1...
Installing RDoc documentation for activerecord-1.14.4...
Installing RDoc documentation for actionpack-1.12.5...
Installing RDoc documentation for actionmailer-1.2.5...
Installing RDoc documentation for actionwebservice-1.1.6...

4 - Após a instalação vamos criar a estrutura básica de uma aplicação WEB.

rails c:\ruby\hellorails

Este processo é bem rápido e ao fim você tem uma estrutura de diretórios :

+ app
+ components
+ config
+ db
+ doc
+ lib
+ log
+ public
+ script
+ test
+ tmp
+ vendor
+ Rakefile
+ README

Entre no diretório

cd c:\ruby\hellorails

Inicie o servidor

ruby script/server

=> Booting WEBrick...
=> Rails application started on http://0.0.0.0:3000
=> Ctrl-C to shutdown server; call with --help for options
[2006-11-04 20:59:05] INFO WEBrick 1.3.1
[2006-11-04 20:59:05] INFO ruby 1.8.4 (2006-04-14) [i386-mswin32]
[2006-11-04 20:59:05] INFO WEBrick::HTTPServer#start: pid=3732 port=3000

Se tudo funcionou como o previsto basta acessar o servidor no endereco http://localhost:3000

5 - Vamos começar nosso projeto fazendo o famoso CRUD (Create,Retrieve,Update,Delete). Para integrar com o MySQL voce precisa alterar o arquivo config/database.yml.


gem install mysql

Select which gem to install for your platform (i386-mswin32)
1. mysql 2.7.1 (mswin32)
2. mysql 2.7 (ruby)
3. mysql 2.6 (ruby)
4. mysql 2.5.1 (ruby)
5. Cancel installation
> 1
Successfully installed mysql-2.7.1-mswin32
Installing ri documentation for mysql-2.7.1-mswin32...
Installing RDoc documentation for mysql-2.7.1-mswin32...

Copie o arquivo libmysql.dll que esta localizado no diretorio bin do MySQL para o diretorio bin do ruby.

6 - O Rails utiliza o modelo MVC como sua estrutura camadas, por tanto execute “ruby script/generate” para criar seus arquivos “controller” e “model”.

6.1 - Controller

C:\ruby\hellorails>ruby script/generate controller Produto editar pesquisar
exists app/controllers/
exists app/helpers/
create app/views/produto
exists test/functional/
create app/controllers/produto_controller.rb
create test/functional/produto_controller_test.rb
create app/helpers/produto_helper.rb
create app/views/produto/editar.rhtml
create app/views/produto/pesquisar.rhtml

“ruby script/generate controller Produto editar pesquisar”

Produto = É o nome do controller
editar = É o nome de uma View
pesquisar = É o nome de outra View

6.2 - Model

C:\ruby\hellorails>ruby script/generate model Produto
exists app/models/
exists test/unit/
exists test/fixtures/
create app/models/produto.rb
create test/unit/produto_test.rb
create test/fixtures/produtos.yml
create db/migrate
create db/migrate/001_create_produtos.rb

“ruby script/generate model Produto”
Produto = É o nome do Model

7 - Para testar se esta tudo funcionando você deve configurar suas paginas no arquivo app/controllers/produto_controller.rb

class ProdutoController < ApplicationController

def index
render_text "Hello, world! Pagina principal"
end

def editar
render_text "Hello, world! Editar"
end

def pesquisar
render_text "Hello, world! Pesquisar"
end
end

Cada def contida no arquivo representa seu método e este indica cada requisição. Portanto para entrar no metodo pesquisar basta acessar a pagina http://localhost:3000/produto/pesquisar

8 - Para completar o fluxo precisamos criar um novo componente view. Na verdade este ja foi criado no momento que criamos o controller, portanto basta alterar seu codigo para

def editar
end

Ao acessar a pagina esta ira redirecionar para o arquivo “app\views\produto\editar.rhtml”

Notem que não foi feita configuração em nenhum arquivo ainda. O fluxo de camadas é executado sguindo alguns padrões de nomenclatura.

9 - Realizando o CRUD. Como tudo ja esta funcionando vamos criar uma tabela de testes em todos os ambientes descritos no arquivo config/database.yml (hellorails_development , hellorails_test , hellorails_production).


CREATE TABLE PRODUTOS
(
id INTEGER NOT NULL PRIMARY KEY,
descricao VARCHAR(50) NOT NULL,
detalhes VARCHAR(255) NOT NULL,
preco DECIMAL(10,2) NULL
);

ALTER TABLE PRODUTOS MODIFY COLUMN `id` INTEGER NOT NULL DEFAULT NULL AUTO_INCREMENT;

Repare que a tabela foi criada no plural. O Rails vai fazer a co-relação de singular/plural.

Um recurso interessante é o scaffolding. Para utiliza-lo basta alterar o seu arquivo controller.


class ProdutoController < ApplicationController

scaffold :produto

end

Este é um recurso que mapeia as operações CRUD para esta determinada tabela. O interessante é que não há geração de código, portanto se for incluido um novo campo na tabela a tela será alterada também.

10 - Uma coisa que você deve estar questionando é quanto a customização. As telas criadas seguem templates do Rails, e com certeza em seus projetos você ira utilizar um padrão diferente. O Rails tem essa ideia de havendo necessidade de mudança é so você descrevê-las.

produto_controller.rb
class ProdutoController < ApplicationController

scaffold :produto

layout "default"

def list
@entries = Produto.find_all nil, "descricao"
end

def edit
@entry = Produto.find(@params["id"])
end

end

list.rhtml
<table border="1" cellpadding="4" cellspacing="0" width="90%">
<tr>
<th>Descricao</th>
<th>Preco</th>
<th colspan="3">Actions</th>
</tr>
<% @entries.each do |entry| %>
<tr>
<td><%= entry.descricao %></td>
<td><%= entry.preco %></td>
<td><%= link_to "Show", :action => "show", :id => entry.id %></td>
<td><%= link_to "Edit", :action => "edit", :id => entry.id %></td>
<td><%= link_to "Destroy", :action => "destroy", :id => entry.id %></td>
</tr>
<% end %>
</table
<p><%= link_to "New", :action => "new" %></p>

edit.rhtml
<%= start_form_tag :action => "update" %>

<%= hidden_field 'entry', 'id' %>

<p>Descricao:<br / ><%= text_field 'entry', 'descricao' %></p>
<p>Preco:<br / ><%= text_field 'entry', 'preco' %></p>
<p>Detalhes:<br / ><%= text_area 'entry', 'detalhes', "rows" => "3" %></p>

<input type="submit" value="Update" />

<%= end_form_tag %>

« Página Anterior - Próxima Página »