【发布时间】:2015-08-10 20:08:02
【问题描述】:
我有一个上传 Excel 电子表格的 JSF 页面。该电子表格有一个包含一定数量行的工作簿。在处理每一行之前,我想把它全部数一遍,然后问用户“确认处理 X 行?”
这是我的 JSF 代码(cancel.xhtml):
<h:form enctype="multipart/form-data" id="frmMassive">
<p:growl id="messagesUpload" showDetail="true" life="3000" />
<h:panelGrid id="panel" columns="2">
<h:outputText value="File" />
<p:fileUpload value="#{cancelView.file}" mode="simple" skinSimple="true" />
<p:spacer></p:spacer>
<p:commandButton value="Send file" ajax="false"
action="#{cancelView.preProcessMassive}" />
</h:panelGrid>
</p:panel>
</h:form>
<h:form id="frmConfirm">
<p:commandButton style="display: none" id="confirmButton"
actionListener="#{cancelView.postProcessMassive}">
<p:confirm header="Confirmation"
message="Confirm the processing of #{cancelView.lineCount} line(s)?"
icon="ui-icon-alert" />
</p:commandButton>
<p:confirmDialog global="true" showEffect="fade" hideEffect="fade">
<p:commandButton value="Yes" type="button"
styleClass="ui-confirmdialog-yes" icon="ui-icon-check" />
<p:commandButton value="No" type="button"
styleClass="ui-confirmdialog-no" icon="ui-icon-close" />
</p:confirmDialog>
</h:form>
托管 Bean 方法 (CancelView.java):
public void preProcessMassive() {
HSSFWorkbook wb;
try {
wb = new HSSFWorkbook(this.file.getInputstream());
} catch (IOException e) {
e.printStackTrace();
return;
}
HttpSession session = Util.getSession();
session.setAttribute("cancelLineCount", sheet.getPhysicalNumberOfRows());
session.setAttribute("cancelSpreadSheet", file);
RequestContext context = RequestContext.getCurrentInstance();
context.execute("document.getElementById('frmConfirm:confirmButton').click()");
}
public int getLineCount() {
HttpSession session = Util.getSession();
if (session.getAttribute("cancelLineCount") == null) {
return 0;
} else {
return (Integer)session.getAttribute("cancelLineCount");
}
}
问题是我的JSF页面在上传电子表格之前调用了getLineCount()方法。
是否有另一种方法来计算电子表格的行数并在处理之前将其返回给用户?
【问题讨论】:
-
Util.getSession()?呃,为什么不只是一个会话范围的托管 bean 并注入它?
标签: excel jsf primefaces