Trabalho Servlet

download Trabalho Servlet

of 29

Transcript of Trabalho Servlet

Trabalho de Ambientes de InternetO que um Servlet ? Servlet so mdulos de cdigos em Java que rodam em uma aplicao no servidor (podemos fazer uma analogia com Applets do lado cliente) para responder pedidos do cliente. Os servlets no so direcionados para um tipo de protocolo cliente-servidor, embora sejam mais comumente usados com HTTP e a palavra SERVLET frequentemente usada com significado HTTP SERVLET. Servlets usam extenses da classe no pacote javax.servlet (o pacote bsico para esse fim) e javax.servlet.http (classes utilizadas para atender a pedidos HTTP). Como servlets so escritos em Java, eles criam extenses sofisticadas em um servidor, independentemente do sistema operacional. Usos tpicos para HTTP Servlets: - Processamento e armazenamento de dados mandados por um formulrio HTML; - Acessar um contedo dinmico, exemplo o resultado de consulta ao banco de dados; - Gerenciar o estado de informao sobre uma conexo de estado HTTP; Servlet x CGI A maneira mais tradicional de adicionar funcionalidade a um servidor web utilizando CGI (Common Gateway Interface). Cada pedido respondido em um processo separado por instancia separada do programa CGI ou um script CGI (como frequentemente chamado porque programas CGI so geralmente escritos em linguagens interpretadas como Perl). Vantagens dos Servlets sobre CGI: - Um servlet no roda em um processo separado. Isto remove o overhead de criar um novo processo para cada pedido. - Um servlet fica na memria entre os pedidos. Um programa CGI precisa ser carregado a cada pedido; - H somente uma nica instncia que responde a todos os pedidos, isto economiza memria e faz um servlet fcil de gerenciar dados persistentes;

Trabalho de Ambientes de InternetBsico da arquitetura Servlet A fim de inicializar um servlet, a aplicao servidora carrega a classe Servlet e provavelmente outras classes que so referenciadas pela classe servlet (e outras classes que so referenciadas por um servlet) e cria uma instancia chamando um construtor que no possui argumentos. A partir da, o servidor chama o mtodo init (ServletConfig config) do servlet. O servlet deve fazer a inicializao uma nica vez das procedures de setup neste mtodo e guard-lo no ServletConfig para que possam ser chamados pelos mtodos

getServletConfig (). Os servlets que estendem GenericServlet (ou sua subclasse HTTPServlet) deve chamar Super.Init(config) no incio do mtodo

init para fazer uso desta feature. O mtodo init chamado apenas uma vez durante a existncia de um servlet. O mtodo no ser chamado at que o mtodo init devolva algum valor de retorno. Quando um servlet iniciado, seu mtodo de servio (ServletRequest req, ServletResponse res) chamado a cada solicitao do servlet. O mtodo chamado concorrentemente (por exemplo: mltiplas threads podem chamar esse mtodo ao mesmo tempo), logo isso deve estar implementado em um modo que suporte threads.

Trabalho de Ambientes de InternetComo recuperar Informaes Para criarmos um aplicativo web precisamos ter conhecimento do ambiente em que ele esta sendo executado, ou at mesmo ter conhecimento em que servidor ele est executando seus servlets ou envio das solicitaes do cliente. No importa o tipo de ambiente em que o aplicativo est sendo rodado o que preciso saber o tipo de informaes sobre as solicitaes com os quais ele est lidando. Vrios mtodos fornecem o acesso dos servlets a essas informaes e para uma grande parte, cada mtodo retorna um resultado especfico. O mtodo servlet tem vrias vantagens e algumas sero citadas abaixo. - Verificao ortogrfica: Os servlets tm mais ajuda do compilador ao obter os erros. Muitos erros no podem ser encontrados at que causem problemas durante a execuo. - Clculo retardado: Quando um servidor inicializa um programa CGI, o valor para cada e toda varivel de ambiente tem que ser calculado previamente e transmitido, caso o programa CGI use ou no. Um servidor que inicializa um servlet tem a opo de melhorar o desempenho retardando esses clculos e executando-os segundo a demanda. - Mais interaes com o servidor: Assim que um programa CGI comea a execuo, ele desvinculado de seu servidor e o nico caminho de comunicao disponvel a sua sada padro. Porm um servlet pode funcionar com o servidor ou como um processo conectado fora do servidor (quando se necessrio). Usando essa conectividade, um servlet pode solicitar informaes calculadas que somente o servidor pode fornecer. Servlet Cada nome do servlet registrado pode ter parmetros de inicializao (init) especfico associados a ele. Os parmetros init esto disponveis para o servlet a qualquer momento; eles so definidos no descritor da distribuio web. xml e geralmente usado no init() para definir os valores iniciais ou defaults para um servlet ou para personalizar o comportamento do servlet de alguma maneira.

Trabalho de Ambientes de InternetComo obter um parmetro init de um servlet Um servlet usa mtodo getInitParameter () para acessar seus parmetros init:public String ServletConfig.getInitParameter(String name)

Esse mtodo retornar o valor do parmetro init nomeado ou null se no existir e o valor do retorno sempre uma nica String. Caber ao servlet interpretar o valor. Como conectar um servlet ao banco de dados Um servlet que precisa estabelecer uma conexo com um banco de dados pode usar parmetros init para definir os detalhes da conexo. Um dos mtodos que podemos adotar o establishConnection () personalizado para extrair os detalhes da JDBC, exemplificado abaixo:java.sql.Connection com = null; public void init () throws ServletException { String host = getInitParameter(host); init port = Integer parseInt (getInitParemeter(port)); String db = getInitParameter (db); String user = getInitParameter (user); String password = getInitParameter (password); String proxy = getInitParameter (proxy); con proxy); } = establishConnection (host, port, db, user, password,

Como obter os nomes do parmetro init do servlet Um servlet pode examinar todos os seus parmetros init usando

getInitParameterNames ():public Enumeration ServletConfig.getInitParameterNames ()

Trabalho de Ambientes de InternetEsse mtodo retorna os nomes de todos os parmetros init do servlet como uma Enumeration de objetos String ou uma Enumeration vazia caso nenhum parmetro exista. Import java.io.*; Import java.util.*; Import javax.servlet.*; public class InitSnoop extends GenericServlet { // No init () method needed public void service (ServletRequest req, ServletResponse res) throws ServletException, IOException { res.setContenttype(text/plain); PrintWriter ou = res.getWriter(); Out.println(Init Parameters:); Enumeration enum = getInitParameterNames(); while ( enum.hasMoreElements () ) { String name = (String) enum.nextElement (); Out.println( name + :+ getInitParameter (name) ) ; } } }

Como obter o nome de um servletpublic String ServletConfig.getServletName ()

Se o servlet no estiver registrado, o mtodo retornar o nome de classe do servlet.

Exemplo:

Trabalho de Ambientes de Internet

public void doGet (HttpServletRequest req, HttpServletResponse res) thwows ServletException, IOException { String name = getServletName (); ServletContext context = getServletContext (); Object value = context.getAttribute (name+.state); }

Servidor Um servlet pode descobrir muito sobre o servidor no qual est sendo executado. Ele pode aprender o nome de host, escutar a porta e o software do servidor. Um servlet pode exibir essas informaes para um cliente, us-las para personalizar seu comportamento ou us-las para restringir explicitamente as mquinas nas quais o servlet ser executado.

Como obter informaes sobre o servidor Um servlet consegue a maior parte de seu acesso para as informaes do servidor atravs do objeto ServletContext em que executado. Existem cinco mtodos onde um servlet pode usar para aprender sobre seu servidor. Dois deles so acionados atravs do objeto ServletRequest que transmitido para o servlet e trs que so chamados a partir do ServletContext no qual o servlet est sendo executado. Servlet pode obter o nmero da porta e o nome do servidor atravs dos mtodos getServerPort( ) e getServerName( ). public String ServletRequest.getServerName( ) public int ServletRequest.getServerPort( ) Esses mtodos so atributos de ServletRequest pois os valores podem mudar caso haja diferentes solicitaes caso o servidor tenha mais de um nome. Essa tcnica chamada de host virtual. Os mtodos getServerInfo( ) e getAttribute( ) de ServletContext fornecem dados sobre o software do servidor e seus atributos.

Trabalho de Ambientes de Internetpublic String ServletContext.getServerInfo( ) public Object ServletContext.getAttribute(String name) O getServerInfo( ) retorna e a verso do software do servidor. O getAttribute( ) retornar o valor do atributo do servidor nomeado como um Object ou null caso o atributo no exista. O nico atributo obrigatrio que um servidor tem que tornar disponvel pois fornece um uma chamado referencia de ao javax.servlet.context.tempdir, java.io.File para um diretrio privado. Os servlets podem adicionar seus prprios atributos ao contexto utilizando o mtodo setAttribute( ). Uma listagem com todos os atributos armazenados pelo servidor e outros servlets pode ser obtida usando o getAttributeNames( ): public Enumeratio ServletContext.getAttributeNames ( ) O objeto que chama o atributo ServletContext que est sendo executado o String serverInfo = getServletContext ( ).getServerInfo ( );

Como obter o parmetro init de um contexto Os parmetros init do servlet,so transmitidos para servlets individuais. Como diversos servlets devem receber os mesmos valores do parmetro init, esses valores podem ser atribudos como um parmetro init do contexto. A classe contexto: public public String ServletContext.getInitParameter(String Enumeration name)- retorna o valor de string do parmetro especificado ServletContext.getInitParameterNames( )- retornar uma Enumeration contendo os nomes de todos os parmetros init disponveis para o aplicativo web. ServletContext tem dois mtodos getInitParameter( ) e getParameterNames( ) para recuperar as informaes de inicializao de todo

Trabalho de Ambientes de Internet

Os parmetros init para um contexto so especificados no descritor da distribuio web.xml para o context usando a tag . rmihost localhost rmiport 1099

Como determinar a verso de um servlet Um servlet pode solicitar ao servidor qual a verso da Servlet APIa qual o servidor suporta. Essa informao muito til para depurar e at mesmo no suporte a deciso, onde se decide se deve utilizar uma nova abordagem para resolver uma tarefa ou uma mais antiga.

Trabalho de Ambientes de InternetA Servlet API 2.1 introduziu dois mtodos para retornar as informaes da verso: public int ServletContext.getMajorVersion( ) public int ServletContext.getMinorVersion( ). Para a API 2.1, getMajorVersion( ) retorna 2 e getMinorVersion( ) retorna 1. Esses mtodos funcionam apenas para os servlets executados em servidores que suportam a Servlet API 2.1 e posterior.

Cliente Para cada solicitao, um servlet tem a capacidade de descobrir sobre a mquina do cliente e, para as pginas que requerem a autenticao, sobre o usurio real. Essas informaes podem ser usadas para registrar os dados de acesso, associar informaes aos usurios individuais ou restringir o acesso a certos clientes. Como obter informaes sobre a mquina do cliente Utilizando o getRemoteAddr( ) e o getRemoteHost( ) ele pode recuperar o endereo IP e o nome de host da maquina do cliente. Ambos os valores so retornados como objetos String. As informaes vem do soquete e conecta o servidor ao cliente. Por tanto o nome do host e o endereo remoto podem ser de um servidor proxy. public String ServletRequest.getRemoteAddr( ) public String ServletRequest.getRemoteHost( ) O endereo IP ou o nome do host remoto pode ser convertido em um objeto java.net.InettAddress usando InetAddress.getByName( ): InetAddress remoteInetAddress = InetAddress.getByName(req.getRemoteAddr( ));

Trabalho de Ambientes de InternetComo limitar o acesso Os servlets tem a capacidade de descobrir sobre a mquina do cliente e so bem adequados para aplicar esse limite. Os servlets podem verificar a mquina do cliente e fornecer links para o carregamento apenas se o cliente vier de um pas cujo o acesso seja permitido.

Como obter informaes sobre o usurio Praticamente todo servidor HTTP tem a capacidade predefinida para limitar o acesso a algumas ou todas as suas pginas para um dado conjunto de usurios registrados. Na primeira vez em que o navegador tenta o acesso a uma dessas pginas, o servidor HTTP responde que precisa de uma autenticao especial. Assim que se fornecido essa autenticao, o navegador tenta de novo acessar a pgina, desta vez anexando a autenticao especial (pode ser login e senha) junto a solicitao. Quando o acesso para um servlet for limitado pelo servidor, o servlet poder obter o nome do usurio que foi aceito, utilizando o mtodo getRemoteUser( ): public String HttpServletRequest.getRemoteUser() Um servlet tambm pode usar o mtodo getAuthType( ) para descobrir qual o tipo de autorizao foi usada: public String HttpServletRequest.getAuthType()

Esse mtodo retorna o tipo de autenticao usada ou null caso o acesso para o servidor no tenha sido limitado. Os tipos podem ser BASIC, DIGEST, FORM ou CLIENT-CERT, Com o nome de um usurio remoto, um servlet pode gravar informaes sobre cada cliente. Em logo prazo, ele poder lembrar as preferncias de cada

Trabalho de Ambientes de Internetindivduo. Em curto prazo, poder lembrar a srie de pginas exibidas pelo cliente e usa-las para adicionar uma sensao de estado para um protocolo http sem estado.

Como servlet descobre o que o cliente desejaParmetro da solicitao Cada acesso para um servlet pode ter qualquer quantidade de parmetros solicitados associados. Esses parmetros so geralmente pares de nome/valor que informa ao servlet sobre qualquer informao extra de que ele precisa para lidar com a situao. Um servlet HTTP obtm seus parmetros da solicitao como parte de sua string de consulta (apenas as solicitaes GET), como dados POST codificados (para as solicitaes POST) ou como ambos. Felizmente, todo servidor recupera seus parmetros da mesma maneira, usando getParameter( ) e

getParameterValues(): public String ServletRequest.getParameter(String name) public Onde: getParameter( ) - retornar o valor do parmetro nomeado com String ou null (caso o parmetro no seja especificado). getParameterValues( ) esse mtodo dever ser chamado caso haja uma chance de um parmetro ter mais de um valor. Obs: Se as informaes do parmetro vierem como dados POST codificados, no estaro disponveis se os dados POST j tiverem sido lidos manualmente com o mtodo getReader ( ) ou getInputStream ( ) de ServletRequest (porque os dados POST podem ser lidos apenas uma vez). Os possveis usos para os parmetros da solicitao so limitados. Eles so uma maneira geral de informar a um servlet o que fazer, como faz-lo ou ambos. Como exemplo simples, vejamos como um servlet de dicionrio poderia usar getParameter ( ) para descobrir a palavra que ele precisa pequisar. String [ ] ServletRequest.getParameterValues(String name)

Trabalho de Ambientes de InternetUm arquivo HTML poderia conter este formulrio que solicita ao usurio uma palavra para pesquisar: Word to look up: O seguinte cdigo recupera o parmetro da palavra e lida com apenas com um valor de parmetro. String Word = req.getParameter(word); String definition = getDefinition(word); Out.println(word+:+definition); Alguns parmetros tem diversos valores, como por exemplo ao usar Please select the Honda s2000 features you would like:
Aero Screen CD Changer ? Trunk Spoiler
Um servlet poder usar o mtodo getParameterValues( ) para lidar com esse formulrio: String [ ] words = req.getParameterValues(features); if (features !=null) { for (init I = 0; i