Podczas wykonywania operacji CRUD przy użyciu JSF/PrimeFaces, zazwyczaj potrzebna jest wspólna metoda, która resetuje pola/właściwości fasoli zarządzanej, która ma być wywoływana zasadniczo po pomyślnym wykonaniu jednej takiej operacji zakończone tak, że pola w komponencie bean są resetowane do ich początkowej (domyślnej) wartości.Potencjalna metoda wywołująca po spełnieniu żądania POST (w zasadzie Ajaxical)
kod urojona:
@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.
}
Sposób submit()
wykonaniu "wpisać" jest zasadniczo związana z JSF/PrimeFaces elementów sterujących, takich jak <p/h:commandButton>
lub <p/h:commandLink>
. Jak na przykład. związane z <p:dataTable>
<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"/>
następujące zdarzenia AJAX wymaga również, aby wywołać metodę 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}"/>
Jak widać, metoda reset()
musi być zapamiętany dokładnie jak to jest wywoływana z kilku miejscach. Droga jest nieco trudna do utrzymania.
Czy istnieje sposób automatycznego wywołania takiej wspólnej metody po tym, jak każde żądanie POST wykonujące jedną z operacji CRUD zakończyło pomyślnie swoje zadanie?
Wystarczy, aby mieć pewność, że jesteś świadomy, że można podać wiele wartości w 'event' atrybutu? Na przykład: ''. Wydaje mi się, że wszystkie pozostałe atrybuty są również identyczne. –
BalusC
Tak, pozostałe atrybuty są identyczne (chociaż 'reset()' musi być wywoływany ręcznie z komponentu bean podczas wstawiania, usuwania.Myślę, aby również wyłączyć te połączenia, jeśli to możliwe). – Tiny
Tylko dla pewności, czy jest to * po * każdej prośbie o dodanie do wydarzenia lub * o * każdej prośbie o dodanie do wydarzenia? Wygląda na to, że teraz to drugie, prawda? – Kukeltje