0

好吧,我基本上已经杀死了谷歌寻找解决方案。

使用richfaces 和JSF。

基本上我有 ah:commandButton,一旦单击它就会打印一个报告,但是如果你多次单击它,DownloadUtils.download() 方法就会被中断,然后它就会中断。我需要避免这种情况。

我试图禁用“onclick”。我尝试使用超时禁用 - 解决方案在这里找到:单击后禁用`<h:commandButton>`,但应触发操作

但是那些基本上要么根本不触发动作,要么在下载过程中到达某个点然后停止。它不返回任何内容,因此不会下载任何报告。

由于下载,您不能使用基于 ajax 的按钮/链接。

在此处确认 a4j 限制的链接: https ://community.jboss.org/thread/8598 使用 JSF 下载 CSV 文件

我还想过在单击按钮后尝试添加一个弹出面板而不使用这样的 ajax:http ://showcase.richfaces.org/richfaces/component-sample.jsf?demo=popup&skin=blueSky

但是在某些时候它不会继续下载(通常是在它在我的日志中打印 XML 之后)。

欢迎任何想法,此时任何解决方案都可以,甚至重定向到新页面。

按钮

<h:commandButton action="#{managingBean.download()}" value="#{bundle.download}"/>

管理 Bean

DownloadUtils.download(object.getOrderReference() + ".pdf",
                    service.getReport(ReportFormat.PDF, object.getOrder()));

服务

public InputStream getReport(ReportFormat format, Object object) throws IOException {
    InputStream is = getReportResource("String", format);

    Report report = someService.createReport(object);
    Document doc = toXml(report, Report.class);

    Map<String, Object> params = new HashMap<String, Object>();
    params.put(JRXPathQueryExecuterFactory.PARAMETER_XML_DATA_DOCUMENT, doc);
    params.put(JRXPathQueryExecuterFactory.XML_DATE_PATTERN, "yyyy-MM-dd'T'HH:mm:ss");

    return getReportFromJasper(is, params, format, true, true, false);
}

先感谢您。

4

1 回答 1

1

2种方法来做到这一点。

使用jQuery:

------------------

<script type="text/javascript">
/* <![CDATA[ */

$("a[id$='submitButtonID']").click(function() {
    $(this).replaceWith( "In Progress");
});
/* ]]> */ 
</script>

<h:commandLink  id="submitButtonID" value="#{bundle.download}" action="#{managingBean.download}"></h:commandLink>

使用 Java 脚本:

-------------------

function displayWaitMsg()
{
         var btnId=getElementForAnId("submitButtonID");
         document.getElementById(btnId).style.display="none";
         var wt=getElementForAnId("waitMsg");
         document.getElementById(wt).innerHTML ="Please wait. Your request is being processed.";
         document.getElementById(wt).style.display="block";
}

function getElementForAnId(str) // To removing appending content
{
        var ret;
        var inputs = document.getElementsByTagName('*');
        for ( var i = 0; i < inputs.length; i++) {
                if (inputs[i].id.indexOf(str) != -1) {

                        ret = inputs[i].id;
                }
        }
        return ret;
}

<h:commandLink id="submitButtonID" action="#{managingBean.download}" onclick="displayWaitMsg();" value="#{bundle.download}">

<div id="waitMsg" align="center" style="display: none;"></div>
于 2013-07-10T12:51:57.740 回答