Documentos de Académico
Documentos de Profesional
Documentos de Cultura
HTML
HTML es "Hyper Text Markup Language" que significa "Lenguaje de marcado
de hipertexto". Ya hemos hablado de hipertexto en el tutorial World Wide Web,
www, w3 o La Web. Este lenguaje describe una página Web usando marcas o
tags.
<html>
<head>
<title>Hola Mundo</title>
</head>
<body>
<h1>Hola edu4java</h1>
</body>
</html>
Un tag de inicio y cierre por si solo compone un elemento HTML. Ej: <br/>
Programación Web
Estos Programas Web tuvieron tanto éxito que la mayor cantidad de
programación en estos últimos años ha sido mayoritariamente
"Programación Web". Bancos, gobierno, tiendas, agencias de viajes y
muchos más tienen sitios Web que en realidad son programas donde
nos piden un usuario y una contraseña y entonces podemos acceder a
nuestros datos y a múltiples servicios.
Parámetros y formularios
Los programas Web rompieron con la idea clásica de documentos
enlazados de hipertexto. Surge la necesidad de enviar datos desde las
páginas Web al servidor (por ejemplo el usuario y la contraseña).
Cuando esto sucedió tanto el HTTP como el HTML fueron modificados
para soportar el envío de parámetros y formularios desde el cliente al
servidor. Para esta comunicación se inventaron dos métodos llamados
Get y Post.
Método Get
Esta técnica consiste en agregar al final del URL un signo "?" y pares
de "nombre" y "valor" separados por un símbolo "&". Ejemplo:
El método Get tiene dos principales inconvenientes. El primero es que se
ven los datos en el URL. Esto es muy malo en el ejemplo de usuario y
clave ya que cualquiera que viera la casilla del URL en el navegador
vería nuestra clave. La segunda desventaja es que el largo del URL esta
limitado por lo que esto nos limita la cantidad de caracteres que
podemos enviar.
Método Post
Este método igual que el Get envía al servidor pares
de "nombre" y "valor" pero lo hace dentro del mensaje HTTP que
solicita una pagina al servidor. De esta forma los datos no son visibles
en el URL y no existe la limitación dada por el largo máximo de un URL.
El método Post está asociado con el de formulario HTML. Aunque se
pueden usar formularios usando el método Get.
Formulario HTML
A continuación se ve un simple formulario Web en el Browser. Cuando
oprimamos el botón enviar el contenido del las cajas de texto rellenas
con edu4java y eli4java serán enviadas al
servidor.
Este es el código HTML para generarlo:
<html>
<body>
<form action="http://www.edu4java.com/es/web/web3.html" method="get">
<table>
<tr>
<td>User</td>
<td><input name="user" />
</td>
</tr>
<tr>
<td>password</td>
<td><input name="password" /></td>
</tr>
</table>
<input type="submit" />
</form>
</body>
</html>
Podemos ver que la etiqueta form tiene un atributo action que indica a
que servidor se enviará la petición de página.
Las etiquetas input representan las cajas de texto y el
atributo name indica el nombre del parámetro usado para enviar la
información de su de caja de texto al servidor.
El atributo method indica el método Get del que hablamos antes para
enviar la información.
Que es un Servlet?
Un Servlet es un objeto java que pertenece a una clase que extiende
javax.servlet.http.HttpServlet. Esto no es del todo exacto ya que existen
diferentes tipos de Servlets pero con diferencia HttpServlet es el más
usado.
Entre las versiones para Windows existen una en forma de zip y otra con
un instalador de servicio Windows. Como quiero mantener este tutorial
lo mas simple posible usaré la versión zip así dejamos la explicación de
que es un servicio Windows para otro tutorial ;) Descargamos el zip (32
o 64bit) y lo descomprimimos en C:\.
<html>
<head>
<title>Hola Mundo</title>
</head>
<body>
<h1>Hola edu4java</h1>
<p>Bienvenidas a nuestra primera <br/> página Web.</p>
</body>
</html>
Volvemos al Browser y apuntamos a http://localhost:8080/first-
servlet/welcome.html y deberíamos obtener:
Una aplicación web según las especificaciones de J2EE debe tener una
estructura de directorios y un archivo llamado web.xml tal como se ve
en el siguiente esquema:
J2EE es un comité formado por empresas del sector java empresarial
que definen especificaciones (estándares) para que los productos de las
diferentes empresas sean compatibles.
package com.edu4java.servlets;
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;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
Por último solo nos resta configurar el archivo web.xml para que
Tomcat sepa cuando debe llamar al Servlet FirstServlet. Vamos a
configurarlo para que sea llamado cuando alguien pregunte
por http://localhost:8080/first-servlet/what-time-is-it
<web-app>
<servlet>
<servlet-name>timeservlet</servlet-name>
<servlet-class>com.edu4java.servlets.FirstServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>timeservlet</servlet-name>
<url-pattern>/what-time-is-it</url-pattern>
</servlet-mapping>
</web-app>
<web-app> es el primer elemento en web.xml. Dentro, el
elemento <servlet> indica que se creará un Servlet de la
clasecom.edu4java.servlets.FirstServlet bajo el nombre
interno timeservlet. El elemento <servlet-mapping> asociará el
URL/what-time-is-it al Servlet con nombre interno timeservlet.
Por último nos resta reiniciar el servidor Tomcat: cerrar la ventana ms-
dos del servidor, volver a ejecutar startup.bat
<html>
<body>
<form action="login" method="get">
<table>
<tr>
<td>User</td>
<td><input name="user" /></td>
</tr>
<tr>
<td>password</td>
<td><input name="password" /></td>
</tr>
</table>
<input type="submit" />
</form>
</body>
</html>
Lo siguiente es crear un Servlet que reciba la petición en /login que es
la dirección indicada en el atributo action de la etiqueta <form> de
login.html
package com.edu4java.servlets;
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;
<web-app>
<servlet>
<servlet-name>timeservlet</servlet-name>
<servlet-
class>com.edu4java.servlets.FirstServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>login-servlet</servlet-name>
<servlet-
class>com.edu4java.servlets.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>timeservlet</servlet-name>
<url-pattern>/what-time-is-it</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>login-servlet</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
</web-app>
Reiniciamos el servidor, abrimos la pagina login.html, colocamos una x
en usuario, una x en password y oprimimos el boton submit.
Como respuesta recibimos
<html>
<body>
<form action="login" method="post">
<table>
<tr>
<td>User</td>
<td><input name="user" /></td>
</tr>
<tr>
<td>password</td>
<td><input name="password" /></td>
</tr>
</table>
<input type="submit" />
</form>
</body>
</html>
Pero al usar de nuevo login.html recibiremos el siguiente error.
package com.edu4java.servlets;
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;
Donde podemos ver que han desaparecido los parámetros del URL.
Por último hacemos click con el botón derecho del ratón sobre login.html
- Run as - Run on Server y aparecerá la ventana Run On Server.
Le damos a finish y obtenemos:
¿Qué pasó aquí? magia ;) después de que hicimos click en finish eclipse
hizo lo siguiente:
C:\eclipseJEE2\workspace\.metadata\.plugins\org.eclipse.wst.server.cor
e\tmp0\wtpwebapps
¿Cómo es que Tomcat ejecuta la aplicación Web si no está en webapps.
La respuesta está en que eclipse inicia Tomcat con la siguiente
instrucción:
start -
Dcatalina.base="C:\eclipseJEE2\workspace\.metadata\.plugins\org.eclip
se.wst.server.core\tmp0" -Dcatalina.home="C:\apache-tomcat-6.0.33" -
Dwtp.deploy="C:\eclipseJEE2\workspace\.metadata\.plugins\org.eclipse
.wst.server.core\tmp0\wtpwebapps" -Djava.endorsed.dirs="C:\apache-
tomcat-6.0.33\endorsed"
Esto se puede ver haciendo click en el menú Run - Run Configurations
...
Despliegue utilizando archivo WAR
Un archivo WAR es un archivo comprimido con todos los archivos que
hasta ahora desplegamos manualmente en webapps. Este archivo
internamente tiene la misma estructura que usamos anteriormente:
directorio WEB-INF, lib, classes, etc. Para desplegar un WAR en Tomcat
basta con copiarlo al directorio webapps.
Una buena razón para utilizar archivos *.war es que normalmente los
equipos de desarrollo de aplicaciones y los de instalación están
conformados por distintas personas. Enviar un solo archivo para
desplegar es más sencillo y presta a menos confusiones que enviar
varios.
Eclipse JEE permite generar el archivo WAR de la aplicación
seleccionando el proyecto, click en botón derecho del ratón - Export -
WAR file
C:\apache-tomcat-6.0.33\bin\start.bat
y a continuación abrir un browser con
http://localhost:8080/first-jee/login.html
por defecto en el url se pone el nombre de WAR sin la extensión: first-
jee.
En el próximo tutorial veremos como hacer una JSP con las facilidades
que nos brinda Eclipse JEE
package com.edu4java.servlets;
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;
<%
String user = request.getParameter("user");
String pass = request.getParameter("password");
if ("edu4java".equals(user) && "eli4java".equals(pass)) {
out.println("login ok");
} else {
out.println("invalid login");
}
%>
Si nos centramos en el código java de la JSP podremos notar no hay
declaración de las variables request y out. Estas variables son conocidas
como Objetos Implícitos (Implicit Objects) y están predefinidas con
nombres estándares para ser utilizadas por el programador en el código
java de las JSPs. A continuación se describe algunos de estos Objetos
Implícitos:
Probando login.jsp
Copiamos login.jsp a WebContent y modificamos login.html para que en
vez de llamar a /login llame directamente a login.jsp
<html>
<body>
<form action="login.jsp" method="post">
<table>
<tr>
<td>User</td>
<td><input name="user" /></td>
</tr>
<tr>
<td>password</td>
<td><input name="password" /></td>
</tr>
</table>
<input type="submit" />
</form>
</body>
</html>
Boton derecho del raton en login.html - Run as - Run on server. Se abre
http://localhost:8080/first-jee/login.html. Rellenamos user, password y
oprimimos el botón Submit Query.
Otra conveniencia de las JSPs es que no es nesesario declararlas en
web.xml.
C:\eclipseJEE2\workspace\.metadata\.plugins\org.eclipse.wst.server.co
re\tmp0\work\Catalina\localhost\first-jee\org\apache\jsp
No es necesario entender todo el código java generado pero es
interesante darle un vistazo.
package org.apache.jsp;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
.getServletContext().getAttribute(org.apache.AnnotationProcessor.c
lass.getName());
}
try {
response.setContentType("text/html");
pageContext = _jspxFactory.getPageContext(this, request, response,
null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;
out.write("\r\n");
out.write("</body>\r\n");
out.write("</html>");
} catch (Throwable t) {
if (!(t instanceof SkipPageException)){
out = _jspx_out;
if (out != null && out.getBufferSize() != 0)
try { out.clearBuffer(); } catch (java.io.IOException e) {}
if (_jspx_page_context != null)
_jspx_page_context.handlePageException(t);
}
} finally {
_jspxFactory.releasePageContext(_jspx_page_context);
}
}
}
Algunas curiosidades:
<html>
<body>
<form action="login" method="post">
<table>
<tr>
<td>User</td>
<td><input name="user" /></td>
</tr>
<tr>
<td>password</td>
<td><input name="password" /></td>
</tr>
</table>
<input type="submit" />
</form>
</body>
</html>
Esta página es igual a login.jsp con la única diferencia que action apunta
a login en vez de login.jsp. Sobre login-servlet.html botón derecho del
ratón - Debug As - Debug on Server y se abre el browser en
http://localhost:8080/first-jee/login-servlet.html. A continuación
rellenamos User con edu4java y oprimimos el botón Submit:
Aquí vemos que la ejecución se ha detenido en el breakpoint que
pusimos en el servlet. Si ponemos el puntero del ratón sobre la variable
user podemos ver que su contenido es edu4java. Esta opción no existe
cuando depuramos una JSP.
java -Xdebug -
Xrunjdwp:transport=dt_socket,address=8000,server=y,suspen
d=y -classpath "C:\apache-tomcat-6.0.33\bin\bootstrap.jar"
org.apache.catalina.startup.Bootstrap