Es posible hacer todo lo que desee.
Puede construir algo cerca de lo que desee con los controles existentes. Una buena forma de aprovechar JSF al máximo es adaptar el modelo para la vista. Por ejemplo, esta vista muestra opciones de edición que le permiten agregar valores a una tabla de datos.
<f:view>
<h:form>
<h:dataTable value="#{people.list}" var="row">
<h:column>
<f:facet name="header">
<h:outputText value="#" />
</f:facet>
<h:selectBooleanCheckbox value="#{row.selected}" />
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="First Name" />
</f:facet>
<h:inputText value="#{row.firstname}" />
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Last Name" />
</f:facet>
<h:inputText value="#{row.lastname}" />
</h:column>
<f:facet name="footer">
<h:panelGroup>
<h:commandButton value="Add Row" action="#{people.addPerson}" />
<h:commandButton value="Delete Selected"
action="#{people.deleteSelected}" />
<h:commandButton value="Finish" action="#{people.finish}" />
</h:panelGroup>
</f:facet>
</h:dataTable>
</h:form>
</f:view>
personas frijol:
public class People implements Serializable {
private static final long serialVersionUID = 1L;
private List<Person> people = new ArrayList<Person>();
public People() {
// initialise with one entry
people.add(new Person());
}
public List<Person> getList() {
return people;
}
public String addPerson() {
people.add(new Person());
return null;
}
public String deleteSelected() {
Iterator<Person> entries = people.iterator();
while (entries.hasNext()) {
Person person = entries.next();
if (person.isSelected()) {
entries.remove();
}
}
return null;
}
public String finish() {
System.out.println(people);
return "someNavigationRule";
}
}
persona frijol:
public class Person implements Serializable {
private static final long serialVersionUID = 1L;
private String firstname;
private String lastname;
private transient boolean selected = false;
public String getFirstname() {
return firstname;
}
public void setFirstname(String firstname) {
this.firstname = firstname;
}
public String getLastname() {
return lastname;
}
public void setLastname(String lastname) {
this.lastname = lastname;
}
public boolean isSelected() {
return selected;
}
public void setSelected(boolean selected) {
this.selected = selected;
}
}
faces-config.xml:
<managed-bean>
<managed-bean-name>people</managed-bean-name>
<managed-bean-class>addmultiple.People</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
Este enfoque es bastante flexible y con un poco de CSS, puede verse bastante bien. Con algunos cambios en la vista y el modelo, puede tener solo la última fila editable, por ejemplo.
Si la experiencia resultante no es lo suficientemente rica o si necesita algo que pueda reutilizar, puede crear un control personalizado. Es difícil entrar en los detalles sin saber exactamente lo que quiere, pero es probable que necesitaría:
- Un nuevo Renderer para emitir solicitudes de HTML y de forma de decodificación.
- (Tal vez) una nueva component, probablemente se extienda UIData, y concrete form para exponer atributos específicos de renderkit (por ejemplo, HTML).
- Un nuevo JSP tag class para permitir que el control se use en JSP.
- Definiciones para todo lo anterior en un faces-config.xml (vea spec).
Aterrulé aquí buscando _Datatable con campos de entrada_ y esta respuesta es muy clara. Gracias (y) –