P1C3 Anotaciones

36
Aurelio Martín Obando Távara [email protected] proyectos i ANOTACIONES

description

Esta presentación os ayudará a controlar el alcance de los beans administrados y a manejar parámetros de entrada por parte del usuario.

Transcript of P1C3 Anotaciones

Page 1: P1C3 Anotaciones

Aurelio Martín Obando Tá[email protected]

proyectos i

ANOTACIONES

Page 2: P1C3 Anotaciones

AGENDA- @ManagedBean- Nombres personalizados- Manejo de parámetros- Controlando el alcance- Resumen

Clase 03

1

Page 3: P1C3 Anotaciones

2 CONTENIDO

Page 4: P1C3 Anotaciones

Revi

sado

de

las

clas

es

ante

riore

sweb.xml

Debe tener un patrón-url *.jsf (o cualquier patrón que usted elija).Asigne Development a PROJECT_STAGE.

faces-config.xmlDebe tener una cabecera XML legal y las etiquetas de inicio y fin.No es necesario etiquetas en el cuerpo

some-page.xmlInvóquela usando some-page.jsf.

Page 5: P1C3 Anotaciones

web.xml

Debe ser una versión mayor a 2.5. Glassfish soporta servlets versión 3.0

Brinda mayor detalle en los mensajes de error. Esto es opcional y nuevo en JSF 2.0

Esto es lo mismo que en JSF 1.X

Patrón que obedece el Contexto Faces. Otras opciones populares son *.faces o /faces/*

Page 6: P1C3 Anotaciones

faces-config.xml

Clic derecho en Web Pages y seleccione >> New >> Other

En la categoría JavaServer Faces >> JSF Faces Configuration >> Next

Escribir en nombre: “faces-config” >> Finish

Durante el ejemplo, este archivo casi siempre estará vació. Todos los beans administrados usan los nombres por defecto y mapeo a páginas de resultado por defecto.

Page 7: P1C3 Anotaciones

some-page.xhtml

Tal como se discutió en las clases anteriores, de ahora en adelante se usará facelets con sintaxis xhtml para todas las páginas basadas en JSF 2.0; de este modo no se utilizará sintaxis jsp. Siempre se usará xmlns:h…, h:head, h:body y h:form. Mas adelante usaremos ocasionalmente xmlns:f… y/o xmlns:ui…

No se necesitan entradas como @taglib…

Page 8: P1C3 Anotaciones

Prin

cipi

os b

ásic

os d

e @

Man

aged

Bean

anotación @ManagedBean@ManagedBeanpublic class SomeBean { … }Para referirse al bean, use #{someBean.blah}, donde el nombre del bean es el nombre de la clase (sin los paquetes) con la primera letra en minúscula. Por defecto, el alcance del bean es Request. Y “blah” es exactamente el nombre de un método (dentro del atributo “action” de h:commandButton) o un shortcut para un método de acceso get y set (dentro del atributo “value” de h:inputText).

Valores de retorno de los métodos de acción de controlador

Si el método retorna “foo” o “bar” y no hay mapeo explícito en el faces-config.xml, entonces las páginas de resultado son foo.xhtml y bar.xhtml (dentro del mismo folder).

Page 9: P1C3 Anotaciones

Ejem

plo

IdeaClic en una página inicial.Obtener una de tres páginas de resultado, escogidas aleatoriamente.

Lo necesarioUna página de inicio

- <h:commandButton action=«#{simpleBean.doNavigation}» />Un bean administrado

- Class: SimpleBean- Anotación @ManagedBean- Un método doNavigation retorna 3 posibles Strings

- «page1», «page2» o «page3»Tres páginas

- Los nombres deben coincidir con los valores de retorno del método doNavigation (menos .xhtml)

- page1.xhtml, page2.xhtml o page3.xhtml

Page 10: P1C3 Anotaciones

start-page.xhtml

Esto significa que cuando Ud. presione el botón, JSF creará una instancia del bean administrado cuyo nombre sea simpleBean y luego se ejecutará el método doNavigation.

En JSF 1.X es el mismo formato; sin embargo en la nueva versión el nombre del bean administrado es derivado del nombre de la clase.

Page 11: P1C3 Anotaciones

SimpleBean.javaEsta anotación registra esta clase como bean administrado sin la necesidad de modificar el faces-config.xml.Debido a que no se especifica un nombre personalizado, el nombre es el nombre de la clase con la primera letra en minúscula (p.e. simpleBean). Para especificar un nombre, @ManagedBean(name=«someName»)Debido a que no se ha especificado un alcance, el alcance es Request. Para especificar otro alcance, @SessionScoped

Debido a que no se han definido reglas explícitas de mapeo en el faces-config.xml, estos valores de retorno corresponden a las páginas de resultado: page1.xhtml, page2.xhtml y page3.xhtml.

Page 12: P1C3 Anotaciones

page1.xhtml

Para el ejemplo, el contenido de esta página nos permitirá identificar que estamos en page1xhtml.

Las páginas page2.xhtml y page3.xhtml son similares.

Page 13: P1C3 Anotaciones

Resultado

Page 14: P1C3 Anotaciones

Dan

do n

ombr

es p

erso

naliz

ados

a

los

bean

s ad

min

istr

ados

El atributo name de @ManagedBean

@ManagedBean(name=“customName”)public class SomeClass { … }

Para referirse al bean, use #{customName.blah}, donde el nombre del bean es el valor exacto del atributo name.Por defecto, el alcance del bean es Request.Evitamos entradas en el faces-config.xml.

Page 15: P1C3 Anotaciones

Ejem

plo

IdeaClic en una página inicial.Obtener una de tres páginas de resultado, escogidas aleatoriamente.

Lo necesarioUna página de inicio

- <h:commandButton action=«#{coolName.doNavigation}» />Un bean administrado

- Class: SimpleBean2- Anotación @ManagedBean(name=«coolName»)- Un método doNavigation retorna 3 posibles Strings

- «page1», «page2» o «page3»Tres páginas

- Los nombres deben coincidir con los valores de retorno del método doNavigation (menos .xhtml)

- page1.xhtml, page2.xhtml o page3.xhtml

Page 16: P1C3 Anotaciones

start-page2.xhtml

Similar a la página start-page.xhtml, pero agregamos algo que nos permita saber nos encontramos en una segunda versión de la página start-page.xhtml.

Page 17: P1C3 Anotaciones

SimpleBean2.java

Usa el nombre «coolName» en vez de «simpleBean2».

Hereda el método doNavigation que retorna «page1», «page2» y «page3». Este ejemplo comparte las páginas de resultados con el ejemplo anterior.

Page 18: P1C3 Anotaciones

Resultado

Page 19: P1C3 Anotaciones

Usa

ndo

bean

s pa

ra m

anej

ar

pará

met

ros

de R

eque

stLos valores de entrada corresponden a propiedades del bean

<h:inputText value=“#{someBean.someProp}” />- Cuando el formulario es mostrado, llama al método getSomeProp(). Si el valor es diferente de null o vacío, pone el valor en el textfield.- Cuando el formulario es enviado (submitted), toma el valor del textfield y lo pasa a setSomeProp(…).

- La validación y/o tipos de conversión ocurren primero.

Es el mismo comportamiento que en JSF 1.X.

El alcance Request es siempre por defectoEl bean administrados es instanciado dos veces: primero cuando el formulario es inicialmente mostrado y luego cuando el formulario es enviado.Es el mismo comportamiento que en JSF 1.X.

#{bean.someProp} directamente en la salida (output)En vez de usar <h:outputText value=“#{bean.someProp}” />Nuevo en la versión JSF 2.0

Page 20: P1C3 Anotaciones

Ejem

plo

La ideaIngresar el código de un cliente de banco y su

contraseña.Obtener ya sea.

Una página que muestre el primer nombre, apellido y balance.

Distintas versiones dependiendo del balance.

Mensaje de error acerca del ingreso de datos.

Lo necesarioBean Administrado:

propiedades correspondientes a los parámetros de requestFormulario de entrada:

atributo de “valor” para h:inputTextPáginas de resultado:

#{miBean.miPropiedad}

Page 21: P1C3 Anotaciones

bank-lookup.xhtml

Este valor juega un doble rol. Cuando el formulario es mostrado por primera vez, bankinBean es instanciado y getCustomerId es llamado. Si el valor es diferente de vacío, ese resultado es el valor inicial de la caja de texto. De otro modo, la caja de texto aparecerá vacía.Cuando el formulario es enviado, bankingBean es instanciado nuevamente (asumiendo por defecto Request Scope) y el valor ingresado en la caja de texto es pasado a setCutomerId.

Page 22: P1C3 Anotaciones

BankingBeanBase.java

Automáticamente, estos serán llamados cuando por JSF cuando el formulario sea enviado.

¿A que se debe que el método showBalance() sea abstracto?

¿Por qué no existe un método setCustomer(…)?

Page 23: P1C3 Anotaciones

BankingBean.java

Llenados por JSF antes que el método showBalance () sea invocado.

El customer no es llenado automáticamente por JSF debido a que no es parte directa de los datos enviados, pero obtenido indirectamente de los datos ingresados. De este modo, customer es llenado por el método showBalance () a través de la lógica de negocio.

Existen 5 posibles resultados de página: wrong-password.xhtml, unknown-customer.xhtml, negative-balance.xhtml, normal-balance.xhtml, and high-balance.xhtml. Se está usando el mapeo por defecto de valores de retorno a nombres de archivos en todos los casos (en lugar de reglas de navegación explícitas en faces-config.xml).

Page 24: P1C3 Anotaciones

CustomerSimpleMap.java

Provee cierta lógica ya programada prueba de errores.

Page 25: P1C3 Anotaciones

CustomerLookupService.java

¿Por qué complicarse declarando los métodos de búsqueda en una interfaz?

Page 26: P1C3 Anotaciones

normal-balance.xhtml

Nótese que en JSF 2.0 se puede usar #{result} en vez de <h:outputText value="#{result}"/>. En ambos casos se obvia los caracteres HTML, entonces úsese la forma más corta mostrada aquí a menos que se necesite una de las siguientes opciones: h:outputText con el atributo “escape” igual a false, con el atributo “rendered” con un valor calculado, id, converter, etc.

negative-balance.xhtml y high-balance.xhtml son similares.

Page 27: P1C3 Anotaciones

unknown-customer.xhtml

Aunque customerId venga del usuario y pueda contener caracteres HTML, es seguro usar #{bankingBean.customerId} en vez de <h:outputText value="#{bankingBean.customerId}"/>.

wrong-password.xhtml es similar.

Page 28: P1C3 Anotaciones

Resultado

Page 29: P1C3 Anotaciones

Resultado

Page 30: P1C3 Anotaciones

Alca

nces

de

los

Bean

Ad

min

istr

ados

IdeaDesigna por cuando tiempo los beans administrados permancerán “vivos”.

Alcances JSF 1.X

Request, Session, Application

Especificado en faces-config.xml

Por defecto alcance Request

Page 31: P1C3 Anotaciones

Anot

acio

nes

para

esp

ecifi

car e

l al

canc

e de

l bea

n ad

min

istr

ado

@RequestScoped •Por defecto. Crea una nueva instancia por cada HTTP Request. Esto significa que este bean es generalmente instanciado dos veces (cuando el formulario es mostrado y cuando es enviado).

@SessionScoped •Pone el bean a nivel de toda la sesión. Si el mismo usuario con el mismo cookie retorna antes que la sesión expire, la misma instancia del bean será usada. El bean debe ser serializado.

@ApplicationScoped

•Pone el bean a nivel de toda la aplicación. Compartido por todos los usuarios. Mucho cuidado al momento de sincronizar el acceso.

Page 32: P1C3 Anotaciones

Anot

acio

nes

para

esp

ecifi

car e

l al

canc

e de

l bea

n ad

min

istr

ado

@ViewScoped•La misma instancia del bean es usando mientras el usuario esté en la misma página (vista). •Nuevo alcance en JSF 2.0.•El bean debería ser serializado.

@CustomScoped•p.e. @CustomScoped(value=«#{someMap}»)•El bean es almacenado en el mapa y el programador puede controlar el ciclo de vida del bean.•Nuevo alcance en JSF 2.0.

@NoneScoped•El bean no es ubicado en ningún alcance. Útiles para los beans que son referenciados por otros bean que sí están en cierto alcance.•Nuevo alcance en JSF 2.0.

Page 33: P1C3 Anotaciones

3 Resumen

Page 34: P1C3 Anotaciones

» Se puede utilizar anotaciones para definir el alcance» Request Scope» Session Scope» Application Scope» View Scope» Custom Scope» None Scope

» Tradicionalmente ubicado después de @ManagedBean@ManagedBean@SessionScopedpublic class somBean {…}

PUNTOS PRINCIPALES

Page 35: P1C3 Anotaciones

GRACIAS

Page 36: P1C3 Anotaciones

O también puedes encontrarla

en .

Saludos!

AULA VIRTUALEncuentra esta presentación en el