Ir al contenido principal

JSF 2.0: Managed Beans (II)

En este segundo post sobre managed beans, vamos a ver cómo inicializar las propiedades de un bean, qué pasa cuando son propiedades de tipo array, List o Map y cómo declarar un bean directamente como un List o un Map.

¿Cómo inicializamos las propiedades de un bean?
  - Utilizando anotaciones
@ManagedBean
@SessionScoped
public class UserBean {
   @ManagedProperty(value="Ana")
    private String name   
    ...
}
- Utilizando el fichero faces-config.xml
<managed-bean>
   <managed-bean-name>userBean</managed-bean-name>
   <managed-bean-class>com.examples.UserBean</managed-bean-class>
   <managed-bean-scope>session</managed-bean-scope>
   <managed-property>
       <property-name>name</property-name>
       <value>Ana</value>
   </managed-property>
</managed-bean>

En <value> podemos hacer referenciar a otro bean como #{adress}. También podemos poner a null una propiedad:
<managed-property>
     <property-name>nick</property-name>
     <null-value/>
</managed-property>

¿Cómo inicializamos propiedades de tipo array o java.util.List?
Tenemos que hacerlo en el fichero faces-config.xml y no con anotaciones, ya que no existe ninguna sintáxis que nos permita hacerlo.
<managed-property>
     <property-name>colores</property-name>
     <list-entries>
          <value>Rojo</value>
          <value>Verde</value>
          <value>Amarillo</value>
     </list-entries>
</managed-property>

Desde nuestra página JSF, podemos acceder a estos valores: <h:outputText value="#{userBean.colores[2]}"/>. El por qué accedemos de esta manera a las propiedades de un bean lo veremos en un post posterior, ahora quedaros con la idea.

Si nuestro array no contiene Strings, como en el ejemplo anterior, sino por ejemplo enteros, tendríamos que indicarlo de la siguiente manera:
<managed-property>
    <property-name>numHabitaciones</property-name>
    <list-entries>
        <value-class>java.lang.Integer</value-class>
        <value>1</value>
        <value>2</value>
        <value>3</value>
    </list-entries>
</managed-property>

¿Cómo inicializamos propiedades de tipo java.util.Map?
También tenemos que hacerlo en el fichero faces-config.xml.
<managed-property>
    <property-name>colores</property-name>
    <map-entries>         <map-entry>
            <key>Rojo</key>
            <value>No puedes continuar</value>
        </map-entry>         <map-entry>
            <key>Verde</key>
            <value>Puedes continuar</value>
        </map-entry>
    </map-entries>
</managed-property>

Desde nuestra página JSF, podemos acceder a estos valores: <h:outputText value="#{userBean.colores['Verde']}"/> Como ya hemos visto antes, aquí se utilizan Strings por defecto. Si quisiéramos que nuestras keys fueran enteros, haríamos lo siguiente:
<map-entries>
    <key-class>java.lang.Integer</key-class>
    <map-entry>
        <key>1</key>
        ...
</map-entries>

¿Cómo declaramos un List o Map como un managed bean directamente?
     <managed-bean-name>colores</managed-bean-name>
     <managed-bean-class>java.util.ArrayList</managed-bean-class>
     <managed-bean-scope>none</managed-bean-scope>
     <list-entries>
         <value>Rojo</value>
         <value>Amarillo</value>
         <value>Verde</value>
     </list-entries>
</managed-bean>

Si nos fijamos en el ejemplo, vemos que el scope del bean se ha puesto a none. Esto significa que el bean no va a ser almacenado en ningún sitio, sino que va a ser instanciado siempre que se necesite.

También podemos hacer que un bean referencie a otro bean de la siguiente manera:
<managed-bean>
    <managed-bean-name>datosBean</managed-bean-name>
    <managed-bean-class>com.examples.DatosPersonalesBean</managed-bean-class>
    <managed-bean-scope>none</managed-bean-scope>
</managed-bean>
<managed-bean>
    <managed-bean-name>userBean</managed-bean-name>
    <managed-bean-class>com.examples.UserBean</managed-bean-class>
    <managed-bean-scope>session</managed-bean-scope>
    <managed-property>
        <property-name>datos</property-name>
        <value>#{datosBean}</value>
    </managed-property>
</managed-bean>

Con anotaciones sería:
@ManaqedProperty(value="#{datosBean}")
private DatosPersonalesBean datos;


Comentarios

Entradas populares de este blog

Leer un fichero properties con java.util.Properties

Los ficheros .properties son simples ficheros de texto que se suelen utilizar para guardar parámetros de configuración, en forma de pares clave-valor. Ejemplo de fichero: configuration.properties #User parameters user.name=Ana user.language=spanish Si estamos usando Java, podemos utilizar la clase java.util.Properties para leer los parámetros de este fichero: private static final String USER_NAME = "user.name"; private static final String USER_LANGUAGE = "user.language"; public void showProperties() throws Exception { Properties p = new Properties(); InputStream is = App.class.getResourceAsStream("/configuration.properties"); p.load(is); is.close(); String userName = p.getProperty(USER_NAME); String userCountry = p.getProperty(USER_LANGUAGE); System.out.println("userName: "+userName); System.out.println("userLanguage: "+userCountry); } Después de ejecutar este método, obtendríamos la siguiente salida: ...

JSF 2.0: Managed Beans (III)

Anteriormente ya hemos visto que cuando se declara un bean, tenemos que darle un scope: application, session, view, request, none. Un scope es un mapeo entre nombres y objetos que se almacena durante un determinado periodo de tiempo. En este post vamos a explicar cada uno de ellos. Si declaramos el bean desde el fichero faces-config.xml, indicamos el scope en <managed-bean-scope> y si queremos hacerlo con anotaciones, utilizaremos @{Application,Session,View,Request,None}Scoped Application Con este scope, se guarda la información durante toda la vida de la aplicación web, independientemente de todas las peticiones y sesiones que se realicen. Este bean se instancia con la primera petición a la aplicación y desaparece cuando la aplicación web se elimina del servidor. Si queremos que el bean se instancie antes de que se muestre la primera página de la aplicación, usamos la propiedad eager a true. @ManagedBean(eager=true) ó <managed-bean eager="true"> Session...

JSF 2.0: Message bundles

Los message bundles son ficheros .properties que guardan mensajes del tipo clave=valor. Si centralizamos todos los mensajes de nuestra aplicación en estos ficheros, es más fácil poder localizarlos si queremos realizar algún cambio y también nos ayuda para la internacionalización de la aplicación. Ejemplo: messages.properties (en src/java/com/examples) con dos mensajes name=Tu nombre: age=Tu edad: ¿Cómo los declaramos? 1) En cada página JSF donde lo necesitemos <f:loadBundle basename="com.examples.messages" var="msgs"/> 2) De manera global en faces-config.xml <application>      <resource-bundle>           <base-name>com.examples.messages</base-name>           <var>msg</var>      </resource-bundle> </application> Esta opción es más eficiente ya que sólo crea el bundle una v...