You are on page 1of 49

Extaido

do
Guia prtico
para a construo de aplicaes

Java Web
(JSP & Servlets)
Arquitectura MVC e Padro DAO
no

Verso 1

Joaquim Jos Hangalo


joajoshang@yahoo.com.br

Luanda, Setembro de 2009

Overview sobre a Programao web lado server com java


O universo java compreende uma conjunto de infra-estruturas agrupadas em trs
pilares. O Java SE (Java Standard Edition), o Java EE (Java Enterprise Edition), o
Java ME (Java Micro Edition).
O Java EE (formalmente chamado J2EE) um conjunto standard de tecnologias
para a programao server-side com Java. O Java EE compreende as tecnologias de
Servlets, JavaServer Pages(JSP), JavaServer Faces (JSF), Enterprise JavaBeans
(EJBs), JPA (Java Persitenc API), e o Java Messaging Service(JMS).
A tecnologia de base proposta pela Sun Microsystems, ainda no alvor da plataforma
java, para o desenvolvimento de aplicaes web lado server a tecnologia dos
servlets.
No presente guia, atravs de exemplos prticos sero exploradas as tecnologias
dos servlets e JavaServer Pages. A tecnologia JSP uma soluo derivada dos
servlets.

A Plataforma Java EE (Java Enterprise Edition)


A plataforma Java EE uma coleo de especificaes que definem
uma infraestrutura para desenvolver aplicaes distribuidas
multicamada (3-tier, n-tier).
A plataforma Java EE, facilita o desenvolvimento de aplicaes
distribudas em Java e disponibiliza uma padro, uma serie de
converces e um conjunto de servios sobre os quais se desenvolvem
as aplicaes multicamada.
O objectivo principla da plataforma Java EE simplificar o
desenvolvimento de uma aplicao e permitir que o desenvolvedor
fique mais concentrado no desenho e na implementao do sistema,
delegadno as tarefas tpicas de gesto e questes de mais baixo nvel
prpria aplicao e infraestrutura do servidor de aplicaes Java EE.
Para a plataforma prov um conjunto fundamental de recurso para os
mais diversos componentes do sistema.
2

Modelo de aplicao Java EE


O modelo de aplicao do Java EE define uma arquitecura que
permite implementar os servios como aplicaes multicamada que
garantam escalabilidade, acessibilidade e de gesto distribuda. Este
modelo particiona as responsabilidades para a implementao de
servios multicamanda nas seguintes partes:
A lgica de negcio e a lgica da apresentao a serem
implementadas pelo desenvolvedor.
O sistema padro de servios, provido pela plataforma Java EE.

Arquitectura das aplicaes distribuda multicamada


A plataforma Java EE utiliza um modelo de aplicao distribuda
multicamada pala a implementao de aplicaes enterprise.
A lgica da aplicao dividada em componentes de acordo com a
funo e os componentes da aplicao que definem uma aplicao
Java EE so instalados em vrias mquinas dependendo da camada a
que o componente pertence dentro do universo de desenvolvimento
multicamanda Java EE.
Um aplicao Java EE em geral consiste em trs ou em quatro
camadas conforme a figura a seguir.

As aplicaes Java EE multicamadas, em geral, so consideradas como


sendoa aplicaes tri-camadas poies elas so distribudas em trs reas
ou locais: a mquina cliente, a maquia servidora Java EE, e maquina
servidora da base de dados ou uma maquinda de recursos legados,no
back-end.
As aplicaes tri-camada que rodam desta maneira herdam o padro
bi-camada do modelo cliente-servidor, adicionando um servidor de
aplicaes multicamanda entre a aplicao cliente e o respositrio de
dados, o back-end.

APIs do Java EE 6

TECNOLOGIA SERVLET
A tecnologia Servlet a base do desenvolvimento de aplicativos web usando a
linguagem de programao Java. Ela uma das tecnologias Java mais importantes,
e subjacente para outras tecnologias Java populares para o desenvolvimento de
aplicativos, o JSP e O JSF.
Entender a tecnologia servlet e sua arquitectura importante para um
desenvolvedor Web.

Padro de projecto MVC - Model-View-Controller


Existem diversos padres que auxiliam o programador a suprir uma determinada
rea do cdigo, como os famosos Iterator, Observer, Singleton, Composite entre outros.
Todos esses so indicados para desenvolvimento orientado a objectos e para a
padronizao da arquitectura das aplicaes.
O padro, ou pattern, como tambm pode ser encontrado na literatura, mais
utilizado para garantir uma arquitectura legvel e malevel, o

MVC, do ingls,

Model-View-Controller, ou Modelo-Viso-Controle, em portugus, que consiste em


dividir em diversas camadas os mdulos com os mais diversos servios das
aplicaes, resultando em maior flexibilidade e fcil reutilizao.

O MVC define trs camadas para a aplicao:


View (Viso) Todas as classes que representam interface com o usurio, seja

utilizando Swing, AWT, SWT, XUL, JSP (em aplicaes web) ou outros.
Controller Classes utilizadas para validar regras de negcio, processar os dados,

e manter toda a lgica de negcio. Isso seria a engine da aplicao.


Model Utilizando a nomenclatura adoptada pelos patterns orientados a objectos,

essa camada contem as classes catlogo (classes que persistem e recuperam um


tipo especfico de objecto), classes de entidade (famosos java beans1, classes que
definem um tipo especfico de dados com mtodos gets e sets e um construtor sem

argumentos). Trata-se de objectos java utilizados para implementar o modelo do


domnio da aplicao.

Na nova especificao do Java EE os java beans so chamados POJO (Plain Old Object). Os POJO so
utilizados para trafegar um conjunto de valores entre as camandas e classes da aplicao, permitindo
assim eliminar o uso dos Transfer Objects(TO) ou Value Objects(VO), simplificando a aplicao e
melhoradno a produtividade e manutenabilidade.

Arquitectura servlet-centric

A arquitectura MVC foi modificada ligeiramente e adaptada para o uso em


aplicaes WEB. A arquitectura resultante foi chamada, ento, de arquitetura Model
2. As aplicaes Model 2 tm tipicamente o seguinte esquema de funcionamento:
Um servlet Controller que fornece um ponto de acesso nico ao restante da
aplicao. Este Controller responsvel por fornecer a gesto central do fluxo
da aplicao e dos servios como a manipulao da segurana e a gesto do
utilizador. Este tipo de controlador frequentemente chamado de Front
Controller.
O servlet Controller usa tipicamente configuraes XML ou Anotaes para
determinar o fluxo da aplicao e o processamento do comando. Tambm
emprega, geralmente, os componentes de ajuda que servem como objectos
Command. Isto significa que tais componentes de ajuda esto associados
com s aces do utilizador e so criados/chamados para gerir aquelas
aces enquanto ocorrem, chamando os componentes da Model quando
necessrio. Isto serve para desacoplar a servlet Controller da Model.

I. Parte
Criao do Projecto

Primeira Aplicao Exemplo


Neste tutorial vamos implementar uma pequena aplicao com arquitectura MVC e
Padro DAO2 utilizando o IDE NetBeans.
Vamos criar uma mini aplicao para registo de pessoal por departamento. A seguir
o diagrama ER da mini aplicao que vamos criar.

Diagrama ER da aplicao

Base de Dados da Aplicao (Script)


No presente tutorial vamos trabalhar com um dos Sistema de gesto de Base de
Dados da Oracle o MYQL. A seguir apresentado o script da base de dados. Se
tiver alguma dvida de como proceder, veja no apndice do presente tutorial os
passos para criar uma base de dados no mysql.
Base de dados gpessoal
CREATE DATABASE IF NOT EXISTS gpessoal;
USE gpessoal;
-2

O padro DAO (Data Access Object) o padro mais utilizado para aceder a dados numa base de
dados.
O padro DAO fornece uma interface independente, na qual possivel persistir objectos de dados. A
Ideia colocar todas as funcionalidades encontradas no desenvolvimento de acesso e trabalho com
dados num s local, tornando simples a sua manuteno.
Tipicamente um DAO inclui mtodos para inserir, seleccionar, actualizar e eliminar objectos de uma
base de dados. Dependendo de como se quer implementar o padro DAO, pode-se ter um DAO para
cada classe de objectos na aplicao ou um nico DAO responsvel por todos os objectos.

-- Definition of table `departamento`


-DROP TABLE IF EXISTS `departamento`;
CREATE TABLE `departamento` (
`codigoDepartamento` int(10) unsigned NOT NULL auto_increment,
`nomeDepartamento` varchar(45) NOT NULL,
PRIMARY KEY (`codigoDepartamento`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-- Definition of table `funcionario`
DROP TABLE IF EXISTS `funcionario`;
CREATE TABLE `funcionario` (
`codigoFuncionario` int(10) unsigned NOT NULL auto_increment,
`nomeFuncionario` varchar(45) NOT NULL,
`sobrenomeFuncionario` varchar(45) NOT NULL,
`dataNascimentoFuncionario` date NOT NULL,
`codigoDepartamento` int(10) unsigned NOT NULL,
PRIMARY KEY (`codigoFuncionario`),
KEY `departamento_funcionario` (`codigoDepartamento`),
CONSTRAINT `departamento_funcionario` FOREIGN KEY
(`codigoDepartamento`) REFERENCES `departamento` (`codigoDepartamento`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Criao de um novo Projecto (Java Web) no NetBeans


O NetBeans permite-nos criar projectos java de diversos tipos (Escritrio, Web,
Moveis, Entreprise, etc). O NeteBeans tambm tem suporte para outras
linguagens {C/C++, PHP} e IDEs {Eclipse, JBuilder}.

1. Criar um projecto no NetBeans muito simples, podemos faz-lo a apartir do


menu File New Project. Ou Seleccionando o icone
Ferramentas

na barra de

... Menu para um Novo Projecto

A seguir deve-se escolher o tipo de projecto.


Para seguir o estudo, escolha Java Web em Categories e Web Aplication em
Projects. J que se deseja criar um projecto web

Faa clique sobre o boto Next {Seguinte}


10

Na etapa Name and Location deve-se dar um nome ao projecto e definir uma
localizao onde o projecto vai ficar guardado...
Para seguir o exemplo do tutorial d aplicao o nome de GestaoPessoal.
conveniente marcar a opo User Dedicated Folder for Storing Labraries
para que as bibliotecas usas fiquem associadas aplicao, no futuro.
a seguir fazer clique sobre o boto Next {Seguinte}, para prosseguir.
...na etapa Server and Settings deve-se escolher o servidor ou contentor de
aplicaes {web server}3 e a verso do Java EE. Actualmente a verso
disponivel para desevolvimento a 5 {Java EE 5}. Utilize esta verso e o
contentor de aplicaes Apache Tomcat.

O NetBeans por padro embute o Tomcat e o GlassFish. Outros web servers podem ser adicionados.

11

Predente-se criar uma aplicao sem uso de num framework. Portanto na


etapa Frameworks, no marque nenhuma opo. E faa clique em FINISH
{Terminar}.

O IDE cria um modelo de projeto para o aplicativo inteiro, e abre uma


pgina JSP vazia (index.jsp) no editor de cdigo-fonte. A estrutura lgica do
projeto visivel na janela Projects {Projetos (Ctrl-1)}.
Expanda o n Libraries {Bibliotecas} Apache Tomcat do projecto.
Observe que as bibliotecas necessrias aplicao so adicionadas ao
classpath.
Expanda Configuration Files {Ficheiros de configurao} e observe que o
IDE criou um ficheiro web.xml, que controla o comportamento da aplicao
Web. O IDE tambm registrou a pagina index.jsp no descritor de
deployment, o ficheiro web.xml.

12

Para executar a aplicao faa clique sobre o boto Run


Ferramentas ou ento prima a tecla F6.

na barra de

13

2. Parte
Estruturao da camada de negcio
A nossa aplicao vai ser estruturada segundo a arquitectura MVC e o Padro DAO
segundo as especificaes, em uso na actualidade em ambientes de produo.
Inicialmente vamos criar os seguintes pacotes.

A camada de viso ser construda com as paginas JSP, as quais esto organizadas na
pasta Web Pages da apliao.

Criao dos POJOS


Os pojos (Plain Old Java Objects) sero desenvolvidos para serem acedidos
pela aplicao. Eles recebero dos dados vindos da base de dados para
transmiti-los s paginas JSP. Das pginas JSP recebero os dados para
transmiti-los base de dados. Eles funcionam como intermedirios nas
transaces de dados.
cada tabela da base de dados corresponder um POJO, com os mesmos
atributos e relacionamentos.

14

Como criar um POJO


Para criar um POJO, navegue at a janela Projects {Projectos}, na estrutura
do projecto web, faa clique com o boto direito do mouse sobre o pacote
modelo, criado anteriormente, na pasta Source Packages, aponte para New e
faa clique em Java Class...
... e crie uma classe chamada Funcionario e outra chamada Departamento
public class Departamento
{
private Integer codigoDepartamento;
private String nomeDepartamento;
// construtores omitidos
// mtodos de acesso e modificao tambm omitidos
}

public class Funcionario


{
private Integer codigoFuncionario;
private String nomeFuncionario;
private String sobrenomeFuncionario;
private Date dataNasceimentoFuncionario;
private Departamento departamento;
private Double salarioFuncionario;
// construtores omitidos
// mtodos de acesso e modificao tambm omitidos
}

Como criar um contrutor da classe com o NetBeans IDE


Faa clique com o boto direito do mouse no cdigo (Editor), abaixo das
variveis de instncia, e no menu de contexto que aparece, seleccione a opo
Insert Code (ALT + Insert) e faa clique em Construtor.
15

Vamos criar dois construtores. Um com parmentros e outro sem parmetros


Para criar um construtor com parmetros, na caixa de dilogo que aparece
marque todos as variveis de instncia da classe e...

... faa clique em Generate.


Para criar um construtor sem parmetros, repita todos os passos anteriores,
mas na janela Generate Construtor, a ultima, no marque nenhuma varivel de
instncia. E faa clique no boto Generate.
Alternativamente pode criar os construtores fazendo a combinao CTRL +
Barra de Espao e Enter

Como criar os mtodos de acesso e modificao {sets e gets}. com o


NetBeans IDE

Faa clique com o boto direito do mouse no cdigo (Editor), e no menu de


contexto que aparece, aponte para Refactor e faa clique em Encapsulate
Fields.

16

Na caixa de dilogo Encapsulate Fields aparecem todos os atributos para os


quais sero gerados metodos getters e setters. A visibilidade dos atributos
mostrada em Fields Visibility e a visibilidade dos assessores em Acessors
Visibility. Marque todos os Getters e Setters e...

... faa clique em Refactor

17

Alternativamente faa clique com o boto direito do mouse no editor de codigo,


logo abaixo do ultimo construtor e escolha a opo Insert code. Na caixa
Generate escolha Getter and Setter

... seleccione os campos e faa clique em Generate.

Criao da classe de Conexao com a base de dados


... Continuando, vamos criar uma classe para fazer a conexo com a base de dados.
Faa clique com o boto direito do mouse sobre o pacote til, anteriormente
criado, aponte para New e faa clique Java Class. D esta classe o nome de
Conexao.

18

Na listagem a seguir mostrado o cdigo da classe que vai permitir a ligao


entre a aplicao e a base de dados.
Classe Conexao
import java.sql.*;
public class Conexao
{
private static String driver ="com.mysql.jdbc.Driver";
private static String url ="jdbc:mysql://localhost:3306/gpessoal";
private static String utilizador ="root";
private static String senha ="root";
public static Connection getConnection() throws Exception {
try {
Class.forName(driver);
return DriverManager.getConnection( url, utilizador, senha);
}
catch (ClassNotFoundException notFoundException)
{
throw new Exception(notFoundException.getMessage());
}
catch (SQLException sQLException)
{
throw new Exception(sQLException.getMessage());
}

19

}
public static void closeConnection(Connection conn,
Statement stmt, ResultSet rs) throws Exception {
close(conn, stmt, rs);
}
public static void closeConnection(Connection conn, Statement stmt)
throws Exception {
close(conn, stmt, null);
}
public static void closeConnection(Connection conn)
throws Exception {
close(conn, null, null);
}
private static void close(Connection conn,
Statement stmt, ResultSet rs)
throws Exception {
try {
if (rs != null) {
rs.close();
}
if (stmt != null) {
stmt.close();
}
if (conn != null) {
conn.close();
}
} catch (Exception e) {
throw new Exception(e.getMessage());
}
}
}

Criao dos DAOs Data Access Object


Para cada classe necessrio criar os mtodos de persistncia. boa prtica
criar uma classe a parte cujo nome ser o da classe com o sufixo DAO.
Por exemplo: DepartamentoDAO
Na listagem a seguir temos o contedo da classe FuncionarioDAO da
aplicao que estamos a criar
public class DepartamentoDAO
{
private Connection con;
public void guardarDepartamento(Departamento departamento) throws Exception
{
PreparedStatement ps = null;
if (departamento == null)
{

20

throw new Exception("O valor passado no pode ser nulo");


}
try
{
String SQL = "INSERT INTO departamento(nomeDepartamento) values(?)";
con = Conexao.getConnection();
ps = con.prepareStatement(SQL);
ps.setString(1, departamento.getNomeDepartamento());
ps.execute();
} catch (SQLException sqle)
{
throw new Exception("Erro ao inserir dados " + sqle);
} finally
{
Conexao.closeConnection(con, ps);
}
}
public void actualizarDepartamento(Departamento departamento) throws Exception
{
PreparedStatement ps = null;
if (departamento == null)
{
throw new Exception("O valor passado no pode ser nulo");
}
try
{
String SQL = "UPDATE departamento SET nomeDepartamento=? where
codigoDepartamento=?";
con = Conexao.getConnection();
ps = con.prepareStatement(SQL);
ps.setString(1, departamento.getNomeDepartamento());
ps.setInt(2, departamento.getCodigoDepartamento());
ps.executeUpdate();
ps.close();
} catch (SQLException sqle)
{
throw new Exception("Erro ao actualizar dados: " + sqle);
} finally
{
Conexao.closeConnection(con);
}
}
public void eliminarDepartamento(Departamento departamento) throws Exception
{
PreparedStatement ps = null;
if (departamento == null)
{
throw new Exception("O valor passado no pode ser nulo");
}
try
{
con = Conexao.getConnection();
ps = con.prepareStatement("delete from departamento where codigoDepartamento=?");
ps.setInt(1, departamento.getCodigoDepartamento());
ps.execute();

21

} catch (SQLException sqle)


{
throw new Exception("Erro ao excluir dados:" + sqle);
} finally
{
Conexao.closeConnection(con);
}
}
public Departamento procuraDepartamentoPorCodigo(Integer codigoDepartamento)
throws Exception
{
PreparedStatement ps = null;
ResultSet rs = null;
try
{
con = Conexao.getConnection();
ps = con.prepareStatement( "select * from departamento where codigoDepartamento=?");
ps.setInt(1,codigoDepartamento);
rs = ps.executeQuery();
if (!rs.next())
{
throw new Exception("No foi encontrado nenhum" +
" registro com o Cdigo: " + codigoDepartamento);
}
String departamentos = rs.getString(2);
return new Departamento(codigoDepartamento, departamentos);
} catch (SQLException sqle)
{
throw new Exception(sqle);
} finally
{
Conexao.closeConnection(con, ps, rs);
}
}
public List<Departamento> todosDepartamentos() throws Exception
{
List departamentosLista = new ArrayList();
Statement st = null;
ResultSet rs = null;
try
{
con = Conexao.getConnection();
st = con.createStatement();
rs = st.executeQuery("SELECT * FROM departamento");
while (rs.next())
{
Integer codigoDepartamento = rs.getInt("codigoDepartamento");
String nomeDepartamento = rs.getString("nomeDepartamento");
Departamento departamento = new Departamento(codigoDepartamento, nomeDepartamento);
departamentosLista.add(departamento);
}
} catch (Exception ex)
{
ex.printStackTrace();
}

22

return departamentosLista;
}
}

e o contedo da classe FuncionarioDAO

public class FuncionarioDAO {


private Connection conn;
public void guardarFuncionario(Funcionario funcionario) throws Exception{
PreparedStatement ps = null;
if (funcionario == null)
throw new
Exception("O valor passado no pode ser nulo");
String SQL = "insert into funcionario( nomeFuncionario, sobrenomeFuncionario," +
"dataNascimentoFuncionario, codigoDepartamento, salarioFuncionario) " +
"values(?,?,?,?,?)";
conn = Conexao.getConnection();
try {
ps = conn.prepareStatement(SQL);
// ps.setInt(1, funcionario.getCodigoFuncionario());
ps.setString(1,funcionario.getNomeFuncionario());
ps.setString(2,funcionario.getSobrenomeFuncionario());
ps.setDate(3, new java.sql.Date(funcionario.getDataNasceimentoFuncionario().getTime()));
ps.setInt(4, funcionario.getDepartamento().getCodigoDepartamento());
ps.setDouble(5,funcionario.getSalarioFuncionario());
ps.execute( );
ps.close();
} catch (SQLException sqle) {
throw new
Exception("Erro ao inserir dados "+ sqle);
} finally {
Conexao.closeConnection(conn);
}
}
public void actualizarFuncionario(Funcionario funcionario) throws Exception {
PreparedStatement ps = null;
if (funcionario == null)
throw new
Exception("O valor passado no pode ser nulo");
String SQL = "UPDATE funcionario SET nomeFuncionario=?,sobrenomeFuncionario=?," +
"dataNascimentoFuncionario=?," +
"codigoDepartamento=?,salarioFuncionario=? WHERE codigoFuncionario =?";
conn = Conexao.getConnection();
try {
ps = conn.prepareStatement(SQL);
ps = conn.prepareStatement(SQL);

23

ps.setString(1,funcionario.getNomeFuncionario());
ps.setString(2,funcionario.getSobrenomeFuncionario());
ps.setDate(3, new java.sql.Date(funcionario.getDataNasceimentoFuncionario().getTime()));
ps.setInt(4, funcionario.getDepartamento().getCodigoDepartamento());
ps.setDouble(5,funcionario.getSalarioFuncionario());
ps.setInt(6, funcionario.getCodigoFuncionario());
ps.executeUpdate( );
ps.close();
} catch (SQLException sqle) {
throw new
Exception("Erro ao atualizar dados: "+ sqle);
} finally {
Conexao.closeConnection(conn);
}
}
public void eliminarFuncionario(Funcionario funcionario) throws Exception {
PreparedStatement ps = null;
if (funcionario == null)
throw new
Exception("O valor passado no pode ser nulo");
try {
conn = Conexao.getConnection();
ps = conn.prepareStatement("delete from funcionario where codigoFuncionario=?");
ps.setInt(1, funcionario.getCodigoFuncionario());
ps.execute( );
ps.close();
} catch (SQLException sqle) {
throw new
Exception("Erro ao excluir dados:" + sqle);
} finally {
Conexao.closeConnection(conn);
}
}
public Funcionario procurarFuncionarioPorCodigo(Integer codigoFuncionarioBusca)
throws Exception {
PreparedStatement ps = null;
ResultSet rs = null;
String sql = "SELECT * from funcionario where codigoFuncionario =?";
try {
conn = Conexao.getConnection();
ps = conn.prepareStatement(sql);
ps.setInt(1, codigoFuncionarioBusca);
rs = ps.executeQuery( );
if( !rs.next( ) ) {
throw new
Exception( "No foi encontrado nenhum" +
" registro com o ID: " + codigoFuncionarioBusca );
}
Integer codigoFuncionario = rs.getInt(1);
String nomeFuncionario = rs.getString(2);
String sobrenomeFuncionario = rs.getString(3);
Date dataNascimentoFuncionario = rs.getDate(4);
Departamento departamento = new Departamento();
departamento.setNomeDepartamento(rs.getString(5));

24

Double salarioFuncionario = rs.getDouble(6);


return new Funcionario(codigoFuncionario, nomeFuncionario, sobrenomeFuncionario,
dataNascimentoFuncionario, departamento, salarioFuncionario);
} catch (SQLException sqle) {
throw new Exception(sqle);
} finally {
Conexao.closeConnection(conn, ps, rs);
}
}
public List<Funcionario> buscaTodosFuncionarios() throws Exception
{
List funcionariosLista = new ArrayList();
Statement st = null;
ResultSet rs = null;
String Sql = "SELECT f.codigoFuncionario, f.nomeFuncionario, f.sobrenomeFuncionario," +
" f.dataNascimentoFuncionario, d.nomeDepartamento, f.salarioFuncionario " +
"FROM funcionario f, departamento d " +
"WHERE f.codigoDepartamento = d.codigoDepartamento";
try
{
conn = Conexao.getConnection();
st = conn.createStatement();
rs = st.executeQuery(Sql);
while (rs.next())
{
Integer codigoFuncionario = rs.getInt("codigoFuncionario");
String nomeFuncionario = rs.getString("nomeFuncionario");
String sobrenomeFuncionario = rs.getString("sobrenomeFuncionario");
Date dataNascimentoFuncionario = rs.getDate("dataNascimentoFuncionario");
Departamento departamento = new Departamento();
departamento.setNomeDepartamento(rs.getString("nomeDepartamento"));
Double salarioFuncionario = rs.getDouble("salarioFuncionario");
Funcionario funcionario = new Funcionario(codigoFuncionario, nomeFuncionario,
sobrenomeFuncionario, dataNascimentoFuncionario, departamento, salarioFuncionario);
funcionariosLista.add(funcionario);
}
} catch (Exception ex)
{
}
return funcionariosLista;
}
}

Criao das classes de controlo


As classes de controlo tm a funo de controlar o acesso aos dados j que o
DAO tem como funo principal trabalhar como intermedirio que recebe os
dados e persiste na base de dados, por um lado, e, por outro, recebe os dados
e disponibiliza-os para a aplicao

25

Nas aplicaes java o papel de controller feito pelos servlets

Criao das Servlets e das Pginas JSP


Para a interaco entre a camada de negcio e a camada de viso, as pginas, boa
prtica utilizar Servlets. Entretanto nada obsta trabalhar apenas com pginas JSP.
A seguir vamos criar os Servlets que vo permitir a manipulao os dados recebidos
dos formulrios JSP para a base de dados e os dados enviados da base de dados para
as pginas JSP.

Como criar um servlet


Inicialmente ser implementado um caso simples de interaco entre servlets e
Pginas JSP. Num segundo momento sero apresentadas estruturas mais elaboradas.
Mas o principio de interaco o mesmo.
Para criar um servlet, faa clique com o boto direito do mouse sobre o packate
servlets, se ainda no tem crie-o, no n Source Packages

D o nome de DepartamentoServlet e faa clique em Next, para prosseguir.


Na janela seguinte deixe marcada a opo Add information to deployment
descriptor(Web.xml) e faa clique sobre o boto finish.

26

A seguir edite o servlet conforme o cdigo mostrador a seguir.

public class GuardarDepartamentoServlet extends HttpServlet


{
private Departamento departamento = new Departamento();
private DepartamentoDAO departamentoDAO = new DepartamentoDAO();
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException, Exception {
try
{
departamento.setCodigoDepartamento(0);
departamento.setNomeDepartamento(request.getParameter("txtdepartamento"));
departamentoDAO.salvar(departamento);
}
finally
{
}
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

27

try
{
processRequest(request, response);
} catch (Exception ex)
{
Logger.getLogger(SalvarDepartamentoServlet.class.getName()).log(Level.SEVERE, null, ex);
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try
{
processRequest(request, response);
} catch (Exception ex)
{
Logger.getLogger(SalvarDepartamentoServlet.class.getName()).log(Level.SEVERE, null, ex);
}
}
@Override
public String getServletInfo()
{
return "Short description";
}
}

Este servlet vai permitir persistir os dados recebidos de um formulrio. A seguir vamos
criar as pginas JSP.

Criar a pgina JSP


Faa clique com o boto direito do mouse sobre o n Web Pages e escolha JSP, d a
esta pgina o nome de RegistarNovoDepartamento.
Para desenha a pgina pode recorrer palete do NetBeans IDE

28

ou a um editor que suporte a tecnologia JSP, como o DreamWeaver da Macromdia.


Na listagem a seguir temos a pgina que nos permitir inserir e guardar novos
departamentos na base de dados do nosso sistema.
Ateno especial deve ser posta na propriedade action do formulrio (form) e na
propriedade method. Na propriedade action passamos o nome do servlet que recebe
os dados e os envia base de dados, na propriedade method passamos o mtodo
POST para significar que o formulrio com dados ser enviado ao servidor.
Pgina para a entrada de dados dos Departamentos
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Registo de Departamento</title>
</head>
<body>
<form action=" GuardarDepartamentoServlet " method="POST">
<h1>Registar Novo Departamento</h1>
<br>
Departamento:
<br>
<br>
<input type="text" name="txtdepartamento" value="" />
<br>
<br>
<input type="submit" value="Guardar" />
29

</form>
</body>
</html>

Pgina para a visualizao dos dados dos Departamentos


Vamos criar uma nova pgina e vamos chama-la ListaDepartamentos
Esta pgina utilizar alguns recursos especiais.
Inicialmente devemos fazer alguns imports e inserir um UserBean.
Para inserir o Use Bean v at palete do NetBeans ID, desdobre o item JSP e arraste
e largue o componente Use Bean e preencha a caixa de dilogo conforme as suas
necessidades. Para o caso actual teremos:

<%@page import="java.util.*, java.sql.*, modelo.*, dao.*" %>


<jsp:useBean id="departamentoBean" scope="session"
class="controlo.DepartamentoControl" />
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Lista dos Departamentos</title>
</head>
<body>
<center>
<h1>Departamentos Registados</h1>
</center>
<br>
<br>
30

<table border="1" align="center">


<tr>
<td>
Cdigo:
</td>
<td>
Departamento:
</td>
</tr>
<tr>
<%

List<Departamento> departamentoLista =
departamentoBean.todosDepartamentos();
for (int i = 0; i < departamentoLista.size(); i++)
{
Departamento departamento = departamentoLista.get(i);
%>
<td><%=departamento.getCodigoDepartamento()%></td>
<td><%= departamento.getNomeDepartamento()%></td>

</tr>
<%
}
%>

</table>
<br>
<h1> <a href="RegistarNovoDepartamento.jsp">Registar Novo
Departamento</a><h1>
</body>
</html>

31

Adicionar Biblioteca MYSQL JDBC Driver & JSTL 1.1


Antes de prosseguirmos com a construo da nossa aplicao, vamos adicionar
algumas Bibliotecas. A saber: JSTL1.1, para tags jsp especiais e MYSQL JBDC Driver que
permitir nossa aplicao aceder base de dados.
O NetBeans 6.8 j traz estas bibliotecas incorporadas, cabendo ao desenvolvedor
apenas a tarefa de adiciona-las ao projecto. Para adicionar estas bibliotecas
faa clique com o boto direito do mouse sobre o mdulo da aplicao e no menu
de contexto escolha propriedades.
Na caixa de dilogo Project Properties seleccione Libraries e a seguir faa clique sobre
o boto Add Library. Se a livraria no estiver disponvel na janela que aparece faa
clique sobre o boto import
Seleccione a livraria e depois clique em Add Library em todas as janela e confirme na
janela Project Properties, fazendo clique no boto Ok.
Biblioteca JSTL 1.1

Biblioca MYSQL JDBC Driver

32

Teste da primeira fase da aplicao


Abra o ficheiro ndex.jsp e adicione um link para a pgina
RegistarNovoDepartamento.jsp. Faa o mesmo para a pgina de visualizao e
execute a aplicao.
Este exemplo ser apenas para mostrar como colocar as estruturas da aplicao em
interao. A seguir sero apresentadas estruturas mais elaboradas para os servlets.

33

3. Parte
Aplicao completa
Servlets da aplicao completa
Para a manipulao das entidades da nossa aplicao vamos criar servlets que
centralizam as operaes sobre cada objecto. Os procedimentos para criar os servlets
e as paginas JSP so semelhantes aos descritos anteriormente. Daqui para frente
apenas sero mostradas os cdigos das estruturas necessrias aplicao.
1 . Classe utilitria Mtodo para converter String em Data

import java.text.*;
import java.text.DateFormat;
import java.util.Date;
public class DataUtil {
public Date stringParaData(String data) throws ParseException
{
if(data== null)
return null;
Date dataF = null;
try
{
DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
long timestamp = dateFormat.parse(data).getTime();
dataF = new Date(timestamp);
}
catch(ParseException pe)
{
throw pe;
}
return dataF;
}
}

2. Servlet para o objecto Departamento

public class DepartamentoServlet extends HttpServlet


{

34

protected void processRequest(HttpServletRequest request, HttpServletResponse response)


throws ServletException, IOException
{
String comando = request.getParameter("comando");
if (comando == null)
{
comando = "principal";
}
DepartamentoDAO dao= new DepartamentoDAO;
Departamento departamento = new Departamento();
if (comando != null || !comando.equalsIgnoreCase("principal"))
{
try
{
String codigoDepartamento = request.getParameter("txtCodigoDepartamento");
if (codigoDepartamento != null)
{
departamento.setCodigoDepartamento(Integer.parseInt(codigoDepartamento));
}
departamento.setNomeDepartamento(request.getParameter("txtNomeDepartamento"));
} catch (Exception ex)
{
ex.printStackTrace();
}
}
try
{
RequestDispatcher rd = null;
if (comando.equalsIgnoreCase("listar"))
{
List departamentosList = dao.todosDepartamentos();
request.setAttribute("departamentosList", departamentosList);
rd = request.getRequestDispatcher("/ListaDepartamentos.jsp");
} else if (comando.equalsIgnoreCase("adicionar"))
{
dao.guardarDepartamento(departamento);
rd = request.getRequestDispatcher("DepartamentoServlet?comando=listar");
} else if (comando.equalsIgnoreCase("eliminar"))
{
dao.eliminarDepartamento(departamento);
rd = request.getRequestDispatcher("DepartamentoServlet?comando=listar");

35

} else if (comando.equalsIgnoreCase("busca"))
{
departamento =
dao.procuraDepartamentoPorCodigo(departamento.getCodigoDepartamento());
HttpSession session = request.getSession(true);
session.setAttribute("departamento", departamento);
rd = request.getRequestDispatcher("/ActualizarDepartamento.jsp");
} else if (comando.equalsIgnoreCase("actualizar"))
{
dao.actualizarDepartamento(departamento);
rd = request.getRequestDispatcher("DepartamentoServlet?comando=listar");
} else if (comando.equalsIgnoreCase("principal"))
{
rd = request.getRequestDispatcher("/index.jsp");
}
rd.forward(request, response);
} catch (Exception e)
{
e.printStackTrace();
throw new ServletException(e);
}
}

2. Servlet para o objecto Funcionario

public class FuncionarioServlet extends HttpServlet


{
private Departamento departamento = new Departamento();
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
String comando = request.getParameter("comando");
if (comando == null)
{
comando = "principal";
}
FuncionarioDAO dao = new FuncionarioDAO();
Funcionario funcionario = new Funcionario();
DataUtil dataUtil = new DataUtil();

36

if (comando != null || !comando.equalsIgnoreCase("principal"))


{
try
{
String codigoFuncionario = request.getParameter("txtCodigoFuncionario");
if (codigoFuncionario != null)
{
funcionario.setCodigoFuncionario(Integer.parseInt(codigoFuncionario));
}
funcionario.setNomeFuncionario(request.getParameter("txtNomeFuncionario"));
funcionario.setSobrenomeFuncionario(request.getParameter("txtSobrenomeFuncionario"));
funcionario.setDataNasceimentoFuncionario(dataUtil.stringParaData(request.getParameter("txtDataNasci
mentoFuncionario")));
departamento.setCodigoDepartamento(Integer.parseInt(request.getParameter("txtDepartamento")));
funcionario.setDepartamento(departamento);
funcionario.setSalarioFuncionario(Double.parseDouble(request.getParameter("txtSalarioFuncionario")));
} catch (Exception ex)
{
ex.printStackTrace();
}
}
try
{
RequestDispatcher rd = null;
if (comando.equalsIgnoreCase("listar"))
{
List funcionariosList = dao.buscaTodosFuncionarios();
request.setAttribute("funcionariosList", funcionariosList);
rd = request.getRequestDispatcher("/ListaFuncionarios.jsp");
} else if (comando.equalsIgnoreCase("adicionar"))
{
dao.guardarFuncionario(funcionario);
rd = request.getRequestDispatcher("FuncionarioServlet?comando=listar");
} else if (comando.equalsIgnoreCase("eliminar"))
{
dao.eliminarFuncionario(funcionario);
rd = request.getRequestDispatcher("FuncionarioServlet?comando=listar");
} else if (comando.equalsIgnoreCase("busca"))
{
funcionario = dao.procurarFuncionarioPorCodigo(funcionario.getCodigoFuncionario());
HttpSession session = request.getSession(true);
session.setAttribute("funcionario", funcionario);
rd = request.getRequestDispatcher("/ActualizarFuncionario.jsp");

37

} else if (comando.equalsIgnoreCase("actualizar"))
{
dao.actualizarFuncionario(funcionario);
rd = request.getRequestDispatcher("FuncionarioServlet?comando=listar");
} else if (comando.equalsIgnoreCase("principal"))
{
rd = request.getRequestDispatcher("/index.jsp");
}
rd.forward(request, response);
} catch (Exception e)
{
e.printStackTrace();
throw new ServletException(e);
}
}

Paginas JSP da aplicao completa


Por uma questo de economia de espao e evitar redundncia, apenas sero
apresentadas as pginas para manipular o objecto Funcionario. As dos demais objectos
tm a mesma estrutura.
1. Pagina para adicionar novo Departamento

<form action="DepartamentoServlet?comando=adicionar" method="POST">


<center>
<h2>Registar Novo Departamento</h2>
</center>
<table align="center">
<tr>
Departamento:
<br>
<input type="text" name="txtNomeDepartamento" value="" />
<br>
<br>
</tr>
38

<tr>
<input type="submit" value="Guardar" />
</tr>

</table>
</form>

2 . Pagina Para Visualizar os Departamentos

<body>
<h2>Lista dos Departamentos</h2>
<table width="100%">
<tr bgcolor="#2E8B57">
<th>Cdigo</th>
<th>Departamento</th>
<th>Actualizar</th>
<th>Eliminar</th>
<tr bgcolor="#DCDCDC">
<%
DepartamentoDAO dao= new DepartamentoDAO();

List<Departamento> departamentoLista = dao.todosDepartamentos();


for (int i = 0; i < departamentoLista.size(); i++) {
Departamento departamento = departamentoLista.get(i);
%>
<td ><%= departamento.getCodigoDepartamento() %></td>
<td ><%= departamento.getNomeDepartamento() %></td>
<td>
<%
out.println("<a
href=\"DepartamentoServlet?comando=busca&txtCodigoDepartamento="+departame
nto.getCodigoDepartamento()+"\">Actualizar</a>");
%>
</td>
39

<td>
<%
out.println("<a
href=\"DepartamentoServlet?comando=eliminar&txtCodigoDepartamento="+departa
mento.getCodigoDepartamento()+"\">Eliminar</a>");
%>
</td>
</tr>
<%
}
%>
</table>
<br><a href="AdicionarDepartamento.jsp">Novo Departamento</a>
<br>
<a href="index.jsp">Home Page</a>
</body>

3. Pagina para actualizar informao de um Departamento

<jsp:useBean id="departamento" scope="session" class="modelo.Departamento" />


<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Actualizar Departamento</title>
</head>
<body>

<form action="DepartamentoServlet?comando=actualizar" method="post">


<table width="40%" align="center">
<tr>
<td><strong>Codigo:</strong> <br/>
<input type="text" name="idCurso"
value="${departamento.codigoDepartamento}" readonly="true" /></td>
</tr>
<tr>
<td ><b>Departamento</b> <br/>
40

<input size="50" type="text" name="cursos"


value="${departamento.nomeDepartamento}" maxlength="50"/></td>
</tr>

<tr>
<td >
<input type="submit" name="btAtualizar" value="Actualizar"/>
</td>
</tr>
</table>
</form>
</body>
</html>

4. Pagina para adicionar um novo Funcionario

<body>
<center>
<h2>Novo Funcionario</h2>
<form action="FuncionarioServlet?comando=adicionar"
name="novoFuncionario" method="POST">
<table width="50%">
<tr>
<th align="center" bgcolor="#2E8B57" colspan="2">Dados do
Funcionrio</th>
</tr>
<tr>
<td width="16%" align="left"><b>Nome</b></td>
<td width="50%" align="left"><input size="50" type="text"
name="txtNomeFuncionario"
maxlength="50"/>
</td>
</tr>
<tr>
<td width="16%" align="left"><b>Sobrenome</b></td>
<td width="50%" align="left"><input size="50" type="text"
name="txtSobrenomeFuncionario"
41

maxlength="50"/>
</td>
</tr>

<tr>
<td width="16%" align="left"><b>Data de Nascimento</b></td>
<td width="50%" align="left"><input type="text"
name="txtDataNascimentoFuncionario"/>
</td>
</tr>
<tr>
<td width="16%" align="left"><b>Departamento</b></td>
<td width="50%" align="left">
<select name="txtDepartamento">
<%
DepartamentoDAO dao= new DepartamentoDAO();

List<Departamento> departamentosLista =
dao.todosDepartamentos();
for (int i = 0; i < departamentosLista.size(); i++)
{
Departamento departamento = departamentosLista.get(i);
%>
<option value=<%=
departamento.getCodigoDepartamento()%>><%=
departamento.getNomeDepartamento()%> </option>
<%
}
%>
</select>
</td>
</tr>
<tr>
<td width="16%" align="left"><b>Salrio</b></td>
<td width="50%" align="left">
<input type="text" name="txtSalarioFuncionario"maxlength="50"/>
</tr>

<tr>
<td colspan="2" bgcolor="#2E8B57" align="center">
42

<input type="submit" name="btCadastrar" value="Guardar" />


</td>
</tr>
</table>

</form>
</center>
</body>

2 . Pagina Para Visualizar os Funcionrios


<body>
<center>
<h2>Lista do Pessoal</h2>
<table width="100%">
<tr bgcolor="#2E8B57">
<th>Nome</th>
<th>Sobrenome</th>
<th>Data de Nascimento</th>
<th>Departamento</th>
<th >Salario</th>
<th>Actualizar</th>
<th>Eliminar</th>
<tr bgcolor="#DCDCDC">
<%

FuncionarioDAo dao = new FuncionarioDAO();


List<Funcionario> funcionarioLista = dao.buscaTodosFuncionarios();
for (int i = 0; i < funcionarioLista.size(); i++) {
Funcionario funcionario = funcionarioLista.get(i);
%>
<td ><%= funcionario.getNomeFuncionario() %></td>
<td ><%= funcionario.getSobrenomeFuncionario() %></td>
<td ><%= funcionario.getDataNasceimentoFuncionario() %></td>
<td ><%= funcionario.getDepartamento().getNomeDepartamento()
%></td>
<td ><%= funcionario.getSalarioFuncionario() %></td>
43

<td>
<%
out.println("<a
href=\"FuncionarioServlet?comando=busca&txtCodigoFuncionario=" +
funcionario.getCodigoFuncionario()+"\">Actualizar</a>");
%>
</td>
<td>
<%
out.println("<a
href=\"FuncionarioServlet?comando=eliminar&txtCodigoFuncionario=" +
funcionario.getCodigoFuncionario() +"\">Eliminar</a>");
%>
</td>
</tr>
<%
}
%>
</table>
<br />
<a href="AdicionarFuncionario.jsp">Novo Funcionario</a>
<br />
<a href="index.jsp">Home Page</a>
</center>
</body>
3 . Pagina Para Actualizar/Editar os dados dos Funcionrios

<form action="FuncionarioServlet?comando=actualizar" method="POST">


<table width="20%" align="center" >
<tr>
<th height="23" colspan="2" align="center" bgcolor="#84D7A9">Dados
do Funcionario</th>
</tr>
<tr>
<td width="16%" align="left"><b>Cdigo</b><br>
<input size="10" type="text" name="txtCodigoFuncionario"
readonly="readonly" value="${funcionario.codigoFuncionario}"
44

maxlength="50"/>
</td>
</tr
<tr>
<td width="50%" align="left"><b>Nome</b>
<input size="50" type="text" name="txtNomeFuncionario"
maxlength="50" value="${funcionario.nomeFuncionario}"/>
</td>
</tr>

<tr>
<td width="16%" align="left"><b>Sobrenome </b> <br>
<input size="50" type="text" name="txtSobrenomeFuncionario"
value="${funcionario.sobrenomeFuncionario}" maxlength="50"/>
</b>
</td>
</tr>
<tr>
<td width="50%" align="left">
<b>Data de Nascimento</b><b>(dd/mm/aaaa)</b> <br>
<input type="text" name="txtDataNascimentoFuncionario"
value="<fmt:formatDate
value="${funcionario.dataNasceimentoFuncionario}" type="DATE"
pattern="dd/MM/yyyy"/>" />
</td>
</tr>
<tr>
<td width="16%" align="left">
<p><b>Departamento </b><br/>
<select name="txtDepartamento">
<option>--Seleccione um Departamento --</option>
<%
DepartamentoDAO dao= new DepartamentoDAO();
List<Departamento> departamentoLista = dao.todosDepartamentos();
for (int i = 0; i < departamentoLista.size(); i++)
{
Departamento departamento = departamentoLista.get(i);
%>
<option value='<%=
45

departamento.getCodigoDepartamento()%>'><%=
departamento.getNomeDepartamento()%> </option>
<%
}
%>
</select>
</b></p>
</td>

</tr>
<tr>
<td width="16%" align="left"><b>salrio
<input size="50" type="text" name="txtSalarioFuncionario"
value="${funcionario.salarioFuncionario}" maxlength="50"/>
</b>
</td>
</tr>

<tr align="left">
<td align="center" bgcolor="#84D7A9" colspan="2">
<input type="submit" name="btAtualizar" value="Actualizar"
</td>
</tr>
</table>

</form>

Consulta Exemplo
Ser simulada o busca da lista de Funcionarios por departamento

Interface para a consulta

<body>
<center>
46

<form name="departamentoFuncionario" method="get"


action="executaBuscaFuncionarioPorDepartamento.jsp" onsubmit="return
validarFormulariomunicipio()">
<table>
<tr>
<td colspan="2" align="center" bgcolor="#2E8B57"><h3>Buscar Funcionario
por Departamento</h3></td>
</tr>
<tr>
<td width="169" align="left"><strong>Seleccione o
Departamento</strong></td>
<td width="103" align="left"><h3>
<select name="txtDepartamento">
<option>Seleccione o Departamento</option>
<%
DepartamentoDAO dao= new DepartamentoDAO();
List<Departamento> departamentoLista = dao.todosDepartamentos();
for (int i = 0; i < departamentoLista.size(); i++) {
Departamento departamento = departamentoLista.get(i);
%>
<option value=<%= departamento.getCodigoDepartamento() %>><%=
departamento.getNomeDepartamento() %> </option>
<%
}
%>
</select>
</h3></td>
</tr>
<tr>
<td colspan="2" bgcolor="#2E8B57" align="center"><input name="submit"
type="submit" value="Consultar" />
</td>
</tr>
</table>
</form>
</center>
</body>

Pagina que processa a consulta


<body>
<%

47

Integer departamento =
Integer.parseInt(request.getParameter("txtDepartamento"));
%>
<center>
<h2> Funcionrios Encontrados</h2>
<table >
<tr>
<td width="10%"><strong>Nome</strong></td>
<td width="10%"><strong>Sobrenome</strong></td>
<td width="10%"> <strong>Salrio</strong></td>
</tr>
<tr>
<%
Connection con = null;
con = Conexao.getConnection();
Statement stm = con.createStatement();
String sqle ="Select nomeFuncionario, sobrenomeFuncionario,
salarioFuncionario" +
" from funcionario f, departamento d" +
" where f.codigoDepartamento = d.codigoDepartamento" +
" and d.codigoDepartamento='"+departamento+"'";
ResultSet rse = stm.executeQuery(sqle);
while (rse.next()) {
String nome = rse.getString(1);
String sobrenome = rse.getString(2);
String salario = rse.getString(3);
%>
<td width="10%"> <%=nome%></td>
<td width="10%"><%=sobrenome%></td>
<td width="10%"><%= salario %></td>
</tr>
<%
}
%>
</table>

<br>
<a href="buscarFuncionarioPorDepartamento.jsp">Voltar</a>
<br>
<a href="index.jsp">Home</a>
48

</center>
</body>

Bom trabalho
You should be the change that you want to see in the world"
("Voc deve ser a mudana que quer ver no mundo")
= Gandhi=

49

You might also like