• Nenhum resultado encontrado

LINGUAGEM DE PROGRAMAÇÃO II VOLUME 02

N/A
N/A
Protected

Academic year: 2019

Share "LINGUAGEM DE PROGRAMAÇÃO II VOLUME 02"

Copied!
104
0
0

Texto

(1)
(2)
(3)

Governador | Eduardo Campos

Vice-Governador | João Soares Lyra Neto

Secretário de Educação | Anderson Stevens Leônidas Gomes

Secretário Executivo de Educação Profissional | Paulo Dutra

Gerente Geral da Educação Profissional | Luciane Pulça

Gestor de Educação a Distância | Marcos Paulo de Assis Castro

Coordenador do Curso | Almir Pires

Professor Conteudista | Márcio Augusto Silva Bueno

Equipe Central de Educação a Distância

Andréia Guerra | Augusto Andrade | Eber Gomes | George Bento | Jannine Moreno | Marcos Vinícius Clemente | Maria de Lourdes Cordeiro Marques | Maria Helena Cavalcanti | Mauro de Pinho Vieira | Pedro Luna

(4)
(5)

SUMÁRIO

UNIDADE 4 ... 7

4. INTERFACE GRÁFICA II ... 7

4.1 Introdução ... 7

4.2 Painel Tabulado (JTabbedPane) ... 7

4.3 Barra de Ferramentas (JToolBar) ... 10

4.4 Painel da Área de Trabalho (JDesktopPane) e Quadro Interno . 12 (JInternalFrame) ... 12

4.5 Painel em Camadas (JLayeredPane) ... 13

4.6 Campo de Senha (JPasswordField) ... 17

4.7 Botão Alternar (JToogleButton) ... 18

4.8 Área de Texto (JTextArea) ... 19

4.9 Campo Formatado (JFormattedTextField) ... 19

3.40 Painel de Texto (JTextPane) ... 20

4.11 Tabela (JTable) ... 22

4.12 Menus ... 24

UNIDADE 5 ... 30

5. APLICAÇÃO WEB I ... 30

5.1 Introdução ... 30

5.2 JSP ... 31

5.3 Criando uma Aplicação Web no Netbeans ... 32

5.4 Avaliando Expressões Java ... 38

5.5 Scriptlets ... 40

(6)

5.7 Escopo de Objetos ... 45

5.8 Objetos Disponíveis numa Página JSP ... 46

5.9 Scriptlets e HTML ... 48

5.10 Diretivas ... 51

5.11 Declarações ... 52

5.12 Tag <jsp:forward> ... 53

5.13 Tag <jsp:include> ... 54

5.14 Exemplo ... 55

UNIDADE 6 ... 69

6. APLICAÇÃO WEB II ... 69

6.1 Introdução ... 69

6.2 JavaBeans ... 70

6.3 Exemplo (Segunda Versão) ... 73

6.4 Servlets ... 76

6.5 Padrão MVC ... 87

6.6 Exemplo MVC ... 89

6.6.1 Classes do Modelo ... 90

6.6.2 Controlador ... 92

6.6.3 Visão ... 95

(7)

UNIDADE 4

4. INTERFACE GRÁFICA II

Objetivos

Aprender componentes Swing mais avançados. Entender o funcionamento de menus.

4.1 Introdução

Você já sabe criar aplicações gráficas utilizando o Netbeans e os componentes Swing do Java, agora você irá aprender como enriquecer ainda mais os seus aplicativos com a utilização de vários outros componentes disponível no Swing.

Primeiramente você conhecerá alguns dos Contêineres Swing disponíveis, verá como se constrói um logo após você

4.2 Painel Tabulado (JTabbedPane)

(8)

Figura 4.1: Caixa de diálogo contendo Painel Tabulado Fonte: Captura de tela do Netbeans

No Netbeans, você clica e arrasta o componente Painel Tabulado para o seu fórmulário, e ele fica só como uma área para que você depois coloque quantos painéis (JPanel) você desejar.

(9)

Figura 4.2: Adicionando Painel ao um Painel Tabulado Fonte: Captura de tela do Netbeans

Depois disto, você pode alterar o nome do painel clicando com o botão direito e seleciona a opção Editar texto conforme a figura 4.3

Figura 4.3:Alterar o nome do painel Fonte: Captura de tela do Netbeans

(10)

4.3 Barra de Ferramentas (JToolBar)

Muitas aplicações possuem barras de ferramentas que possuem, na maioria das vezes, botões que servem de atalhos para as funcionalidades mais utilizadas.

Normalmente, você irá incluir botões (JButton), botões alternar (JToggleButton) e separador (JSeparator) todos dento da categoria de Controles Swing na janela Paleta do Netbeans.

É lógico que você poderá incluir qualquer outro componente que desejar, porém os três anteriores são os mais utilizados.

O JToolBar tem uma propriedade chamada floatable que permite que o

usuário arraste a barra de ferramentas livremente, se você não deseja este efeito, desmarque esta opção na janela Propriedades.

Uma outra propriedade muito utilizada é a rollover que faz com que as

bordas dos botões não sejam desenhadas e só apareçam quando o cursor do mouse está em cima do botão.

Muitas vezes, os botões que você adiciona na barra de ferramentas possuem figuras, ao invés de texto. Para fazer isto no Netbeans é muito fácil. Primeiro, você seleciona o botão e na janela Propriedades você clica nas reticências (...) ao lado da propriedade icon que abre a caixa de diálogo

(11)

Figura 4.4: Caixa de diálogo JButton - Icon Fonte: Captura de tela do Netbeans

Depois, você clica em Importar para o projeto e seleciona a imagem que você quer utilizar no seu botão. Depois, basta selecionar a imagem desejada, dentro da opção Imagem no projeto. Esta é uma opção melhor do que utilizar diretamente uma imagem externa, pois quando você for distribuir o seu projeto, os botões poderão ficar sem as imagens.

Normalmente, você só irá desejar mostrar a imagem no botão, então selecione a propriedade text e apague todo o texto que estiver nela.

Uma propriedade muito utilizada é a mnemonic, por exemplo, se você

(12)

A última propriedade de botão que normalmente é alterada, é a toolTipText

que faz com que dá uma dica sobre para que serve o botão quando o usuário passa o mouse por cima.

Saiba que a propriedade toolTipText também existe em muitos outros

componentes. Considere preencher esta propriedade para facilitar a utilização do usuário.

4.4 Painel da Área de Trabalho (JDesktopPane) e Quadro Interno

(JInternalFrame)

(13)

Para criar um formulário como este, você precisa arrastar um JDesktopPane para a área de desenho e depois arrastar quantos JInternalFrame você desejar para dentro do JDesktopPane que você adicionou inicialmente.

É necessário configurar os JInternalFrame através das propriedades closable (se pode ser fechada), iconifable (se pode minimizar para um ícone), maximizable (se pode ser maximizada), resizable (se pode ser redimensionada) e title (contendo o título da janela interna).

Se você executar uma aplicação assim, quando o usuário apertar CTRL+TAB ele pode alternar entre as janelas internas.

4.5 Painel em Camadas (JLayeredPane)

Este componente serve para você colocar vários painéis dentro dele, porém somente um deles é visível para o usuário.

Neste tipo de componente fica difícil a edição dentro da área gráfica, pois você irá querer adicionar vários painéis ao JLayeredPane ocupando a área máxima. Existe, portanto, uma maneira mais prática de criar o layout de cada um dos painéis.

Primeiramente, você adiciona o JLayeredPane ao seu formulário e faça ele ocupar toda a área desejada. Depois arraste um JPanel para dentro do JLayeredPane e faça ele ocupar toda a área do JLayeredPane.

(14)

JLayeredPane, portanto para adicionar o segundo JPanel você utiliza a janela Inspetor, clicando com o botão direito do mouse sobre o seu JLayeredPane (conforme figura 4.6).

Figura 4.6: Adicionando componente utilizando a janela Inspetor Fonte: Captura de tela do Netbeans

(15)

Figura 4.7: Segundo JPanel adicionado Fonte: Captura de tela do Netbeans

(16)

Figura 4.8: Layout do primeiro JPanel Fonte: Captura de tela do Netbeans

Observe que na figura 4.8, o jPanel1 (dentro da janela Inspector) está em negrito, e que o título da aba da área de edição está como “FormularioAvancado.java [jPanel1]”, indicando que você está apenas trabalhando com o primeiro painel.

(17)

Figura 4.9: Layout do formulário Fonte: Captura de tela do Netbeans

4.6 Campo de Senha (JPasswordField)

Este é um componente que você irá utilizar quando quiser que o usuário digite uma senha que não apareça na tela.

Você utiliza ele da mesma forma que um campo de texto (JTextField), porém, ao invés de utilizar o método getText() para recuperar o que o usuário digitou, é necessário utilizar o método getPassword().

(18)

Supondo que o seu campo de senha se chame pfSenha, a linha abaixo irá criar uma String senha com o conteúdo digitado pelo usuário:

String

senha

=

String.valueOf(pfSenha.getPassword());

Agora que você tem a senha como uma String, você pode então comparar com a resposta correta utilizando o método equals.

É interessante também apagar o texto existente na propriedade text do seu campo de senha na janela Propriedades.

4.7 Botão Alternar (JToogleButton)

O botão alternar tem dois estados (apertado e solto) indicando se uma certa funcionalidade está ativada, ou não.

Um exemplo bem comum deste tipo de botão é o que existe em editores de texto, que possui os botões Negrito, Itálico e Sublinhado. Se o botão estiver pressionado, então é porque esta característica está ativada.

Este tipo de botão possui a propriedade selected que você pode consultar

(19)

4.8 Área de Texto (JTextArea)

Este componente é indicado quando você deseja que o usuário possa digitar um textos mais longos que no caso o JTextField.

Ele possui barras de rolagem quando o texto não cabe na área reservada para ele. Elas aparecem automaticamente à medida que a pessoa digita o texto. Da mesma forma que o JTextField tem o campo text, portanto, você pode

utilizar os métodos getText e setText para acessar o seu conteúdo, ou alterá-lo.

4.9 Campo Formatado (JFormattedTextField)

Quando você quer que o usuário digite um texto com uma determinada máscara, então o JFormattedTextField é justamente o componente ideal para isto.

Depois de posicionar corretamente o campo formatado, é necessário

(20)

Figura 4.10: Caixa de diálogo formatterFactory

Fonte: Captura de tela do Netbeans

É possível ver pela figura 4.10 que existem várias máscaras pré-formatadas para você utilizar: número, data, hora, porcentagem, moeda e máscara. Agora, se você quiser que a máscara apareça no campo, então você deve configurar a sua própria máscara utilizando a última opção disponível na caixa de diálogo da figura 4.10.

3.40 Painel de Texto (JTextPane)

Um painel de texto é um componente que pode ser utilizado quando

deseja-se ter texto formatado com negrito, itálico, etc.

(21)

formatado, igual apareceria num navegador. Portanto, muitas vezes

são utilizados para exibir textos de ajuda (

help

) a partir de uma URL

(endereço da internet).

Outro uso deste componente, é quando você quer criar um campo

como sendo um editor de texto, porém não é trivial implementar e

integrar todos os comandos para que o usuário possa simplesmente

digitar texto e apertar CTRL+I (para itálico), CTRL+N (para negrito),

etc.

Portanto, se você precisar criar um editor é necessário você fazer uma

pesquisa mais detalhada neste componente.

O JTextPane é uma subclasse do JEditorPane especializado para

trabalhar com texto formatado. Se você simplesmente quiser exibir

uma página da web na sua aplicação, então existe o campo

page

do

JEditorPane que é utilizado para apontar para uma URL. Você poderia

colocar para testar a seguinte URL na propriedade

page

do seu

componente JEditorPane ou JTextPane:

http://download.oracle.com/javase/6/docs/api/javax/swing/JE

ditorPane.html

(22)

Figura 4.11: JEditorPane exibindo uma página da Internet Fonte: Captura de tela do Netbeans

4.11 Tabela (JTable)

(23)

Figura 4.12: Editor do Model de uma JTable Fonte: Captura de tela do Netbeans

Para acessar qualquer informação digitada na tabela você precisa

utilizar o seu

model

, da mesma maneira que você utilizou o

model

de

(24)

Se você quiser personalizar ao máximo a sua tabela, então será

necessário você pesquisar mais sobre tabelas, pois você teria que

implementar o seu próprio TableModel.

4.12 Menus

Para se ter menus na sua aplicação, você precisa utilizar os componentes disponíveis da janela Paleta do Netbeans (vide figura 4.13).

(25)

Primeiramente, você deve arrastar a Barra de Menu (JMenuBar) para o seu formulário e o seu formulário ficará como o exibido na figura 4.14.

Figura 4.14: Formulário com uma Barra de Menu Fonte: Captura de tela do Netbeans

(26)

Figura 4.15: Janela Inspetor

Fonte: Captura de tela do Netbeans

(27)

Figura 4.16: Edição da Barra de Menus Fonte: Captura de tela do Netbeans

Veja que na figura 4.16 os itens de menu Novo... e Salvar... já tem teclas de atalho (CTRL+N e CRTL+S, respectivamente), enquanto que as opções Abrir e Sair não possuem atalhos definidos.

(28)

Figura 4.17: Criando o evento actionPerformed de um item de menu

Fonte: Captura de tela do Netbeans

Saiba Mais

Vocês pode obter mais detalhes sobre Swing nos seguintes sites: http://download.oracle.com/javase/tutorial/ui/index.html http://download.oracle.com/javase/tutorial/uiswing/index.html http://www.metropoledigital.ufrn.br/aulas_avancado/web/disci plinas/desktop/index.html

(29)

RESUMO

Nesta aula você entrou em contato com inúmeros componentes Swing, porém aqui não foi possível entrar em todos os detalhes destes componentes, portanto, o interessante é que você viu como utilizar o Netbeans para criar estes componentes, e quais são algumas das propriedades que você precisa alterar. Se você desejar utilizar melhor algum destes componentes, foi dado referências sobre eles para que você possa aprofundar o seu conhecimento.

Atividades de aprendizagem:

1. Crie um aplicação no Netbeans que contenha pelo menos 4 dos componentes vistos nesta aula e ainda adicione um menu neste seu exercício.

2. Aprofunde o seu conhecimento sobre interfaces gráficas no site http://www.metropoledigital.ufrn.br/aulas_avancado/web/disciplinas/deskto p/index.html e realize alguns dos exercícios propostos de lá.

(30)

UNIDADE 5

5. APLICAÇÃO WEB I

Objetivos

Aprender a desenvolver aplicações para Web. Entender JSP.

Saber trabalhar com session.

5.1 Introdução

Nesta lição você irá aprender a desenvolver uma aplicação para web utilizando a tecnologia Java EE.

A linguagem de programação que você irá utilizar continua sendo o Java, porém você esta utilizando o Java SE (ou JDK) que é o kit de desenvolvimento Java com uma extensa API. O Java EE (de Enterprise Edition) é construído sobre o Java SE e oferece muitos componentes para o desenvolvimento de aplicações empresariais como JSP, Servlets, Enterprise JavaBeans (EJB), etc.

(31)

Você aprenderá como criar uma aplicação web utilizando as facilidades disponíveis na IDE Netbeans e utilizando o servidor de aplicações GlassFish.

5.2 JSP

JSP é uma sigla para Java Server Pages e serve para você desenvolver aplicações web. O JSP é similar ao ASP da Microsoft, só que ao invés de utilizar VB ou C# como linguagem de programação, o JSP utiliza Java. JSP permite que você misture código HTML com Java, portanto, para desenvolver páginas JSP é necessário que você conheça tanto HTML quanto Java.

Para executar uma página JSP é necessário um container web, que é um servidor de aplicações que entenda a especificação Java EE, como o GlassFish que você irá utilizar nestas aulas.

(32)

configurar nada a mais, pois você já terá o container web, servidor de banco de dados e tudo o que precisa para já testar a sua aplicação.

5.3 Criando uma Aplicação Web no Netbeans

Ao rodar o Netbeans 7 e criar um novo projeto: opção Novo projeto... do menu Arquivo, você deverá escolher uma Aplicação Web dentro da categoria Java Web (conforme figura 5.1).

Figura 5.1: Novo Projeto

(33)

Aperte no botão Próximo e escolha o nome da sua aplicação (vide figura 5.2). Se você quiser, é possível também alterar o diretório onde você irá salvar o seu arquivo. Marque a opção Configurar como projeto principal, se ele já não estiver marcado.

Figura 5.2: Nova Aplicação Web (Tela 1 de 3) Fonte: Captura de tela do Netbeans

(34)

Figura 5.3: Nova Aplicação Web (Tela 2 de 3) Fonte: Captura de tela do Netbeans

(35)

Você deverá ver a tela do Netbeans conforme a figura 5.5. Se por acaso, você não estiver vendo alguma das janelas, é possível habilitá-las no menu Janela do Netbeans.

Observe que na janela Projetos, além de Pacotes de código-fonte, apareceu um novo item chamado Páginas Web, que é onde estarão todas as páginas web da sua aplicação. Existe uma pasta chamada WEB-INF que contém arquivos de configuração e as classes compiladas da sua aplicação. Você pode ver que a primeira página, chamada index.jsp já foi criada e possui um pequeno código padrão.

(36)

Agora, você irá alterar o código da JSP index.jsp para criar a sua aplicação Olá Mundo, conforme exibido na figura 5.6. O arquivo index.jsp é executado automaticamente pelo servidor de aplicação quando na URL só tem o nome da pasta. Se você clicar no botão Executar projeto principal... (ou a tecla F6), você poderá ver o resultado da sua aplicação web.

Figura 5.6: Código do Olá Mundo! Fonte: Conteudista

(37)

Figura 5.7: Janela Saída do Netbeans ao executar a aplicação pela primeira vez

Fonte: Captura de tela do Netbeans

(38)

Figura 5.8: Aplicação Olá Mundo! sendo executada Fonte: Captura de tela do Chrome

5.4 Avaliando Expressões Java

(39)

Figura 5.9: Código do Olá Mundo com data Fonte: Captura de tela do Netbeans

Agora, se você executar a sua aplicação novamente (tecla F6), então você verá que também será mostrada a informação da data e hora do sistema (vide figura 5.10). Se você executar novamente, então aparecerá uma nova página, onde pelo menos os segundos são diferentes.

(40)

Uma outra expressão que você pode tentar é “(int) (Math.random() * 6) + 1” (sem as aspas), que irá exibir cada vez que a aplicação for executada (teste clicando no botão de atualizar do seu navegador) um valor entre 1 e 6, como se fosse um dado.

5.5 Scriptlets

Além de exibir expressões Java utilizando <%= %>, é possível escrever qualquer código Java dentro de uma página JSP com scriptlets, que é um bloco de código Java dentro de <% %>.

Observe na figura 5.11 um novo código, onde dentro do scriptlet é declarada e inicializada uma variável do tipo Random (veja a linha 12), e depois é avaliada a expressão utilizando esta variável (veja a linha 16).

(41)

Ao executar esta nova versão da página index.jsp você verá o resultado conforme o exibido na figura 5.12.

Figura 5.12: A visualização da página index.jsp no navegador Fonte: Captura de tela do Chrome

(42)

Figura 5.13: Código fonte da página index.jsp que o navegador recebeu Fonte: Captura de tela do Chrome

5.6 Execução de uma Página JSP

Para você entender melhor o que acontece quando uma página JSP é solicitada ao servidor web, veja o seu funcionamento na figura 5.14.

(43)

Figura 5.14:Execução de uma página JSP

Fonte: Captura de tela do Netbeans

O seu código JSP não é um programa em si, pois ele não tem um método main, portanto ele precisa rodar dentro de um container web.

O GlassFish que é um container web internamente gera um arquivo .java para cada arquivo .jsp solicitado, compila e então executa. Este código .java gerado é um Servlet que é um componente do lado do servidor que trata das requisições para as aplicações web.

O Servlet é gerado na primeira solicitação de uma página .jsp, é então compilado e depois executado. Porém, da segunda solicitação em diante, o Servlet é apenas executado, fazendo com que ele seja mais eficiente.

(44)

da página index.jsp na janela Projetos e selecionar a opção Visualizar servlet. Você pode visualizar um trecho do código do servlet na figura 5.15.

Figura 5.15: Trecho de código do servlet da página index.jsp Fonte: Captura de tela do Netbeans

(45)

Depois você entenderá melhor sobre servlets para poder criar os seus próprios, porém agora você viu que existe o objeto out já instanciado e pronto para ser utilizado. Saiba que existem outros objetos que você pode utilizar dentro de uma página JSP. Eles serão detalhados nas próximas seções.

5.7 Escopo de Objetos

Quando você começar a criar aplicações web um pouco mais complexas, você verá que são necessárias várias páginas .jsp e/ou servlets para executar uma requisição do usuário.

Neste contexto, vários objetos são criados e você precisa saber como reutilizar os objetos criados em uma página numa outra página.

Os escopos disponíveis são: page, request, session e application. Estes escopos estão ordenados do mais restrito ao mais abrangente.

Veja a seguir os significados destes escopos:

page  objetos associados a este escopo só podem ser utilizados na mesma página em que foram criados.

request  objetos associados a este escopo só podem ser utilizados por páginas que processam o mesmo request (solicitação).

(46)

application  objetos associados a este escopo podem ser utilizados em qualquer página dentro da mesma aplicação em que foram criados.

5.8 Objetos Disponíveis numa Página JSP

Os seguintes objetos já foram pré-definidos e são de bastante utilidade quando você precisa escrever uma página JSP. A seguir você tem o nome do objeto (seu tipo):

application (javax.servlet.ServletContext): é o objeto ServletContext associado com o contexto da aplicação (escopo application).

config (javax.servlet.ServletConfig): é o objeto ServletConfig associado com esta página (escopo page).

exception (java.lang.Throwable): é o objeto que permite acessar os dados da exceção pela página JSP (escopo page).

out (javax.servlet.jsp.JspWriter): é o objeto utilizado para enviar a saída para o cliente (escopo page).

(47)

pageContext (javax.servlet.jsp.PageContext): encapsula as características específicas de servidor, isto é, dependente do servidor utilizado (escopo page).

request (javax.servlet.ServletRequest): é o objeto ServletRequest associado com esta solicitação (escopo request).

response (javax.servlet.ServletResponse): é o objeto ServletResponse associado com resposta ao cliente (escopo page). session (javax.servlet.http.HttpSession): é o objeto HttpSession associado com esta solicitação (escopo session).

Saiba Mais

(48)

http://download.oracle.com/javaee/6/api/javax/servlet/ServletRe quest.html

http://download.oracle.com/javaee/6/api/javax/servlet/ServletRe sponse.html

http://download.oracle.com/javaee/6/api/javax/servlet/http/HttpS ession.html

5.9 Scriptlets e HTML

Você pode utilizar código Java como for, while e if, por exemplo, em conjunto com código HTML. Pode parecer um pouco estranho, mas um trecho de código Java, pode estar dividido em vários scriptlets.

(49)

Figura 5.16: Misturando scriptlets com HTML Fonte: Conteudista

(50)

de compilação se você esquecer um fecha-chaves, por exemplo. Portanto, escrever códigos com corretas indentações se tornam essenciais para um bom entendimento do seu código.

(51)

5.10 Diretivas

É possível importar classes de outros pacotes para não ficar utilizando os nomes completos das classes, como java.util.Date ou java.util.Random. Para isto é necessário utilizar uma diretiva JSP dentro de <%@ %>.

As diretivas disponíveis são:

include – utilizada para incluir o conteúdo de um outro arquivo dentro da página JSP atual, esta inclusão ocorre estaticamente no momento da compilação da página JSP, então alterações futuras na página sendo incluída, o resultado não se reflete na página JSP até que ela seja recompilada;

page – utilizada para configurar várias opções para uma página JSP e também importar classes e pacotes;

taglib – utilizada para incluir uma biblioteca de tags para ser utilizada na página atual.

Para importar a classe java.util.Random e não precisar mais utilizá-la com o seu nome completo dentro de páginas JSP, inclua a seguinte linha no início do arquivo .jsp:

<%@page import="java.util.Random"%>

Para incluir um arquivo HTML dentro de uma página JSP você deverá utilizar a diretiva include que irá incorporar todo o texto do arquivo teste.html:

(52)

Você deve colocar este comando no ponto exato do seu arquivo que você deseja incluir o texto inteiro que está contido no arquivo teste.html.

5.11 Declarações

Como você viu, toda página JSP se tornará um servlet, portanto, se você quiser declarar algum atributo ou método a este servlet é possível fazer isto através de uma declaração utilizando <%! %>.

Veja, por exemplo, a declaração do atributo privado r utilizado nos exemplos anteriores:

<%!

private Random r = new Random(); %>

Agora, a variável local r, na realidade virou o atributo r ele será compartilhado por todas as instâncias do servlet gerado, isto é, se você tiver 10 pessoas diferentes acessando a mesma página JSP, então apenas um único objeto Random é criado e ele é compartilhado por todas estas 10 instâncias da página JSP.

(53)

5.12 Tag <jsp:forward>

Essa tag é utilizada quando você quiser redirecionar para uma nova página HTML, JSP ou servlet, sem que o usuário que fez a solicitação saiba, pois no navegador ainda permanece o endereço antigo.

Normalmente ela é utilizada para não precisar implementar todos os casos em uma única página, como por exemplo: você tem uma página para a pessoa entrar no sistema digitando um nome e senha, então existe a possibilidade de dar certo ou errado este login, portanto se não existisse esta opção, você teria que criar uma página JSP que tratasse os dois casos, o que complicaria o código.

A sintaxe abaixo serve para quando você tem uma página que não recebe parâmetros:

<jsp:forward page="novaURLrelativa" />

Já, se a página precisa receber parâmetros, então você tem a opção de utilizar a seguinte sintaxe:

<jsp:forward page="novaURLrelativa" >

<jsp:param name="nomeParametro"

value="valorParametro" />

</jsp:forward>

(54)

5.13 Tag <jsp:include>

Essa tag é utilizada quando você quiser incluir tanto conteúdo estático, quanto dinâmico, numa página JSP. Para o <jsp:include> fica transparente se o conteúdo a ser incluído é estático, ou dinâmico, o que o torna muito útil quando você não sabe qual o tipo do conteúdo que você deseja incluir. A sintaxe abaixo serve para quando você tem uma página que não recebe parâmetros:

<jsp:include page="novaURLrelativa" flush="true" />

Já, se a página precisa receber parâmetros, então você tem a opção de utilizar a seguinte sintaxe:

<jsp:include page="novaURLrelativa" flush="true" >

<jsp:param name="nomeParametro"

value="valorParametro" />

</jsp:include>

Da mesma forma que o <jsp:forward>, você pode ter tantos parâmetros, quantos forem necessários.

(55)

5.14 Exemplo

Agora, você verá um exemplo bem simples. Você terá uma tela para informar o nome e a idade de uma pessoa e irá exibir estas informações em outra página JSP utilizando o objeto implícito session.

Você terá quatro páginas JSP para este exemplo: cadastro.jsp, processamento.jsp erro.jsp e exibicao.jsp.

Para criar uma página JSP, você clica com o botão direito sobre Páginas Web do Netbeans, seleciona a opção Novo  JSP. Você verá uma caixa de diálogo como a da figura 5.18, onde você preencherá com o nome da página JSP, neste caso, cadastro.

(56)

Quando você apertar o botão Finalizar, você terá uma tela como a da figura 5.19, onde você irá alterar o título da página e o cabeçalho H1. Observe que na linha 16 tem uma linha em branco que é onde você irá incluir o formulário web para digitar as informações e submeter às informações inseridas pelo usuário.

Figura 5.19: Versão inicial de cadastro.jsp Fonte: Captura de tela do Netbeans

Do lado direito da figura 5.19 você visualiza a janela Paleta que contém elementos HTML e formulários HTML para facilitar a escrita da sua página JSP. Você irá incluir na linha 16 um Formulário (dentro da categoria Formulário HTML). Para fazer isto, você pode clicar e arrastar para a linha desejada, ou posicionar o cursor na linha 16 e dar um clique duplo sobre o item Formulário.

(57)

Figura 5.20: Caixa de diálogo Inserir Formulário Fonte: Captura de tela do Netbeans

Ao apertar o botão OK, aparecerá no seu código o seguinte código

<form action="processamento.jsp" method="POST">

</form>

(58)

Figura 5.21: Caixa de diálogo Inserir Formulário Preenchida

Fonte: Captura de tela do Netbeans

(59)

Agora, você irá incluir os textos Nome e Idade na primeira coluna e dois campos de textos chamados nome e idade na segunda coluna. Para incluir o campo de texto, utilize o item Entrada de texto da janela Paleta. Veja a caixa de diálogo para o campo nome na figura 5.23.

Figura 5.23: Caixa de diálogo Inserir Entrada de Texto Fonte: Captura de tela do Netbeans

(60)

Figura 5.24: Caixa de diálogo Inserir Button Fonte: Captura de tela do Netbeans

(61)

Figura 5.25: Página cadastro.jsp

Fonte: Conteudista

(62)

Figura 5.26: Página cadastro.jsp no navegador Fonte: Captura de tela do Chrome

(63)

Ainda no código da figura 5.27, você pode ver nas linhas 8 e 9 que está sendo armazenada na variável session o nome e a idade desta pessoa. Como o escopo é de sessão, então, enquanto o usuário estiver com o navegador aberto e interagindo com a sua aplicação web, você estará armazenando estas informações do usuário.

Na linha 6, quando é feita a conversão de String para int pode acontecer um erro que está sendo tratado pelo catch da linha 11 (NumberFormatException), e neste caso você está encaminhando para a página erro.jsp passando o parâmetro msg utilizando o método GET (através da própria URL). O comando pageContext.forward tem a mesma funcionalidade da tag <jsp:forward>, porém utilizando o código Java, ao invés de utilizar tag. Observe que se você quisesse utilizar a tag, precisaria fechar o scriptlet e depois abrir novamente.

(64)

Figura 5.27: Página processamento.jsp Fonte: Conteudista

(65)

Figura 5.28: Página erro.jsp Fonte: Conteudista

Nesta página, você recupera os atributos armazenados no objeto session, porém como tudo que é armazenado na session é visto como Object (isto é conveniente, pois você pode armazenar qualquer tipo de dado na session), você precisa converter para o tipo correto (vide linhas 3 e 4 da figura 5.29). Tudo que foi armazenado com o método setAttribute é recuperado como o método getAttribute.

Todo tipo de dado primitivo armazenado na session é convertido para o tipo objeto correspondente, portanto a idade que é do tipo int foi convertida automaticamente para o tipo Integer. Então, na hora de recuperar a idade, você recebe um objeto do tipo Integer e extrai o valor do tipo int dele através do método intValue().

(66)

Figura 5.29: Página exibicao.jsp Fonte: Conteudista

Você deve agora codificar este exemplo inteiro e testar vários casos de cadastros com e sem sucesso.

Agora, você entendeu como você pode criar uma formulário onde o usuário pode digitar informações, recuperar estas informações em outra página, e como utilizar o objeto session para armazenar dados que serão utilizados em várias páginas JSP.

(67)

Saiba Mais

Vocês pode obter mais detalhes sobre JSP e Java EE nos seguintes sites:

http://download.oracle.com/javaee/6/tutorial/doc/index.html http://www.metropoledigital.ufrn.br/aulas_avancado/web/disciplina s/desenv_web/index.html

http://netbeans.org/kb/trails/java-ee_pt_BR.html http://www.oficinadanet.com.br/artigo/1687/mvc_-_o_padrao_de_arquitetura_de_software

http://www.jsptut.com

http://javafree.uol.com.br/artigo/868717/JSP-Java-Server-Pages.html

Atividades de aprendizagem:

1. Altere o exemplo da seção 5.14 para que tenha também os campos

telefone e sexo, e que exista um link da página de exibição para a página

de cadastro.

2. Aprofunde o seu conhecimento sobre JSP no site

http://www.metropoledigital.ufrn.br/aulas_avancado/web/disciplinas/desenv_

(68)

RESUMO

Nesta aula você aprendeu como utilizar o Netbeans para criar rapidamente uma aplicação web com o seu servidor embutido GlassFish. Também aprendeu o básico de JSP para criar páginas dinâmicas, e viu como é fácil misturar código Java com HTML.

(69)

UNIDADE 6

6. APLICAÇÃO WEB II

Objetivos

Utilizar beans para agilizar o processamento. Aprender sobre o padrão MVC.

Saber criar servlets.

6.1 Introdução

Você aprendeu o básico de JSP para desenvolver uma aplicação web, porém se você não tomar cuidado com o código que você desenvolver, ele ficará muito difícil de dar manutenção e estender.

Agora você irá aprender como desenvolver os seus beans que facilitará a comunicação entre os componentes da sua aplicação web.

(70)

6.2 JavaBeans

JavaBeans são classes Java que você já conhece que seguem algumas convenções. Eles são feitos de forma a poderem ser utilizados em aplicações gráficas, de maneira similar como o Netbeans deixa você acessar graficamente as propriedades dos componentes swing que você utilizou nos capítulos 3 e 4.

JavaBeans precisam ser serializáveis, ter o construtor padrão e oferecer métodos get e set para acessar os seus atributos (propriedades).

Portanto, praticamente todas as classes básicas que você já criou estão dentro do padrão JavaBenas (com exceção de implementar a interface java.io.Serializable).

O exemplo passado, onde o usuário digita o seu nome e idade no formulário web mostra que você precisa ficar solicitando cada parâmetro individualmente, e depois armazenar item por item na variável session. Imagine agora, se no seu formulário você tivesse 20 campos, ao invés de 2 campos, o trabalho iria ser muito grande, tanto para armazenar, quanto para recuperar depois.

Então, é possível utilizar um Bean para realizar este trabalho. Veja na figura 6.1 o código do BeanPessoa. Veja que é apenas uma classe como qualquer outra que tenha o construtor padrão e get e set para os seus atributos.

(71)

Figura 6.1: Código da classe BeanPessoa Fonte: Conteudista

Agora, você poderá utilizar este bean dentro das suas páginas JSP utilizando a tag <jsp:useBean> que possui a seguinte sintaxe:

<jsp:useBean id= "nomeDaInstância" scope = "escopo"

class = "classe do seu bean"/>

O comando anterior localiza, e se não achar, instancia um bean com o nome e escopo desejado. O escopo é um daqueles visto na seção 5.8. Esta tag também é utilizada em conjunto com a <jsp:getProperty> e <jsp:setProperty>.

(72)

<jsp:getProperty name=" nomeInstância "

property="nomeProp" />

A sintaxe da tag <jsp:setProperty> é uma das três seguintes:

<jsp:setProperty name="nomeInstância" property="*"

/>

<jsp:setProperty name="nomeInstância"

property="nomeProp" />

<jsp:setProperty name="nomeInstância"

property="nomeProp"

value="novoValorPropriedade" />

A primeira sintaxe, você deve utilizar quando quiser alterar automaticamente todas as propriedades de um bean a partir dos parâmetros recebidos pela página atual. A segunda sintaxe, é utilizada quando você quiser alterar uma propriedade específica de um bean a partir do parâmetro recebido pela página atual. A terceira e última sintaxe deve ser utilizada quando você quiser alterar uma propriedade do seu bean com um valor que você (programador) desejar.

(73)

6.3 Exemplo (Segunda Versão)

Agora, você verá como o exemplo da seção 5.14 deve ser alterado para utilizar o BeanPessoa que foi criado e utilizar estes novos comandos.

A página JSP cadastro.jsp continua inalterada. Veja na figura 6.2 o código da página processamento.jsp para verificar as alterações.

Figura 6.2: Página processamento.jsp Fonte: Conteudista

Como agora você não pode utilizar a cláusula try/catch para a tag <jsp:setProperty>, é necessário informar qual a página de erro deverá ser chamada automaticamente, caso aconteça qualquer erro no processamento da página atual. Você faz isto, incluindo a página de erro no atributo errorPage da diretiva @page (veja linha 1 da figura 6.2).

A primeira vez que esta página for chamada na sessão do usuário a linha 2 da figura 6.2 fará com que o bean pessoa seja instanciado, porém nas próximas execuções, ele simplesmente será recuperado da sessão.

(74)

mais propriedades do que as que vieram como parâmetros, elas ficarão sem inicialização.

Na figura 6.3 você pode observar que na linha 2 é utilizado o comando para recuperar o bean pessoa. Depois disto, você pode utilizar a variável pessoa normalmente (como na linha 15) ou você pode ter acesso à um valor deste bean utilizando <jsp:getProperty> (vide linha 19).

Apesar do código da linha 19 ser maior que o da linha 15, ele é mais parecido com o código HTML.

Figura 6.3: Página exibicao.jsp Fonte: Conteudista

(75)

para você recuperar a exceção original, você deve utilizar o método getCause() duas vezes (vide linha 11).

Figura 6.4: Página erro.jsp Fonte: Conteudista

A linhas de 12 a 16 da figura 6.4 apresenta o que será exibido para o usuário. Se o erro for do tipo NumberFormatException, será exibida uma mensagem mais fácil do usuário entender (vide linha 13), do que simplesmente imprimir a mensagem encapsulada na exceção. Porém, se for uma outra exceção, que não estava prevista, então é exibida a mensagem padrão da exceção (vide linha 15).

Observe que as linhas 13 e 15 estão utilizando o objeto implícito out para não precisar fechar o scriptlet e depois abrir novamente outro scriptlet. Neste caso, você precisa criar uma String com o código HTML dentro do método out.println().

(76)

páginas de erros, e aí o seu código não precisa ser tão genérico, pode ser mais específico e assim, mostrar mensagens mais personalizadas para o usuário.

Uma outra opção é enviar parâmetros à página de erro utilizando o método GET ao definir a página de erro na diretiva @page.

6.4 Servlets

Você já viu que toda página JSP internamente é um servlet que é gerado automaticamente pelo container web. Agora, você irá aprender como escrever o seu servlet.

Na realidade um servlet é uma classe Java que estende a capacidade do servidor para atender às requisições HTTP. Isto é, quando o usuário digita o endereço da sua aplicação web num navegador de internet, a sua aplicação precisa responder a esta solicitação, e a classe Java responsável por atendê-la é o servlet.

(77)

Figura 6.5: Caixa de diálogo Novo Servlet (tela 1 de 2) Fonte: Captura de tela do Netbeans

(78)

Figura 6.6: Caixa de diálogo Novo Servlet (tela 2 de 2) Fonte: Captura de tela do Netbeans

Note que existe 3 nomes diferentes para o servlet: o nome da classe, o nome do servlet e a URL para acessar o servlet. Elas podem ser iguais, porém o comum é que elas sejam diferentes, pois os usuários não devem saber como é que são os nomes internos dos seus servlet, nem a estrutura de diretório onde eles estão salvos, para não conseguir hackear a sua aplicação facilmente.

(79)

Figura 6.7: Janela Projetos do Netbeans Fonte: Captura de tela do Netbeans

(80)

Figura 6.8: Código do ServletAloMundo gerado automaticamente Fonte: Captura de tela do Netbeans

(81)

Figura 6.9: Execução do ServletAloMundo Fonte: Captura de tela do Chrome

Observe na figura 6.9 que a URL no navegador é

http://localhost:8080/Primeira_Aplicacao_Web/OlaMundo, indicando que o seu servlet é executado sempre que for solicitado o endereço OlaMundo da aplicação Primeira_Aplicacao_Web. Perceba que ninguém sabe pelo endereço que o seu servlet se chama ServletAloMundo e que ele está no pacote servlets.

Você pode então alterar o código para deixar ele de acordo com o da figura 6.10.

Figura 6.10: Trecho de código do ServletAloMundo Fonte: Conteudista

(82)

internet que contém a página aberta (vide figura 6.9), que o container web (neste caso, o GlassFish) recompila o servlet e já exibe a nova versão da página.

Note que para gerar uma página web com as mesmas informações em JSP seria muito mais fácil do que ficar utilizando o tempo inteiro o objeto implícito out. Por isso, que os servlets normalmente não são utilizados para exibição de conteúdo, eles são utilizados para receber as requisições HTTP (com ou sem parâmetros), fazer o processamento (chamando as suas classes de negócio apropriadas para isso) e redirecionar para uma página JSP que fará a exibição do resultado para o usuário.

(83)

Figura 6.11: Caixa de Diálogo para criação do ServletProcessamento

(tela 1 de 2)

(84)

Figura 6.12: Caixa de Diálogo para criação do ServletProcessamento

(tela 2 de 2)

Fonte: Captura de tela do Netbeans

(85)

Figura 6.13: Código do ServletProcessamento Fonte: Conteudista

Os servlets não tem os objetos implícitos que você viu que as páginas JSP possuem, portanto, você não pode utilizar pageContext.forward(...). Você precisa utilizar um objeto do tipo RequestDispatcher para realizar a tarefa de fazer o forward para uma página JSP (vide linhas 38 a 40 da figura 6.13). Também, não é possível salvar todos os parâmetros diretamente no bean, como é possível numa página JSP (a não ser que você utilize um framework como o spring ou struts), portanto veja nas linhas de 29 a 34, como é feita a recuperação dos parâmetros, alterando as propriedades do bean e salvando ele na session (que no servlet precisa ser solicitado a partir do objeto request – linha 34).

(86)

A página erro.jsp precisa voltar a ter o código da exibido na figura 5.28, pois ela precisa exibir a mensagem recebida como parâmetro, ao invés de capturar a exceção.

Observe que como o servlet está encaminhado a requisição para uma página JSP, então ninguém sabe o nome real da página que está exibindo os dados, e isto não é interessante. Portanto, ao invés de utilizar o forward é melhor utilizar o redirect, conforme exibido na figura 6.14.

Figura 6.14: Código do ServletProcessamento Fonte: Conteudista

Existe mais uma diferença, não é mais possível utilizar o caminho absoluto “/” antes dos nomes das páginas JSP, pois o redirect não está restrito ao contexto da sua aplicação, como o forward.

Saiba Mais

(87)

http://www.rponte.com.br/2008/07/12/repitam-comigo-redirect-nao-e-forward/

http://www.mhavila.com.br/topicos/web/http_mime.html#redi rect

A aplicação desenvolvida até o momento, já está se estruturando de

uma forma que existe uma separação entre o código para processar o

que está sendo requisitado pelo usuário e o código utilizado para

exibir páginas web. Na seção a seguir você entenderá melhor como

realizar a separação de códigos (de forma similar à que você fez

utilizando arquitetura em camadas) ao desenvolver uma aplicação

web.

6.5 Padrão MVC

Como você viu no exemplo anterior, normalmente você possui

páginas JSP que não possuem código Java (ou melhor, tem pouco

código Java) e servlet que não tem nenhum código HTML (ou o

mínimo possível).

(88)

model (modelo): responsável pelas regras de negócio da sua

aplicação;

view (visão): cria a interface com o usuário exibindo os dados

provenientes do modelo;

controller (controlador): recebe as requisições do usuário, dispara

as ações necessárias utilizando as classes do seu modelo, e finalmente redireciona para uma página da view para exibir a resposta ao usuário.

O exemplo anterior utilizando servlet já está utilizando esta

arquitetura MVC, onde o model é representado por BeanPessoa,

enquanto que o ServletProcessamento é o controller e as páginas

cadastro.jsp, exibicao.jsp e erro.jsp são as views.

Se você tiver a sua aplicação dividida em camadas, como visto na

disciplina Linguagem de Programação I, você poderá reutilizar as

camadas de negócio e de dados como sendo o model, e precisará

implementar os componentes da view e do controller.

(89)

6.6 Exemplo MVC

Crie uma nova aplicação web no Netbeans chamada Segunda

Aplicacao Web. Veja na figura 6.15 a estrutura do projeto e todas as

páginas e classes que ele contém.

(90)

6.6.1 Classes do Modelo

Primeiramente, o modelo é composto por duas classes Pessoa e

Sistema. Na figura 6.16 você pode ver o código da classe Pessoa e na

figura 6.17 o da classe Sistema.

(91)

Figura 6.17: Classe Sistema Fonte: Conteudista

(92)

reinicializada (isto ocorre quando um servlet ou página JSP é alterada,

ou o container web é reiniciado).

6.6.2 Controlador

O controlador é responsável por receber as requisições do usuário,

realizar a ação requerida e enviar para a página JSP correspondente

para exibir a resposta ao usuário.

(93)

Figura 6.18: Método processRequest do Servlet Controlador Fonte: Conteudista

Preste atenção aos seguintes pontos no código da figura 6.18:

(94)

O servlet recebe o parâmetro acao que indica a operação que ele deve realizar (linhas 28, 30, 32, 36), e as variáveis forward e paginaJSP são preenchidas de acordo com a ação desejada;

Normalmente operações que alteram o estado do modelo (neste exemplo, apenas o cadastramento) devem utilizar redirect, pois se o usuário apertar no botão de atualizar do navegador, não deseja-se disparar novamente o cadastramento da mesma pessoa;

Nas operações que não alteram o estado do model, utiliza-se o forward, pois se o usuário apertar o botão de atualizar do navegador várias vezes, apenas a exibição é repetida;

Veja nas linhas de 37 a 48 a sequência de comandos para executar o cadastramento de uma pessoa: 1) pega os parâmetros nome e idade; 2) confere se o nome está ok, e converte a idade para número; 3) pega a instância única do sistema; 4) cria um objeto Pessoa e inicializa ele com os parâmetros recebidos; 5) cadastra a pessoa no sistema e 6) define que irá redirecionar e indica a página

“controlador?acao=exibir”, neste caso;

(95)

Neste exemplo simples, só existe um servlet controlador, porém numa

aplicação maior, você terá apenas um servlet geral que receberá as

ações do usuário e irá fazer um forward para os servlets que realmente

irão executar as solicitações do usuário.

Existirão, dois tipos de servlets: os de tarefas e os de página. Os

primeiros realizam tarefas que alteram o seu modelo (cadastrar,

alterar, excluir, ...), e assim, precisam utilizar redirect e os últimos

executam operações que só faz consulta ao modelo, e utilizam

forward.

6.6.3 Visão

As páginas JSP que fazem parte deste componente são: index.jsp (na

pasta principal do projeto) e cadastro.jsp, erro.jsp e exibicao.jsp

(dentro da pasta WEB-INF).

(96)

Figura 6.19: Página index.jsp Fonte: Conteudista

(97)

Figura 6.20: Página cadastro.jsp

Fonte: Conteudista

(98)

Figura 6.21: Página erro.jsp

Fonte: Conteudista

(99)

Figura 6.22: Página exibicao.jsp

Fonte: Conteudista

6.7 Estudos Futuros

(100)

Outros padrões de projetos que é interessante você estudar são: factory, abstract factory e DAO (data access object), e assim deixar a sua aplicação ainda mais reusável e fácil de desenvolver.

Já existe a versão Java EE 6 que ainda incorpora mais recursos ao desenvolvimento web, também é preciso estudar as chamadas tag libraries, JSF e Unified Expression Language.

Portanto, saiba que estas duas unidades semanais foram apenas a sua introdução a este assunto tão extenso que é o desenvolvimento de aplicações web em Java.

Outros recursos que você também precisa aprender incluem: javascript, AJAX, jQuery, etc.

Saiba Mais

Vocês pode obter mais detalhes sobre JSP e Java EE nos seguintes sites:

(101)

http://javafree.uol.com.br/artigo/868717/JSP-Java-Server- http://www.javasimples.com.br/spring-2/spring-framework-parte-1-dependency-injection/

Atividades de aprendizagem:

1. Desenvolva uma pequena aplicação web de uma agenda

telefônica utilizando o padrão MVC e armazenando os dados em

banco de dados através de JDBC.

2. Estude mais sobre o framework Spring e altere a aplicação web do

(102)

RESUMO

(103)

REFERÊNCIAS

[1] DEITEL, Harvey M.; DEITEL, Paul J.. Java, como programar. 8. ed. Prentice Hall Brasil, 2010.

[2] MECENAS, I. J. Java 6 - Fundamentos, Swing, Bluej E Jdbc. 3. ed. Starlin Alta Consult, 2008.

[3] HORSTMANN, Cay S.; CORNELL, Gary. Core Java, V.1 -

Fundamentos. 8. ed.Prentice Hall Brasil, 2009.

[4] ______. The Java Tutorials. Disponível em http://download.oracle.com/javase/tutorial/. Atualizado em 17/03/2011. Acessado em 16/04/2011.

[1] JANDL JUNIOR, P. Desenvolvendo Aplicações Web com JSP e

JSTL. 1. ed. Novatec, 2009.

[2] BASHAM, B. Use a Cabeça! Servlets e JSP. 2. ed. Starlin Alta Consult, 2008.

[3] GONÇALVES, E. Desenvolvendo Aplicações Web com JSP,

Servlets, JavaServer Faces, Hibernate, EJB 3 Persistence e AJAX.

1. ed.Ciência Moderna, 2007.

(104)

Imagem

Figura 4.4: Caixa de diálogo JButton - Icon
Figura 4.6: Adicionando componente utilizando a janela Inspetor
Figura 4.7: Segundo JPanel adicionado
Figura 4.9: Layout do formulário
+7

Referências

Outline

Documentos relacionados

Na Universidade de São Paulo (USP), uma coleta de lixo eletrônico foi feita por funcionários do Centro de Computação Eletrônica (CCE) e o resultado foram 5 toneladas de

Com base em uma concepção de formação integral, analisam a práxis e formação política de trabalhadores, as contradições da educação em cursos de formação

Origem do direito tributário; origens das receitas públicas e sua classificação atual: o sistema constitucional brasileiro consoante reforma tributária do ano de

Esses dados revelam a fragilidade do Parque Nacional de Ilha Grande frente aos incêndios florestais e são suficientes para alertar sobre a importância do problema do fogo em

que a população tem direito, como Transportes da Secretaria de Saúde o Ambulâncias Novas, UTI Móvel, Veículos senhor Francisco Belinho de Almeida, o para o Transporte de

A responsabilidade pela coordenação do processo de seleção no campus ficará a cargo do servidor de referência, o qual deverá encaminhar à PRAEC, via Sistema Eletrônico

[r]

Por motivos alheios ao ADMINISTRADOR ou ao GESTOR, tais como moratória, inadimplência de pagamentos, fechamento parcial ou total dos mercados, inexistência de liquidez