Aplicações Web em Java
Aplicações Web em Java
Aplicações Web em Java
Servlets e JSP
Aula 1
Software tradicional vs. Aplicaes
Web
SW tradicional: cdigo binrio instalado e executando no
cliente.
Ex.: PhotoShop, CorelDraw, Microsoft Office, ...
Portabilidade
Dinamicidade
Interatividade
Flexibilidade
Escalabilidade
A World Wide Web (WWW)
Ex.:
<html>
<head>
<title>ttulo da pgina</title>
</head>
<body>contedo da pgina</body>
</html>
HTTP (HyperText Transfer Protocol)
Elementos principais:
HTTP/1.1 200 OK
Set-Cookie: JSESSIONID=0AAB6C8DE; Path=/testEL
Content-Type: text/html
Content-Length: 397
Date: Wed, 19 Nov 2003 03:25:40 GMT
Server: Apache-Coyote/1.1
Connection: close
Elementos principais:
pNome=alisson&pSenha=123
Requisio GET ou POST?
http://www.google.com:80/calendar/b/0/render?tab=mc&pli=1
Ubuntu:
Windows:
acessar http://httpd.apache.org/
fazer download e instalar o servidor
Testando a instalao:
acessar http://localhost
O que servidores web no fazem?
// arquivo MinhaServlet.java
import javax.servlet.http.*;
import java.io.*;
Ubuntu:
executar $TOMCAT_HOME/bin/startup.sh
Windows:
executar %TOMCAT_HOME%/bin/startup.bat
Testando a instalao:
acessar http://localhost:8080
Estrutura de diretrios do Tomcat
- <diretrio_instalao_tomcat>
- webapps
- <diretrio_aplicao_web> // document root
- index.html // pginas HTML
- hora.jsp // pginas JSP
- WEB-INF // tudo maisculo com hfen
- web.xml // descritor de implantao/tudo
minsculo
- classes // tudo minsculo
- MinhaServlet.class // servlets compiladas
- lib // opcional
- biblioteca1.jar // dependncias (.jar)
Estrutura de diretrios no Eclipse
- <nome_projeto_web_dinamico>
- Java Resources/src
- MinhaServlet.java // cdigo da servlet
- Web Content
- index.html // pginas HTML
- hora.jsp // pginas JSP
- WEB-INF
- web.xml // descritor de implantao
- lib
- biblioteca1.jar // dependncias (.jar)
Mapeando uma URL para a servlet
usando o Descritor de Implantao
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">
<!-- arquivo web.xml -->
<web-app>
<servlet>
<servlet-name>ServletHora</servlet-name> <!-- interno -->
<servlet-class>MinhaServlet</servlet-class> <!-- real -->
</servlet>
<servlet-mapping>
<servlet-name>ServletHora</servlet-name> <!-- interno -->
<url-pattern>/hora</url-pattern> <!-- externo -->
</servlet-mapping>
</web-app>
Criando uma pgina HTML para
chamar a servlet
<!-- arquivo index.html -->
<html>
<head/>
<body>
<a href="hora">Clique para ver a data/hora</a>
</body>
</html>
Aula 4
Recuperando parmetros passados a
uma servlet
// arquivo MinhaServlet.java
import javax.servlet.http.*;
import java.io.*;
Difcil de ler
Difcil de manter
Impossvel de reusar o cdigo HTML em outro contexto
Impossvel de reusar a lgica de negcio em uma aplicao
Swing ou J2ME
Alto acoplamento entre as camadas de apresentao e de
negcio
E se inserssemos cdigo Java em
pginas HTML?
<html>
<head/>
<body>
A data/hora atual <!-- cdigo Java aqui -->
</body>
</html>
Mas isso uma pgina JSP!!!
<servlet-mapping>
<servlet-name>MinhaServlet</servlet-name>
<url-pattern>/calculadoraServlet</url-pattern>
</servlet-mapping>
</web-app>
Aula 6
Uma servlet genrica da camada
Controller
import javax.servlet.*;import javax.servlet.http.*;import java.io.*;
public class ControllerServlet extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response) throws IOException,
ServletException {
// recupera os parmetros da requisio
// invoca um objeto do Model passando os parmetros
// insere o estado do Model em um atributo da requisio
// encaminha a requisio para uma pgina JSP
}
}
Recuperando parmetros da requisio
na servlet
import javax.servlet.*;import javax.servlet.http.*;import java.io.*;
public class ControllerServlet extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response) throws IOException,
ServletException {
String param = request.getParameter("<nomeParam>");
// invoca um objeto do Model passando os parmetros
// insere o estado do Model em um atributo da requisio
// encaminha a requisio para uma pgina JSP
}
}
Exerccio: JSP
Manifest-Version: 1.0
Class-Path: lib/mysql-connector-java-3.0.11-stable-bin.jar
lib/forms-1.0.5.jar theme/alloy.jar
Acessibilidade de arquivos da
aplicao web
Recursos (pginas HTML, JSP...) acessveis diretamente aos
usurios so colocados na raiz do arquivo .war ou na raiz do
diretrio da aplicao web.
<servlet-mapping>
<servlet-name>ServletHora</servlet-name> <!-- interno -->
<url-pattern>/virtual/hora.do</url-pattern> <!-- comea sempre
com "/" e pode conter diretrios virtuais e extenses virtuais -->
</servlet-mapping>
</web-app>
Mapeando URLs a servlets:
combinao por diretrio
<!-- arquivo web.xml -->
<web-app>
<servlet>
<servlet-name>ServletHora</servlet-name> <!-- interno -->
<servlet-class>MinhaServlet</servlet-class> <!-- real -->
</servlet>
<servlet-mapping>
<servlet-name>ServletHora</servlet-name> <!-- interno -->
<url-pattern>/virtual/*</url-pattern> <!-- comea sempre
com "/", pode conter diretrios virtuais e termina sempre com
"*" -->
</servlet-mapping>
</web-app>
Mapeando URLs a servlets:
combinao por extenso
<!-- arquivo web.xml -->
<web-app>
<servlet>
<servlet-name>ServletHora</servlet-name> <!-- interno -->
<servlet-class>MinhaServlet</servlet-class> <!-- real -->
</servlet>
<servlet-mapping>
<servlet-name>ServletHora</servlet-name> <!-- interno -->
<url-pattern>*.do</url-pattern> <!-- comea sempre com "*" e
seguido por uma extenso -->
</servlet-mapping>
</web-app>
Mapeando URLs a servlets
<web-app>...
<servlet-mapping>
<servlet-name>ServletUm</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>ServletDois</servlet-name>
<url-pattern>/fooStuff/bar</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>ServletTres</servlet-name>
<url-pattern>/fooStuff/*</url-pattern>
</servlet-mapping>
</web-app>
Qual servlet ser invocada?
1. http://localhost:8080/MapTest/blue.do
2. http://localhost:8080/MapTest/fooStuff/bar
3. http://localhost:8080/MapTest/fooStuff/bar/blue.do
4. http://localhost:8080/MapTest/fooStuff/blue.do
5. http://localhost:8080/MapTest/fred/blue.do
6. http://localhost:8080/MapTest/fooStuff
7. http://localhost:8080/MapTest/fooStuff/bar/foo.fo
8. http://localhost:8080/MapTest/fred/blue.fo
Qual servlet ser invocada?
1. ServletUm
2. ServletDois
3. ServletTres
4. ServletTres
5. ServletUm
6. ServletTres
7. ServletTres
8. 404 no encontrado
Configurando pginas de boas-vindas
<web-app>
...
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>
Qual pgina ser retornada?
- webapps <web-app>
- MyTestApp ...
- index.html <welcome-file-list>
- search <welcome-file>index.html</welcome-file
- default.jsp >
- registration <welcome-file>default.jsp</welcome-file
- index.html >
- newMember </welcome-file-list>
- foo.txt </web-app>
1. http://localhost:8080/MyTestApp/
2. http://localhost:8080/MyTestApp/registration/
3. http://localhost:8080/MyTestApp/search
4. http://localhost:8080/MyTestApp/registration/newMember/
Qual pgina ser retornada?
1. MyTestApp/index.html
2. MyTestApp/registration/index.html
3. MyTestApp/search/default.jsp // se existe um "index.html"
dentro de "search", este seria retornado ao invs de
"default.jsp
4. 404 no encontrado // ou a lista de arquivos do diretrio
Configurando pginas de erro
<web-app>
...
<error-page>
<exception-type>java.lang.Throwable</exception-type>
<location>/paginaErro.jsp</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/naoEncontrado.jsp</location>
</error-page>
</web-app>
Configurando parmetros de
inicializao das servlets
Um parmetro de inicializao de servlet um par chave-valor que
disponibilizado servlet no momento de sua inicializao.
<web-app>
<servlet>
<servlet-name>ServletHora</servlet-name>
<servlet-class>MinhaServlet</servlet-class>
<init-param>
<param-name>adminEmail</param-name>
<param-value>[email protected]</param-value>
</init-param>
</servlet>
...
</web-app>
Recuperando parmetro de
inicializao na servlet
// arquivo MinhaServlet.java
import javax.servlet.http.*;
import java.io.*;
out.println(getServletContext().getInitParameter("adminEmail")
);
}
}
Aula 8
Problema: como implementar um
carrinho de compras?
O protocolo HTTP usa conexes sem estado (stateless
connections): o cliente/navegador cria uma conexo HTTP com
o servidor, envia a requisio, recebe a resposta e fecha a
conexo.
Solues erradas:
- usar o endereo IP como identificador
- solicitar ao usurio para se logar antes de usar o carrinho
Soluo
<html>
...
</html>
A requisio HTTP contendo o ID de
sesso do cliente
POST /usuarioServlet HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0
Cookie: JSESSIONID=0AAB6C8DE415
Accept: text/xml,application/xml,application/xhtml+xml,text/...
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
No se preocupe! O continer cuida
dos IDs de sesso para voc!
Voc s precisa dizer ao continer que quer usar uma sesso
invocando request.getSession().
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 397
Date: Wed, 19 Nov 2003 03:25:40 GMT
Server: Apache-Coyote/1.1
Connection: close
<html>
<body>
<a
href="http://localhost/usuarioServlet;jsessionid=0AAB6C8DE41
5"> clique aqui</a>
</body>
</html>
Requisio HTTP
// arquivo WEB-INF/web.xml
<web-app>
...
<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/Teste</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
</web-app>
Conectando a aplicao Web a um
banco de dados MySQL via Tomcat
import javax.sql.*; import java.sql.*; import javax.naming.*; ...
public void doGet(HttpServletRequest request, ...) throws ... {
try {
Context ctx = new InitialContext(); // cria um contexto
DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/Teste"); //
URL p/ recuperar DataSource especificado no arquivo "server.xml"
Connection conn = ds.getConnection(); // cria conexo
Statement st =
conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
ResultSet result = st.executeQuery("select * from tabela;");
result.first();
response.getWriter().println(result.getString(2));
conn.close(); // fecha a conexo
} catch(Exception e) { // captura algum erro, se ocorrer
response.getWriter().println(e.getMessage()); }}
Exerccio: carrinho de compras