Professional Documents
Culture Documents
do
Guia prtico
para a construo de aplicaes
Java Web
(JSP & Servlets)
Arquitectura MVC e Padro DAO
no
Verso 1
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.
MVC, do ingls,
utilizando Swing, AWT, SWT, XUL, JSP (em aplicaes web) ou outros.
Controller Classes utilizadas para validar regras de negcio, processar os dados,
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
I. Parte
Criao do Projecto
Diagrama ER da aplicao
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.
na barra de
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
12
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.
14
16
17
18
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());
}
}
}
20
21
22
return departamentosLista;
}
}
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
25
26
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.
28
</form>
</body>
</html>
<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
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
32
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;
}
}
34
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);
}
}
36
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);
}
}
<tr>
<input type="submit" value="Guardar" />
</tr>
</table>
</form>
<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();
<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>
<tr>
<td >
<input type="submit" name="btAtualizar" value="Actualizar"/>
</td>
</tr>
</table>
</form>
</body>
</html>
<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
</form>
</center>
</body>
<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
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
<body>
<center>
46
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