2012-10-01 46 views
7

Estoy compilando una aplicación web utilizando JSF/Primefaces. Necesito tener una clase "constantes", es decir, una clase que constará de constantes. Estas constantes son principalmente comandos de navegación que se usarán en toda la aplicación. La razón por la que estoy haciendo esto es para evitar tener instancias de cadenas en una base ad-hoc.Tener una clase "constantes" en JSF

¿Cómo logro esto, haciendo que las constantes sean accesibles tanto desde el respaldo de los beans como desde los archivos XHTML?

He intentado usar @ApplicationScoped y usar el patrón Singleton (clase Singleton) pero no puedo hacerlo funcionar debido a problemas de alcance.

O tal vez estoy utilizando el enfoque equivocado. Cualquier idea/sugerencia es bienvenida.

+0

¿Por qué no tiene una clase con 'public static final String page1 =" page1.xhtml "'. Recuerde que esta clase se usará en sus beans administrados. Si vas a usar cualquiera de estos valores en tu código JSF, entonces podrías agregar @ApplicationScope a la clase y getters para el 'String's que usarás. –

+0

¿Puedes explicarlo con un ejemplo? – javaMS

Respuesta

12

¿Cómo logro esto, haciendo que las constantes sean accesibles tanto desde el respaldo de los beans como desde los archivos XHTML?

En el respaldo de los granos, es obviamente fácil. Como solo son clases Java, no es diferente de la forma Java "normal". Puede usar los campos enum o public static final. En vistas, esta es una historia diferente. Hasta la próxima versión 3.0, EL does not support constants de ninguna manera.

Sugiero usar enums ya que EL tiene soporte implícito para ellos en las comparaciones de cadenas. No realiza ningún control de seguridad de tiempo de compilación/tiempo de ejecución, pero puede usar el nombre de la enumeración como una cadena. P.ej.

<h:someComponent ... rendered="#{order.status == 'SHIPPING'}" /> 

Si prefiere más código autodocumentado y un cheque de tiempo de ejecución (no, una comprobación de tiempo de compilación no es posible), entonces se podría considerar el uso de OmniFaces<o:importConstants>.

<o:importConstants type="com.example.OrderStatus" /> 
<h:someComponent ... rendered="#{order.status == OrderStatus.SHIPPING}" /> 

Esto es IMO solo un poco más torpe. Sin embargo, el control del tiempo de ejecución es bueno durante el desarrollo. Un error tipográfico es fácilmente supervisado.

En el futuro EL 3.0 (JSR-341, parte de Java EE 7), es posible hacer referencia a las constantes de la misma manera. Consulte también How to reference constants in EL?. Esto solo requiere la importación programática de las constantes ya que no hay una etiqueta JSP/Facelets estándar para eso.

+0

He usado enumeraciones y funcionan bien en el nivel de frijol. Sin embargo, cuando trato de usar omnifaces para importar la enumeración, obtengo una excepción. Mi opinión tiene esto: y luego tengo el comando public String add (Object object, Object command) {(...) NavigationHelper nh = (NavigationHelper); en el frijol La excepción es java.lang.NullPointerException – javaMS

+0

Ok, encontré el problema. Tengo que colocar en el -block. Lo había colocado fuera de él lo que condujo a esta excepción. ¿Puedes explicar lo que quieres decir con torpe? – javaMS

+0

Las etiquetas deben colocarse dentro de la vista, no afuera. Si está utilizando una plantilla maestra, también puede colocarla allí, para que no tenga que repetirla en todos los clientes de plantilla. "Torpe" significa aquí "no lo suficientemente simple". Me gusta la simplicidad. – BalusC

Cuestiones relacionadas