У меня есть простой webapp, который позволяет пользователю создавать транзакции, а на другой странице пользователь может видеть все прошлые транзакции. Я хотел бы:JSF Primefaces: обновить dataTable на другой вкладке?
- Чтобы иметь DataTable быть уточненным, когда я открываю прошлое страницы транзакции
- Чтобы обновить DataTable, когда я создаю транзакцию на странице создания
I я не уверен, что это может быть покрыто одной или двумя функциями. Кроме того, я не уверен, как отделить функциональность. Должно ли создание транзакции инициировать обновление данныхTable, или должен ли файл dataTable найти новые записи в БД?
Прошедшее страница сделки:
Мой TransactionListModel
package model;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.enterprise.context.SessionScoped;
import javax.inject.Named;
import entity.Transaction;
@Named
@SessionScoped
public class TransactionListModel implements Serializable {
private static final long serialVersionUID = 1L;
private List<Transaction> txList;
@PostConstruct
public void init() {
txList = new ArrayList<Transaction>();
}
public List<Transaction> getTxList() {
return txList;
}
public void clearList(){
txList = new ArrayList<Transaction>();
}
}
мой взгляд сделка
<!-- Fill the table before rendering -->
<f:event type="preRenderView" listener="# {transactionListController.findAllTx()}" />
<h:form id="alltxform">
<p:dataTable id="tableAllTransactions" var="transaction"
value="#{transactionListModel.txList}">
<f:facet name="header">Transactions</f:facet>
<p:column headerText="Id">
<h:outputText value="#{transaction.id}" />
</p:column>
</p:dataTable>
</h:form>
Мой TransactionList контроллер
@Named
@RequestScoped
public class TransactionListController implements Serializable {
private static final long serialVersionUID = 1L;
@Inject
private Logger log;
@Inject
private TransactionService txService;
@Inject
private TransactionListModel txListModel;
public void findAllTx() {
txListModel.clearList();
txListModel.getTxList().addAll(txService.findAllTx());
}
public void reset() {
if (txListModel.getTxList() != null) {
txListModel.clearList();
}
}
}
страница Создание
Существует простой textInputField (привязывается к модели) с помощью кнопки:
<h:commandButton id="sendtx" value="Send" styleClass="ui-priority-primary">
<f:actionListener binding="#{transactionXmlController.sendTx()}" />
</h:commandButton>
Вызываемый метод:
public void sendTx() {
FacesMessage message;
if (!transactionService.sendTx(transactionXmlEditableModel.getXml()).equals("OK"))
message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error", "KO");
else {
message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Success", "OK");
}
fc.addMessage(null, message);
}
Пока это работает.
Мои вопросы
Как перезагрузить DataTable с помощью AJAX?
Я бы хотел, чтобы dataTable обновлялся, даже если он был открыт на другой вкладке перед созданием новой транзакции. Как это сделать?
Как заменить мой? «F: тип события =» preRenderView»с viewAction для того, чтобы заполнить DataTable перед визуализацией страницы
Лучший способ заключается в использовании механизма «проталкивания» на основе, например, на WebSockets – Kukeltje