He visto que en muchos casos, algo tan básico como el manejo de JSP y Servlets, causa problemas a muchos programadores que están empezando a introducirse en este mundillo del desarrollo de aplicaciones web en Java.
Es por eso que voy a hacer un pequeño resumen de algunas acciones que pueden resultar prácticas si os estáis iniciando en tareas de comunicación entre estos dos elementos. Se trata de casos muy prácticos en los que no voy a explicar teoría, pero es recomendable que os documentéis sobre toda la arquitectura y sepáis lo que estáis haciendo en cada momento.
Pasaré por alto que es un jsp y que es un servlet, porque entiendo que si has llegado hasta aquí ya sabes de lo que estoy hablando.
Una de las comunicaciones mas simples puede resultar la creación de un formulario en la parte cliente, y la respuesta generada por el servlet al ser llamado por la acción de este formulario, así tendríamos que :
JSP :
<FORM action="ServletDestino" method="get">
<INPUT type="text" name="nombre" id="nombre">
<INPUT type="text" name="apellido" id="apellido">
<INPUT type="submit" value="Enviar">
</FORM>
ServletDestino.java :
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String nombre = req.getParameter("nombre")
String apellido= req.getParameter("apellido");
PrintWriter out = resp.getWriter();
out.println("<html>");
out.println("<body>");
out.println("El nombre es " + nombre);
out.println("El nombre es " + apellido);
out.println("</body>");
out.println("</html>");
}
Este ejemplo es bien sencillo, un jsp ( o html en este caso ya que se trata de una página completamente estática) que envía una petición a un servlet pasandole parámetros vía get, este ServletDestino recoge los parámetros y realiza una respuesta en forma de página web una vez ha tratado los datos que llegan des de la petición.
Esta es una comunicación muy sencilla pero poco eficiente por varios motivos, el principal de todos es que la respuesta del servidor se realiza mediante la escritura de una página web en el mismo servlet. Si consideramos que las páginas actuales no suelen ser tan sencillas y que incluyen css, javascript y mil cosas mas escribir una respuesta de este tipo puede resultar un infierno por no hablar de la ineficiencia que supone.
En muchos casos, podemos querer llamar a otra página web des de el servlet para que esta sea la respuesta de la petición que nos han hecho, y así ahorrarnos generar la página con ouy.println en este caso deberíamos incluir estas lineas:
req.setAttribute(“nombre_del_parametro”,valorDelParametro);
req.getRequestDispacher(“/PaginaSecundaria.jsp”).forward(req,resp);
Y en la pagina jsp de destino podríamos añadir java incrustado mediante los tags <% %> :
p=reqt.getAttribute(“nombre_del_parametro”);
Y recuperar el parámetro que nos interesa. Luego setearlo en algún sitio del <body> para preparar alguna salida deseada mediante <%!=p%>, un ejemplo bien sencillo :
<body>
<p>El valor de los atributos es: <%!=p%> </p>
</body>
Pensemos que hay muchas formas de comunicarse con un servlet des de la parte de cliente, tambien podriamos hacer un href pasandole como destino un servlet y sus parametros al estilo :
<a href=”ServletDestino?id=1″>Go to Servlet</a>
Visto todo esto, vamos a hablar ahora de las tendencias actuales en la web.
Antiguamente, todas las webs se recargaban enteramente su contenido para mostrar una respuesta del servidor. Actualmente esto se hace cada vez menos (por fortuna, ya que de esta manera se dota de agilidad a la web) y se emplean llamadas asíncronas al servidor mediante el uso de AJAX, dando como resultado una web mucho mas dinámica. La librería JQuery de javascript nos facilitan mucho la vida a la hora de realizar estas llamadas ajax y el posterior tratado de los datos y actualización de ciertos elementos de nuestra página.
Todas las lineas que escribo a continuación son bajo el supuesto de que la página tiene incluida la librería jQuery y por tanto haré uso de ella.
Pongamos por caso, una web donde tenemos los siguientes elementos :
<input type="text" name="firstname" id="txt">
<button type="button" onclick="enviaPeticion()">Ok</button>
<div id="Respuesta"></div>
en el momento de clickar en ok, llamamos a una función javascript, que podria ser, por ejemplo :
function enviaPeticion(){
//recuperamos el valor del textField
var texto = $("#txt").val();
var rc="";
$.ajax({
url:'ServletDestino?Texto='+texto+',
type:'post',
dataType: 'json',
success: function(data){
$.each(data, function(key, val) {
rc=val;
}
});
$("#txt").text(rc);
}
Cosas a comentar, al enviarse la petición ajax con la función $.ajax creamos la función para la respuesta en el servidor, definimos que la respuesta vendrá en formato json, y lo que hacemos con la función $.each es iterar por cada pareja clave-valor del json resultante que nos devuelva el servidor. Si conocemos la clave a la que queremos acceder, no haría falta patearse toda la respuesta del servidor, bastaria con obtenerla haciendo :
data['nombreDeLaClave']
Una vez evaluados todos los resultados actualizaremos el div contenido en la página con esa respuesta mediante jQuery.
La única diferencia tener en cuenta a la hora de hacer el servlet en comparación con los ejemplos anteriores, es que la respuesta debe ser de tipo JSON, por lo que yo suelo usar una librería externa en mis proyectos y genero una instancia de JSONObject.
JSONObject json = new JSONObject();
hago las inserciones necesarias:
json.put(key, value);
y se lo devuelvo a la parte cliente :
PrintWriter out = response.getWriter();
out.print(json);
out.flush();
out.close();