Tecnología de Programación Clase 22 Diego C. Martínez Departamento de Ciencias e Ing geniería de la Computación Universidad Nacional del Sur
Componentes Web J2EE presenta los componentes Web (web components): servlets y Java Server Pages. Los servlets son clases en Java que procesan pedidos (requests) y construyen respuestas a esos pedidos. Las páginas JSP son documentos de texto que se ejecutan como servlets pero permiten una aprox imación más natural para presentar contenido estático. Veamos algunos ejemplos prácticos de cada uno...
Calculadora (I) Pensemos una calculadora web simple (muy simple). Puede sumar, restar, multiplicar y dividir dos números. La página principal permite ingresar dos números y seleccionar la operación deseada. El servidor realiza la operación e imprime el resultado. (1) Pedido de la página (2) Devuelve página con formulario Cliente (1) Envío de datos (operandos y operación) (1) Envío de resultado Servidor
Calculadora (I) index.html Archivo HTML con el formulario Servidor Calc.class Recibe los datos del cliente y devuelve el resultado Primero pedimos la página index.html, que contiene el formulario a completar (campos de texto, listas desplegables, etc) Cómo le pasamos los datos al servlet Calc??
Formularios <form action="unrecurso" method= unmetodo >... </form> El atributo action indica al browser que se contacte con el recurso mencionado y le envíe los datos comp rendidos en el formulario, utilizando el método indicado. Existen otros atributos como el target t, la codificacion (enctype) olos caracteres aceptables (accept-charset), menos comunes dependiendo de la aplicación. El contenido del formulario es el habitual en las interfaces gráficas: campos de texto, listas desplegables, botones, etc. Cada elemento tiene un nombre, y tendrá un valor ingresado por el usuario. Luego ese dato estará disponible para quien lo procese.
Formularios Componentes de un formulario: <input type="text" name="user"> <input type="password" name="password"> <input type="checkbox" name="vehicle" value="bike" /> <input type="radio" checked="checked" name="sex" value="male"> <input type="radio" name="sex" value="female"> <select name="equipo"> <option value="river">river</option> <option value="boca">boca</optio on> <option value="independiente">independiente</option> <option value="sanlorenzo">san Lorenzo</option> </select> <textarea rows="10" cols="30"> Esto está escrito en el area de texto. </textarea> <input type="button" value="hello world!"> <input type="submit" value="enviar"> <input type="reset" value="limpiar"> Todos tienen atributos, algunos requeridos, otros opcionales.
Formulario de la calculadora Para la calculadora web necesitamos: dos campos de texto para los operandos. un selector para el operador. Direccion del servlet <form method="post" action=" "webcalc"> <input type="text" name="operando1" size="4"> <select name="operacion"> <option value= ="+">+</option> <option value= ="-">-</option> <option value= ="*">*</option> <option value= ="/">/</option> </select> <input type="text" name="operando2" size="4"> <input type="submit" value="="> </form>
El servlet Calc Cuando completemos los datos, el nav vegador los enviará a la dirección indicada. En nuestro caso, tendremos un servlet public class Calc extends HttpServlet { protected void dopost( { en esa dirección. HttpServletRequest req, HttpServletResponse res ) throws ServletException, IOException // Recuperar los datos de req. // Procesarlos // Utilizar el writer de res para mostrar el resultado Recuperará los datos del objeto HttpR Request, los procesará, y mostrará la información usando el objeto HttpResponse.
El servlet Calc public class Calc extends HttpSe ervlet { protected void dopost( { HttpServletRequest req, HttpServletResponse res ) throws ServletException, ti IOException // Recuperar los datos de req. // Procesarlos // Utilizar el writer de res para mostrar el resultado
El servlet Calc public class Calc extends HttpSe ervlet { protected void dopost( { HttpServletRequest req, HttpServletResponse res ) throws ServletException, ti IOException String oper1=req.getparameter("operando1"); String oper2=req.getparamete req.getparameter("operando2"); char op=req.getparameter("operacion").charat(0) ; int op1 = new Integer(oper1) ).intvalue(); int op2 = new Integer(oper2) ).intvalue(); // Procesarlos // Utilizar el writer de res para mostrar el resultado
El servlet Calc public class Calc extends HttpSe ervlet { protected void dopost( { HttpServletRequest req, HttpServletResponse res ) throws ServletException, ti IOException String oper1=req.getparameter("operando1"); String oper2=req.getparamete req.getparameter("operando2"); char op=req.getparameter("operacion").charat(0) ; int op1 = new Integer(oper1) ).intvalue(); int op2 = new Integer(oper2) ).intvalue(); switch(op){ case '+':resultado = op1 + op2; break; case '-':resultado = op p1 - op2; break;... // Utilizar el writer de res para mostrar el resultado
El servlet Calc public class Calc extends HttpSe ervlet { protected void dopost( { HttpServletRequest req, HttpServletResponse res ) throws ServletException, ti IOException String oper1=req.getparameter("operando1"); String oper2=req.getparamete req.getparameter("operando2"); char op=req.getparameter("operacion").charat(0) ; int op1 = new Integer(oper1) ).intvalue(); int op2 = new Integer(oper2) ).intvalue(); switch(op){ case '+':resultado = op1 + op2; break; case '-':resultado = op p1 - op2; break;... res.setcontenttype("text/htm ml"); PrintWriter out = res.getwriter(); out.println("<html>...</html>");...
Servlets y sesiones Cuando desde un servlet queremos ma antener datos para un mismo cliente entre pedidos (requests) podemos utilizar variables de sesión. Las variables de sesión son variables que el servidor recordará que pertenecen a algún cliente en particular, y por lo tanto mantendrá una copia separada para cada cliente. Se mantienen agrupadas en un objeto de tipo HttpSession HttpSession session = req.getsession(true); Podemos almacenar valores en ese objeto, recuperarlos después, eliminarlos, etc. Algunas operaciones: session.isnew(); session.setattribute(string nombre, Object valor); session.getattribute(string nombre); session.invalidate();
El servlet Calc version 2.0 Vamos a agregarle mayor funcionalidad d al servlet Calc. Queremos que además del resultado, nos liste todas las operaciones realizadas anteriormente. Para eso debemos recordar entre requests los datos anteriores, por lo que usaremos el objeto sesión (HttpSession). Para simplificar, mantendremos el historial de operaciones como un string al que le iremos concatenando las nuevas operaciones. La única complicación adicional es tener en cuenta si la sesión del cliente es nueva o no...... si la sesión es nueva, guardamos un string vacío llamado historial... si la sesión no es nueva, enton nces recuperamos historial de la sesión, lo imprimimos, concatena ca amos la última operación calculada cu ada y volvemos a guardarlo en la sesión
CalcHistory.class public class CalcHistory extends HttpServlet { protected void dopost( HttpServletRequest req, HttpServletResponse res ) thro ows ServletException, IOException { // recuperar datos del request // realizar la operación solicitada HttpSession session = req.getsession(); String hist; if (session.isnew()){ hist = new String( (); session.setattribute("historial",hist); else { hist =(String)session.g getattribute("historial");... res.setcontenttype("text/html"); PrintWriter out = res.getwriter(); out.println("hist");... hist = hist + "<br>" + op1 + op + op2 + "=" + resultado;...
CalcHistory.class Además, imprimiremos nuevamente el realizar más operaciones... formulario original para poder index.html index.html tiene un formulario CalcHistory.class CalcHistory.class genera un formulario para poder seguir haciendo operaciones Incluso no es necesario el index.html, simplificar el inicio de la calculadora. pero lo mantendremos para