Professional Documents
Culture Documents
Calendar c1 = Calendar.getInstance();
Calendar c2 = new GregorianCalendar();
dia = Integer.toString(c.get(Calendar.DATE));
mes = Integer.toString(c.get(Calendar.MONTH));
annio = Integer.toString(c.get(Calendar.YEAR));
import java.text.SimpleDateFormat;
import java.util.Date;
public class TestSDF {
public static void main(String args[]) {
SimpleDateFormat[] sdfs = {
new SimpleDateFormat("dd-MM-yyyy h:mm a"),
new SimpleDateFormat("dd/MMM/yy HH:mm:ss"),
new SimpleDateFormat("EEEE dd 'de' MMMM 'de' yyyy h:mm:ss:SSS")
};
int numItera = 5;
for (Date d = new Date();;d = new Date(d.getTime()+1468800000))
{//3600000
for (SimpleDateFormat sdf : sdfs) {
System.out.println(sdf.format(d));
}
if (--numItera==0) break;
}
}
}
getMonth();
El Año:
getYear();
El dia:
getDay();
Hora:
getHours();
Minutos:
getMinutes();
Segundos:
getSeconds();
Ejemplo:
Para obtener la fecha del sistema en un formato concreto se puede jugar con las clases Date
y SimpleDateFormat. Por un lado podemos sacar la fecha actual del sistema de la siguiente
forma:
Date fechaActual = new Date();
Ojo, estamos trabajando con el Date del paquete java.util no con el de java.sql
hora =calendario.get(Calendar.HOUR_OF_DAY);
minutos = calendario.get(Calendar.MINUTE);
segundos = calendario.get(Calendar.SECOND);
<h:outputLabel for=”from” value=”From:” />
<h:inputText id=”from” value=”#{scheduleBean.event.startDate}” />
<f:convertDateTime pattern=”dd/MM/yyyy” />
</p:inputMask>
h:form prependId=”false”>
<p:panel id=”panel” header=”New Person”>
<h:messages />
<h:outputText value=”5 characters minimum” />
<h:panelGrid columns=”3”>
<h:outputLabel for=”firstname” value=”Firstname: *” />
<h:inputText id=”firstname” value=”#{pprBean.firstname}” >
<f:validateLength minimum=”5” />
<p:ajax event=”blur” update=”panel” />
</h:inputText>
<h:message for=”firstname” />
</h:panelGrid>
</p:panel>
</h:form>
Continuando con el tutorial básico de aplicaciones Web con NetBeans, en esta sección veremos la aplicación
en ejecución y creare una pagina para mostrar los datos enviados del usuario.
indicamos el nombre
Agregamos <h:outputText para mostrar el nombre del usuario que se logeo
<h:outputLabel value ="#{login.username}"/>
quedaría
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html">
<h:head>
<title>Facelet Title</title>
</h:head>
<h:body>
<h:outputLabel value ="#{login.username}"/>
</h:body>
</html>
y al darle clic en el botón Entrar nos lleva a la siguiente pagina y nos muestra el nombre del usuario que
ingresamos en la pagina anterior.
CONVERSION!!!!!!!!
Introducción
JSF proporciona dos mecanismos separados que nos ayuda a validar los valores
introducidos por los usuarios a la hora de submitir los formularios:
Los mensajes que lanzan tanto los Conversores como lo Validadores en el caso
de excepción se pueden mostrar en el formulario correspondiente a través de
la etiqueta messages.
Herramientas utilizadas
Preparamos el entorno
<html>
<head>AUTENTIA- TUTORIAL CONVERSIONES-VALIDACIONES</head>
<body>
</body>
</html>
Creamos la página home.jsp en el directorio WebContent: esta página tendrá
enlaces a los diferentes ejemplos que vamos a hacer:
<html>
<head>
<title>AUTENTIA-Tutorial de Conversiones y validaciones</title>
</head>
<body>
<f:view>
</f:view>
</body>
</html>
Los ejemplos que vamos a hacer a partir de este momento partirán de esta
página.
Primer ejemplo: usando un conversor estándar
Antes de nada debemos tener en cuenta que los conversores estándar que
proporciona JSF se dividen en conversores a tipos numéricos
(NumberConverter) y conversores a tipos Fecha (DateTimeConverter)
<h:inputText converter=”#{Double}”
value=”#{modifyInvoicePage.invoice.amount}”/>
BigDecimalConverter BigDecimal
BigIntegerConverter BigInteger
NumberConverter Number
IntegerConverter Integer
ShortConverter Short
ByteConverter Byte
CharacterConverter Character
FloatConverter Float
DoubleConverter Double
BooleanConverter Boolean
DateTimeConverter DateTime
Incluyendo <f:convertNumber [lista_atributos]/> o <f:convertDateTime
[lista_atributos]/> dentro de la invocación al componente, como por ejemplo:
<h:inputText value=”#{modifyInvoicePage.invoice.amount}”>
<f:convertNumber type=”currency”/>
</h:inputText>
O por ejemplo
<h:inputText id=”invoiceDate”
value=”#{modifyInvoicePage.invoice.invoiceDate}”>
<f:convertDateTime pattern=”M/d/yyyy”/>
</h:inputText>
currencyCode String
currencySymbol String
groupingUsed boolean
integerOnly boolean
locale java.util.Locale
maxFractionDigits int
maxIntegerDigits Int
minFractionDigits Int
minIntegerDigits int
pattern String
type String
dateStyle String
pattern String
timeStyle String
type String
package com.autentia.tutorialValidacion;
import java.math.BigDecimal;
import java.util.Date;
/**
* Bean para probar conversiones y validaciones en JSF
* @author AUTENTIA
*/
return edad;
this.edad = edad;
}
public Date getFechaNacimiento() {
return fechaNacimiento;
}
public void setFechaNacimiento(Date fechaNacimiento) {
this.fechaNacimiento = fechaNacimiento;
}
public String getNombre() {
return nombre;
this.nombre = nombre;
}
public BigDecimal getSueldo() {
return sueldo;
}
public void setSueldo(BigDecimal sueldo) {
this.sueldo = sueldo;
}
<?xml version="1.0"?>
<!DOCTYPE faces-config PUBLIC
"http://java.sun.com/dtd/web-facesconfig_1_0.dtd">
<faces-config>
<managed-bean>
<managed-bean-name>gestionUsuariosBean</managed-bean-
name>
<managed-bean-class>
com.autentia.tutorialValidacion.GestionUsuariosBean
</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
</faces-config>
Creamos la página
<html>
<head>
<body>
<f:view>
headerClass="gestionUsuariosFormHeader"
footerClass="gestionUsuariosFormFooter"
columnClasses="gestionUsuariosFormLabels,
gestionUsuariosFormInputs" width="600">
value="#{gestionUsuariosBean.nombre}" />
</h:panelGroup>
<h:panelGroup>
value="#{gestionUsuariosBean.edad}" />
</h:panelGroup>
<f:convertDateTime pattern="dd/MM/yyyy"/>
</h:inputText>
</h:panelGroup>
<h:panelGroup>
id="idSueldo"
value="#{gestionUsuariosBean.sueldo}" />
</h:panelGroup>
<h:panelGroup>
<h:commandButton action="resultado_conversion"
value="Validar" />
<f:verbatim> </f:verbatim>
</h:panelGroup>
</h:panelGrid>
</h:form>
</f:view>
</body>
</html>
..
<navigation-rule>
<from-view-id>/conversion_estandar.jsp</from-view-id>
<navigation-case>
<from-outcome>resultado_conversion</from-outcome>
<to-view-id>/resultado_conversion.jsp</to-view-id>
<redirect/>
</navigation-case>
</navigation-rule>
…
…
Y para que el ejemplo nos quede chulo, creamos la página que dice que dice
que todo ha ido bien y muestra los valores introducidos por el usuario:
<html>
<head>
<title>AUTENTIA - TUTORIAL
VALIDACIONES/CONVERSIONES</title>
</head>
<body>
<f:view>
headerClass="gestionUsuariosFormHeader"
footerClass="gestionUsuariosFormFooter"
columnClasses="gestionUsuariosFormLabels,
gestionUsuariosFormInputs" width="600">
<h:outputText value="#{gestionUsuariosBean.nombre}"/>
</h:panelGroup>
<h:panelGroup>
<h:outputText value="#{gestionUsuariosBean.edad}"/>
</h:panelGroup>
<!-- Fecha de nacimiento -->
<h:outputLabel for="fechaNacimiento" value="Fecha de nacimiento"/>
<h:panelGroup>
<h:outputText value="#{gestionUsuariosBean.fechaNacimiento}"/>
</h:panelGroup>
<h:panelGroup>
<h:outputText value="#{gestionUsuariosBean.sueldo}"/>
</h:panelGroup>
<h:panelGroup>
<f:verbatim> </f:verbatim>
</h:panelGroup>
</h:panelGrid>
</h:form>
</f:view>
</body>
</html>
..
<navigation-rule>
<from-view-id>/resultado_conversion.jsp</from-view-id>
<navigation-case>
<from-outcome>home</from-outcome>
<to-view-id>/home.jsp</to-view-id>
<redirect/>
</navigation-case>
</navigation-rule>
…
…
Probamos
Para crear nuestro propio conversor, debemos seguir los siguientes pasos:
En dos partes:
Prefijo = 91
Creamos el conversor
package com.autentia.tutorialValidacion;
/**
* Clase que representa un teléfono
* @author AUTENTIA
*/
/** El prefijo */
private String prefijo;
/** El número de teléfono */
private String numero;
/**
* Constructor
*/
public Telefono(){}
return numero;
this.numero = numero;
return prefijo;
this.prefijo = prefijo;
}
/**
* Devuelve el número de teléfono como un String
*/
elNumero.append(prefijo);
elNumero.append("-");
elNumero.append(numero);
return elNumero.toString();
}
}
Y por fin la clase TelefonoConverter:
package com.autentia.tutorialValidacion;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.ConverterException;
import org.apache.commons.lang.StringUtils;
/**
* Conversor de números de teléfono
* @author AUTENTIA
*/
throws ConverterException
{
Telefono telefono = null;
if(!StringUtils.isEmpty(value))
if(valores.length!=2)
throw new ConverterException(new
FacesMessage("El número de teléfono debe tener el siguiente formato: 'pp-
nnn nn nn', donde pp es el prefijo y nnn nn nn es el número"));
if(valores[0].length()!=2)
throw new ConverterException(new
FacesMessage("El prefijo del número de teléfono debe tener de tipo NN"));
String elNumero = StringUtils.remove(valores[1],' ');
if(elNumero.length()!=7)
throws ConverterException
return value.toString();
…
…
/** Teléfono */
private Telefono telefono;
….
….
public Telefono getTelefono() {
return telefono;
}
public void setTelefono(Telefono telefono) {
this.telefono = telefono;
}
….
…..
…………
<converter>
<converter-id>autentia.telefonoConverter</converter-id>
<converter-
class>com.autentia.tutorialValidacion.TelefonoConverter</converter-class>
</converter>
…………..
<html>
<head>
<title>AUTENTIA - TUTORIAL
VALIDACIONES/CONVERSIONES</title>
</head>
<body>
<f:view>
headerClass="gestionUsuariosFormHeader"
footerClass="gestionUsuariosFormFooter"
columnClasses="gestionUsuariosFormLabels,
gestionUsuariosFormInputs" width="600">
value="#{gestionUsuariosBean.nombre}" />
</h:panelGroup>
value="#{gestionUsuariosBean.telefono}">
<f:converter converterId="autentia.telefonoConverter" />
</h:inputText>
</h:panelGroup>
<h:panelGroup>
<h:commandButton action="resultado_conversion_nuestra"
value="Validar" />
<f:verbatim> </f:verbatim>
</h:panelGroup>
</h:panelGrid>
</h:form>
</f:view>
</body>
</html>
………
<navigation-rule>
<from-view-id>/conversion_nuestra.jsp</from-view-id>
<navigation-case>
<from-outcome>resultado_conversion_nuestra</from-outcome>
<to-view-id>/resultado_conversion_nuestra.jsp</to-view-id>
<redirect/>
</navigation-case>
</navigation-rule>
<navigation-rule>
<from-view-id>/resultado_conversion_nuestra.jsp</from-view-id>
<navigation-case>
<from-outcome>home</from-outcome>
<to-view-id>/home.jsp</to-view-id>
<redirect/>
</navigation-case>
</navigation-rule>
………..
Y probamos:
En la primera parte de este tutorial hemos visto como los Conversores pueden
cubrir gran parte de la funcionalidad necesaria para validar que los valores
introducidos por los usuarios en un formulario JSF sean correctos.
Que el nuevo atributo password debe ser igual que el campo repetición de
password
return password;
this.password = password;
}
…
…
Creamos la página
<html>
<head>
<title>AUTENTIA - TUTORIAL
VALIDACIONES/CONVERSIONES</title>
</head>
<body>
<f:view>
headerClass="gestionUsuariosFormHeader"
footerClass="gestionUsuariosFormFooter"
columnClasses="gestionUsuariosFormLabels,
gestionUsuariosFormInputs" width="600">
value="#{gestionUsuariosBean.nombre}">
</h:inputText>
</h:panelGroup>
<h:panelGroup>
</h:inputText>
</h:panelGroup>
<h:panelGroup>
</h:panelGroup>
<!-- Repetición de password -->
<h:panelGroup>
</h:inputSecret>
</h:panelGroup>
<h:panelGroup>
<h:commandButton action="resultado_validacion"
value="Validar" />
<f:verbatim> </f:verbatim>
</h:panelGroup>
</h:panelGrid>
</h:form>
</f:view>
</body>
</html>
<navigation-rule>
<from-view-id>/validacion_estandar.jsp</from-view-id>
<navigation-case>
<from-outcome>resultado_validacion</from-outcome>
<to-view-id>/resultado_validacion.jsp</to-view-id>
<redirect/>
</navigation-case>
</navigation-rule>
…
…
El resultado
Para crear nuestro propio Validador, debemos seguir los siguientes pasos:
Compruebo que el valor a validar tiene una longitud igual a 9. Los primeros 8
caracteres deben ser números (corresponden al DNI) y el último debe ser una
letra (la del NIF)
“TRWAGMYFPDXBNJZSQVHLCKE”
Creamos el Validador
package com.autentia.tutorialValidacion;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;
import org.apache.commons.lang.StringUtils;
/**
* Validador de NIF
* @author AUTENTIA
*/
public class NifValidator implements Validator
/**
* Efectúa el proceso de validación
*/
public void validate(FacesContext context,
{
// Si el valor es null, lo transformamos en un valor vacío
String valor = StringUtils.defaultString((String)value);
if(!matcher.matches())
…
<validator>
<validator-id>autentia.nifValidator</validator-id>
<validator-class>
com.autentia.tutorialValidacion.NifValidator
</validator-class>
</validator>
Creamos la página
<head>
<title>AUTENTIA - TUTORIAL
VALIDACIONES/CONVERSIONES</title>
</head>
<body>
<f:view>
headerClass="gestionUsuariosFormHeader"
footerClass="gestionUsuariosFormFooter"
columnClasses="gestionUsuariosFormLabels,
gestionUsuariosFormInputs" width="600">
value="#{gestionUsuariosBean.nombre}">
</h:inputText>
</h:panelGroup>
value="#{gestionUsuariosBean.nif}" required="true">
<f:validator validatorId="autentia.nifValidator"/>
</h:inputText>
</h:panelGroup>
<h:panelGroup>
<h:commandButton action="resultado_validacion_nuestra"
value="Validar" />
<f:verbatim> </f:verbatim>
</h:panelGroup>
</h:panelGrid>
</h:form>
</f:view>
</body>
</html>
<navigation-rule>
<from-view-id>/validacion_nuestra.jsp</from-view-id>
<navigation-case>
<from-outcome>resultado_validacion_nuestra</from-outcome>
<to-view-id>/resultado_validacion_nuestra.jsp</to-view-id>
<redirect/>
</navigation-case>
</navigation-rule>
….
<html>
<head>
<title>AUTENTIA - TUTORIAL
VALIDACIONES/CONVERSIONES</title>
</head>
<body>
<f:view>
headerClass="gestionUsuariosFormHeader"
footerClass="gestionUsuariosFormFooter"
columnClasses="gestionUsuariosFormLabels,
gestionUsuariosFormInputs" width="600">
<h:outputText value="#{gestionUsuariosBean.nombre}"/>
</h:panelGroup>
<h:panelGroup>
<h:outputText value="#{gestionUsuariosBean.nif}"/>
</h:panelGroup>
<h:panelGroup>
<f:verbatim> </f:verbatim>
</h:panelGroup>
</h:panelGrid>
</h:form>
</f:view>
</body>
</html>
Probamos
2
3 <?xml version="1.0" encoding="UTF-8"?>
4 <!--
5 To change this template, choose Tools | Templates
6 and open the template in the editor.
7 -->
8 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
9 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
10 <html xmlns="http://www.w3.org/1999/xhtml"
11 xmlns:ui="http://java.sun.com/jsf/facelets"
12 xmlns:h="http://java.sun.com/jsf/html"
13 xmlns:f="http://java.sun.com/jsf/core"
14 xmlns:p="http://primefaces.prime.com.tr/ui">
15
16 <body>
17 <div class="post">
18
19
20 <h2 class="title">Buscar Arquivo</h2>
21 <div id="stylized" class="myform">
22
23 <h:form>
24 <p>Coloque o valor no campo de busca.
25 Permite buca aninhada. Ex: Nome='Maria' e Caixa='20'
26 Busca todas as marias na caixa 20</p>
27 <h:outputLabel>Arquivo: <span class="small">Busca por número do
28 Arquivo</span></h:outputLabel>
29 <h:inputText value="#{ArquivoControllerSearch.arquivo.id}"
30 required="false" />
31
32 <h:outputLabel>Nome do Aluno: <span class="small">Nome ou parte do
33 Nome</span></h:outputLabel>
34 <h:inputText value="#{ArquivoControllerSearch.arquivo.aluno}"
35 required="false" />
36
37 <h:outputLabel>RA: <span class="small">Busca por número do
38 Registro</span></h:outputLabel>
39 <h:inputText value="#{ArquivoControllerSearch.arquivo.ra}"
40 required="false" />
41
42 <h:outputLabel>Caixa: <span class="small">Arquivos de uma
43 Caixa</span></h:outputLabel>
44 <h:inputText value="#{ArquivoControllerSearch.arquivo.caixa}"
45 required="false" />
46
47 <h:commandButton styleClass="button"
48 action="#{ArquivoControllerSearch.search}" value="Procurar" />
49 <h:commandButton styleClass="button" type="reset" value="Limpar" />
50
51
52 </h:form>
</div>
</div>
</body>
</html>
0. Índice de contenidos.
• 1. Introducción.
• 2. Entorno.
• 3. Invocación al método getRowData.
• 4. Enviando el identificador del objeto como parámetro.
• 5. Enviando el objeto como parámetro.
• 6. Con el soporte de Jboss Seam.
• 7. Referencias.
• 8. Conclusiones.
1. Introducción
En este tutorial vamos a analizar las opciones que tenemos disponibles en JSF2 para obtener el
registro de la fila seleccionada en un dataTable.
La historia de usuario que queremos cumplir sería similar a esta: Como Pablo quiero acceder,
desde el listado de usuarios, a la edición de los mismos para modificar sus características
de acceso. Pablo es el administrador de usuarios en la aplicación de nuestro hipotético cliente.
Vamos a examinar todas las posibilidades de las que disponemos, que no son pocas, haciendo uso del
estandar, y con el soporte de anotaciones de Jboss Seam. Existen más posibilidades si hacemos uso
de librerías de componentes visuales de terceros como ICEfaces, RichFaces o Primefaces, pero dichas
posibilidades las vamos a examinar en otro tutorial en el que hablaremos de la posibilidad de selección
múltiple de filas de un dataTable.
Para el objetivo del tutorial, la selección de un registro de la fila puede suponer navegación a otra
vista o no, en función de si el evento de selección responde a un listener o a un action.
2. Entorno.
El tutorial está escrito usando el siguiente entorno:
• Hardware: Portátil MacBook Pro 17' (2.93 GHz Intel Core 2 Duo, 4GB DDR3 SDRAM).
• Sistema Operativo: Mac OS X Snow Leopard 10.6.1
• JSF2 (Mojarra 2.0.4)
• Jboss Seam 2.1 y RichFaces 3.3
• Apache Tomcat 7.0.6
01 <h:dataTable id="usersList"
02 var="user"
03 value="#{usersView.users}"
04 rows="10"
05 binding="#{usersView.usersDataTable}">
06 <h:column>
07 <f:facet name="header">
08 <h:outputText id="number_label"
09 value="#{msg['Users.login']}"/>
10 </f:facet>
<h:commandLink actionListener="#{usersView.editUser}"
11
immediate="true">
12 <f:ajax render="@form"/>
13 <h:outputText id="login"
14 value="#{user.login}"/>
15 </h:commandLink>
16 </h:column>
17 ...
18 </h:dataTable>
01 @ManagedBean
02 @ViewScoped
04 ...
06
07 public void setUsersDataTable(UIData usersDataTable) {
08 this.usersDataTable = usersDataTable;
09 }
10
12 return usersDataTable;
13 }
14 ...
17 }
18 ...
19 }
20
Sería indiferente si trabajásemos con un action o con un actionListener, funciona con los dos tipos de
evento.
01 <h:dataTable id="usersList"
02 var="user"
03 value="#{usersView.users}"
04 rows="10">
05 <h:column>
06 <f:facet name="header">
07 <h:outputText id="number_label"
08 value="#{msg['Users.login']}"/>
09 </f:facet>
<h:commandLink actionListener="#{usersView.editUser}"
10
immediate="true">
12 <f:ajax render="@form"/>
13 <h:outputText id="login"
14 value="#{user.login}"/>
15 </h:commandLink>
16 </h:column>
17 ...
18 </h:dataTable>
En el método que recibe el evento podemos obtener el parámetro como sigue:
view sourceprint?
01 @ManagedBean
02 @ViewScoped
04 ...
06 ...
0
public void editUser(ActionEvent event){
7
selectedUser =
09
FinancialService.getInstance().getByLogin(userLogin);
11 }
12 ...
13 }
14
Aquí el inconveniente es que tenemos que volver a obtener el objeto totalmente poblado porque lo
que remitimos es su identificador y se trata de un tipo básico.
5. Enviando el objeto como parámetro.
Existe una alternativa a la de remitir el identificador que es la de remitir todo el objeto completo y,
para ello tenemos dos posibilidades.
La primera es hacer uso del componente no visual <f:setPropertyActionListener en el que le podemos
indicar el valor que tendrá un atributo del managedBean antes de que el evento de acción sea
invocado.
view sourceprint?
01 <h:dataTable id="usersList"
02 var="user"
03 value="#{usersView.users}"
04 rows="10">
05 <h:column>
06 <f:facet name="header">
07 <h:outputText id="number_label"
08 value="#{msg['Users.login']}"/>
09 </f:facet>
<h:commandLink actionListener="#{usersView.editUser}"
10
immediate="true">
11 <f:setPropertyActionListener value="#{user}"
target="#{usersView.selectedUser
12
}" />
13 <f:ajax render="@form"/>
14 <h:outputText id="login"
15 value="#{user.login}"/>
16 </h:commandLink>
17 </h:column>
18 ...
19 </h:dataTable>
Del lado del managedBean solo necesitaremos el atributo con sus métodos set & get.
view sourceprint?
01 @ManagedBean
02 @ViewScoped
04
05 ...
07
09 this.selectedUser = selectedUser;
10 }
11
13 return selectedUser;
14 }
15 ...
16 }
17
La segunda opción, solo podremos hacer uso de ella, si tenemos disponible la versión 2.2 de EL, como
en nuestro caso que usamos Tomcat 7.
Consiste en invocar directamente desde Expression Language a un método del managedBean
pasándole un parámetro.
view sourceprint?
01 <h:dataTable id="usersList"
02 var="user"
03 value="#{usersView.users}"
04 rows="10">
05 <h:column>
06 <f:facet name="header">
07 <h:outputText id="number_label"
08 value="#{msg['Users.login']}"/>
09 </f:facet>
<h:commandLink action="#{usersView.editUser(user)}"
10
immediate="true">
11 <f:ajax render="@form"/>
12 <h:outputText id="login"
13 value="#{user.login}"/>
14 </h:commandLink>
15 </h:column>
16 ...
17 </h:dataTable>
01 @ManagedBean
02 @ViewScoped
04 ...
06 selectedUser = user;
08 }
09 ...
10 }
11
Esta técnica es la que veníamos usando hasta ahora en los proyectos que tenían el soporte de Jboss
Seam que sí permitía invocar a un método del managedBean pasándole parámetors de entrada.
6. Con el soporte de Jboss Seam.
Además de la que hemos comentado anteriormente existe una segunda posibilidad en Jboss Seam
consistente en mantener en el managedBean un atributo anotado que tendrá una referencia al
dataTable y un segundo atributo, también anotado, que mantiene una referencia a la fila seleccionada.
view sourceprint?
01 @Name("usersView")
02 @Scope(ScopeType.SESSION)
04
05 @DataModel
06 List<User> users;
07
08 @DataModelSelection
09 User selectedUser;
10
11 ...
12 }
La vista no requiere de ninguna configuración adicional, desde cualquier método de evento del
managedBean podemos acceder al atributo que estará poblado con la entidad de la fila seleccionada.
view sourceprint?
1 ...
2 <rich:dataTable id="usersList"
3 var="user"
4 value="#{usersView.users}"
5 rows="10">