clase jsp y servlets_29_oct

24
PROGRAMACION JSP - SERVLETS Problema 01 Crear el proyecto proyInforma. En el JSP index.jsp, colocar un hipervinculo, con el texto “Llamar a Servlet de informacion” para ejecutar un Servlet que llamara InfoServlet.java A continuación el JSP index.jsp : El Serv let InfoServlet mostrara la dirección del JSP “remoto” , tal como se ve en la siguiente figura : Como sabemos todos los servlets reciben como parámetros dos objetos :

Upload: carlos123yo

Post on 15-Oct-2014

103 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Clase JSP y Servlets_29_Oct

PROGRAMACION JSP - SERVLETS

Problema 01

Crear el proyecto proyInforma. En el JSP index.jsp, colocar un hipervinculo, con el texto “Llamar a Servlet de informacion” para ejecutar un Servlet que llamara InfoServlet.java

A continuación el JSP index.jsp :

El Serv let InfoServlet mostrara la dirección del JSP “remoto” , tal como se ve en la siguiente figura :

Como sabemos todos los servlets reciben como parámetros dos objetos :request de la clase HttpServletRequestresponse de la clase HttpServletResponse

El objeto request entre otras cosas contiene la dirección del programa llamante y para acceder a esta información se utiliza uno de sus métodos : getRemoteAddr()

Entonces el código del servlet seria:

Page 2: Clase JSP y Servlets_29_Oct

Después de haber quitado los tags de comentario :

protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); try

{ String dirCliente = request.getRemoteAddr();

out.println("<html>"); out.println("<head>"); out.println("<title>Servlet de Informacion</title>"); out.println("</head>"); out.println("<body>"); out.println("<h2>Direccion del cliente = " + dirCliente + "</h2>"); out.println("</body>"); out.println("</html>"); } finally

{ 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); }

Como se ve cualquiera sea el método de llamada utilizado, en Netbeans, los métodos doPost y doGet siempre llaman al método processRequest()

Problema 02

Crear un JSP, al que llamara Facturar :

Obteniendo la dirección del JSP

mostrando la dirección del JSP

Page 3: Clase JSP y Servlets_29_Oct

El objetivo del JSP será dentro de un formulario pedir el precio y la cantidad de una venta y al hacer clic sobre un botón, mostrar sobre un textarea el monto a pagar :

El ingreso de datos (“text”) se realiza con con <input type=”text”, como se ve en el ejemplo :

Digitar precio : <input type="text" name="precio"> <br>

Para recuperar un parámetro enviado, apelamos al objeto request y al su método getParameter(name del <input type=”text” name=”precio”>). Por ejemplo :

String sprec = request.getParameter("precio");

El formulario solo lleva el método de envio (“post”) y no action, debido a que la acción se realizara en el mismo JSP y no se llamara a otra pagina.

<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Pagina JSP de Facturacion</title> </head> <body> <form method="post" > Digitar precio : <input type="text" name="precio"> <br> Digitar cantidad : <input type="text" name="cantidad"> <br> <input type="submit" value="Facturar"> <br> <textarea rows= 10 cols=20> <% if(request.getParameter("precio") != null && Request.getParameter("cantidad") != null) {

String sprec = request.getParameter("precio"); int prec = Integer.parseInt(sprec);

String scant = request.getParameter("cantidad"); int cant = Integer.parseInt(scant); int monto = prec * cant; String linea = "El monto a pagar es : "+ monto; out.println(""+linea); } %> </textarea> </form> </body></html>

Page 4: Clase JSP y Servlets_29_Oct

Problema 03

Crear un servlet, tal que muestre su localización en el sistema : Solucion

Esto se logra utilizando el objeto request y su método getContextPath ()Veamos el código del servlet solicitado :

public class ServletContextPath extends HttpServlet { protected void processRequest(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {

response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); try

{ out.println("<html>"); out.println("<head>"); out.println("<title> Servlet ServletContextPath </title>"); out.println("</head>"); out.println("<body>"); out.println("<h2> El ServletContextPath esta en : " + request.getContextPath () + "</h2>");

out.println("</body>"); out.println("</html>"); } finally

{ out.close();

}

Problema 04

Crear un JSP que pida un numero y muestre la tabla de multiplicar correspondiente :

<html> <head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Pagina JSP : Tabla</title> </head>

Page 5: Clase JSP y Servlets_29_Oct

<body> <form method="get" > Numero de Tabla de multiplicar : <input type="text" name="numTabla"><br> <input type="submit" value="Mostrar tabla de multiplicar"> <br><br> Tabla de Multiplicar<br> =====================================<br> <textarea rows= 15 cols=30> <% if(request.getParameter("numTabla") != null) {

String snumTabla = request.getParameter("numTabla"); int nTab = Integer.parseInt(snumTabla);String linea=""; for(int i =1; i <=12; ++ i)

{linea = linea + nTab + " x "+ i +" = "+ (nTab*i)+"\n";

} out.println("\n"+linea);

} %> </textarea> </form> </body></html>

Contextuar la ruta de la aplicación (prog03.jsp y servlet05.java)

Para que un JSP llame a otra aplicación, por ejemplo un servlet, usamos :

<form method="post" action="http://localhost:14267/proyServlet1/Servlet05">

En su lugar podriamos usar : request.getContextPath()

<form method="post" action="<%=request.getContextPath()%>/Servlet05">

Que una aplicación envíe de retorno una respuestaSi deseamos que un servlet retorne una respuesta, primero preparamos la respuesta :

int sum = n1+n2;String linea = "La suma es "+ sum;

request.setAttribute("suma", linea); // etiqueta, objeto

Después, procedemos a escribir el mecanismo de retorno al JSP :

getServletContext().getRequestDispatcher("/prog03.jsp").forward(request, response);

Que un JSP reciba la respuesta de un servletSe usa el método getAttribute() :

resultado = "\n" + (String)request.getAttribute("suma")+"\r";

JSP de destino

Objeto a enviar

Page 6: Clase JSP y Servlets_29_Oct

Problema 05

Construir un JSP para pedir dos números, los cuales se enviaran al servlet05, el cual calculara la suma y lo devolverá al JSP para que lo imprima.

Codigo del JSP y del Servlet :<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Programa principal : prog03.jsp</title> </head> <body> <form method="post" action="<%=request.getContextPath()%>/Servlet05"> Numero 1 : <input type="text" name="num1"> <br> Numero 2 : <input type="text" name="num2"> <br> <input type="submit" value="Calcular la suma"> <br> <textarea rows= 10 cols=30> <% if(request.getAttribute("suma")!= null) { resultado = "\n" +

(String)request.getAttribute("suma")+"\r"; out.print(resultado); } %> </textarea> </form> </body></html>

import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;

public class Servlet05 extends HttpServlet { protected void processRequest(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { int n1 = Integer.parseInt(request.getParameter("num1")); int n2 = Integer.parseInt(request.getParameter("num2")); int r = n1+n2; String linea = "La suma es "+ r; request.setAttribute("suma", linea); // etiqueta, objeto

getServletContext().getRequestDispatcher("/prog03.jsp").forward(request, response);

}

JSP : prog03.jsp

Servlet : Servlet05.javaComo se observa este servlet no posee interfaz grafica, solo procesa y retorna un resultado.

Servlet llamado

Page 7: Clase JSP y Servlets_29_Oct

JSPDirectivas JSPLa directriz JSP configuran la generación de código que ejecutara el contenedor al crear un servlet. Son utilizadas para establecer valores globales tales como declaraciones de clase, método a implementar, tipo de contenido de salida, etc., y no producen ninguna salida para el cliente. Las directrices tienen alcance para el total de la pagina JSP ; en otras palabras, una directriz afecta a toda la pagina JSP pero solo a esa pagina.Las directrices comienzan con <%@ y finalizan con %> y la sintaxis general es :

Hay tres directivas principales que pueden ser utilizadas en un JSP:

La directriz page La directriz include La directriz taglib

La directriz page

La directiva page nos permite definir uno o más de los siguientes atributos sensibles a las mayúsculas.

indica que la variable predefinida session (del tipo HttpSession)

debería unirse a la sesión existente si existe una.

Esto especifica el tamaño del buffer para el JSP Writer out. El valor por defecto es específico del servidor, debería ser de al menos 8kb.

<%@ nombreDirectiva atributo=”valor” atributo=”valor” %>

Esto nos permite especificar los paquetes que deberían ser importados

<%@ page import = “java.lang.Math” %>

Page 8: Clase JSP y Servlets_29_Oct

Problema 06

Crear un JSP para formatear el número 98756123.7579 con comas y 2 decimales de aproximación. Además formatear la fecha actual obtenida con el método Date(). Utilizar las directivas page para importar las librerías Java necesarias.

<%@page import="java.util.Locale"%><%@page import="java.text.NumberFormat"%><%@page import="java.text.DecimalFormat"%>

<%@page import="java.util.Date"%><%@page import="java.text.SimpleDateFormat"%><html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JSP Page</title> </head> <body> <h3><b>Formateando Numero</b></h3> <% double n = 98756123.7579; NumberFormat fNum = NumberFormat.getNumberInstance(Locale.UK); DecimalFormat formatoNum = (DecimalFormat) fNum; formatoNum.applyPattern("###,###,###,###.00"); out.println(formatoNum.format(n)); %> <h3>Formateando Fecha</h3> <% SimpleDateFormat formatoFecha = new SimpleDateFormat("dd/MM/yyyy"); out.println(formatoFecha.format(new Date())); %> </body></html>

Especifica la página de error que será invocada en caso de producirse una excepción durante la ejecución del JSP.

Indica si la página actual, actúa o no como página de error de otra página JSP. El valor por defecto es false.

True indica que el buffer debe descargarse cuando este lleno.

Las directivas <%@page import

Un número cualquiera

Indicando formato numérico

formatoNum : objeto para

formatear numero n

Formateando la fecha actual

Page 9: Clase JSP y Servlets_29_Oct

La directriz include

Esta directiva nos permite incluir una página externa en la página actual. La directiva se parece a esto

Ejemplo : Tenemos dos paginas jsp, de las cuales, la pagina a incluir se llamara reporte1.jsp que poseerá como texto “La Universidad” y la pagina principal de nombre index.jsp, simplemente invoca a la pagina mencionada y la incluye dentro de de si misma. Para eso se tiene que utilizar la directiva include.

Implementando la pagina index.jsp

Implementando la pagina reporte1.jsp

Note en la figura de arriba la inclusión del jsp reporte1 dentro de la pagina index.jsp.

Page 10: Clase JSP y Servlets_29_Oct

JavaBeans en JSP

Los JavaBeans representan las entidades y reglas del negocio. No hay que verlas como un oscuro misterio de la tecnología J2EE, simplemente son clases Java reutilizables que representan elementos del dominio.

Estructura basica de un Bean

Los javaBeans manejan una serie de etiquetas que a continuación vamos a detallar:

<jsp:useBean>

La etiqueta <jsp:useBean> busca una instancia de un bean de la clase y el ambito que se hayan determinando. Si existe un bean de la clase especificada, se hace referencia a dicho bean con el id, en caso contrario, se crea una instancia del mismo. El bean estara disponible dentro de su ambito.

El id es un nombre identificativo, seleccionado por el programador. Además debemos declarar su alcance o ámbito (scope). Un alcance “page” es en esta

Page 11: Clase JSP y Servlets_29_Oct

pagina, "request" implica que es accesible otra JSP que haya sido invocada por medio por ejemplo de jsp:include. El beanName sigue la lógica Java de paquete.subpaquete.

En nuestro ejemplo:

El constructor vacío, es el que utiliza el motor JSP en la creación del objeto.

Problema 7

Fundamentos de JavaScript

La clase bean ubicada en su respectivo paquete

Id representa el nombre del objeto instanciado

Esto me permite definir su ambito

El detalle del JavaBean Empleado, esta en la página anterior

Hacer un JSP que trabaje con un javabean para almacenar datos en el y poder también extraerlos

Page 12: Clase JSP y Servlets_29_Oct

Javascript es un lenguaje de programación empleado para programar pequeñas funciones responsables de realizar acciones dentro del ámbito de una página web.

Javascript no tiene nada que ver con Java, son productos totalmente distintos y no guardan entre si más relación que la sintaxis idéntica y poco más. Algunas diferencias entre estos dos lenguajes son las siguientes: 

Compilador. Para programar en Java necesitamos un Kit de desarrollo y un compilador. Sin embargo, Javascript no es un lenguaje que necesite que sus programas se compilen, sino que éstos se interpretan por parte del navegador cuando éste lee la página.

Orientado a objetos. Java es un lenguaje de programación orientado a objetos, en cambio Javascript no es orientado a objetos, esto quiere decir que podremos programar sin necesidad de crear clases.

Propósito. Java es mucho más potente que Javascript, esto es debido a que Java es un lenguaje de propósito general, con el que se puede construir cualquier tipo de sistemas, sin embargo, con Javascript sólo podemos escribir subrutinas para que se ejecuten en páginas web.

Estructura de programa javascript Teniendo en cuenta que Javascript se escribe dentro de un documento HTML, podemos decir que los delimitadores de un programa javascript son las etiquetas

<SCRIPT>

</SCRIPT>

En una misma página podemos introducir varios scripts, cada uno que podría introducirse dentro de unas etiquetas <SCRIPT> distintas.

Uso de variables y su impresion

Javascript otorga un poco de libertad es a la hora de declarar las variables, ya que no estamos obligados a hacerlo, al contrario de lo que pasa en la mayoría de los lenguajes de programación.

De todos modos, es aconsejable declarar las variables, y para ello Javascript cuenta con la palabra var :

var ciudad = "Valencia"var mujer = true

var num1 = 23var num2 = 33var suma = num1 + num2 document.write(suma) <-- imprimiendo

JavaScript tiene la peculiaridad de ser un lenguaje débilmente tipeado, esto es, una variable puede cambiar de tipo durante su vida, por ejemplo :

MiVariable = 4;

MiVariable = "Una_Cadena";

Page 13: Clase JSP y Servlets_29_Oct

Existen variables locales y globales. Las globales deben ser declaradas asi :<SCRIPT>

var nomVariable;</SCRIPT>

Y en el caso de las variables locales :

Estructuras de control de flujo

Tenemos if, if else, switch, for, while, do while, se usan igual que Java

Ubicacion del codigo javascript

El codigo javascript se ubica dentro del bloque HEAD de un programa HTML

 Parametros de funciones

Su empleo es simple como se ve en el ejemplo :

function bienvenida(nombre, colorTexto){     document.write("<FONT color=" + colorTexto + ">)

document.write("<H1>Hola " + nombre + "</H1>")     document.write("</FONT>")}

JSPVariables globales en JSP

La variable simplemente se coloca sobre el código HTML :

El tag <input type="button"

Esta etiqueta con el tipo indicado, trabaja como un botón común, entonces para este caso debemos implementar el manejo de eventos (click), lo que se implementa tal como se ve :

<input type="button" value="Calcular la suma" onclick= "calcular()">

La función calcular() es implementada con código javascript :

Etiqueta del boton Evento función del evento

Page 14: Clase JSP y Servlets_29_Oct

Problema 08

Un JSP pide 2 números y los envía a un servlet. Aquí usaremos un <input type=”button” con la función de evento click. Lo que implica el uso de una función javascript (callServlet)

<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Programa principal: prog04.jsp</title>

<script> function callServlet() { // formSuma es el nombre del formulario(ver mas abajo)

document.formSuma.action="<%=request.getContextPath()%>/Servlet06";

document.formSuma.method="get"; document.formSuma.submit(); }

</script> </head> <body> <form name="formSuma"> <%--- nombre del formulario ---%> numero 1 : <input type="text" name="num1"> <br> numero 2 : <input type="text" name="num2"> <br> <input type = "button" value="Calcular la suma"

onclick="callServlet()"><br> <textarea rows= 10 cols=30 name="area"> <% if(request.getAttribute("suma")!= null) { String resultado =

(String)request.getAttribute("suma"); out.print("\n"+resultado); } %> </textarea> </form> </body></html>

public class Servlet06 extends HttpServlet { protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { int n1 = Integer.parseInt(request.getParameter("num1")); int n2 = Integer.parseInt(request.getParameter("num2")); int r = n1+n2; String linea = "La suma es "+ r; request.setAttribute("suma", linea); // etiqueta, objeto getServletContext().getRequestDispatcher("/prog04.jsp").forward(request, response); }

javascript y la funcion alert(mensaje)

Se usa para emitir un mensaje sobre una pequeña ventana (útil para mensajes de error)Ejemplo : alert("falta el sueldo");

Notar que no existe action a pesar que se llama a un servlet

Aqui la function maneja el llamado al servlet06

JSP : prog04.jsp

Servlet : Servlet06.java

Page 15: Clase JSP y Servlets_29_Oct

javascript y la función focus()

A veces es necesario enfocar una caja de texto <input >. Esto se logra con la función focus()Ejemplo :

document.planilla.sueldo.focus();

javascript y como detectar un campo vacio (<input type=”text”> )

Se usa la función de cadenas length(), tal como se ve en el ejemplo :

var nom;

nom = document.planilla.nombre.value;if(nom.length == 0)

alert("falta nombre");

Problema 09

Desarollar un JSP para ingresar un nombre con su apellido, entonces llamar a un servlet para que reciba la cadena, extraiga solo el nombre y lo devuelva al JSP.

<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Pagina prog05</title>

<script> function focusValidar() { var num;

nom = document.planilla.nombre.value; if(nom.length == 0) { alert("falta nombre"); document.planilla.nombre.focus(); return;

}else {

document.planilla.action= "<%=request.getContextPath()%>/Servlet06"; document.planilla.method="get"; document.planilla.submit(); }

}</script>

</head>

Clase document

Nombre del formulario

Nombre del <input type=”text”

(Formulario JSP)

Valor escrito por el usuario dentro del <input type=”text”)

Page 16: Clase JSP y Servlets_29_Oct

<body> <form name="planilla"> nombre : <input type="text" name="nombre"><br> <input type="button" value ="generar Planilla"

onclick="focusValidar()"> <br> <textarea name="area" rows="20" cols="40"> <% if(request.getAttribute("registro")!= null) { out.print((String)request.getAttribute("registro")); } %> </textarea> </form> </body></html>

Problema 10

Realizar un JSP que me permita Ingresar por teclado dos números enteros y mostrar a través de un Alert el resultado de la suma de esos números.

Solución :

Page 17: Clase JSP y Servlets_29_Oct

Problema 11

Hacer un JSP para solicitar al usuario elija una ciudad a partir de un select (combo) y se muestre la selección con un Alert. Las ciudades son : Lima, Habana, Moscú y Quito

Page 18: Clase JSP y Servlets_29_Oct

MANEJO DE SESIONES

El protocolo HTTP permite acceder a páginas web y enviar datos de un formulario pero tiene una limitación que consiste en que no puede recordar datos o cliente cuando se cambia de servidor o de página dentro de un mismo servidor. Por esta razón a este protocolo se le conoce como protocolo sin estado.

Qué es una sesión ?

Como se obtiene una sesión : HttpSession miSesion = request.getSession();

Es una serie de comunicaciones entre un cliente y un servidor, en la que se realiza un intercambio de información. Por medio de una sesión se puede hacer un seguimiento de un usuario a través de la aplicación.

Para obtener la sesión de un usuario, se utiliza el método getSession() que devuelve una interfaz de tipo HttpSession : request.getSession(true);

Para obtener un objeto que fue almacenado en la sesión : session.getAttribute()Cuando fue creada la sesión : session.getCreationTime()Ultimo acceso : session.getLastAccessedTime()Tiempo máximo de inactividad : session.getMaxInactiveInterval()

Problema 12

<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JSP Page</title> </head> <body> <a href="/demoSession/ServCliente"> Llamar a servlet </a> </body></html>

import java.io.IOException;import java.io.PrintWriter;import java.util.Date;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;

public class ServletSession extends HttpServlet {

protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter();

Llamando a servlet

ServCliente.java

Page 19: Clase JSP y Servlets_29_Oct

HttpSession session = request.getSession(true);

Integer ctosAccesos = (Integer) session.getAttribute("ctosAccesos");

if (ctosAccesos == null) { ctosAccesos = new Integer(1); } else { ctosAccesos = new Integer(ctosAccesos.intValue() + 1); }

session.setAttribute("ctosAccesos", ctosAccesos);

try { out.println("<html>"); out.println("<head>"); out.println("<title>demoSession</title>"); out.println("</head>"); out.println("<body>"); out.println("<p>ID de sesión: " + session.getId() + "</p>"); out.println("<p>Creación: " + new Date(session.getCreationTime())+"</p>"); out.println("<p>Último acceso: " + new Date(session.getLastAccessedTime()) + "</p>"); Integer ctos = (Integer) session.getAttribute("ctosAccesos"); out.println("<p>Cantidad de accesos: " + ctos.intValue() + "</p>"); out.println("<p>Tiempo máximo de inactividad: " + session.getMaxInactiveInterval() + " segundos" + "</p>"); out.println("</body>"); out.println("</html>"); } finally { out.close(); } }}

Page 20: Clase JSP y Servlets_29_Oct