Pregunta

Tengo una página con una tabla de datos. Quiero que algunos de los elementos en las tablas se vinculen a una página de vista correspondiente.

Por ejemplo, en este momento tengo una tabla sin enlaces:

<h:dataTable var="bean" value="#{beanServiceImpl.beans}" border="1">
    <h:column>#{bean.id}</h:column>
  </h:dataTable>

Quiero agregar hipervínculos a algunas entradas y hacer que vayan a una página de vista que les muestre más información en función de su identificación:

  <h:dataTable var="bean" value="#{beanServiceImpl.beans}" border="1">
    <h:column>
        <a href="viewBean.xhtml?id=#{bean.id}">#{bean.id}</a>
    </h:column>
  </h:dataTable>

ViewBean.xhtml contendrá algo como esto:

ViewBean.xhtml

<ul>
  <li>ID: #{bean.id}</li>
  <li>Field 1: #{bean.field1}</li>
  <li>Field 2: #{bean.field2}</li>
</ul>

¿Cómo logro algo como esto en JSF? Sé que tendré que escribir un controlador para consultar la identificación de los otros campos. Pero, ¿cómo hago que ViewBean.xhtml ejecute la lógica de negocios para obtener los otros campos y renderizarlo?

¿Fue útil?

Solución

La respuesta del Balusc es casi buena, pero no funcionará (editar: ahora funciona).

Ya sabe cómo agregar el valor a los parámetros. Por cierto, si yo fuera tú, no usaría <a href>, pero en lugar:

<h:link outcome='viewBean'>
    <f:param name='id' value='#{bean.id}' />
</h:link>

Ahora tiene que opciones cuando se trata de atrapar el valor. El más simple sería agregar anotación por encima de su propiedad de identificación:

@ManagedProperty("#{param.id}") // this will inject id from param into id
private Long id;


//  (getters and setters are obligatory)


@PostConstruct // this will execute init() after id is injected
public void init() {

}

Y lo último: tener una variable llamada "Bean" no tiene más sentido que llamarlo "variable" (o tener un perro llamado perro y gato llamado Cat). No lleva información y peor, hace que todos los frijoles en su aplicación sean indistinguibles (a menos que construya un gerente de legumbres).

Otros consejos

Asumiré JSF 2.x. Agrega esto a tu Bean

@ManagedProperty(value="#{param.id}")
private Long id;

(Esto básicamente hace un bean.setId(request.getParameter("id")) Siempre que se cargue la vista)

Estará disponible en @PostConstruct método de Bean.

@PostConstruct
public void init() {
    // Fill model based on id.
}

Esto es lo que hice.

    <h:form>
        <h:commandLink action="#{bean.populateBean}" value="#{bean.id}">
            <f:setPropertyActionListener target="#{bean.id}" value="#{bean.id}" />
        </h:commandLink>
    </h:form>

En mi clase Bean.Java, agregué el controlador de acción:

public String populateBean(){
    Bean bean = BeanServiceImpl.getBean(id); //id was injected by the commandLink
    this.field1 = tenure.getField1();
    this.field2 = tenure.getField2();

    return("viewBean");
}

Mi viewBean.xhtml es el mismo:

<ul>
  <li>ID: #{bean.id}</li>
  <li>Field 1: #{bean.field1}</li>
  <li>Field 2: #{bean.field2}</li>
</ul>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top