AJAX con JSP y Servelts
El código y el proyecto de esta entrada lo podéis descargar pulsando AQUI.
En esta entrada vamos a poner un sencillo ejemplo de como incluir AJAX (Asynchronous JavaScript And XML) en JSP y Servelts. AJAX nos permitirá recargar contenido en un "fragmento" (en un "<div>") de la página web sin que esta tenga que ser recargada de nuevo, lo cual nos permitirá hacer una web más amigable y más cómoda de ver para el usuario.
Este ejemplo que mostramos se ha hecho con el fin de mostrar el funcionamiento del AJAX, por tanto y para no "ensuciar" el código del ejemplo, no vamos a programar que el contenido del formulario es correcto y demás comprobaciones, simplemente lo hacemos para que se vea el flujo del programa y como funcionan aquí los Servelts, luego tenéis que ser vosotros los que programéis la lógica de vuestra web.
El ejemplo que vamos a realizar aquí, va a consistir en rellenar un sencillo formulario de nombre, apellido y edad, y al darle al botón "Añadir" se añadirán esos datos a una tabla de forma asíncrona, sin que la web tenga que ser recargada, tal y como mostramos a continuación:
El fichero "index.jsp" es el siguiente:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="ISO-8859-1"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>AJAX JSP Servelts</title> <script src="http://code.jquery.com/jquery-latest.js"> </script> <script> $(document).ready(function() { $('#submit').click(function(event) { var nombreVar = $('#nombre').val(); var apellidoVar = $('#apellido').val(); var edadVar = $('#edad').val(); // Si en vez de por post lo queremos hacer por get, cambiamos el $.post por $.get $.post('ActionServlet', { nombre : nombreVar, apellido: apellidoVar, edad: edadVar }, function(responseText) { $('#tabla').html(responseText); }); }); }); </script> </head> <body> <h2>Ejemplo de AJAX con JSP y Servelts</h2> <form id="form1"> Nombre:<input type="text" id="nombre" /> <br> Apellido: <input type="text" id="apellido" /> <br> Edad: <input type="text" id="edad" /> <br> <input type="button" id="submit" value="Añadir" /> </form> <br> <!-- En este div metemos el contenido de la tabla con AJAX --> <div id="tabla"></div> </body> </html>
El contenido del servelt, llamado "ActionServlet.java" es el siguiente:
package ajaxdemo; import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ActionServlet extends HttpServlet { private static final long serialVersionUID = 1L; private ArrayList<Persona> personas = new ArrayList<>(); protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Si lo queremos hacer a traves de un get, tenemos que poner el codigo del post en esta clase } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType( "text/html; charset=iso-8859-1" ); PrintWriter out = response.getWriter(); // Obtengo los datos de la peticion String nombre = request.getParameter("nombre"); String apellido = request.getParameter("apellido"); String edad = request.getParameter("edad"); // Compruebo que los campos del formulario tienen datos para añadir a la tabla if (!nombre.equals("") && !apellido.equals("") && !edad.equals("")) { // Creo el objeto persona y lo añado al arrayList Persona persona = new Persona(nombre, apellido, edad); personas.add(persona); } out.println("<table style= cellspacing="1" bgcolor="#0099cc">"); out.println("<tr>"); out.println("<td style= rowspan="7" align="center" bgcolor="#f8f8f8"> NOMBRE </td>"); out.println("<td style= rowspan="7" align="center" bgcolor="#f8f8f8">APELLIDO</td>"); out.println("<td style= rowspan="7" align="center" bgcolor="#f8f8f8">EDAD</td>"); out.println("</tr>"); for(int i=0; i<personas.size(); i++){ Persona persona = personas.get(i); out.println("<tr>"); out.println("<td style= rowspan="7" align="center" bgcolor="#f8f8f8">"+persona.getNombre()+"</td>"); out.println("<td style= rowspan="7" align="center" bgcolor="#f8f8f8">"+persona.getApellido()+"</td>"); out.println("<td style= rowspan="7" align="center" bgcolor="#f8f8f8">"+persona.getEdad()+"</td>"); out.println("</tr>"); } out.println("</table>"); } }
La clase persona es la siguiente:
package ajaxdemo; public class Persona { private String nombre; private String apellido; private String edad; public Persona(){ } public Persona(String nombre, String apellido, String edad) { super(); this.nombre = nombre; this.apellido = apellido; this.edad = edad; } public String getNombre() { return nombre; } public void setNombre(String nombre) { this.nombre = nombre; } public String getApellido() { return apellido; } public void setApellido(String apellido) { this.apellido = apellido; } public String getEdad() { return edad; } public void setEdad(String edad) { this.edad = edad; } }
El contenido "web.xml" es el siguiente:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>Ejemplo con AJAX</display-name> <servlet> <servlet-name>ActionServlet</servlet-name> <servlet-class>ajaxdemo.ActionServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>ActionServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
Llegados a este punto, solo queda ejecutar el ejemplo. Para ello es necesario tener el Tomcat instalado y ejecutar el proyecto en el Tomcat. Si alguno tiene dudas de como hacerlo, dejamos dos enlaces a los tutoriales de como instalar el Tomcat y como configurar el eclipse para trabajar con Servelts: