Prof.ª Daniela Barreiro Claro A API JavaServlet é uma extensão da plataforma Java que permite que os desenvolvedores adicionem, nos servidores Web, mecanismos que estendam sua funcionalidade. Um servlet pode ser visto como uma applet que roda no lado do servidor Comparado com o Netscape’s NSAPI, Microsoft’s ISAPI, ou Módulos Apache Independente de plataforma Independente de Servidor Um servlet pode fornecer vários serviços ao servidor Web como por exemplo: ◦ ◦ ◦ ◦ ◦ processar formulários de pedido; persistência de conexões HTTP; acesso a Banco de Dados; envio de e-mails automáticos; compatibilidade com vários protocolos (HTTP, URL, FTP) Web Server HTTP Request Browser MeuServlet.class MeuServlet.class HTTP Response Página html Servlet Engine Java Virtual Machine Os servlets oferecem várias vantagens sobre as aplicações baseadas em CGI, entre as quais podemos destacar: ◦ ◦ ◦ ◦ Independência de plataforma; performance; extensibilidade; facilidade de desenvolvimento; Independência de Plataforma ◦ Os Servlets podem rodar em qualquer plataforma sem serem reescritos e até mesmo compilados novamente. ◦ Os servlets podem ser executados em vários sistemas operacionais (Linux, AIX, Ubuntu, Solaris) utilizando um grande número de servidores Web com acesso a vários tipos de bancos de dados. Desempenho ◦ Um novo programa CGI é carregado para cada requisição ao servidor. Um Servlet é carregado apenas uma vez e para cada nova requisição este Servlet gera uma nova thread. ◦ O método init() da Servlet, assim como nas Applets, ocorre apenas na primeira vez que a classe é carregada. Extensibilidade ◦ Com Java pode-se criar aplicações muito mais modulares, tirar todo o proveito da orientação a objetos e utilizar o grande número de APIs disponíveis. ◦ Utilizar outros recursos do Java, sendo o JavaMail, além do JavaIDL, etc Servlets podem ser executados no mesmo processo do Servidor que o servidor HTTP Pode suportar uma maior quantidade de usuários logados utilizando menos recursos da máquina Servlets podem ser carregados de vários lugares: ◦ Máquina do Servidor ◦ Sites remotos Servlets não disparam um novo processo para cada requisição Características ◦ Baseada na linguagem JAVA ◦ Não há dialetos diferentes nas linguagens de desenvolvimento para bases de dados diferentes ◦ Orientado a objetos ◦ Facilitam a prática da reutilização de código Servlets podem tirar vantagens do JDBC, EJB, JavaMail, JavaIDL, RMI,... Tecnologias de terceiros baseado em JAVA poderão ser acessados Podem rodar em qualquer plataforma que tenha uma JVM Podem executar em ambiente Mobile Forma mais comum de utilizar as Servlets: ◦ A mais popular é quando o próprio Web Server possui um servlet container. ◦ Antigamente, existia outra possibilidade de adicionar um Servlet engine ao servidor Web não compatível com Servlets e JSP. O Web Server se comunica com o Servlet através de uma simples interface, javax.servlet.Servlet. Esta interface consiste em três métodos principais: ◦ init() ◦ service() ◦ destroy() O método init() ◦ O método init() é invocado quando o servlet é carregado pela primeira vez e somente na primeira inicialização do servlet. ◦ Este é um bom local para abrir conexões com uma base de dados ou declarar variáveis globais. ◦ O método recebe um argumento, uma referência ao objeto ServletConfig. O Objeto ServletRequest ◦ O objeto ServletRequest contém os dados enviados pelo cliente. ◦ Estes dados são formados em pares de nome/valor e obtidos através do método: String getParameter(String) ◦ Este objeto ou uma especialização dele permite que se obtenha uma série de informações sobre o cliente. O objeto ServletResponse ◦ Representa a resposta do Servlet para o cliente. Quando todo o processamento estiver concluído utiliza-se este objeto para enviar as informações. ◦ O método void setContentType(String) deve ser chamado para definir o tipo de resposta. ◦ O método getOutputStream( ) ou getWriter() deve ser usado para enviar os dados para o cliente. O método service( ) ◦ O método service() manipula as requisições HTTP recebidas do cliente através do parâmetro ServletRequest e em seguida envia a requisição ao método desenvolvido especificamente para manipular aquele tipo de requisição. ◦ Funciona como o coração do Servlet, é nele onde são enviada as requisições e obtidas as respostas O método service() ◦ Alguns destes métodos são: doGet para requisições GET doPost para requisições POST doPut para requisições PUT doDelete para requisições DELETE O método destroy( ) ◦ É chamado antes que o servlet seja finalizado a fim de possibilitar a liberação dos recursos que estão sendo usados pela servlet. ◦ É importante usar alguns flags para certificar que todos os outros métodos já foram concluídos antes de finalizar o servlet. Apache Tomcat IBM WebSphere Lotus Domino GO iPlanet Weblogic Tengah Zeus W3C Jigsaw Paralogic WebCore Engines do IIS … Um Servlet é instanciado por um Container É iniciado via o método init() O método service() pode ser chamado várias vezes Pode ser limpo através do método destroy() Funcionamento ◦ Um cliente faz uma requisição no Servidor ◦ A requisição é direcionada para um Servlet pelo container ◦ Método Service() é chamado com dois objetos: request e response ◦ O Servlet envia uma resposta a requisição Objeto Request ◦ Encapsula todas as informações do Cliente ◦ Acesso aos dados do FORM javax. servlet. ServletRequest { Enumeration getParameterNames(); String getParameter( String paramName); String getRemoteAddr(); } javax. servlet. http. HttpServletRequest { String getRequestURI(); Enumeration getHeaderNames(); String getHeader( String headerName); HttpSession getSession(); Cookie[] getCookies(); } Objeto Response ◦ Encapsula toda a comunicação com o Cliente ◦ Seta os cookies ◦ Método para enviar redirecionamento de páginas, páginas de erro, etc. javax. servlet. ServletResponse { ServletOutputStream getOuputStream(); PrintWriter getWriter(); void setContentType( String type); void setContentLength( int length); } Sessões ◦ Requisições feitas pelo usuário durante um determinado período public void doGet( HttpServletRequest request, HttpServletResopnse response) throws ServletException, IOException { HttpSession session = request. getSession(); Carro carro = (Carro) session. getValue(“ carro”); carro. addItem( produto, quantidade); } public class hello extends HttpServlet { public String getServletInfo() { return ”Servlet Internamente"; } public void init(ServletConfig config) throws ServletException { super.init(config); } public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { log(”Dentro do DOGET"); res.setContentType("text/html"); PrintWriter os=res.getWriter(); os.println("<html>"); os.println("<head><title>Olá Mundo!</title></head>"); os.println("<body bgcolor=<add8af>"); os.println("<H1>Olá do Servlet</H1>"); os.println("</body></html>"); os.flush(); } } JavaServer Pages JSP é uma tecnologia para a camada de apresentação dos dados, que permite misturar HTML estático com tags utilizando o Java. JSP não modifica os dados estáticos, o design da página continua o mesmo. Permite que aplicações Web sejam particionadas em componentes JavaScript misturado nas páginas JSP Dados estáticos nunca são modificados no Servidor Os elementos dinâmicos sempre serão interpretados e modificados antes de chegar no cliente (browser) Páginas estáticas com extensão JSP ◦ Saída igual a extensão HTML ◦ Mais recursos pois o engine JSP vai executar o arquivo Algumas vantagens do JAVA ◦ WO-RA Write Once, Run Anywhere ◦ Java API ◦ Tratamento de Erro ◦ Escalabilidade Página fica na memória, demais requisições invoca métodos e dispara threads ◦ Componentes JavaBeans - Separa a lógica de apresentação da lógica de negócios, além de separar os dados estáticos dos dados dinâmicos Características ◦ Enfatiza a reutilização de componentes, principalmente JavaBeans e Enterprise JavaBeans; ◦ simplifica o desenvolvimento de páginas com tags personalizadas; ◦ inclusão dos benefícios de gerência de memória, robustez e segurança da plataforma java; ◦ alta performance pois o JSP é convertido em um Servlet para ser executado. <HTML><BODY> <% if (a>b){ %> <h1> A variável A é maior que a variável B</h1> <br> <% }; %> </BODY></HTML> <%! declarations %> ◦ Utilize esta tag para declarar métodos em uma página JSP. <%= expressão %> ◦ Esta tag imprime o valor de uma expressão. É corresponde ao out.println(“texto”) do servlet. <% fragmento de código %> ◦ Todo o código desta TAG é inserido no método service() do servlet que será gerado. Considerações ◦ Scriptlet que necessitam gerar saída <% %> deve ser através do objeto out ◦ Expression não terminam com “;” O método out.println() foi abstraído ◦ Declaração tornam as variáveis e os métodos globais, com uma única inicialização ◦ Scriptlet não precisam seguir seqüência, ou seja os loops podem ser particionados e interagidos com HTML estático <%@ include file=“URL” %> <%@ page [language=“java”] [import=“{package.class | package.*},... “]%> <%jsp:forward page=“pagina.html” %> <%jsp:getProperty name=“bean” property=“propriedade”%> <%jsp:setProperty name=“bean” property=“propriedade” value=“valor”%> <%jsp:useBean id=“bean” scope=“page” ...%> Objetos implícitos Tipo request response pageContext session application ServletRequest ServletResponse PageContext HttpSession ServletContext out config page exception JspWriter ServletConfig Object Throwable config Fonte: CITS Tecnologia Web Server HTTP Request Browser teste.jsp teste.jsp HTTP Response Página html Container JSP JSP Runtime + Servlet Engine Java Virtual Machine Web Server teste.jsp JSP Runtime + Servlet Engine Java Virtual Machine Ao receber a primeira requisição, o container JSP interpreta o arquivo e gera um servlet. O servlet é compilado, carregado em memória e executado. As requisições seguintes utilizarão o servlet em memória. <%@ page import="java.sql.*" %> <%! String desc; %> <% desc = request.getParameter("desc"); if(desc == null) desc = ""; %> <jsp:useBean id=’gc' scope='page' class=’GeraCodigo'/> <% out.println(“Saida do código: ” + GeraCodigo.getCodigo()); %> Somente uma sintaxe no padrão XML Dois atributos mais comuns ◦ ID - Identifica o Action Element ◦ SCOPE - Define o ciclo de vida do elemento Page,request, session, application ◦ JavaBeans Action Utiliza JavaBean no lado do Servidor getProperties, setProperties JavaBeans Action ◦ Exemplo <jsp:useBean id=“meuBean” scope=“session” class=“br.dclaro.MeuBean”/> ◦ Procura uma instancia já previamente criada ou cria uma instancia do objeto requisitado ◦ Associa este objeto ao escopo definido, que são objetos implícitos ◦ Primeiro pesquisa o objeto pelo ID e SCOPE, caso não encontre cria o objeto especificado <jsp:setProperty> ◦ Seta propriedades para um Bean ◦ Bean tem que ser definido anteriormente ◦ Exemplo < jsp:setProperty name=“meuBean” property=nome value = “Daniela”/> ◦ Atributo param é utilizado para setar propriedades com o mesmo valor dos parâmetros de request <jsp:getProperty> ◦ Retorna o valor de uma determinada propriedade ◦ Exemplo <jsp:getProperty name=“meuBean” property=name/> ◦ Pode retornar de um bean, o valor de todas as propriedades <jsp:getProperty name=“meuBean” property=*/> Recursos externos utilizados pelo JSP ◦ <jsp:include> Insere a saída tanto dos dados estáticos quanto dinâmicos na página atual O código não é incluído e somente o resultado O código inserido é processado antes de ser incluído na página ◦ <jsp:forward> Termina a ação na página atual e redireciona para outro recurso como uma página estática, uma página jsp ou ainda um Servlet <jsp:forward page=“date.jsp”> <jsp:plugin> ◦ Os plugins são executados no Cliente, através da JRE(Java Runtime Environment) ◦ Javabeans com o plugin executado no Cliente ◦ Javabeans com o useBean executado no Servidor ◦ O tipo de plugin pode ser uma Applet ou ainda um JavaBean Principal propósito Enviar mensagens para o engine do JSP Não contém a lógica do negócio Não podem modificar o stream de saída Simplesmente avisam ao engine como as páginas JSP podem se comportar ◦ Suporta a sintaxe de JSP e de XML ◦ Possui o símbolo @ ◦ ◦ ◦ ◦ Diretiva PAGE ◦ Permite importar pacotes do JAVA ◦ Exemplo <% @page import=“java.sql.*”%> Diretiva Include ◦ Depende da posição na página que irá ser inserido o código ◦ O código é inserido e não o resultado ◦ Caso a pagina do include tenha sido modificada, a página atual deve ser recompilada para receber estas alterações O ciclo de vida é composto por ◦ jspInit() Pode ser override(reescritos) Executado somente uma vez, antes de qualquer outra requisição Usual na criação de Pool de conexões ◦ _jspService Criado e manipulado pelo engine do JSP Nunca deve ser manipulado pelo usuário ◦ jspDestroy() Pode ser override (reescrito) Quando o servlet é descarregado da JVM. O mesmo que o Applet Objeto Request ◦ <%String nome = request.getParameter(“name”);%> ◦ Caso o parâmetro não exista, um resultado nulo é retornado ◦ Mantém as informações do Servidor ◦ Obter as informações dos cookies Objeto Response ◦ Resultados para o browser gerados pela página dinâmica ◦ Setar as informações nos cookies Servidor gera um ID unique para as sessões O servidor também seta um cookie ou URL rewriting para armazenar este ID da sessão Se o cookie não estiver habilitado, o engine JSP redireciona para URL rewriting session.invalidate() Mantém a sessão no servidor por 30 minutos(configurável no Servidor Web) Conexão para Banco de Dados ◦ Drivers nativos ou ODBC ◦ Versão 2.0 Permite navegar para frente e para trás com o ResultSet Utiliza SQL3 Atualiza tabelas utilizando Java methods Pode se deslocar para uma linha específica do ResultSet Conection Pooling Componentes padronizados ◦ Possuem suas próprias características de desenvolvimento ◦ Podem se intercomunicar através das suas interfaces ◦ Componentes padronizados tornam-se fáceis de plugar em outras aplicações ◦ Reusabilidade de código inerente a sua criação É uma classe JAVA que adere às convenções de desenvolvimento e nomenclaturas Qualquer classe java que reflita as convenções dos JavaBeans é um JavaBean Segue um paradigma de programação O método Construtor Propriedades e Métodos de acesso Distribuição em um arquivo .JAR ◦ Sem parâmetros ◦ As propriedades são a representação externa do estado interno do JavaBean ◦ Para cada propriedade tem métodos de acesso, como SET e GET, IS ◦ Os estados internos nunca são acessados diretamente ◦ Visibilidade das propriedades private, métodos públicos ◦ getNome(), setNome(), isNome() - Property Enterprise JavaBeans São JavaBeans distribuídos em uma rede, utilizando para isso o RMI ou CORBA, arquitetura de objetos distribuídos Necessita de um container especial para trabalhar com EJB 1) Incluir o campo ‘Endereço’ no contato; 2) Alterar os dados dos contatos; 3) Excluir um contato.