Manual JSP y Java WEB Segunda Parte
Manual JSP y Java WEB Segunda Parte
Klagges Sazo
<%
// Este es un scriptlet
// Es código en Java que captura los parámetros
enviados
// en el objeto "request"
String nombre = request.getParameter("nombre");
String color = request.getParameter("color");
String mail = request.getParameter("mail");
%>
Expresiones en JSP:
Una expresión se utiliza para desplegar como texto, una variable Java. Para
insertar una expresión en una JSP, se usa la siguiente sintaxis:
La Figura III.2 a) muestra una página JSP llamada index.jsp que captura datos
del usuario. Al oprimir el botón “enviar”, index.jsp envía los datos (parámetros)
dentro del objeto request a la paginaDestino.jsp. La paginaDestino.jsp de la
Figura III.2 b) despliega los parámetros.
Docente: Eduardo A. Klagges Sazo
</body>
</html>
index.jsp pide los datos al usuario y las captura en los atributos llamados
nombre, color, mail. Cuando el usuario oprime el botón “Enviar”, se
ejecuta la acción “ir a pagjnaDestino.sp”. Si no se capturó un dato, se envía el
valor null.
<%
// Este es un scriptlet
// Es código en Javaque captura los parámetros
enviados
// en el objeto "request"
String nombre = request.getParameter("nombre");
Docente: Eduardo A. Klagges Sazo
</body>
</html>
Conceptos básicos:
Docente: Eduardo A. Klagges Sazo
Hasta el capítulo anterior hemos estudiado cómo capturar información del usuario en una
página inicial y pasarla a una página destino para que se despliegue. Sin embargo, hasta ahora
no hemos hecho ningún tipo de procesamiento a la información.
Es posible incluir código Java en las JSPs para procesar los datos, pero esto no es una buena
práctica. Lo recomendable es utilizar algún patrón que organice la aplicación en partes
independientes.
Para aplicaciones muy sencillas, utilizamos páginas JSP para capturar y mostrar
información, es decir, p ara implementar la vista. Y el procesamiento se hace con clases
normales de Java. Sin embargo, para aplicaciones reales, que tienen mayor complejidad, es
mejor utilizar un patrón de diseño, como el Modelo-Vista-Controlador MVC que algo hemos
visto, y seguiremos estudiando en capítulos futuros.
Figura IV-1. Creación de un hilo de Java por cada petición de una JSP
En la Figura IV2 se observa que esta página se solicitó tres veces. Esta técnica
puede fallar cuando dos computadoras solicitan la página JSP exactamente al
mismo tiempo. Se le dice en inglés no thread-safe cuando se manejan las
variables globales de esta forma. En este caso, no sería grave que se perdiera
la cuenta. Para los casos en que es indispensable que no se pierda la cuenta,
existen métodos más sofisticados para manejar variables globales de forma
más segura (thread-safe).
Docente: Eduardo A. Klagges Sazo
Encapsulamiento
Uno de los principios a seguir en el desarrollo Web es el encapsulamiento. El
encapsulamiento sirve para proteger los datos de los objetos. Éste se logra
declarando los atributos de una clase como private y codificando métodos
especiales para controlar el acceso. La manera de acceder a los atributos
desde Fuera de la clase es por medio de los métodos getter. Y la manera de
Modificar los atributos desde fuera de la clase es usando los métodos setter.
Métodos getter:
Métodos setter:
Para que otros objetos puedan modificar el valor de los atributos de una clase,
usamos los métodos setter, por ejemplo:
saldo = s;
}
Los setters reciben como parámetro el mismo tipo de dato que el del atributo. El
nombre de los métodos setter se construye de forma análoga a la de los getters,
pero iniciando con la palabra “set”, y asignan al atributo el valor del parámetro
recibido. El parámetro recibido tiene el mismo nombre que el atributo. Para
diferenciar entre el valor enviado como parámetro y el nombre del atributo se
utiliza la palabra ‘this’. De tal forma que this.nombreAtributo se refiere al
atributo del objeto. Por ejemplo:
this.numCuenta = numCuenta;
}
En la página de inicio (Figura IV3 a), se solicitan los datos. Cuando estos datos
se envían al servidor, la aplicación Web debe realizar los cálculos y después
desplegarlos, como se muestra en la Figura IV3 b). La página de inicio es muy
sencilla, y se muestra a continuación:
package negocios;
public class Calcula {
// se declaran como objetos del tipo Double
// y se encapsulan
private Double tInicial;
private Double tFinal;
private Double distancia;
private Double vel;
private Double tTotal;
// métodos customer
flujo de datos entre las clases y las JSPs. En el siguiente capítulo estudiaremos
qué son los servlets
y como pasar información entre un servlet y una JSP y, entre un servlet y una
clase Java.
Ejercicio:
Hacer una aplicación Web que pida al usuario su nombre, su sueldo diario y la
cantidad de días trabajados. Al seleccionar el botón “Calcular sueldo” debe
calcular y desplegar el sueldo total. Usar JSPs y una clase Java para hacer el
cálculo. La Figura IV-6 muestra un ejemplo de ejecución de esta aplicación:
</table>
<br>
<br>
</form>
</body>
</html>
Finalmente, la paginaDestino.jsp:
Un servlet es una clase Java que hereda de la clase HttpServlet. Los cinco
métodos más comunes de un servlet son:
Figura V-3. index.jsp a), envía datos a un servlet, que a su vez los envía a la
JSP de b).
Las dos instrucciones que se usan para enviar datos de un servlet a una JSP
son:
request.setAttribute(“nombreAtributo”,objetoAEnviar);
request.getRequestDispatcher(“nombre.jsp”).forward(request,
response);
package controller;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import negocios.Alumno;
try {
String nombre= request.getParameter("nombre"); String apellidos=
request.getParameter("apellidos"); Double promedio =
Docente: Eduardo A. Klagges Sazo
Double.parseDouble(request.getParameter("prom"));
Alumno alumno = new Alumno(nombre,apellidos,promedio);
request.setAttribute("atribAlumn",alumno);
request.getRequestDispatcher(
"/muestraDatos.jsp").forward(request, response);
} finally {
out.close();
}
}
<%
Alumno alumno = (Alumno) request.getAttribute("atribAlumn"); %>
<h1> MuestraDatos.jsp</h1>
<h2> Aqui se despliegan los datos que envió el servlet</h2> <p> Tus datos son
los siguientes: </p>
Este método no transfiere los objetos request y response, por lo tanto, sólo
se utiliza para re-direccionar a una URL específica, usualmente fuera de la
aplicación actual.
package controller;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import negocios.*;
// Guardar en archivo
EscribeArchivo.add(alumno, path);
request.setAttribute("atribAlumn",alumno);
request.getRequestDispatcher("/muestraDatos.jsp")
.forward(request, response);
} finally {
out.close(); }
}
@Override
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
processRequest(request, response);
Docente: Eduardo A. Klagges Sazo
}
}
<h3> MuestraDatos.jsp</h3>
</body>
</html>
Figura V-5. Página que despliega todos los registros leidos en «promedios.txt
package controller;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import negocios.Alumno;
import negocios.LeeArchivo;
@WebServlet(name = "muestraRegistro",
urlPatterns = {"/muestraRegistro"})
public class muestraRegistro extends HttpServlet {
protected void processRequest(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try {
ArrayList <Alumno> alumnos = new ArrayList<Alumno>();
int cont=0;
String contador;
ServletContext sc = this.getServletContext();
String path = sc.getRealPath("/WEB-INF/Promedios.txt");
path = path.replace('\\','/');
Docente: Eduardo A. Klagges Sazo
alumnos = LeeAlumno.leeAlumnos(path);
request.setAttribute("Alumnos",alumnos);
request.setAttribute("contador", contador);
request.getRequestDispatcher("/alumnosRegistrados.jsp")
.forward(request, response);
} finally {
out.close();
}
}
}
package negocios;
import java.io.*;
import java.util.ArrayList;
cont=0;
}
}
<table border="1">
<tr>
<th>Nombre</th>
<th>Apellidos</th>
<th>Promedio</th>
</tr>
DRA. MARÍA DEL CARMEN GÓMEZ FUENTES Y DR. JORGE CERVANTES OJEDA
<%
for (Alumno alumno: alumnos)
{
%>
<tr valign="top">
<td><%=alumno.getNombre() %></td>
<td><%=alumno.getApellidos() %></td>
<td><%=alumno.getPromedio() %></td>
</tr>
<% } %>
<% alumnos.clear();%>
</table>
</body>
</html>
Figura V-9. despliegaProductos.jsp muestra todos los productos registrados en el archivo productos.txt