Criação de um Servlet
1.Fazer clique no botão New File (Novo Ficheiro ) ou fazer clique com o botão direito do mouse sobre o projeto e escolher New(Novo) para abrir o assiste de Ficheiro.
2.Na secção Categories(Categorias) escolha Web e, em seguida, em File Types(Tipo de ficheiro) escolha Servlet e clique em Next(Seguinte)
3.Na caixa de diálogo que aparece na secção Class Name (Nome da Classe) escrever o nome para o Servlet. Por convecção o nome de um servlet termina com Servlet (ex. ClienteServlet) e pode ser boa ideia seguir esta convecção. É importante criar ou selecionar um package para o servlet.
4.A seguir fazer clique em Next(Seguinte) para ir a secção da configuração.
5.A secção Configure Servlet Deployment (Configurar Implantação do Servlet)faz-se o registo do Servlet com o aplicativo, dando-lhe um nome interno (nome do servlet) e especifica-se os padrões que identificam a URL para a invocação do Servlet.
No exemplo em construção o nome do Servlet é CategoriaFuncionarioServlet e a URL pattern categoriaControlo.
De lembrar que a URL pattern será o nome pelo qual será invocado e acedido o Servlet.
Na versões anteriores do JavaEE todas as informações definidas nesta fase deveriam obrigatoriamente ser persistidas no “Deployment Descriptor”, o ficheiro web.xml. Portanto, era obrigatório marcar a opção “Add information do deployment descriptor”.
A partir da versão JavaEE 6 a utilização do ficheiro web.xml tornou-se opcional e faz-se recurso às anotações. No presente Ebook será seguida esta ultima abordagem.
6.Feitas todas as configurações fazer clique em sobre o botão Finish(Terminar). O NetBeans gera e mostra a estrutura do servlet no editor.
Código completo do servlet CategoriaFuncionarioServlet, sem os comentários e sem conteúdo no método processRequest.
Classe CategoriaFuncionarioServlet.java
package org.ao.projecto.controlo;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet(name = "CategoriaFuncionarioServlet", urlPatterns = {"/categoriaControlo"})
public class CategoriaFuncionarioServlet extends HttpServlet {
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
@Override
public String getServletInfo() {
return "Short description";
}// </editor-fold>
}
Chamada ou invocação de um Servlet
Para fazer a chamada do servlet pode-se proceder de duas formas.
- Fazer clique com o botão direito do mouse no conteúdo da classe aberto no editor e na lista de opções que aparece escolher Run File
- Alternativamente, escrever a URL no browser, assumindo que o servidor de aplicações ou o contentor de servlet esteja já em execução.
http:localhost:8080/ gestaodeprojectos/ categoriaControlo
Anatomia de uma URL
URL (Uniform Resource Locator), em português é conhecido por Localizador Padrão de Recursos, é o endereço de um recurso disponível numa rede, seja numa rede internet ou intranet. Em outras palavras, url é um endereço virtual com um caminho que indica onde está o que o utilizador procura, e pode ser tanto um ficheiro, como uma máquina, uma página, um site, uma pasta etc.
Anatomia
http://www.ngola.com:8080/pweb/paginas/index.jsp
http//: - protocolo
www.ngola.com - DNS do servidor
8080 - porta
/pweb/paginas/index.jsp - é a parta utilizada no GET ou no POST
/pweb/paginas/ - path
/index.jsp - nome do recurso
O path é contado a partiu de um directorio base que é especifico de cada servidor web. Por exemplo, o directorio base do apachae é htdocs, do WildFly é deployments que fica debaixo de standalone, do glassfish é applications que fica debaixo de domain1.
Se o recurso nao estiver no path indicado ou o nome do recurso estiver errado, o servidor devolve uma resposta de erro com o código de status 404.
Os principais códigos de status de uma resposta HTPP estão divididos em cinco grupos:
de 100 a 199 são códigos informativos. Essa classe de códigos de status indica uma resposta provisória.
de 200 a 299 são códigos que endicam sucesso. Esta classe de códigos de status indica a ação solicitada pelo cliente foi recebida, compreendida, aceita e processada com êxito.
de 300 a 399 são códigos que indicam um Redirecionamento. Esta classe de código de status indica que alguma ação ainda deve ser realizada agente do utilizador, a fim de atender à solicitação.
de 400 a 499 são códigos de erros que indicam algum erro do cliente. A classe de código de status é destinada a casos em que o cliente parece ter cometido algum erro. Esses códigos de status são aplicáveis a qualquer método de solicitação.
de 500 a 599 são códigos de erro que indicam algum erro do servidor ao processar a solicitação. Na grande maioria dos casos está relacionada as permissões dos ficheiros ou pastas do software ou script que o utilizador tenta aceder e não foram configuradas no momento da programação/construção do site ou da aplicação.
Durante os desenvolvimento de uma aplicação os códigos de erro mais recorrentes são o 400, 404 e 500.
O código de erro 400, com a descrição Bad request, indica que a requisição tem sintaxe inválida ou não pode ser cumprida;
O código de erro 404, com a descrição Not found, indica que o recurso requisitado não foi encontrado, mas pode ser disponibilizado futuramente. As solicitações subseqüentes são permitidas;
O código de erro 500, com a descrição Internal Server Error, indica um erro do servidor. Em geral caracteriza-se por ser uma mensagem de erro genérico, dada quando nenhuma mensagem mais específica é adequada.
Descrição do conteudo do servlet
No servlet criado aparece o método processRequest(HttpServletRequest request, HttpServletResponse response) criado para receber dados tanto do método doGet(HttpServletRequest request, HttpServletResponse response) que trata dos dados e/ou formulários enviados com o método GET, como do método void doPost(HttpServletRequest request, HttpServletResponse response) que trata dos formulários enviados com o método POST).
No mesmo ficheiro podemos observar que os dois métodos (doGet e doPOST) chamam o método processRequest. Esta estruturação possibilita a programação no mesmo método deixando ao servlet a decisão de tratar a requisição como um requisição do tipo GET ou POST. Portanto, todas as instruções serão escritas no método processRequest.
Construção do Servlet com os processos e objetos de interação entre a visão e o modelo
Depois de criado o esqueleto do servlet o passo seguinte e adicionar no método processRequest(HttpServletRequest request, HttpServletResponse response) os dados necessários para o processo de interação entre as camadas da aplicação. Recordando que o servlet intermedeia este processo.
A seguir serão mostrados alguns exemplos de implementação que traduz o processo de interação entre as diversas camadas da aplicação e clarificam o papel do controlador.
Para receber os parâmetros das páginas utiliza-se o método getParameter(String parametro) da classe HttpServletRequest. Nesta primeira abordagem é importante reter que o valor a passar como parâmetro ao método getParameter() é o valor da propriedade name de um campo de texto, caixa de combinação, botão de opção, etc. do formulário. Todas a codificação vai ser feita dentro do método processRequest. A apresentação dos métodos nativos dos servlets será feita com algum detalhe posteriormente.
Exemplos práticos
Para exemplificar o processo de interação entre as camadas e o processamento das requisições pelo servlet, serão apresentados dois exemplos. Seguindo o método do simples para o complexo.
Servlet CategoriaFuncionarioServlet.java
package org.ao.projecto.controlo;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.ao.projecto.dao.CategoriaFuncionarioDAO;
import org.ao.projecto.modelo.CategoriaFuncionario;
@WebServlet(name = "CategoriaFuncionarioServlet", urlPatterns = {"/categoriaFuncionarioServlet"})
public class CategoriaFuncionarioServlet extends HttpServlet {
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String comando = request.getParameter("comando");
if (comando == null) {
comando = "principal";
}
CategoriaFuncionarioDAO categoriaFuncionarioDAO;
CategoriaFuncionario categoriaFuncionario = new CategoriaFuncionario();
if (comando == null || !comando.equalsIgnoreCase("principal")) {
try {
String idCategoria = request.getParameter("id_categoria_funcionario");
if (idCategoria != null) {
categoriaFuncionario.setIdCategoria(Integer.parseInt(idCategoria));
}
} catch (NumberFormatException ex) {
System.err.println("Erro ao converter dado: " + ex.getMessage());
}
}
try {
categoriaFuncionarioDAO = new CategoriaFuncionarioDAO();
if (comando.equalsIgnoreCase("guardar")) {
categoriaFuncionario.setNomeCategoria(request.getParameter("nome_categoria_funcionario"));
categoriaFuncionario.setSalarioCategoria(Double.parseDouble(request.getParameter("salario_categoria_funcionario")));
categoriaFuncionarioDAO.save(categoriaFuncionario);
response.sendRedirect("paginas/categoria_funcionario_guardar.jsp");
} else if (comando.equalsIgnoreCase("editar")) {
categoriaFuncionario.setIdCategoria(Integer.parseInt(request.getParameter("id_categoria_funcionario")));
categoriaFuncionario.setNomeCategoria(request.getParameter("nome_categoria_funcionario"));
categoriaFuncionario.setSalarioCategoria(Double.parseDouble(request.getParameter("salario_categoria_funcionario")));
categoriaFuncionarioDAO.update(categoriaFuncionario);
response.sendRedirect("paginas/categoria_funcionario_listar.jsp");
} else if (comando.equalsIgnoreCase("eliminar")) {
categoriaFuncionarioDAO.delete(categoriaFuncionario);
response.sendRedirect("paginas/categoria_funcionario_listar.jsp");
} else if (comando.equalsIgnoreCase("prepara_editar")) {
categoriaFuncionario = categoriaFuncionarioDAO.findById(categoriaFuncionario.getIdCategoria());
request.setAttribute("categoriaFuncionario", categoriaFuncionario);
RequestDispatcher rd = request.getRequestDispatcher("/paginas/categoria_funcionario_editar.jsp");
rd.forward(request, response);
} else if (comando.equalsIgnoreCase("listar")) {
response.sendRedirect("paginas/categoria_funcionario_listar.jsp");
} else if (comando.equalsIgnoreCase("principla")) {
response.sendRedirect("/index.jsp");
}
} catch (IOException | ServletException ex) {
System.err.println("Erro na leitura dos dados: " + ex.getMessage());
}
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
@Override
public String getServletInfo() {
return "Short description";
}
}
Envio e recuperação de parâmetros na requisição
Ao desenvolver uma aplicação Web, sempre é necessário realizar operações no lado do servidor. A opção mais comum é a de utilizar formulários para recolher os dados informados pelo utilizador. Na propriedade action do formulário indica-se que a ação a realizar ao ser submetido é enviar uma requisição ao servelt. A função do Servlet criado será a de receber, de alguma forma, estes dados e converte-los, se necessário e com estes dados preencher os membros do objeto com dados. Para tal utiliza-se o método getParameter(“nomeDoParametro”) do request.
Redirecionamento da Resposta
Há casos em que o Servlet deve realizar apenas algum processamento inicial e deixar a geração do conteúdo propriamente dito para uma outra entidade. Nestes casos o servlet redireciona a geração da saída. Existem dois modos de se fazer o redirecionamento: Através da utilização de um objeto RequestDispacher e através da utilização do método sendRedirect() da classe HttpServletResponse. O RequestDispacher acontece no lado do servidor, pois outro componente no lado do servidor executa o trabalho. Já o senrRedirect volta-se para o cliente. Será um cliente a executar o trabalho.
Paginas JSP envolvidas.
Para simplificar a leitura do código será apresentado apenas o código fundamental e será excluída toda a parte relativa à estilização ou qualquer outro aspeto estético. De lembrar que para a estilização fez-se recurso ao framework Bootstrap e portanto todas as classes CSS que aparecem são do referido framework.
I Exemplo: Operações com a classe CategoriaFuncionario.java
categoria_funcionario_guardar.JSP
Formulário para a operação de guardar os dados na base de dados. A informação relevante e ao qual se deve prestar atenção neste item, é o valor da propriedade action da tag
. O primeiro elemento é o nome do servlet (urlPatterns). O ponto de interrogação “?” separa o servlet da propriedade “comando” que recebe o valor “guardar”. Quando este formulário é submetido, pelo clique sobre o botão, o servlet é invocado e dos dados passados para o método processRequest e ai é desencadeada a ação em função do valor atribuído à propriedade “comando”. Neste caso serão desencadeados todos os processos relativos à operação de persistência dos dados na base de dados. De lembrar que os valores passados para o método getParameter() são os valores a propriedade name dos elementos do formulário.
<form class="form-horizontal" role="form" **action="../categoriaFuncionarioServlet?comando=guardar"** method="POST">
<div class="form-group">
<label class="col-xs-3 control-label">Categoria:</label>
<div class="col-xs-4">
<input type="text" class="form-control" id="nome_categoria_funcionario" name="nome_categoria_funcionario"/>
</div>
</div>
<div class="form-group">
<label class="col-xs-3 control-label">Salário:</label>
<div class="col-xs-4">
<input type="text" class="form-control" id="salario_categoria_funcionario" name="salario_categoria_funcionario"/>
</div>
</div>
<div class="col-md-4 col-md-offset-2">
<button type="submit" class="btn btn-primary" >Guardar</button>
</div>
</form>
categoria_funcionario_listar.jsp
Nesta pagina também são definidas as operações para eliminar e para chamar a pagina de edição. As linhas a seguir, fazem a chamada ao servlet e passam o valor o atributo idCategoria da categoria para as propriedades prepara_editar e id_categoria_funcionario. O método processRequest do servlet executa as instrução em função dos parâmetros passados e do link que for acionado.
<td><a href="../categoriaFuncionarioServlet?comando=prepara_editar&id_categoria_funcionario=<%=categoria.getIdCategoria()%>"><img src="../imagens/edit.png" /></a></td>
<td><a href="../categoriaFuncionarioServlet?comando=eliminar&id_categoria_funcionario=<%=categoria.getIdCategoria()%>"><img src="../imagens/delete.png" /></a></td>
…
<%@page import="org.ao.projecto.dao.CategoriaFuncionarioDAO" %>
<%@page import="org.ao.projecto.modelo.CategoriaFuncionario" %>
<%@page import="java.util.List" %>
…
…
<%
CategoriaFuncionarioDAO categoriaFuncionarioDAO = new CategoriaFuncionarioDAO();
List<CategoriaFuncionario> categorias = categoriaFuncionarioDAO.findAll();
%>
…
<table class=" table table-hover">
<thead>
<tr>
<th>Id</th>
<th>Categoria</th>
<th>Salario</th>
<th colspan="2">Operações</th>
</tr>
</thead>
<tbody>
<%for (CategoriaFuncionario categoria : categorias) {%>
<tr>
<td><%=categoria.getIdCategoria()%></td>
<td><%=categoria.getNomeCategoria()%></td>
<td><%=categoria.getSalarioCategoria()%></td>
<td><a href="../categoriaFuncionarioServlet?comando=prepara_editar&id_categoria_funcionario=<%=categoria.getIdCategoria()%>"><img src="../imagens/edit.png" /></a></td>
<td><a href="../categoriaFuncionarioServlet?comando=eliminar&id_categoria_funcionario=<%=categoria.getIdCategoria()%>"><img src="../imagens/delete.png" /></a></td>
</tr>
<%}%>
</tbody>
</table>
categoria_funcionario_editar.jsp
Esta pagina recupera os dados do request (passados através do método setAtribute() no servlet, através do método getAttribute() e preenche a propriedade value de cada campo.
…
<%@page import="org.ao.projecto.modelo.CategoriaFuncionario" %>
….
<%
CategoriaFuncionario categoriaFuncionario = (CategoriaFuncionario) request.getAttribute("categoriaFuncionario");
%>
<form class="form-horizontal" role="form" action="./categoriaFuncionarioServlet?comando=editar" method="POST">
<div class="form-group">
<label class="col-xs-3 control-label">Id:</label>
<div class="col-xs-4">
<input type="text" class="form-control" id="id_categoria_funcionario" name="id_categoria_funcionario" value="<%=categoriaFuncionario.getIdCategoria()%>" readonly="readonly"/>
</div>
</div>
<div class="form-group">
<label class="col-xs-3 control-label">Categoria:</label>
<div class="col-xs-4">
<input type="text" class="form-control" id="nome_categoria_funcionario" name="nome_categoria_funcionario" value="<%=categoriaFuncionario.getNomeCategoria() %>"/>
</div>
</div>
<div class="form-group">
<label class="col-xs-3 control-label">Salário:</label>
<div class="col-xs-4">
<input type="text" class="form-control" id="salario_categoria_funcionario" name="salario_categoria_funcionario" value="<%=categoriaFuncionario.getSalarioCategoria()%>"/>
</div>
</div>
<div class="col-md-4 col-md-offset-2">
<button type="submit" class="btn btn-primary" >Atualizar</button>
<button type="submit" class="btn btn-primary" >Fechar</button>
</div>
</form>
Este exemplo ilustra o processo de interação para implementar com sucesso as operações base do CRUD. O exemplo a seguir vai envolver uma classe cuja construção envolve composição, ou seja, uma classe cuja estrutura faz referencia à uma outra classe.
II Exemplo: Operações com a classe Colocacao.java
A classe Colocacao.java é constituída por membros de diversos tipos. Uma particular atenção deve ser data à referencia às classes Projeto e Funcionário e ainda à classe Date, esta ultima para para criar e manipular datas.
Classe java.util.Date
A classe java.util.Date é tradicionalmente utilizada para armazenar uma data em específico. É uma classe simples, e muitos componentes de bibliotecas e Frameworks utilizam esta classe. No entanto, hoje a maioria dos métodos da classe Date estão classificados como deprecated(depreciados), ou seja, são métodos que não são mais utilizados, por isso esta classe foi ao longo do tempo substituída pela classe Calendar, para ter suporte correto à internacionalização do sistema de datas. O Java 8 trás uma nova API de datas disponível no pacote java.time. No projeto desenvolvido no presente ebook foi utilizada a classe Date e para a manipulação das data foi criada um classe utilitária com um método para converter Strings em data e outro para formatar as datas no padão dia/mês/ano. O método que converte Strings em data é utilizado para converter os valores recebidos do formulários e passados para os membros da classe que são do tipo data. O método de formatação é utilizado nas paginas JSP para uma visualização conforme o padrão habitual no mundo neolatino.
Classe DateUtil.java
public class DateUtil {
public static Date strToDate(String data) {
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) {
System.err.println("Erro ao converter String em data: " + pe.getLocalizedMessage());
}
return dataF;
}
public static String formataData(Date data) {
Calendar calendar = new GregorianCalendar();
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
calendar.setTime(data);
return sdf.format(calendar.getTime());
}
}
A seguir é apresentado o código do Servlet que trata do processamento das requisições e respostas relativas à classe Colocacao.java. O Servlet não é diferente do anterior. Apenas tem mais elementos na construção do objeto.
@WebServlet(name = "ColocacaoServlet", urlPatterns = {"/colocacaoServlet"})
public class ColocacaoServlet extends HttpServlet {
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String comando = request.getParameter("comando");
if (comando == null) {
comando = "principal";
}
ColocacaoDAO colocacaoDAO;
Colocacao colocacao = new Colocacao();
if (comando == null || !comando.equalsIgnoreCase("principal")) {
try {
String idColocacao = request.getParameter("id_colocacao");
if (idColocacao != null) {
colocacao.setIdColocacao(Integer.parseInt(idColocacao));
}
} catch (NumberFormatException ex) {
System.err.println("Erro ao converter dado: " + ex.getMessage());
}
}
try {
colocacaoDAO = new ColocacaoDAO();
if (comando.equalsIgnoreCase("guardar")) {
Projeto projecto = new Projeto();
Funcionario funcionario = new Funcionario();
projecto.setIdProjecto(Integer.parseInt(request.getParameter("select_projecto_colocacao")));
funcionario.setIdFuncionario(Integer.parseInt(request.getParameter("select_funcionario_colocacao")));
colocacao.setProjecto(projecto);
colocacao.setFuncionario(funcionario);
colocacao.setDataInicio(DateUtil.strToDate(request.getParameter("inicio_colocacao")));
colocacao.setDataFim(DateUtil.strToDate(request.getParameter("fim_colocacao")));
colocacaoDAO.save(colocacao);
response.sendRedirect("paginas/colocacao_guardar.jsp");
} else if (comando.equalsIgnoreCase("editar")) {
Projeto projecto = new Projeto();
Funcionario funcionario = new Funcionario();
colocacao.setIdColocacao(Integer.parseInt(request.getParameter("id_colocacao")));
projecto.setIdProjecto(Integer.parseInt(request.getParameter("select_projecto_colocacao")));
funcionario.setIdFuncionario(Integer.parseInt(request.getParameter("select_funcionario_colocacao")));
colocacao.setProjecto(projecto);
colocacao.setFuncionario(funcionario);
colocacao.setDataInicio(DateUtil.strToDate(request.getParameter("inicio_colocacao")));
colocacao.setDataFim(DateUtil.strToDate(request.getParameter("fim_colocacao")));
colocacaoDAO.update(colocacao);
response.sendRedirect("paginas/colocacao_listar.jsp");
} else if (comando.equalsIgnoreCase("eliminar")) {
colocacaoDAO.delete(colocacao);
response.sendRedirect("paginas/colocacao_listar.jsp");
} else if (comando.equalsIgnoreCase("prepara_editar")) {
colocacao = colocacaoDAO.findById(colocacao.getIdColocacao());
request.setAttribute("colocacao", colocacao);
RequestDispatcher rd = request.getRequestDispatcher("/paginas/colocacao_editar.jsp");
rd.forward(request, response);
} else if (comando.equalsIgnoreCase("listar")) {
response.sendRedirect("paginas/colocacao_listar.jsp");
} else if (comando.equalsIgnoreCase("principla")) {
response.sendRedirect("/index.jsp");
}
} catch (IOException | ServletException ex) {
System.err.println("Erro na leitura dos dados: " + ex.getMessage());
}
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
@Override
public String getServletInfo() {
return "Short description";
}
}
Paginas JSP envolvidas
colocacao_guardar.jsp
….
<%@page import="org.ao.projecto.modelo.*" %>
<%@page import="org.ao.projecto.dao.*" %>
%@page import="java.util.List" %
….
<%
ProjetoDAO projetoDAO = new ProjetoDAO();
List<Projeto> projetos = projetoDAO.findAll();
FuncionarioDAO funcionarioDAO = new FuncionarioDAO();
List<Funcionario> funcionarios = funcionarioDAO.findAll();
%>
<form class="form-horizontal" role="form" action="../colocacaoServlet?comando=guardar" method="POST">
<div class="form-group">
<label class="col-xs-3 control-label">Funcionario:</label>
<div class="col-xs-5" >
<select class="form-control" id="select_funcionario_colocacao" name="select_funcionario_colocacao">
<option selected="true" value="">Selecione um Funcionario</option>
<% for (Funcionario funcionario : funcionarios) {%>
<option value="<%=funcionario.getIdFuncionario()%>"><%=funcionario.getNomeFuncionario() + " " + funcionario.getSobrenomeFuncionario()%></option>
<%
}
%>
</select>
</div>
</div>
<div class="form-group">
<label class="col-xs-3 control-label">Projecto:</label>
<div class="col-xs-5" >
<select class="form-control" id="select_projecto_colocacao" name="select_projecto_colocacao">
<option selected="true" value="">Selecione um Projecto</option>
<% for (Projeto projeto : projetos) {%>
<option value="<%=projeto.getIdProjecto()%>"><%=projeto.getNomeProjecto()%></option>
<%
}
%>
</select>
</div>
</div>
<div class="form-group">
<label class="col-xs-3 control-label">Início:</label>
<div class="col-xs-5" >
<input type="date" class="form-control" id="inicio_colocacao" name="inicio_colocacao" placeholder="dd/MM/yyyy"/>
</div>
</div>
<div class="form-group">
<label class="col-xs-3 control-label">Fim:</label>
<div class="col-xs-5" >
<input type="date" class="form-control" id="fim_colocacao" name="fim_colocacao" placeholder="dd/MM/yyyy"/>
</div>
</div>
<div class="col-md-4 col-md-offset-2">
<button type="submit" class="btn btn-primary" >Guardar</button>
</div>
</form>
….
colocacao_listar.jsp
….
<%@page import="org.ao.projecto.dao.*" %>
<%@page import="org.ao.projecto.modelo.*" %>
<%@page import="java.util.List" %>
<%@page import="java.text.*" %>
%@page import="org.ao.projecto.util.*" %
….
<%
ColocacaoDAO colocacaoDAO = new ColocacaoDAO();
List<Colocacao> colocacoes = colocacaoDAO.findAll();
%>
<table class=" table table-hover">
<thead>
<tr>
<th>Id</th>
<th>Projecto</th>
<th>Funcionário</th>
<th>Início</th>
<th>Fim</th>
<th colspan="2">Operações</th>
</tr>
</thead>
<tbody>
<%for (Colocacao colocacao : colocacoes) {%>
<tr>
<td><%=colocacao.getIdColocacao()%></td>
<td><%=colocacao.getProjecto()%></td>
<td><%=colocacao.getFuncionario()%></td>
<td><%=DateUtil.formataData(colocacao.getDataInicio())%></)%></td> <td><%=DateUtil.formataData(colocacao.getDataFim())%></td>
<td><a href="../colocacaoServlet?comando=prepara_editar&id_colocacao=<%=colocacao.getIdColocacao()%>"><img src="../imagens/edit.png" /></a></td>
<td><a href="../colocacaoServlet?comando=eliminar&id_colocacao=<%=colocacao.getIdColocacao()%>"><img src="../imagens/delete.png" /></a></td>
</tr>
<%}%>
</tbody>
</table>
colocacao_editar.jsp
….
<%@page import="org.ao.projecto.modelo.*" %>
<%@page import="org.ao.projecto.dao.*" %>
<%@page import="java.util.List" %>
%@page import="org.ao.projecto.util.*" %
….
<%
Colocacao colocacao = (Colocacao) request.getAttribute("colocacao");
ProjetoDAO projetoDAO = new ProjetoDAO();
List<Projeto> projetos = projetoDAO.findAll();
FuncionarioDAO funcionarioDAO = new FuncionarioDAO();
List<Funcionario> funcionarios = funcionarioDAO.findAll();
%>
<form class="form-horizontal" role="form" action="./colocacaoServlet?comando=editar" method="POST">
<div class="form-group">
<label class="col-xs-3 control-label">Id:</label>
<div class="col-xs-5" >
<input type="text" class="form-control" id="id_colocacao" name="id_colocacao" value="<%=colocacao.getIdColocacao()%>" readonly="readonly"/>
</div>
</div>
<div class="form-group">
<label class="col-xs-3 control-label">Funcionario:</label>
<div class="col-xs-5" >
<select class="form-control" id="select_funcionario_colocacao" name="select_funcionario_colocacao">
<option selected="true" value="">Selecione um Funcionario</option>
<% for (Funcionario funcionario : funcionarios) {%>
<option value="<%=funcionario.getIdFuncionario()%>"><%=funcionario.getNomeFuncionario() + " " + funcionario.getSobrenomeFuncionario()%></option>
<%
}
%>
</select>
</div>
</div>
<div class="form-group">
<label class="col-xs-3 control-label">Projecto:</label>
<div class="col-xs-5" >
<select class="form-control" id="select_projecto_colocacao" name="select_projecto_colocacao">
<option selected="true" value="">Selecione um Projecto</option>
<% for (Projeto projeto : projetos) {%>
<option value="<%=projeto.getIdProjecto()%>"><%=projeto.getNomeProjecto()%></option>
<%
}
%>
</select>
</div>
</div>
<div class="form-group">
<label class="col-xs-3 control-label">Início:</label>
<div class="col-xs-5" >
<input type="date" class="form-control" id="inicio_colocacao" name="inicio_colocacao" value="<%= DateUtil.formataData(colocacao.getDataInicio())%>" >
</div>
</div>
<div class="form-group">
<label class="col-xs-3 control-label">Fim:</label>
<div class="col-xs-5" >
<input type="date" class="form-control" id="fim_colocacao" name="fim_colocacao" value="<%= DateUtil.formataData(colocacao.getDataFim())%>"/>
</div>
</div>
<div class="col-md-4 col-md-offset-2">
<button type="submit" class="btn btn-primary" >Guardar</button>
</div>
</form>
PRÁTICA
Com esta aproximação aos servlets e à sua utilização, conclui-se a abordagem do ultimo elemento da arquitetura MVC. Propriamente o C, que está para Controller e que é implementado com os servlets. Para ganhar prática e eventualmente compreender melhor alguns conceitos e elementos práticos fica a recomedanção ao leitor no sentido de implementar os servlets para a manipulação das demais classes dos projeto.