Está en la página 1de 74

Taller de Sistemas de

Información 2
Clase 12
Java Server Faces
Que es JSF?
 Un set de controles web y sus handlers
asociados?
 Un framework para la capa de presentacion,
independiente del dispositivo?
 Un Struts mejorado?

 Cual es la mejor forma de ver a JSF?


o Depende del uso, pero la 1 y la 3 son las formas
mas comunes de ver a JSF

INCO - Facultad de Ingeniería – Montevideo, Uruguay 2


JSF vs. MVC + Request
Dispatcher
 Algunas ventajas al usar JSF, frente a un
MVC o front controller, implementado con un
Request dispatcher…

INCO - Facultad de Ingeniería – Montevideo, Uruguay 3


JSF vs. MVC + Request
Dispatcher
 Controles GUI custom
o Podemos crear interfaces web complejas
 Manejo de eventos
o Es sencillo determinar el codigo Java ejecutado
por un evento en el formulario
 Managed beans
o Es sencillo seleccionar el codigo ejecutado en el
servidor

INCO - Facultad de Ingeniería – Montevideo, Uruguay 4


JSF vs. MVC + Request
Dispatcher
 Expression Language
o Provee un legnuaje sencillo para el acceso a la
informacion en los beans en el servidor
 Conversion y validacion de los campos en el
formulario
o Provee capacidades built-in para resolver este
problema
 Configuracion centralizada
o A traves de archivos XML o de propiedades

INCO - Facultad de Ingeniería – Montevideo, Uruguay 5


JSF vs. MVC + Request
Dispatcher
 Enfoque consistente
o Promueve el uso consistente de MVC en las
aplicaciones web

 Pero… tiene algunas desventajas

INCO - Facultad de Ingeniería – Montevideo, Uruguay 6


JSF vs. MVC + Request
Dispatcher
 Curva de aprendizaje mayor
o Debemos conocer JSPs, Servlets, y un API
bastante grande
 Documentacion pobre
o Tenemos menos recursos online y libros sobre
JSF que sobre JSPs / Servlets / Struts
o Como siempre, esto cambia con el tiempo y uso
del framework

INCO - Facultad de Ingeniería – Montevideo, Uruguay 7


JSF vs. MVC + Request
Dispatcher
 Menos transparente
o Ocurre mucho tras “mostradores”
o Mas dificil de entender
o Mas dificil de depurar y optimizar
 Poco desarrollo de herramientas de soporte
o Como la documentacion, esto cambia con el
tiempo
 Rigido
o Debemos usar un MVC, si o si

INCO - Facultad de Ingeniería – Montevideo, Uruguay 8


JSF vs. Struts
 Tambien tenemos algunas ventajas frente a
Struts…

 Componentes custom
o JSF hace facil combinar una GUI compleja, en un
control custom reutilizable
 Soporte para otras tecnologias de despliegue
o JSF no esta limitado a HTML sobre HTTP

INCO - Facultad de Ingeniería – Montevideo, Uruguay 9


JSF vs. Struts
 Acceso a los beans por nombre
o El acceso a los elementos en memoria, es mas
sencillo en JSF
o Podemos asignar un nombre unico a cada
componente en memoria
 Expression Language
o El lenguaje de JSF para acceder a los beans es
mas preciso y concreto que el de Struts

INCO - Facultad de Ingeniería – Montevideo, Uruguay 10


JSF vs. Struts
 Controller y beans mas simples
o No hay que extender ninguna clase especial
o Es no intrusivo
 Archivos de configuracion y estructura
general mas simples
 Potencialmente, el soporte de las
herramientas puede ser mejor

INCO - Facultad de Ingeniería – Montevideo, Uruguay 11


JSF vs. Struts
 Pero… tambien tiene algunas desventajas

 Base establecida y momentum…


o Struts tiene una base establecida y un
momentum entre los desarrolladores que JSF no
 Soporte para otras tecnologias de despiegue
 

INCO - Facultad de Ingeniería – Montevideo, Uruguay 12


JSF vs. Struts
 Confusiones en el nombrado de archivos
o Problema de cómo se nombran y referencian las
paginas en JSF
 Enfoque de Self-submit
o Es un tema de cómo se envia la informacion
desde el html al server
o En JSF puede dar lugar a confusiones

INCO - Facultad de Ingeniería – Montevideo, Uruguay 13


JSF vs. Struts
 Menos soporte de herramientas
 Falta de soporte para Tiles
o Tiles = Mecanismo de layout en paginas de Struts
 Validators mas debiles
 Falta de validators a nivel del cliente

 Peor instalacion
o Falta de struts-blank.war
 Falta de soporte para GET

INCO - Facultad de Ingeniería – Montevideo, Uruguay 14


Arrancando…
 Existen varias formas de iniciar una nueva
web application con JSF
 Las mas facil?

 Copiar una existente

INCO - Facultad de Ingeniería – Montevideo, Uruguay 15


Navegacion entre
paginas

Java Server Faces


Flujo de control en JSF

INCO - Facultad de Ingeniería – Montevideo, Uruguay 17


Flujo de control en JSF
 Se despliega un formulario
o f:view y h:form
 Se hace submit del form a si mismo
o La URL / ACTION a los que posteamos, es
http://.../blah.faces
 Se instancia un bean
o Los beans se configuran en el archivo faces-
config.xml

INCO - Facultad de Ingeniería – Montevideo, Uruguay 18


Flujo de control en JSF
 Se invoca el metodo del action controller
o Es el valor del atributo action de un
h:commandButton
 El action method retorna una condicion
(string)
o Es un string que matchea from-outcome en las
reglas de navegacion de faces-config.xml

INCO - Facultad de Ingeniería – Montevideo, Uruguay 19


Flujo de control en JSF
 Se despliega una pagina de resultado
o La pagina se especifica por el valor del atributo
to-view-id en las reglas de navegacion del archivo
faces-config.xml

INCO - Facultad de Ingeniería – Montevideo, Uruguay 20


Pasos para usar JSF
 Creamos un bean
o Propiedades para los datos del form
o “Action controller methods”
o Repositorio para los datos resultado
 Creamos un form para ingreso de datos
o Los campos de entrada se refieren a propiedades
del bean
o Los botones especifican condiciones, o metodos
del bean, que devolveran condiciones

INCO - Facultad de Ingeniería – Montevideo, Uruguay 21


Pasos para usar JSF
 Editamos el archivos faces-config.xml
o Especificamos los beans
o Declaramos las reglas de navegacion
 Creamos las paginas para mostrar resultados
o Mostramos datos con h:outputText
 Prevenimos el acceso directo a las paginas
JSP
o Usamos un filtro que redirija blah.jsp a blah.jsf

INCO - Facultad de Ingeniería – Montevideo, Uruguay 22


Ejemplo: Registration
 Copiamos la webapp jsf-blank
o La colocamos en Eclipse
o La renombramos a jsf-navigation
 URL inicial
o http://hostname:8080/jsf-navigation/register.faces
 Cuando hacemos submit del form
o Se presenta una pagina de resultados
o WEB-INF/results/result.jsp

INCO - Facultad de Ingeniería – Montevideo, Uruguay 23


Ejemplo: Registration
 El resultado es estatico
o No aplicamos ninguna regla de negocio
 Lo interesante de esto?
o El formato del form original
o Las reglas de navegacion

INCO - Facultad de Ingeniería – Montevideo, Uruguay 24


Formato del form
<%@ taglib uri="http://java.sun.com/jsf/core"
prefix="f" %>
<%@ taglib uri="http://java.sun.com/jsf/html"
prefix="h" %>

<f:view>
HTML markup
<h:form>
HTML markup and h:blah tags
</h:form>
HTML markup
</f:view>

INCO - Facultad de Ingeniería – Montevideo, Uruguay 25


Formato de faces-config.xml
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE faces-config PUBLIC …>
<faces-config>
<navigation-rule>
<from-view-id>/blah.jsp</from-view-id>
<navigation-case>
<from-outcome>some string</from-outcome>
<to-view-id>
/WEB-INF/results/something.jsp
</to-view-id>
</navigation-case>
</navigation-rule>
</faces-config>
INCO - Facultad de Ingeniería – Montevideo, Uruguay 26
Creacion del form
Formato basico
<%@ taglib uri="http://java.sun.com/jsf/core"
prefix="f" %>
<%@ taglib uri="http://java.sun.com/jsf/html"
prefix="h" %>

<f:view>
<BODY>
<h:form>
...
</h:form>
</BODY>
</f:view>

INCO - Facultad de Ingeniería – Montevideo, Uruguay 27


Creacion del form
 El archivo de la pagina invocada es blah.jsp
 Pero la URL que colocamos en el navegador
es blah.faces

INCO - Facultad de Ingeniería – Montevideo, Uruguay 28


Creacion del form
 Elemento h:form
o ACTION: Tiene el valor “self”, apuntando a la
pagina actual (URL actual)
o METHOD: Siempre es POST
 Elementos dentro de h:form
o Los elementos de input se representan con tags
especiales
o Estos elementos pueden asociarse a propiedades
del bean

INCO - Facultad de Ingeniería – Montevideo, Uruguay 29


Creacion del form
 Elementos dentro de h:form
o h:inputText equivale a <input type=“text”
o h:inputSecret equivale a <input type=“password”
o h:commandButton equivale a <input
type=“submit”
 En caso de una navegacion estatica,
especificamos dentro del action del
h:commandButton, el “outcome” al que
queremos ir

INCO - Facultad de Ingeniería – Montevideo, Uruguay 30


result.jsp
 El archivo es
o TOMCAT-DIR/webapps/jsf-navigation/register.jsp
 La URL es
o http://localhost/jsf-navigation/register.faces

INCO - Facultad de Ingeniería – Montevideo, Uruguay 31


result.jsp

INCO - Facultad de Ingeniería – Montevideo, Uruguay 32


<%@ taglib uri="http://java.sun.com/jsf/core"
prefix="f" %>
<%@ taglib uri="http://java.sun.com/jsf/html"
prefix="h" %>
<f:view>
<HTML>
<HEAD>…</HEAD>
<BODY>
<CENTER>
<TABLE BORDER=5>
<TR><TH CLASS="TITLE">New Account Registration</TH></TR>
</TABLE>
<P>
<h:form>
Email address: <h:inputText/><BR>
Password: <h:inputSecret/><BR>
<h:commandButton value="Sign Me Up!" action="register"/>
</h:form>
</CENTER></BODY></HTML>
</f:view>
INCO - Facultad de Ingeniería – Montevideo, Uruguay 33
Editamos faces-config.xml
 Formato general:

<?xml version='1.0' encoding='UTF-8'?>


<!DOCTYPE faces-config PUBLIC …>
<faces-config>

</faces-config>

INCO - Facultad de Ingeniería – Montevideo, Uruguay 34


Reglas de navegacion
<faces-config>
<navigation-rule>
<from-view-id>
/the-input-form.jsp
</from-view-id>
<navigation-case>
<from-outcome>
string-from-action
</from-outcome>
<to-view-id>
/WEB-INF/…/something.jsp
</to-view-id>
</navigation-case>
</navigation-rule>
</faces-config>
INCO - Facultad de Ingeniería – Montevideo, Uruguay 35
En nuestro ejemplo…
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE faces-config PUBLIC …>
<faces-config>
<navigation-rule>
<from-view-id>/register.jsp</from-view-id>
<navigation-case>
<from-outcome>register</from-outcome>
<to-view-id>
/WEB-INF/results/result.jsp
</to-view-id>
</navigation-case>
</navigation-rule>
</faces-config>

INCO - Facultad de Ingeniería – Montevideo, Uruguay 36


Resultados
 Debido a que internamente JSF utiliza un
RequestDispatcher, esto nos permite colocar
las paginas dentro de WEB-INF
 Esto protege el acceso directo a los JSPs
o …/jsf-navigation/WEB-INF/results/result.jsp

INCO - Facultad de Ingeniería – Montevideo, Uruguay 37


Resultados
<!DOCTYPE …>
<HTML>
<HEAD>…</HEAD>
<BODY>
<CENTER>
<TABLE BORDER=5>
<TR><TH CLASS="TITLE">Success</TH></TR>
</TABLE>
<H2>You have registered successfully.</H2>
</CENTER>
</BODY></HTML>

INCO - Facultad de Ingeniería – Montevideo, Uruguay 38


Resultados

Notar que la URL no cambia!!


INCO - Facultad de Ingeniería – Montevideo, Uruguay 39
Acceso directo a las paginas
JSP
 Es algo que debemos prevenir
 Existe una correspondencia entre las URLs
y los nombres de archivo
o Los archivos son de la forma blah.jsp
o Las URLs usadas son de la forma blah.faces
 Si un cliente accede directamente a la JSP,
puede obtener resultados erroneos
o Debemos prevenirlo

INCO - Facultad de Ingeniería – Montevideo, Uruguay 40


Estrategia
 No podemos poner las paginas con
formularios dentro de WEB-INF
o Debido a que la URL debe corresponder a un
archivo
 Entonces, usamos un filtro para redirigir en el
web.xml
o Debemos conocer la extension (.faces)
o Asume que las paginas JSF siempre tendran
extension fisica .jsp

INCO - Facultad de Ingeniería – Montevideo, Uruguay 41


INCO - Facultad de Ingeniería – Montevideo, Uruguay 42
FacesRedirectFilter
 Creamos un filtro que intercepte todo pedido
y detecte si estamos accediendo
directamente a un JSP.
 En caso afirmativo, redirigmos a la pagina
.faces correspondiente

INCO - Facultad de Ingeniería – Montevideo, Uruguay 43


public class FacesRedirectFilter implements Filter {
private final static String EXTENSION = "faces";

public void doFilter(ServletRequest req,


ServletResponse res,
FilterChain chain)
throws ServletException, IOException {
HttpServletRequest request = (HttpServletRequest)req;
HttpServletResponse response = (HttpServletResponse)res;
String uri = request.getRequestURI();
if (uri.endsWith(".jsp")) {
int length = uri.length();
String newAddress = uri.substring(0, length-3) +
EXTENSION;
response.sendRedirect(newAddress);
} else { // Address ended in "/"
response.sendRedirect("index.faces");
}
}
...
INCO - Facultad de Ingeniería – Montevideo, Uruguay 44
FacesRedirectFilter
 Agregamos al web.xml

<filter>
<filter-name>faces-redirect-filter</filter-name>
<filter-class>
coreservlets.FacesRedirectFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>faces-redirect-filter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
INCO - Facultad de Ingeniería – Montevideo, Uruguay 45
Flujo de control en JSF (de
nuevo)
 Se instancia un bean
o Los beans se configuran en el archivo faces-
config.xml
 Se invoca el metodo del action controller
o Es el valor del atributo action de un
h:commandButton
 El action method retorna una condicion
(string)
o Es un string que matchea from-outcome en las
reglas de navegacion de faces-config.xml

INCO - Facultad de Ingeniería – Montevideo, Uruguay 46


Puntos importantes…
 Especificamos en el commandButton, el
controller que atendera el pedido del metodo
o <h:commandButton value="Sign Me Up!“
action="#{healthPlanController.signup}"/>
 El “controller method” retorna strings con las
condiciones
o Si es nulo, se muestra el mismo form
o Si es no nulo, se usa para determinar la vista a la
cual ir, usando la regla de navegacion apropiada

INCO - Facultad de Ingeniería – Montevideo, Uruguay 47


Controller method
 Debemos declarar en el faces-config.xml, el
controller method, el cual se encuentra en el
controller bean
 Este bean, se denomina tambien “managed
bean”

INCO - Facultad de Ingeniería – Montevideo, Uruguay 48


Controller method
<faces-config>
<managed-bean>
<managed-bean-name>
controller name
</managed-bean-name>
<managed-bean-class>
controller class
</managed-bean-class>
<managed-bean-scope>
request
</managed-bean-scope>
</managed-bean>
</faces-config>

INCO - Facultad de Ingeniería – Montevideo, Uruguay 49


Controller method
public class HealthPlanController {

public String signup() {


if (Math.random() < 0.2) {
return("accepted");
} else {
return("rejected");
}
}

}
INCO - Facultad de Ingeniería – Montevideo, Uruguay 50
Modificamos
<%@ el form
taglib uri="http://java.sun.com/jsf/core"
prefix="f" %>
<%@ taglib uri="http://java.sun.com/jsf/html"
prefix="h" %>
<f:view>

<h:form>
First name: <h:inputText/><BR>
Last name: <h:inputText/><BR>
...
<h:commandButton
value="Sign Me Up!"
action="#{healthPlanController.signup}"/>
</h:form>…
</f:view>
INCO - Facultad de Ingeniería – Montevideo, Uruguay 51
Declaramos el bean
<faces-config>
<managed-bean>
<managed-bean-name>
healthPlanController
</managed-bean-name>
<managed-bean-class>
coreservlets.HealthPlanController
</managed-bean-class>
<managed-bean-scope>
request
</managed-bean-scope>
</managed-bean>
</faces-config>

INCO - Facultad de Ingeniería – Montevideo, Uruguay 52


Definimos las reglas de
navegacion
<faces-config>
… (bean definitions anteriores)
<navigation-rule>
<from-view-id>/signup.jsp</from-view-id>
<navigation-case>
<from-outcome>accepted</from-outcome>
<to-view-id>/WEB-INF/results/accepted.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>rejected</from-outcome>
<to-view-id>/WEB-INF/results/rejected.jsp</to-view-id>
</navigation-case>
</navigation-rule>
</faces-config>

INCO - Facultad de Ingeniería – Montevideo, Uruguay 53


Definimos las reglas de
navegacion

INCO - Facultad de Ingeniería – Montevideo, Uruguay 54


Algunos puntos extra
 * en el valor “from-view-id” matchea con
cualquier pagina
 Recuperar el request / response

ExternalContext context =
FacesContext.getCurrentInstance()
.getExternalContext();

HttpServletRequest request =
(HttpServletRequest)context.getRequest();
HttpServletResponse response =
(HttpServletResponse)context.getResponse();
INCO - Facultad de Ingeniería – Montevideo, Uruguay 55
Algunos puntos extra
 Podemos mezclar en el faces-config.xml la
definicion de los beans y las reglas de
navegacion

<navigation-rule>
<from-view-id>*</from-view-id>
<navigation-case>
<from-outcome>success</from-outcome>
<to-view-id>/WEB-INF/results/success.jsp</to-view-id>
</navigation-case>
</navigation-rule>

INCO - Facultad de Ingeniería – Montevideo, Uruguay 56


Managed beans

Java Server Faces


Flujo de JSF (de nuevo…)

INCO - Facultad de Ingeniería – Montevideo, Uruguay 58


Flujo de control en JSF
 Se despliega un formulario
o f:view y h:form
o Se instancian los beans
o Si los getters del bean devuelven no nulo, esos
valores se usan para poblar el formulario, si
corresponde
 Se hace submit del form a si mismo
o La URL / ACTION a los que posteamos, es
http://.../blah.faces

INCO - Facultad de Ingeniería – Montevideo, Uruguay 59


Flujo de control en JSF
 Se instancia el bean
o Se instancian los beans declarados en la seccion
managed beans del faces-config.xml
o Asumiendo que esta en request scope
o Se ejecutan los setters del bean, pasandole los
valores en los h:inputText
 Se invoca el metodo del action controller
o Es el valor del atributo action de un
h:commandButton

INCO - Facultad de Ingeniería – Montevideo, Uruguay 60


Flujo de control en JSF
 El action method retorna una condicion
(string)
o Es un string que matchea from-outcome en las
reglas de navegacion de faces-config.xml
 Se despliega una pagina de resultado
o La pagina se especifica por el valor del atributo
to-view-id en las reglas de navegacion del archivo
faces-config.xml

INCO - Facultad de Ingeniería – Montevideo, Uruguay 61


Un ejemplo…
 Tenemos un bean

public class MyBean {


public String getBlah() {…}
public void setBlah(String newValue){

}…
}

INCO - Facultad de Ingeniería – Montevideo, Uruguay 62


Un ejemplo…
 Lo declaramos en el faces-config.xml
<faces-config>
<managed-bean>
<managed-bean-name>
beanName
</managed-bean-name>
<managed-bean-class>
package.MyBean
</managed-bean-class>
<managed-bean-scope>
request
</managed-bean-scope>
</managed-bean>…
</faces-config>
INCO - Facultad de Ingeniería – Montevideo, Uruguay 63
Un ejemplo…
 Usamos h:inputText para asociar un textfield
con las propiedades del bean
o <h:inputText
value="#{beanName.propertyName}"/>
 Usamos un h:outputText para mostrar las
propiedades de un bean
o <h:outputText
value="#{beanName.propertyName}"/>

INCO - Facultad de Ingeniería – Montevideo, Uruguay 64


Creando el bean
 Propiedades para el formulario
o Para cada paraemtro del request, se provee un
getter/setter
o Si el input dice value=“#{name.value}”, entonces
se debe proveer getValue() y setValue()
o Cuando el form se despliega por primera vez
 Se instancia el bean (request scope)
 Se llama a los getters
 Si el resultado es no nulo o no es un String vacio, el
valor se coloca en el textfield

INCO - Facultad de Ingeniería – Montevideo, Uruguay 65


Creando el bean
 Propiedades para el formulario
o Cuando se hace submit del formulario
 Se instancia una nueva copia del bean (request
scope)
 Se pasan los valores de los textfields a los setters del
bean
 Los strings se convierten al tipo de datos apropiado
 El form se redespliega si existen errores

INCO - Facultad de Ingeniería – Montevideo, Uruguay 66


Creando el bean
 Action controller method
o El metodo esta en el propio bean
o Puede acceder a las propiedades del bean
o El metodo puede ejecutar o invocar cualquier
logica de negocio
o Puede almacenar resultados de interes, en
propiedades dentro del bean

INCO - Facultad de Ingeniería – Montevideo, Uruguay 67


Formpublic
data class RegistrationBean
implements Serializable {
private String email = "user@host";
private String password = "";
public String getEmail() {
return(email);
}
public void setEmail(String email) {
this.email = email;
}
public String getPassword() {
return(password);
}
public void setPassword(String password) {
this.password = password;
}
INCO - Facultad de Ingeniería – Montevideo, Uruguay 68
Action controller method
public String register() {
if ((email == null) ||
(email.trim().length() < 3) ||
(email.indexOf("@") == -1)) {
suggestion = “Ingrese un mail mas largo”;
return("bad-address");
} else if ((password == null) ||
(password.trim().length() < 6)) {
suggestion = “La password debe ser mayor”;
return("bad-password");
} else {
return("success");
}
}
INCO - Facultad de Ingeniería – Montevideo, Uruguay 69
Formulario para ingreso de
datos
<%@ taglib uri="http://java.sun.com/jsf/core"
prefix="f" %>
<%@ taglib uri="http://java.sun.com/jsf/html"
prefix="h" %>
<f:view>…
<h:form>
Email address:
<h:inputText value="#{regBean.email}"/>
<BR>
Password:
<h:inputSecret value="#{regBean.password}"/>
<BR>
<h:commandButton value="Sign Me Up!"
action="#{registrationBean.register}"/>
</h:form>…
</f:view>
INCO - Facultad de Ingeniería – Montevideo, Uruguay 70
Declaramos el bean
<faces-config>
<managed-bean>
<managed-bean-name>
regBean
</managed-bean-name>
<managed-bean-class>
coreservlets.RegistrationBean
</managed-bean-class>
<managed-bean-scope>
request
</managed-bean-scope>
</managed-bean>
</faces-config>
INCO - Facultad de Ingeniería – Montevideo, Uruguay 71
Reglas de navegacion
<faces-config>
<navigation-rule>
<from-view-id>/register.jsp</from-view-id>
<navigation-case>
<from-outcome>bad-address</from-outcome>
<to-view-id>/WEB-INF/results/bad-address.jsp</to-view-
id>
</navigation-case>
<navigation-case>
<from-outcome>bad-password</from-outcome>
<to-view-id>/WEB-INF/results/bad-password.jsp</to-view-
id>
</navigation-case>
<navigation-case>
<from-outcome>success</from-outcome>
<to-view-id>/WEB-INF/results/success.jsp</to-view-id>
</navigation-case>
</navigation-rule>
INCO - Facultad de Ingeniería –</faces-config>
Montevideo, Uruguay 72
Reglas de navegacion

INCO - Facultad de Ingeniería – Montevideo, Uruguay 73


Pagina de resultados
<%@ taglib uri="http://java.sun.com/jsf/core"

prefix="f" %>
<%@ taglib uri="http://java.sun.com/jsf/html"
prefix="h" %>

<f:view>
<!DOCTYPE …>
<HTML>

<h:outputText
value="#{beanName.propertyName}"/>

</HTML>
</f:view>
INCO - Facultad de Ingeniería – Montevideo, Uruguay 74

También podría gustarte