我有一种我称之为奇怪的行为。
我有一个带有面板的页面,其中包含几个用于搜索目的的下拉菜单以及一个用于显示结果的数据表。 默认情况下,在加载页面时,值由PostContruct init()初始化。
我可以毫无问题地执行搜索,包括更新数据表。
现在,对我来说困难的部分如下: 我有一张打开/关闭状态的门票列表。我可以使用Open / Closed / ALL执行搜索。
我正在使用RequestScoped bean,我想知道一些问题,因为selectRow无法使用新添加的数据。
<ui:define name="content">
<h:form id="searchForm">
<p:panelGrid id="searchPanel" style="width: 1000px" styleClass="ticketsPanel">
<p:row>
<p:column>
<p:outputLabel for="lstStatus" value="Status"></p:outputLabel>
</p:column>
<p:column>
<p:selectOneMenu id="lstStatus" value="#{ticketController.searchStatus}">
<f:selectItem itemValue="Open" itemLabel="Open"></f:selectItem>
<f:selectItem itemValue="Closed" itemLabel="Closed"></f:selectItem>
<f:selectItem itemValue="ALL" itemLabel="ALL"></f:selectItem>
</p:selectOneMenu>
</p:column>
</p:row>
<f:facet name="footer">
<p:row>
<p:column colspan="6" style="alignment-adjust: middle">
<p:commandButton value="Search" action="#{ticketController.search()}" update=":searchForm:lstTicketsTable"></p:commandButton>
<p:commandButton value="Create" action="/tickets/createticket.xhtml?faces-redirect=true"></p:commandButton>
<p:commandButton value="View" action="#{ticketController.doUpdateTicket()}"></p:commandButton>
</p:column>
</p:row>
</f:facet>
</p:panelGrid>
<p:dataTable id="lstTicketsTable" selectionMode="single" paginator="true"
paginatorTemplate="{FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {CurrentPageReport} {RowsPerPageDropdown}"
rowsPerPageTemplate="10,15,50" rows="10" paginatorPosition="bottom"
value="#{ticketController.ticketList}" selection="#{ticketController.selectedTicket}" var="_tl" rowKey="#{_tl.number}">
<p:column headerText="Ticket NR">
<p:outputLabel value="#{_tl.number}"></p:outputLabel>
</p:column>
<p:column headerText="Summary">
<p:outputLabel value="#{_tl.summary}"></p:outputLabel>
</p:column>
<p:column headerText="Contact From">
<p:outputLabel value="#{_tl.contactfrom}"></p:outputLabel>
</p:column>
<p:column headerText="Researcher">
<p:outputLabel value="#{_tl.researcher.email == null ? '' : _tl.researcher.email}"></p:outputLabel>
</p:column>
<p:column headerText="NSN SR">
</p:column>
<p:column headerText="SR / CR">
</p:column>
<p:column headerText="Release">
<p:outputLabel value="#{_tl.release}"></p:outputLabel>
</p:column>
<p:column headerText="Status">
<p:outputLabel value="#{_tl.status}"></p:outputLabel>
</p:column>
<p:column headerText="Age">
<p:outputLabel value="#{_tl.startdate}"></p:outputLabel>
</p:column>
<p:column headerText="Priority">
<p:outputLabel value="#{_tl.priority}"></p:outputLabel>
</p:column>
</p:dataTable>
</h:form>
</ui:define>
支持bean函数doUpdateTicket是在视图按钮中调用的函数,而搜索是更新数据表列表的函数。
public void doUpdateTicket() {
FacesContext fc = FacesContext.getCurrentInstance();
ExternalContext ec = fc.getExternalContext();
try {
ec.redirect("/SupportSite/faces/tickets/updateticket.xhtml?tnr=" + this.selectedTicket.getNumber().toString());
} catch (IOException ex) {
Logger.getLogger(TicketController.class.getName()).log(Level.SEVERE, null, ex);
}
}
public void search() {
FacesContext fc = FacesContext.getCurrentInstance();
ExternalContext ec = fc.getExternalContext();
if (this.searchTicketNR != null) {
Ticket t = tjc.findTicket(Integer.parseInt(this.searchTicketNR));
if (t != null) {
try {
//This works when search by ticket number only
ec.redirect("/SupportSite/faces/tickets/updateticket.xhtml?tnr=" + t.getNumber().toString());
} catch (IOException ex) {
Logger.getLogger(TicketController.class.getName()).log(Level.SEVERE, null, ex);
}
}
} else if (this.getSearchStatus() != "ALL") {
setTicketList(tjc.findTicketByStatus(this.getSearchStatus()));
this.init();
} else {
setTicketList(tjc.findTicketEntities());
this.init();
}
}