14.
Proyectos Software Necesarios
● Descargamos los siguientes proyectos para insertar las librerías necesarias en nuestro desarrollo web:
– Añadir el driver JDBC de la base de datos (en nuestro caso MySQL) si no está ya en el servidor de aplicaciones, en el
CLASSPATH del sistema o <JAVA_HOME>/jre/lib/ext. Nos podremos bajar el driver de
http://dev.mysql.com/downloads/connector/j/5.0.html
– Implementación JavaServer Faces (Elegir una de las dos):
● MyFaces (Apache): MyFaces Core 1.1.5 Distributions de http://myfaces.apache.org/download.html
● JSF RI (Sun): Descargar de https://javaserverfaces.dev.java.net
– Descargar las Jarkarta Taglibs http://www.apache.org/dist/jakarta/taglibs/standard/
● Añadir al proyecto standard.jar (Es una implementación Open Source de JSP Standard Tag Library (JSTL), version 1.1.2).
15.
Generación Proyecto Nuevo (I)
● Desde el IDE Eclipse, ir a File > New... > Project y en la ventana seleccionar Web
> Dynamic Web Project.
– Crear un proyecto denominado CaJsfWeb.
● Seleccionar como Target Runtime Apache Tomcat v5.5
● Seleccionar JavaServer Faces v1.1 Project en Configurations.
– Posteriormente, seleccionar Dynamic Web Module, Java 5.0 o 6.0 (para uso
de extensiones del lenguaje y anotaciones) y JavaServer Faces 1.1.
– Context Root: : CaJsfWeb, , Content Directory: WebContent y Java Source
Directory: src
– En la ventana JSF capabilities, si no existe ningún Implementation Library,
crearla importando las librerías del proyecto MyFaces o similar.
● En nuestro caso, utilizamos MyFaces Core 1.1.5. agregamos también la librería
standard.jar del proyecto Jakarta Taglibs.
16.
Generación Proyecto Nuevo (II)
● Hemos conseguido un esqueleto básico para comenzar
nuestra implementación del proyecto CaJsfWebCaJsfWeb.
● Lo primero que vamos a desarrollar será la vista utilizada
para entrar en el sistema así como las páginas jsp, que
pueden ser el resultado de introducir correctamente, o no, los
datos dentro del formulario.
● Existe un esqueleto ubicado en el servidor de Subversion.
– Es necesario instalar el plugin Subclipse para tener
soporte SVN (seguir las instrucciones de la ficha
Configuración de Eclipse (III)Configuración de Eclipse (III))
– Ir a File > New Project > SVN > Checkout Projects
from SVN e introducir los datos del repositorio.
– Nos podremos bajar las soluciones de los ejercicios
propuestos.
17.
web.xml (I)
● El fichero web.xml contiene la configuración inicial al arrancar
el desarrollo web.
● Si se indica solamente el contexto de la aplicación, la página
que se mostrará inicialmente será una de las que se
marquen en el bloque <welcomefilelist><welcomefilelist>
– En este caso, la primera página no puede pasar por
ningún servlet por lo que la llamada es directamente al
recurso.
● El servlet de la implementación JSF controla las URL's
acabadas con una extensión determinada (en este caso
*.faces):
– Mediante las secciones <servlet><servlet> y <servletmapping><servletmapping>
se configura el servlet.
– Dado que el recurso indicado en la sección <welcome<welcome
filelist>filelist> no puede ser procesado por ningún servlet, es
habitual dejarla con una simple redirección.
20.
Creación de un Formulario (II)
● Lo primero que nos encontramos dentro del la página jsp es:
● Estamos indicando al motor de JSP's que queremos utilizar dos librerías de etiquetas, html html y corecore, la primera contiene todas las
etiquetas necesarias para trabajar con los elementos típicos de HTML, como por ejemplo, formularios... La librería corecore contiene
todas las etiquetas propias de JSF, por ejemplo, etiquetas de validación, etiquetas del controlador...
● Esta etiqueta es muy importante ya que informa al contenedor de que los componentes de esta página van a ser gestionados a
través de JSF, gracias a ella el árbol de componentes puede ser construído o encontrado si la vista ya había sido cargada con
anterioridad.
● Con la siguiente etiqueta le estamos diciendo a JSF que queremos representar un formulario en ese preciso lugar de la vista, a
través del atributo idid JSF podrá identificar cada uno de los componentes dentro del árbol que ha generado.
21.
Creación de un Formulario (III)
● Esta etiqueta lo único que hará será representar la cadena “Login” dentro de la página generada en nuestro navegador.
● A parte de representar una caja de texto dentro de la vista, esta etiqueta es importante por el hecho de que vincula el contenido de la
caja de texto con un campo nombrenombre del bean que hemos denominado loginActionloginAction, que no viene a ser otra cosa que la clase
LoginAction. LoginAction.
● El contenido del atributo valuevalue, cuyo valor es #{loginAction.nombre}#{loginAction.nombre}, es un ejemplo de uso de JSF EL, es decir, JavaServer Faces
Expression Language, utilizado para establecer una asociación entre la vista y el controlador de nuestra aplicación.
● Por último, pero no menos importante, tenemos la etiqueta commandButtoncommandButton que gracias a su atributo actionaction vinculará el método loginlogin
de la clase LoginActionLoginAction con el botón que estará representado en la página.
27.
Reglas de Navegación (III)
● Hablaremos de navegación estática cuando solamente
existe una página destino que podemos alcanzar:
● Diremos que la navegación es dinámica cuando existe más
de una página destino a la que podemos ir desde la página
origen:
● Este tipo de navegación estará implementado en la regla de
navegación que gestiona el desplazamiento entre la vista
loginNakloginNak y la vista login.
● Este caso es utilizado en la ventana de loginlogin, ya que no
sabremos hasta que se esté ejecutando la aplicación que
ventana tendremos que representar después de entrar en la
aplicación.
35.
Ciclo de vida de JSF (II)
● Fase Reconstituir el árbol de llamada:
– Crea un árbol de componentes para la página
solicitada.
● Fase Aplicar los valores de la llamada:
– Se efectúa una iteración en el árbol de componentes y
se ejecuta el método decode()decode() de cada componente.
Este método extrae información de la llamada y lo
almacena en el componente.
– Opcionalmente, los componentes pueden delegar la
descodificación a un renderizador.
– Para descodificar la información de la llamada, los
componentes o los renderizadores pueden crear
eventos de llamada. Estas señales suelen indicar un
cambio visual en uno o más componentes.
● Fase Gestionar los eventos de la llamada:
– Los eventos de la llamada se gestionan llamando al
método processEvents()processEvents() de cada componente que
tiene una o más llamadas.
– Los componentes pueden gestionar los eventos
directamente o delegando el evento a un gestor de
eventos.
– El método processEvents()processEvents() devuelve un valor
booleano .Si es falso, el ciclo de vida salta a la fase
Procesar Validaciones; de otro modo, el ciclo de vida
avanza directamente a la fase Renderizar la
Respuesta.
36.
Ciclo de vida de JSF (III)
● Fase Procesar validaciones:
– La implementación JSF invoca el método validate()validate() de
cada validador.
– Los validadores efectúan los chequeos y devuelven un
valor booleano del método validate()validate(). Si el método
devuelve true, el ciclo de vida procede normalmente;
en otro caso, la implementación JSF invoca
directamente a la fase Renderizar Respuesta.
● Fase Actualizar el modelo de valores:
– Cada componente JSF puede ser asociado a un
objeto Java (objeto modelo). El método updateModel()updateModel()
de los componentes realiza esta transferencia y
conversión. Los errores de conversión pueden ocurrir
durante esta fase (paso de la request como String a
objetos Java).
– Si se produce un error de conversión, la
implementación JSF invoca directamente la fase
Renderizar Respuesta.
● Fase Invocar la aplicación:
– Los eventos de formulario y comandos (links,
submit, ...) son gestionados en esta sección por un
gestor específico de la aplicacíón. Generalmente estos
gestores indican una URL y la implementación JSF
redirige la llamada a este enlace.
● Fase Renderizar la respuesta:
– Se genera el árbol de componentes de respuesta y se
envía la respuesta al cliente.
39.
Conversión (II)
● Para crear un conversor personalizado deberemos de seguir la siguientes instrucciones:
– Implementar el interfaz Converter (javax.faces.convert.Converter)
– Implementar el método getAsObject, el cual convierte un campo de nuestro formulario (String) en un objeto del tipo que
deseemos.
– Implementar el método getAsString, el cual convierte un objeto del tipo que nosotros necesitemos en un String.
– Registrar nuestro conversor personalizado en el contexto Faces.
– Insertar el conversor en las vistas que lo necesitemos utilizando la etiqueta <f:converter/><f:converter/>
47.
Integración JMS
● Hay determinadas acciones asociadas a las páginas web que en caso de tardar excesivo tiempo, darán un timeout en el navegador
del cliente.
– Por regla general, suelen ser tareas que tardan más tiempo que el timeout definido en el navegador por lo que la petición de
la Request es detenida.
● En la aplicación CaJsfWeb, existen 2 tareas que se pueden ejecutar en paralelo, es decir dejar la tarea en background para que el
servidor la ejecute cuando pueda. El cliente recibirá directamente la siguiente página y se le informará que en el menor tiempo
posible se efectuará la labor solicitada:
– Ejemplo aplicaciones:
● Creación del PDF del acta cerrada.
● Envío de email para recordar password.
La idea que tenemos que dejar clara es que JSF es el resultado de la experiencia de muchos años dentro del desarrollo de aplicaciones Web utilizando Java como lenguaje de programación.
Una idea que tenemos que transmitir es que las acciones programadas con JSF son directamente utilizables con Swing por ejemplo.
La parte del controlador podrá ser reutilizado en aplicaciones que utilicen la framework Swing
Comentar la posibilidad de realizar el proceso de la instalación de WTP de un modo manual bajando los ficheros:
emf-sdo-xsd-SDK-2.2.2.zip
GEF-SDK-3.2.2.zip
JEM-SDK-1.2.3_jem.zip
wtp-jsf-R-1.5.3.zip
http://download.eclipse.org/webtools/downloads/drops/R1.5/R-1.5.3-200702082048/
Descomprimir y mover el contenido a las carpetas de eclipse correspondientes.
IMPORTANTE: Recordar que tenemos que presionar el botón Select Requiered para que todo funcione correctamente.
Las instrucciones para instalar el plugin Subclipse se han encontrado en la siguiente página:
http://subclipse.tigris.org/install.html
Nosotros trabajaremos con MyFaces
Es importante notar que la conexión a la BBDD funciona después de haber configurado el conector.
Si por cualquier motivo se nos olvida introducir algún fichero .jar dentro de los jar&apos;s relacionados con la librería JSF podremos utilizar la siguiente opción para poder introducir los jar que nos hayamos dejado:
Window-&gt;Preferences...-&gt;Web and XML-&gt; JSF Libraries
Seleccionamos la que nos interese y presionamos Edit...
No es posible ejecutar un proyecto vacío: No puede encontrar un cliente capaz de lanzar la seleccion.
Podemos explicar que hay diferentes posibilidades para el código de la primera página (que no consta realmente de nuestra aplicación)
Opción 1: &lt;jsp:forward page=”login.faces” /&gt;
Opción 2: la que tenemos en nuestro desarrollo
Explicar que si la aplicación es complejo una buena idea es separar las reglas de navegación en un fichero que se suele denominar navigation.xml y dejar el registro de los managed-bean dentro del fichero faces-config.xml.
El fichero de configuración para el servlet utilizará el fichero que le hayamos indicado cuando hemos creado el proyecto dentro de Eclipse.
Introducir de manera muy superficial el inicio del ciclo de vida de JSF.
Introducir el concepto del árbol de componentes.
Hay que comentarles que el nombre del bean que aparece dentro del componente que hemos creado en la página TIENE QUE SER el mismo que aparece dentro del elemento &lt;managed-bean-name&gt;
También indicar la relación entre la etiqueta inputText y el método setXXX del bean que gestiona la vista.
Los métodos getters y setters serán utilizados por las vistas para poder trabajar con las properties del bean.
Podemos aprovechar esta transparencia para contarles todo el rollo de los scopes!!!
request
session
application
Explicar la relación entre el elemento from-outcome y el String devuelto por el método que hemos utilizado dentro del controlador con el botón.
Explicar la posibilidad, aunque a lo mejor cuando estén desarrollando algún ejemplo el tema de from-action para evitar alguna situación problemática
Avisar de que puede haber algun problema si queremos hacer modificaciones a través del editor WYSIWYG de las reglas de navegación, así que tienen que comprobar el fuente generado del fichero de configuración.
Es importante recordar pero solamente si lo hacen mal que tienen que incluir los componentes dentro de una vista y de un formulario porque sino está mal compuesta la página!!!
Una de las preguntas que me quedan por hacerle a Paco es que es lo que se modifica cuando ya hemos finalizado el proyecto dentro de la configuración de pre-producción y pasamos a la fase de producción. Creo que me comentó que docBase cambiaba y estaría bien comentarlo dentro del curso.
Otra idea que tenemos que aportar es porque hemos creado este fichero dentro de META-INF y no hemos editado &apos;a mano&apos; el fichero server.xml para añadir dicho elemento.
Una idea interesante a tener en cuenta es que dicho ciclo de vida puede modificarse por parte del desarrollador utilizando la clase FacesContext.
Podemos comentar cuales son todos los conversores estándar que nos proporciona la implementación myfaces.
Aviso que se ha producido cuando he introducido el símbolo € dentro de la vista para el ejemplo de la moneda. Utilizar la codificación UTF-8 en vez de ISO-8859-1.
File-&gt;Properties
Para finalizar dar una panoramica general de como estaría la arquitectura de JSF