在我的JSF Web应用程序中,我有一个新闻面板(news.xhtml),其中包含多个已发布的新闻。新闻被加载到p:datagrid中。在每个p:datagrid单元格中,我有一个“Read More”按钮,用户被重定向到新的浏览器选项卡(readNews.xhtml)以读取相关新闻的所有详细信息。
<p:dataGrid id="newsDataGrid" var="news" value="#{newsService.newsList}" columns="3" layout="grid"
rows="6" paginator="true"
paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
rowsPerPageTemplate="6,12,16"
paginatorPosition="bottom" lazy="true">
<h:panelGrid columns="1" style="width:100%">
<h:outputText value="#{news.title}" styleClass="newsTitle" />
<h:outputText value="#{news.publishDate}" styleClass="newsDate">
<f:convertDateTime pattern="dd/MM/yyyy hh:mm" />
</h:outputText>
<p:outputLabel value="#{news.subContent}" escape="false" style="font-style: italic;"/>
<p:commandButton value="Read More" onclick="target='_blank'" action="#{newsService.action(news.id)}" ajax="false" />
</h:panelGrid>
由于新闻面板中有多个新闻,因此必须在不同的浏览器标签中加载所选新闻。重定向到新标签时,我生成一个UUID并将其附加到URL,如下所示:
public void action(Long id) throws IOException {
ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
String key = UUID.randomUUID().toString();
externalContext.getSessionMap().put(key, id);
externalContext.redirect("readNews.xhtml?key=" + key);
}
当加载新的重定向选项卡(readNews.xhtml)时,我正在从selectedNewsData字段的getter方法中检索所选的新闻数据,如下所示:
public News getSelectedNewsData() {
HttpServletRequest origRequest = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest();
String key = (String)origRequest.getParameter("key");
if(StringUtils.isNotBlank(key)) {
ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
Long newsId = (Long) externalContext.getSessionMap().get(key);
if(newsId != null) {
selectedNewsData = newsDAO.getNewsById(newsId);
}
}
return selectedNewsData;
}
我的情景很好。不同选项卡中的所有选定新闻都是独立加载的。
然而,我的主要问题出在这里:业务逻辑依赖于getter方法。在每次调用中,我都必须从数据库中检索所需的数据。如您所知,在JSF请求 - 响应周期中,多次调用getter方法,这会导致我的应用程序出现性能问题。
当新选项卡被绑定并从getter方法移动业务逻辑时,有没有办法检索每个选定的新闻数据一次?