Javascript 调用在循环中返回JSF视图Id的有状态bean操作来呈现PDF
有没有一种方法可以调用一个有状态Bean操作来多次(在一个循环中)使用JSF呈现PDF?我尝试通过Javascript实现,在Javascript中,我为要呈现的每个PDF作业创建的每个按钮上都会调用.click()事件。xhtml如下所示:Javascript 调用在循环中返回JSF视图Id的有状态bean操作来呈现PDF,javascript,html,jsf,seam2,Javascript,Html,Jsf,Seam2,有没有一种方法可以调用一个有状态Bean操作来多次(在一个循环中)使用JSF呈现PDF?我尝试通过Javascript实现,在Javascript中,我为要呈现的每个PDF作业创建的每个按钮上都会调用.click()事件。xhtml如下所示: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:s="http://jboss.com/products/seam/taglib"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:a="http://richfaces.org/a4j"
xmlns:c="http://java.sun.com/jstl/core"
xmlns:rich="http://richfaces.org/rich">
<ui:composition>
<div id="dataSizingDivGrowth">
<f:subview id="fbiAdminId" rendered="#{user.FBIAdmin}">
<h:inputHidden value="#{pdfPrinter.emailsSize}" id="emailSizeId"/>
<h:inputHidden value="#{pdfPrinter.downloadIds}" id="downloadIds"/>
<br />
<table>
<tr>
<td colspan="4" align="center">
<button type="button" onclick="savePDF();">Send Emails</button>
<c:forEach items="#{pdfPrinter.downloadIdsArr}" var="value">
<h:form id="emailAutoForm-#{value}" target="_blank">
<h:inputHidden value="#{pdfPrinter.currDownloadId}" id="currDownloadId-#{value}"/>
<h:commandButton action="#{pdfPrinter.emailAutoCD()}" id="savePDFId-#{value}" style="display:none"/>
</h:form>
</c:forEach>
</td>
</tr>
</table>
</f:subview>
</div>
<script type="text/javascript">
function savePDF() {
//alert("start saving pdf");
var emailSize = document.getElementById("emailAuto:fbiAdminId:emailSizeId").value;
alert("before downloadIdsArr " + emailSize);
var downloadIds = document.getElementById("emailAuto:fbiAdminId:downloadIds").value;
var downloadIdsArr = downloadIds.split("?");
//alert("before getting length");
//alert(downloadIds);
//alert(downloadIdsArr.length);
//alert(downloadIdsArr[0]);
for ( var i = 0; i < emailSize; i++ ) {
var j = function(x) {
document.getElementById("emailAuto:fbiAdminId:emailAutoForm-" + downloadIdsArr[x] + ":currDownloadId-" + downloadIdsArr[x]).value = downloadIdsArr[x];
document.getElementById("emailAuto:fbiAdminId:emailAutoForm-" + downloadIdsArr[x] + ":savePDFId-" + downloadIdsArr[x]).click();
}
j(i);
}
}
</script>
</ui:composition>
</html>
发送电子邮件
函数savePDF(){
//警报(“开始保存pdf”);
var emailSize=document.getElementById(“emailAuto:fbiAdminId:emailSizeId”).value;
警报(“下载前发送”+电子邮件大小);
var downloadIds=document.getElementById(“emailAuto:fbiAdminId:downloadIds”).value;
var downloadIdsArr=downloadIds.split(“?”);
//警报(“获取长度前”);
//警报(下载ID);
//警报(下载到达长度);
//警报(下载IDsarr[0]);
对于(变量i=0;i电子邮件大小;i++){
var j=函数(x){
document.getElementById(“emailAuto:fbiAdminId:emailAutoForm-”+downloadIdsArr[x]+”:currldownloadId-“+downloadIdsArr[x])。value=downloadIdsArr[x];
document.getElementById(“emailAuto:fbiAdminId:emailAutoForm-”+downloadIdsArr[x]+”:savePDFId-“+downloadIdsArr[x])。单击();
}
j(i);
}
}
发生的情况是,javascript循环只调用最后一次迭代并执行,而忽略之前的任何内容。任何帮助都将不胜感激。您希望进入循环的原因是什么?这将导致令人震惊的用户体验。如果您希望用户一次下载多个文件,请在服务器端将它们包装在一个zip中,然后发出一个请求。我的目标是让多个用户请求PDF格式的报告。我试图实现的是让每个用户逐个循环生成PDF,然后将其保存在服务器上的某个位置。不幸的是,当前的体系结构并没有让我变得容易,所以我尝试使用JSF和RenderFilter来完成我的任务。当最终用户发出请求时,只需生成PDF并将其存储在您在服务器中选择的路径中。您可以随时获取所有PDF。不幸的是,请求不是由用户发出的,而是由管理员发出的。这是因为我们根据季度数据发送报告,我们将每季度发送一次报告。那么,你应该在你的帖子中写出来。无论如何,我在任何地方都看不到有状态的需求,我也不明白为什么要在javascript端管理它。只需在服务器中提供一个入口点,该入口点接收您要为其处理报告并执行工作的用户。然后,如果您希望在每个季度发送它们,只需使用预定的cronjob即可。