Durante l'esecuzione di operazioni CRUD utilizzando JSF/PrimeFaces, è generalmente necessario un metodo comune che reimposta campi/proprietà bean gestiti che deve essere invocato fondamentalmente dopo che un'operazione di questo tipo è stata eseguita correttamente completato in modo che i campi nel backing bean vengano reimpostati sul loro valore iniziale (predefinito).Un potenziale metodo di richiamo dopo una richiesta POST (fondamentalmente Ajaxical)
codice immaginaria:
@Named
@ViewScoped
public class Bean extends LazyDataModel<Entity> implements Serializable {
@Inject
private Service service; // EJB.
// Holds a list of selected rows in a <p:dataTable>.
private List<Entity> selectedValues; // Getter & setter.
private String someField; // Getter & setter.
// Other fields depending upon the business requirement.
public Bean() {}
@PostConstruct
private void init() {
// Do something.
}
@Override
public List<Entity> load(int first, int pageSize, List<SortMeta> multiSortMeta, Map<String, Object> filters) {
setRowCount(service.rowCount());
// Other complex logic as and when required.
return service.getList(first, pageSize, map, filters); // Returns a List<Entity>.
}
// Resets fields to their default value.
public void reset() {
someField = null;
selectedValues = null;
// Reset other fields to their default value.
}
// Add (insert submitted values to the database).
// This method is basically bound to an action(Listener) of <p:commandButton>.
public void submit() {
if (service.insert(someField)) {
// Add a FacesMessge to indicate a success.
reset(); // Calling reset.
} else {
// Add a FacesMessge to indicate a failure.
}
}
// Update the database using submitted values.
public void onRowEdit(RowEditEvent event) {
if (event.getObject() instanceof Entity) {
Entity entity = (Entity) event.getObject();
Entity newEntity = service.update(entity);
if (newEntity != null) {
// Update the model.
// Other things like adding a FacesMessage to indicate a success.
} else {
// Add a FacesMessage to warn against the null entity returned by the service layer.
}
} else {
// Add a FacesMessage to indicate a failure.
}
reset(); // Finally reset the fields to their initial/default value.
}
// Similarly, performing the delete operation also requires to call the reset() method.
}
Procedimento submit()
eseguito "inserto" è fondamentalmente associato JSF/primefaces componenti comando come <p/h:commandButton>
o <p/h:commandLink>
. Ad esempio.
<p:inputText value="#{bean.someField}"/>
<p:commandButton value="Submit"
actionListener="#{bean.submit}"
oncomplete="if(args && !args.validationFailed) {updateTable();}"/>
<!-- Updating a p:dataTable in question after the above p:commandButton completes. -->
<p:remoteCommand name="updateTable" update="dataTable" process="@this"/>
I seguenti eventi AJAX associati a un <p:dataTable>
richiedono anche per chiamare il metodo reset()
.
<p:ajax event="rowEdit"
onstart="..."
oncomplete="..."
update="..."
listener="#{bean.onRowEdit}"/>
<p:ajax event="rowEditCancel"
onstart="..."
oncomplete="..."
update="..."
listener="#{bean.reset}"/>
<p:ajax event="page"
onstart="..."
oncomplete="..."
update="..."
listener="#{bean.reset}"/>
<p:ajax event="sort"
onstart="..."
oncomplete="..."
update="..."
listener="#{bean.reset}"/>
<p:ajax event="filter"
onstart="..."
oncomplete="..."
update="..."
listener="#{bean.reset}"/>
Come si può notare, il metodo reset()
deve essere memorizzato con attenzione in quanto viene invocato da più punti. La via è alquanto difficile da mantenere.
Esiste un modo per richiamare un tale metodo comune automaticamente dopo ogni richiesta POST che esegue una delle operazioni CRUD ha completato correttamente il suo lavoro?
Giusto per essere sicuri, si è consapevoli del fatto che è possibile specificare più valori in 'event' attributo? In questo modo: ''. Mi sembra che tutti gli altri attributi siano identici. –
BalusC
Sì, il resto degli attributi è identico (anche se 'reset()' deve essere richiamato manualmente dal bean di supporto durante l'inserimento, l'eliminazione. Suppongo di escludere anche quelle chiamate, se possibile). – Tiny
Per sicurezza, è * dopo * ogni richiesta di post di un evento o * su * ogni richiesta di post di un evento? Sembra essere quest'ultimo ora, giusto? – Kukeltje