You are on page 1of 12

Aplicacin Web con Spring

Introduccin
En esta aplicacin web MVC se utiliza Spring Framework. Permite al usuario introducir su nombre en un campo de texto,
y al digitar en OK, el nombre se regresa y se muestra en una segunda pgina con un saludo de bienvenida.
El Framework Spring es un conjunto de aplicaciones de cdigo abierto que facilita el desarrollo de Java EE. Consiste en
un contenedor, un ambiente para la gestin de componentes, y un conjunto de servicios para las interfaces de usuario web,
transacciones y persistencia. El Spring Web MVC es una parte de Spring, un framework MVC extensible para la creacin
de aplicaciones web.
El IDE proporciona soporte integrado para Spring 4.x y 3.x. Las bibliotecas se incluyen con el IDE y se agregan
automticamente al classpath del proyecto cuando se selecciona Spring. Se incluyen los valores de configuracin, como
el nombrado y la asignacin del DispatcherServlet de Web Spring MVC. La biblioteca JSTL se puede registrar
opcionalmente en la creacin del proyecto. Tambin se proporciona soporte para los archivos de configuracin del bean
XML de Spring, incluyendo las siguientes funcionalidades:
Completado de cdigo. Es invocado en los archivos de configuracin de Spring XML para las clases de Java, as
como las referencias del bean.
Navegacin. Hiperenlaces de las clases y propiedades de Java mencionadas en las definiciones del bean de Spring, as
como hiperenlaces a otras referencias del bean de Spring.
Refactorizacin. Renombrado de las referencias a las clases de Java en los archivos de configuracin de XML de
Spring.

1. Configuracin de un Nuevo Proyecto con Spring


a. Creacin del Proyecto Base de Spring
Inicio de la creacin del nuevo proyecto de la aplicacin web con Spring.
1. Seleccionar New Project (Ctrl-Shift-N) en el men File del IDE. Seleccionar la categora Java Web y en
Projects seleccionar Web Application. Clic en Next.

2. En Project Name, ingresar HelloSpring. Clic en Next.

Spring

Pgina 1

3. En el paso mencionado 3: Server and Settings, deshabilitar la opcin Enable Contexts and Dependency
Injection, ya que no se trabaja con la especificacin JSR-299.
4. Confirmar que el servidor GlassFish est seleccionado en la lista desplegable Server. Clic en Next. La versin
Java EE depende de la versin del servidor que se haya seleccionado. La versin predeterminada de Java EE es
Java EE 7 Web cuando el servidor seleccionado es GlassFish Server 4.0.

5. En el Paso 4, en el panel Frameworks, seleccionar Spring Web MVC.


6. Seleccionar Spring Framework 3.x en la lista desplegable Spring Library.

Spring

Pgina 2

Nota: El IDE permite aadir la biblioteca Spring 4.x al proyecto, pero en este ejercicio se utiliza
SimpleFormController que no es compatible en Spring 4.x. Adems, cuando se selecciona el Spring Web MVC,
notar que biblioteca JSTL (JavaServer Pages Standard Tag Library) se aade al classpath durante la creacin del
proyecto de forma predeterminada. Deshabilitar esta opcin, ya que no se requiere JSTL para este ejercicio.
7. Clic en la pestaa Configuration y observar que el asistente permite especificar el nombre y la asignacin del
servlet Dispatcher de Spring.

8. Clic en Finish. El IDE crea un proyecto para toda la aplicacin, incluyendo todos los metadatos, as como el
script del Ant de construccin del proyecto, que se puede inspeccionar desde la ventana Files (Ctrl-2). Se puede
ver la estructura de la plantilla en la ventana Projects. Verificar los cuatro archivos abiertos de forma
predeterminada en el editor del IDE:
dispatcher-servlet.xml, applicationContext.xml, redirect.jsp, y index.jsp.
9. En la ventana Projects, expandir el nodo Libraries del nuevo proyecto y verificar que los archivos JAR de Spring
se incluyen en el classpath del proyecto.

b. Ejecucin del Proyecto Base


Antes de hacer cualquier cambio en los archivos del proyecto, intentar la ejecucin del nuevo proyecto en el IDE.
1. Clic en Run Project en la barra principal de herramientas del IDE. El IDE inicia automticamente al servidor
GlassFish si no se est ejecutando, compila el proyecto, luego lo despliega en el servidor. Observar cualquier
salida mostrada en la ventana Output del IDE. La salida generada termina con el mensaje BUILD
SUCCESSFUL.

Spring

Pgina 3

Se inicia el navegador predeterminado del IDE y se muestra el contenido de la pgina de bienvenida (/WEBINF/jsp/index.jsp).

Nota. Cuando se ejecuta el proyecto en el IDE, el proyecto se compila y se implanta en el servidor, y luego se abre en el
navegador predeterminado. Por otra parte, el IDE proporciona la caracterstica Deploy on Save, que
predeterminadamente se activa para proyectos web. Al guardar archivos en el editor, el proyecto se vuelve a compilar y
desplegar en el servidor de forma automtica. Para ver los cambios, simplemente se pueden refrescar las pginas en el
navegador.
Para entender lo que se realiz, se empieza por examinar el descriptor de despliegue del proyecto ( web.xml). Para abrir
este archivo en el editor, clic derecho en el nodo WEB-INF > web.xml en la ventana Projects y seleccionar Edit. El
punto predeterminado de entrada de la aplicacin es redirect.jsp:
<welcome-file-list>
<welcome-file>redirect.jsp</welcome-file>
</welcome-file-list>

Dentro de redirect.jsp, existe un enunciado de redireccin que dirige todas las solicitudes a index.htm:
<% response.sendRedirect("index.htm"); %>

En el descriptor de despliegue, observar que todas las solicitudes de patrones de URL que coincidan con *.htm se
mapean o asignan al DispatcherServlet de Spring.
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>

El
nombre
completo
del
servlet
despachador,
como
se
muestra
arriba,
es
org.springframework.web.servlet.DispatcherServlet. Esta clase est contenida en la biblioteca de
Spring, que se aadi al classpath del proyecto cuando ste se cre. Se puede verificar esto en la ventana Projects
buscando en el nodo de Libraries. Localizar el spring-webmvc-3.1.1.RELEASE.jar, luego expandirlo para
encontrar org.springframework.web.servlet > DispatcherServlet.
Spring

Pgina 4

El DispatcherServlet controla las solicitudes entrantes en funcin de los valores de configuracin que se
encuentran en dispatcher-servlet.xml. Abrir el dispatcher-servlet.xml seleccionado su pestaa en el
editor. Observar el siguiente cdigo.
<bean id="urlMapping"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/index.htm">indexController</prop>
</props>
</property>
</bean>
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/jsp/"
p:suffix=".jsp" />
<bean name="indexController"
class="org.springframework.web.servlet.mvc.ParameterizableViewController"
p:viewName="index" />

Se definen tres beans en este archivo: indexController, viewResolver y urlMapping. Cuando el


DispatcherServlet recibe una peticin que coincide con *.htm como index.htm, busca un controlador dentro de
urlMapping que pueda acomodar la solicitud. Arriba se observa la propiedad mappings que enlaza /index.htm a
indexController.
El entorno de ejecucin busca entonces la definicin de un bean llamado indexController, que es convenientemente
proporcionado
en
el
esqueleto
del
proyecto.
Observar
que
indexController
hereda
de
ParameterizableViewController. Esta es otra clase de Spring, que simplemente regresa una vista. Adems,
observar que p:viewName="ndice" especifica el nombre de vista lgico, que se resuelve usando el
viewResolver anteponiendo /WEB-INF/jsp/ y aadindole .jsp. Esto permite que el tiempo de ejecucin localice el
archivo en el directorio de la aplicacin y responder con la vista de la pgina de bienvenida (/ WEBINF/jsp/index.jsp).

2. Revisin de la aplicacin.
La aplicacin se compone de dos pginas JSP (que se conocen como vistas en la terminologa MVC). La primera vista
contiene un formulario HTML con un campo de entrada que solicita el nombre del usuario. La segunda vista es una
pgina que simplemente muestra un mensaje de saludo conteniendo el nombre del usuario.
Las vistas son administradas por un controlador, que recibe las solicitudes para la aplicacin y decide cul de ellas
considera regresar. Tambin pasa a las vistas cualesquier informacin que necesiten mostrar (esto se denomina un
modelo). El controlador de la aplicacin se denomina HelloController.
En una aplicacin web compleja, la lgica de negocio no est contenida directamente en el controlador. En cambio, otra
entidad, denominada service, es utilizada por el controlador cada vez que necesita realizar una lgica de negocio. En esta
aplicacin, la lgica de negocio se limita a procesar el mensaje de saludo, y para ello se crea un HelloService.

3. Implantacin de un servicio.
Ahora que el entorno est configurado correctamente, se puede empezar a ampliar el esqueleto del proyecto de acuerdo a
las necesidades. Iniciar con la creacin la clase HelloService.
1. Clic en el botn New File en la barra de herramientas del IDE.
2. Seleccionar la categora Java, a continuacin seleccionar Java Class y clic en Next.
3. En el asistente New Java Class que se, ingresar HelloService como nombre de la clase, e ingresar
service en el nombre de paquete para crear un nuevo paquete de la clase.
4. Clic en Finish. El IDE crea la nueva clase y la abre en el editor.
La clase HelloService desempea un servicio muy sencillo. Toma un nombre como parmetro, y prepara y regresa un
String que incluye el nombre. En el editor, crear el siguiente mtodo sayHello() para la clase (cambios en negritas).
Spring

Pgina 5

public class HelloService {


public static String sayHello(String name) {
return "Hello " + name + "!";
}
}

4. Implantacin del Controlador y del Modelo


Se puede utilizar un SimpleFormController para manejar los datos del usuario y determinar cul vista regresar.
Nota: SimpleFormController es obsoleta en Spring 3.x. Sin embargo, los controladores anotados deben utilizarse
en lugar de los archivos XML.
1. Abrir el asistente New File. En Categories, seleccionar Spring Framework; en File Types seleccionar
Simple Form Controller.

Nota: El IDE de NetBeans proporciona plantillas para diversos artefactos de Spring, incluyendo el archivo de
configuracin XML de Spring, el AbstractController y el SimpleFormController.
2. Clic en Next.
3. Ingresar el nombre de la clase HelloController y crear un nuevo paquete ingresando controller en el
campo de texto Package. Clic en Finish. El IDE crea la nueva clase y la abre en el editor.

4. Especificar las propiedades del controlador eliminando los comentarios de los mtodos setter que se muestran
de forma predeterminada en la plantilla de la clase. Para eliminar los comentarios del fragmento de cdigo,
marcar el cdigo como se indica en la imagen de abajo, y enseguida digitar Ctrl-/.

Spring

Pgina 6

Nota: Digitando Ctrl-/ se alternan los comentarios en el editor.


5. Realizar los cambios de la siguiente manera (en negritas).
public HelloController() {
setCommandClass(Name.class);
setCommandName("name");
setSuccessView("helloView");
setFormView("nameView");
}

La configuracin del FormView permite establecer el nombre de la vista que se utiliza para mostrar el formulario. Esta
es la pgina que contiene el campo de texto que permite a los usuarios introducir su nombre. La configuracin de
SuccessView asimismo permite establecer el nombre de la vista que se debe mostrar en un envo exitoso. Cuando se
establece el CommandName se define el nombre del comando en el modelo. En este caso, el comando es el objeto
formulario con los parmetros de la peticin unidos a l. La configuracin de CommandClass permite establecer el
nombre de la clase del comando. Se rellena una instancia de esta clase y se valida en cada solicitud.
Observar que se muestra una bandera de error para Name en el mtodo setCommandClass():

Ahora se debe crear la clase Name como un bean sencillo para guardar la informacin de cada solicitud.
6. En la ventana Projects, clic derecho en el nodo del proyecto y seleccionar New>Java Class. Se muestra el
asistente New Java Class.

7. Ingresar Name en el nombre de la clase, y para el paquete seleccionar controller de la lista desplegable.

Spring

Pgina 7

8. Clic en Finish. Se crea la clase Name y se abre en el editor.


9. En la clase Name, crear un campo llamado value, enseguida crear los mtodos de acceso (es decir, mtodos
getter y setter) para este campo. Iniciar con la declaracin del campo value:
public class Name {
private String value;
}
Nota: Para escribir rpidamente private se puede escribir pr y luego digitar Tab. El modificador de acceso private
se aade automticamente a la lnea. Este es un ejemplo del uso de plantillas de cdigo del editor. Para obtener una lista
completa de plantillas de cdigo, seleccionar Help > Keyboard Shortcuts Card.
El IDE puede crear los mtodos de acceso. En el editor, clic derecho en value y seleccionar Insert Code (o digitar
Alt-Insert). En el men emergente seleccionar Getter and Setter.

10. En el cuadro de dilogo que se muestra, seleccionar la opcin value:String, luego clic OK. Los mtodos
getValue() y setValue () se aaden a la clase Name:

public String getValue() {


return value;
}
public void setValue(String value) {
this.value = value;

Spring

Pgina 8

11. Digitar Ctrl-Tab y seleccionar HelloController para volver a la clase HelloController. Observar que
la bandera de identificacin de error anterior ha desaparecido ya que ahora existe la clase Name.

12. Eliminar el mtodo doSubmitAction() y eliminar los comentarios del mtodo onSubmit(). El mtodo
onSubmit() permite crear su propio ModelAndView, que se requiere aqu. Realizar los siguientes cambios:
@Override
protected ModelAndView onSubmit(
HttpServletRequest request,
HttpServletResponse response,
Object command,
BindException errors) throws Exception {
Name name = (Name) command;
ModelAndView mv = new ModelAndView(getSuccessView());
mv.addObject("helloMessage", helloService.sayHello(name.getValue()));
return mv;

Como se indic arriba, el command se reconvierte a un objeto Name. Se crea una instancia de ModelAndView, y se
obtiene la vista de xito usando un getter en SimpleFormController. Por ltimo, el modelo se rellena con datos.
El nico elemento en el modelo es el mensaje de saludo obtenida del HelloService creado anteriormente. Se utiliza el
mtodo addObject() para agregar el mensaje de saludo al modelo con el nombre HelloMessage .
13. Corregir los errores de importacin digitando clic derecho en el editor y elegir Fix Imports (Ctrl-Shift-I).

Nota. Confirmar que org.springframework.validation.BindException y


org.springframework.web.servlet.ModelAndView estn seleccionados en el cuadro de dilogo Fix All
Imports.
Spring

Pgina 9

14. Clic en OK. El siguiente enunciado import se aade a la parte superior del archivo:

import org.springframework.web.servlet.ModelAndView;

Como se indica en la documentacin de la API, esta clase representa un modelo y la vista regresada por un manejador,
que es resuelto por un DispatcherServlet La vista puede tomar el formulario de un nombre de la vista String que
tendr que ser resuelta por un objeto ViewResolver; alternativamente un objeto View se puede especificar
directamente. El modelo es un Map, lo que permite el uso de mltiples objetos con clave por su nombre.
Observar que en esta etapa, no todos los errores son corregidos porque la clase todava no puede identificar la clase
HelloService, ni hacer uso de su mtodo sayHello().
15. Dentro de HelloController, declarar un campo privado HelloService:
private HelloService helloService;

A continuacin, crear un mtodo setter pblico para el campo:

public void setHelloService(HelloService helloService) {


this.helloService = helloService;
}

Por ltimo, clic derecho en el editor y seleccione Fix Imports (Ctrl-Shift-I). El siguiente enunciado se agrega en la parte
superior del archivo:
import service.HelloService;

Todos los errores se deben corregir.


16. Registrar HelloService en applicationContext.xml. Abrir applicationContext.xml en el editor e introducir
el siguiente enunciado de un bean:
<bean name="helloService" class="service.HelloService" />

Nota: Spring permite incluir en el IDE el completado de cdigo en los archivos de configuracin XML para las clases de
Java, as como las referencias a beans. Para invocar el completado de cdigo, digitar Ctrl-Space cuando se trabaje en el
editor:

17. Registrar HelloController en el dispatcher-servlet.xml. Abrir dispatcher-servlet.xml en el editor e


introducir el siguiente enunciado del bean:
<bean class="controller.HelloController" p:helloService-ref="helloService"/>

5. Implantacin de las vistas.


Para implantar la vista del proyecto, se crean dos pginas JSP. La primera, se nombra nameView.jsp, que funciona
como la pgina de bienvenida y permite a los usuarios introducir un nombre. La segunda pgina, helloView.jsp,
muestra un mensaje de bienvenida que incluye el nombre de entrada. Se inicia creando el archivo helloView.jsp.
1. En la ventana Projects, clic derecho en el nodo WEB-INF>jsp y seleccionar New>JSP. Se abrir el asistente
New JSP File. Nombrar al archivo con helloView.
2. Clic en Finish. Se crea la nueva pgina JSP en la carpeta jsp y se abre en el editor.
3. En el editor, cambiar el ttulo del archivo por Hello, y cambiar el mensaje de salida para recuperar el
HelloMessage del objeto ModelAndView que se crea en HelloController.
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

Spring

Pgina 10

<title>Hello</title>
</head>
<body>
<h1>${helloMessage}</h1>
</body>

4. Crear otra pgina JSP en la misma forma, pero con el nombre nameView.
5. En el editor, agregar la siguiente declaracin de biblioteca de etiquetas de Spring a nameView.jsp.

<%@taglib uri="http://www.springframework.org/tags" prefix="spring" %>

Lo anterior importa la biblioteca de etiquetas de Spring, que contiene etiquetas tiles cuando se implantan las vistas como
pginas JSP.
6. Cambiar el contenido de las etiquetas <title> y <h1> para leer: Enter Your Name.
7. Escriba el siguiente cdigo debajo de las etiquetas <h1>:
<spring:nestedPath path="name">
<form action="" method="post">
Name:
<spring:bind path="value">
<input type="text" name="${status.expression}" value="${status.value}">
</spring:bind>
<input type="submit" value="OK">
</form>
</spring:nestedPath>

spring:bind le permite enlazar una propiedad de bean. La etiqueta bind proporciona un estado de enlace y valor, que se
utiliza como el nombre y el valor del campo de entrada. De esta manera, cuando se enva el formulario, Spring sabr
cmo extraer el valor enviado. Aqu, la clase del comando (controller.Name) posee una propiedad value, por lo
tanto, se establece path a value.
spring:nestedPath permite anteponer una ruta especfica a un bean . Por lo tanto, cuando se utiliz spring:bind como se
muestra arriba, la ruta hacia el bean se convierte en: name.value. Se debe recordar que el nombre del comando
HelloController es name. Por lo tanto, esta ruta se refiere a la propiedad value de un bean de nombre name en el
mbito de la pgina.
8. Cambiar el punto de entrada relativa de la aplicacin. En la actualidad, el punto de entrada del proyecto sigue
siendo index.htm que, como se describe en la seccin anterior Ejecucin del Esqueleto del Proyecto, se
redirige a WEB-INF/jsp/index.jsp. Se puede especificar un punto de entrada para el proyecto cuando se
despliega y se ejecuta. En la ventana Projects, clic derecho en el nodo del proyecto y seleccionar Properties. Se
muestra el cuadro de dilogo Project Properties. En Categories, seleccionar Run. En el campo Relative URL,
ingresar /hello.htm, y a continuacin clic en OK.
En este momento se puede preguntar en donde se encuentra la asignacin de hello.htm a HelloController.
No se ha aadido una asignacin al bean urlMapping , como es el caso de index.htm, la pgina de bienvenida del
esqueleto del proyecto. Esto es posible con un poco de magia de Spring proporcionada por la siguiente definicin de
bean en el dispatcher-servlet.xml:
<bean
class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMa
pping"/>
Este beam es responsable de crear automticamente un mapeo de URL para todos los controladores registrados en el
archivo. Toma el nombre completo de la clase del controlador (en este caso, controller.HelloController) y
toma el nombre del paquete y el sufijo Controller, a continuacin, utiliza el resultado como un mapeo a una URL.
Por lo tanto, crea una asignacin hello.htm para HelloController. Esta magia sin embargo no funciona para los
controladores que se incluyen en el Framework Spring, como ParameterizableViewController. Se requiere una
asignacin explcita.
9. En la ventana Projects, clic derecho en el nodo del proyecto y seleccionar Run. El proyecto se compila, implanta
y ejecuta. Se abre el navegador predeterminado, mostrando el hello.htm como el nameView del proyecto.
Spring

Pgina 11

No olvidar que la vista inicial debe ser similar a la siguiente:


Enter your name:
Name:
minombre OK
Y la de respuesta:
Hello minombre!

Nota: Generar el reporte en un documento con imgenes y seguimiento de lo obtenido. Guardar


en la red el reporte y la carpeta del proyecto.

Spring

Pgina 12