Hay varias formas de lograr el requisito.
Si su servletcontainer admite un mínimo de Servlet 3.0 / EL 2.2, simplemente páselo como argumento de acción / método de escucha del UICommand
componente o AjaxBehavior
etiqueta. P.ej
<h:commandLink action="#{bean.insert(item.id)}" value="insert" />
En combinación con:
public void insert(Long id) {
// ...
}
Esto solo requiere que el modelo de datos se conserve para la solicitud de envío del formulario. Lo mejor es poner el bean en el alcance de la vista mediante @ViewScoped
.
Incluso puede pasar todo el objeto del elemento:
<h:commandLink action="#{bean.insert(item)}" value="insert" />
con:
public void insert(Item item) {
// ...
}
En los contenedores Servlet 2.5, esto también es posible si proporciona una implementación EL que lo admita, como JBoss EL. Para obtener detalles sobre la configuración, consulte esta respuesta .
Uso <f:param>
en UICommand
componente. Agrega un parámetro de solicitud.
<h:commandLink action="#{bean.insert}" value="insert">
<f:param name="id" value="#{item.id}" />
</h:commandLink>
Si su bean tiene un alcance de solicitud, deje que JSF lo configure por @ManagedProperty
@ManagedProperty(value="#{param.id}")
private Long id; // +setter
O si su bean tiene un alcance más amplio o si desea una validación / conversión más detallada, úselo<f:viewParam>
en la vista de destino, vea también f: viewParam vs @ManagedProperty :
<f:viewParam name="id" value="#{bean.id}" required="true" />
De cualquier manera, esto tiene la ventaja de que el modelo de datos no necesariamente debe conservarse para el envío del formulario (en el caso de que su bean tenga un alcance de solicitud).
Uso <f:setPropertyActionListener>
en UICommand
componente. La ventaja es que esto elimina la necesidad de acceder al mapa de parámetros de solicitud cuando el bean tiene un alcance más amplio que el alcance de la solicitud.
<h:commandLink action="#{bean.insert}" value="insert">
<f:setPropertyActionListener target="#{bean.id}" value="#{item.id}" />
</h:commandLink>
En combinación con
private Long id; // +setter
Solo estará disponible por propiedad id
en el método de acción. Esto solo requiere que el modelo de datos se conserve para la solicitud de envío del formulario. Lo mejor es poner el bean en el alcance de la vista mediante @ViewScoped
.
Enlaza el valor de la tabla de datos a lo DataModel<E>
que a su vez envuelve los elementos.
<h:dataTable value="#{bean.model}" var="item">
con
private transient DataModel<Item> model;
public DataModel<Item> getModel() {
if (model == null) {
model = new ListDataModel<Item>(items);
}
return model;
}
( transient
Hacerlo y crear una instancia perezosamente en el getter es obligatorio cuando está usando esto en un bean con alcance de vista o sesión, ya DataModel
que no se implementa Serializable
)
Luego, podrá acceder a la fila actual DataModel#getRowData()
sin pasar nada (JSF determina la fila según el nombre del parámetro de solicitud del enlace / botón de comando en el que se hizo clic).
public void insert() {
Item item = model.getRowData();
Long id = item.getId();
// ...
}
Esto también requiere que el modelo de datos se conserve para la solicitud de envío del formulario. Lo mejor es poner el bean en el alcance de la vista mediante @ViewScoped
.
Úselo Application#evaluateExpressionGet()
para evaluar programáticamente el actual #{item}
.
public void insert() {
FacesContext context = FacesContext.getCurrentInstance();
Item item = context.getApplication().evaluateExpressionGet(context, "#{item}", Item.class);
Long id = item.getId();
// ...
}
La forma de elegir depende de los requisitos funcionales y de si uno u otro ofrece más ventajas para otros fines. Personalmente, seguiría adelante con el n. ° 1 o, cuando también desee admitir contenedores de servlet 2.5, con el n. ° 2.