Java Server Pages

Propaganda
Texto de apoio para a disciplina de Programação em Rede. Texto, exemplos e imagens baseados e retirados da bibliografia da
cadeira. Não pode ser utilizado sem autorização expressa do coordenador da disciplina.
Java Server Pages
Arquitectura de uma aplicação distribuída em Internet
Figura 1 – “Modelo 2”
A implementação desta arquitectura, com um controlador que direcciona a execução de
JSPs, de Servlets e de JavaBeans, exige a resolução de problemas de
“encaminhamento”, invocação e passagem de parâmetros. Este documento aborda essas
questões.
1
JSP
Texto de apoio para a disciplina de Programação em Rede. Texto, exemplos e imagens baseados e retirados da bibliografia da
cadeira. Não pode ser utilizado sem autorização expressa do coordenador da disciplina.
1. Invocação de um Servlet num JSP
O servlet e o JSP devem pertencer ao mesmo módulo web. O servlet deve estar
compilado e o JSP gravado.
Considere o servlet seguinte :
package com.mycompany;
import java.io.*;
import java.net.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class NewServlet extends HttpServlet {
public void init(ServletConfig config) throws ServletException {
super.init(config);
}
public void destroy() {
}
protected void processRequest(HttpServletRequest request, HttpServletResponse
response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet</title>");
out.println("</head>");
out.println("<body>");
out.println("Este é o NewServlet !!!!!!!!!!");
out.println("</body>");
out.println("</html>");
out.close();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
public String getServletInfo() {
return "Descrição do NewServlet";
}
}
2
JSP
Texto de apoio para a disciplina de Programação em Rede. Texto, exemplos e imagens baseados e retirados da bibliografia da
cadeira. Não pode ser utilizado sem autorização expressa do coordenador da disciplina.
e o JSP seguinte :
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<html>
<head><title>JSP Page</title></head>
<body>
Este é o JSP teste.jsp !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
<jsp:forward page="NewServlet" />
</body>
</html>
Quando o JSP é invocado, o servlet é chamado através de
<jsp:forward page="NewServlet" />
repare que não é utilizada a extensão do ficheiro NewServlet.
3
JSP
Texto de apoio para a disciplina de Programação em Rede. Texto, exemplos e imagens baseados e retirados da bibliografia da
cadeira. Não pode ser utilizado sem autorização expressa do coordenador da disciplina.
2. Invocação de um JSP noutro JSP
Os dois JSPs devem estar gravados no mesmo módulo web.
Considere o JSP outroTeste.jsp seguinte:
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<html>
<head><title>JSP Page</title></head>
<body>
Este é o JSP outroTeste.jsp !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
</body>
</html>
Este JSP pode ser invocado a partir do nosso JSP teste.jsp da seguinte forma:
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<html>
<head><title>JSP Page</title></head>
<body>
Este é o JSP teste.jsp !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
<jsp:forward page="outroTeste.jsp" />
</body>
</html>
A invocação é efectuada através de
<jsp:forward page="outroTeste.jsp" />
repare que, ao contrário do caso anterior, é obrigatório indicar a extensão do ficheiro.
4
JSP
Texto de apoio para a disciplina de Programação em Rede. Texto, exemplos e imagens baseados e retirados da bibliografia da
cadeira. Não pode ser utilizado sem autorização expressa do coordenador da disciplina.
3. Invocação de um JSP num Servlet
O JSP e o Servlet devem pertencer ao mesmo módulo web.
Considere novamente o JSP outroTeste.jsp.
Este pode ser invocado no servlet NewServlet através do código seguinte:
// Invocação do JSP outroTeste.jsp
getServletConfig().getServletContext(
).getRequestDispatcher("/outroTeste.jsp").forward(request, response);
Repare que a String que identifica o JSP deve começar por “/”.
O método getServletConfig() retorna um objecto ServletContext que contém informações
sobre a rede em que o servlet está a correr.
O método getServletContext() de ServletContext retorna o contexto do servlet.
O método getRequestDispatcher(…) permite enviar um pedido (request) a determinado
URL. Retorna o RequestDispacher.
Os objectos request e response) são enviados ao RequestDispacher (URL que está a ser
invocado) por forward(request, response).
Assim, o servlet NewServlet invoca o JSP outroTeste.jsp da seguinte forma:
5
JSP
Texto de apoio para a disciplina de Programação em Rede. Texto, exemplos e imagens baseados e retirados da bibliografia da
cadeira. Não pode ser utilizado sem autorização expressa do coordenador da disciplina.
package com.mycompany;
import java.io.*;
import java.net.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class NewServlet extends HttpServlet {
public void init(ServletConfig config) throws ServletException {
super.init(config);
}
public void destroy() {
}
protected void processRequest(HttpServletRequest request, HttpServletResponse
response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet</title>");
out.println("</head>");
out.println("<body>");
out.println("Este é o NewServlet !!!!!!!!!!");
// Invocação do JSP outroTeste.jsp
getServletConfig(
).getServletContext(
).getRequestDispatcher(
"/outroTeste.jsp").forward(
request, response);
}
out.println("</body>");
out.println("</html>");
out.close();
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
public String getServletInfo() {
return "Descrição do NewServlet";
}
}
6
JSP
Texto de apoio para a disciplina de Programação em Rede. Texto, exemplos e imagens baseados e retirados da bibliografia da
cadeira. Não pode ser utilizado sem autorização expressa do coordenador da disciplina.
4. Invocação de um servlet a partir de outro servlet
Os dois servlets devem pertencer ao mesmo módulo web e devem estar compilados.
Considere agora o servlet OutroNewServlet :
package com.mycompany;
import java.io.*;
import java.net.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class OutroNewServlet extends HttpServlet {
public void init(ServletConfig config) throws ServletException {
super.init(config);
}
public void destroy() {
}
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet</title>");
out.println("</head>");
out.println("<body>");
out.println("Este é o OutroNewServlet !!!!!!!!!!");
out.println("</body>");
out.println("</html>");
out.close();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
public String getServletInfo() {
return "Descrição do OutroNewServlet";
}
}
7
JSP
Texto de apoio para a disciplina de Programação em Rede. Texto, exemplos e imagens baseados e retirados da bibliografia da
cadeira. Não pode ser utilizado sem autorização expressa do coordenador da disciplina.
Para que OutroNewServlet seja invocado de NewServlet, este último deve ser:
package com.mycompany;
import java.io.*;
import java.net.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class NewServlet extends HttpServlet {
public void init(ServletConfig config) throws ServletException {
super.init(config);
}
public void destroy() {
}
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet</title>");
out.println("</head>");
out.println("<body>");
out.println("Este é o NewServlet !!!!!!!!!!");
// Invocação do JSP outroTeste.jsp
getServletConfig(
).getServletContext(
).getRequestDispatcher(
"/OutroNewServlet").forward(request, response);
}
out.println("</body>");
out.println("</html>");
out.close();
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
public String getServletInfo() {
return "Descrição do NewServlet";
}
}
Repare que um servlet é invocado sem extensão e precedido por “/”.
8
JSP
Texto de apoio para a disciplina de Programação em Rede. Texto, exemplos e imagens baseados e retirados da bibliografia da
cadeira. Não pode ser utilizado sem autorização expressa do coordenador da disciplina.
5. Invocação de uma classe a partir de um servlet
O servlet e a classe devem pertencer ao mesmo módulo web e devem estar compilados.
A classe deve estar compilada na mesma directoria que o servlet, isto é /WEBINF/classes/com/mycompany .
Considere a classe seguinte:
package com.mycompany;
public class ClasseJavaTeste {
public ClasseJavaTeste() {
}
String imprimeMensagem(){
return "Instanciei ClasseJavaTeste !";
}
}
Assim, o servlet NewServlet fica:
package com.mycompany;
import java.io.*;
import java.net.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class NewServlet extends HttpServlet {
public void init(ServletConfig config) throws ServletException {
super.init(config);
}
public void destroy() {
}
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet</title>");
out.println("</head>");
out.println("<body>");
out.println("Este é o NewServlet !!!!!!!!!!");
// Instanciação de uma classe JAVA e utilização da instancia
ClasseJavaTeste ijpt = new ClasseJavaTeste();
out.println(ijpt.imprimeMensagem());
out.println("</body>");
out.println("</html>");
out.close();
9
JSP
Texto de apoio para a disciplina de Programação em Rede. Texto, exemplos e imagens baseados e retirados da bibliografia da
cadeira. Não pode ser utilizado sem autorização expressa do coordenador da disciplina.
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
public String getServletInfo() {
return "Descrição do NewServlet";
}
}
A classe ClasseJavaTeste é livremente utilizada no servlet NewServlet.
10
JSP
Texto de apoio para a disciplina de Programação em Rede. Texto, exemplos e imagens baseados e retirados da bibliografia da
cadeira. Não pode ser utilizado sem autorização expressa do coordenador da disciplina.
6. Invocação de uma classe a partir de uma página JSP
Uma página JSP não pode instanciar directamente uma classe JAVA existente
no servidor (a não ser que esta classe pertença ao SDK, como por exemplo a classe
String). Por este motivo, a utilização de objectos JAVA em JSPs deve ser feita através
do servlet “controlador” (veja a Figura 1 – Modelo 2 na pág.1 deste texto).
Quando um JSP necessita de uma instância JAVA: (1) no momento da
inicialização o controlador cria a instância pretendida; (3) o controlador coloca a
instância na sessão (isto é, a instância torna-se numa variável global para os JSPs e
servlets activos na sessão); (4) o controlador invoca o JSP; (5) o JSP pode aceder ao
objecto através da variável session.
Assim, para invocarmos uma classe a partir de uma página JSP temos que ser
capazes de, num servlet, criar uma instância da classe e disponibilizá-la na sessão.
7. Instanciação de uma classe num servlet e disponibilização da
instância na sessão
Como já vimos, a instanciação e utilização de uma classe num servlet pode ser feita da
seguinte forma:
// Instanciação
ClasseJavaTeste icjt = new ClasseJavaTeste();
String descricao = icjt.imprimeMensagem();
Para que a instância seja disponibilizada na sessão, temos que obter uma instância de
HttpSession a partir do request:
// Disponibilização da instãncia na sessão
HttpSession mySession = request.getSession();
Colocar um valor na sessão:
mySession.setAttribute("descricaoClasseJavaTeste", descricao);
11
JSP
Texto de apoio para a disciplina de Programação em Rede. Texto, exemplos e imagens baseados e retirados da bibliografia da
cadeira. Não pode ser utilizado sem autorização expressa do coordenador da disciplina.
8. Acesso a um valor da sessão num JSP
Finalmente, invocamos o JSP:
// Invocação do JSP outroTeste.jsp
getServletConfig(
).getServletContext(
).getRequestDispatcher(
"/teste.jsp").forward(
request, response);
No JSP o objecto que está na sessão é obtido da seguinte forma:
<%-- Obtem a descricao (String) que está na sessão --%>
<% String descricao = (String)(session.getAttribute("descricaoClasseJavaTeste")); %>
O que nos permite a sua utilização:
<%-- Mostra a descricão --%>
<%= descricao %>
9. Invocação de uma classe a partir de uma página JSP – exemplo
completo
Servlet que instancia e coloca valor na sessão:
package com.mycompany;
import java.io.*;
import java.net.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class Controlador extends HttpServlet {
private String login = null;
private String password = null;
public void init(ServletConfig config) throws ServletException {
super.init(config);
}
public void destroy() {
}
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
12
JSP
Texto de apoio para a disciplina de Programação em Rede. Texto, exemplos e imagens baseados e retirados da bibliografia da
cadeira. Não pode ser utilizado sem autorização expressa do coordenador da disciplina.
response.setContentType("text/html");
PrintWriter out = response.getWriter();
// Instanciação
ClasseJavaTeste icjt = new ClasseJavaTeste();
String descricao = icjt.imprimeMensagem();
// Disponibilização da instãncia na sessão
HttpSession mySession = request.getSession();
mySession.putValue("descricaoClasseJavaTeste", descricao);
// Invocação do JSP outroTeste.jsp
getServletConfig(
).getServletContext(
).getRequestDispatcher(
"/teste.jsp").forward(
request, response);
}
out.close();
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
public String getServletInfo() {
return "Descrição do servlet";
}
}
JSP que obtêm o valor a partir da sessão e que o utiliza:
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%@page import="com.mycompany.*" %>
<html>
<head><title>JSP Page</title></head>
<body>
Este é o JSP teste.jsp !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
<%-- Obtem a descricao (String) que está na sessão --%>
<% String descricao = (String)(session.getAttribute("descricaoClasseJavaTeste")); %>
<%-- Mostra a descricão --%>
<%= descricao %>
</body>
</html>
13
JSP
Texto de apoio para a disciplina de Programação em Rede. Texto, exemplos e imagens baseados e retirados da bibliografia da
cadeira. Não pode ser utilizado sem autorização expressa do coordenador da disciplina.
10.
Condições em JSPs
Exemplo da programação de uma condição if-else num JSP.
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<html>
<head><title>JSP Page</title></head>
<body>
<%! boolean b = true; %>
<%
if(b == true){
%>
É verdade.
<%
}
else {
%>
É falso.
<%
}
%>
</body>
</html>
Repare no abrir e fechar das tags dos scriplets e na continuidade do código JAVA entre
scriplets consecutivos.
Exercício
Adapte a sua resolução do exercício anterior para que fique de acordo com a
arquitectura “Modelo 2” (controlador - JSPs).
14
JSP
Download