首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java和RequestHandler -如何?

Java和RequestHandler -如何?
EN

Stack Overflow用户
提问于 2018-08-08 14:17:34
回答 1查看 1.1K关注 0票数 0

使用场景:用户点击网站上的链接,就会得到两种语言的动态PDF :德语和英语。

这个密码起作用了。generateCouponPdfOnClick创建一个包含pdf文件的ResourceStreamRequestHandler。

代码语言:javascript
复制
Link<Void> generatePdf = new Link<Void>("generatePdf") {
@Override
public void onClick() {
    ResourceStreamRequestHandler requestHandler = generateCouponPdfOnClick(coupon, PDFLanguage.GERMAN);
    getRequestCycle().scheduleRequestHandlerAfterCurrent(requestHandler);
}
};

现在,我想修改代码以获得一个弹出窗口(Wicket,这里是PdfDialogPage类),用户可以通过在这两个按钮中的一个按钮上单击,为PDF选择一种语言(德语/英语)。如果用户单击某个按钮,则ModalWindow应关闭,并应生成并显示PDF。

下面是修改后的代码:变量pdflanguageanguage包含所选语言,并由PdfDialogPage使用PageReferenz设置

代码语言:javascript
复制
AjaxLink<Void> generatePdf = new AjaxLink<Void>("generatePdf") {
@Override
public void onClick(final AjaxRequestTarget target) {
    modalWindow.setPageCreator(() -> {
        return new PdfDialogPage(getPage().getPageReference(), modalWindow);
    });
    modalWindow.setWindowClosedCallback((AjaxRequestTarget target1) -> {
        ResourceStreamRequestHandler requestHandler = generateCouponPdfOnClick(coupon, pdflanguageanguage);
        getRequestCycle().scheduleRequestHandlerAfterCurrent(requestHandler);
    });
    modalWindow.show(target);
};

当我单击该链接时,将打开modalwindow。我选择语言,例如英语,modalWindow在将" English“写到变量pdflanguageanguage时关闭。比什么都没有发生..。并且不生成PDF。Wicket窗口告诉我文件夹日志:

代码语言:javascript
复制
</head>]]></header-contribution><evaluate><![CDATA[(function(){var settings = {"minWidth":200,"minHeight":200,"className":"w_blue","width":400,"height":100,"resizable":true,"src":"./wicket/page?6","mask":"semi-transparent","autoSize":false,"unloadConfirmation":true,"onClose":function() { Wicket.Ajax.ajax({"u":"./overviewCoupons?5-1.1-panel-modalWindow","c":"modalWindowb0"}); },"onCloseButton":function() { Wicket.Ajax.ajax({"u":"./overviewCoupons?5-1.0-panel-modalWindow","c":"modalWindowb0"});; return false; }};window.setTimeout(function(){
  Wicket.Window.create(settings).show();
}, 0);
})();]]></evaluate></ajax-response>
INFO: returned focused element: javascript:;
INFO: returned focused element: javascript:;
INFO: Response processed successfully.
INFO: refocus last focused component not needed/allowed
INFO: focus removed from generatePdf5
INFO: focus set on _wicket_window_3
INFO: focus set on undefined
INFO: focus removed from undefined

错误: Wicket.Ajax.Call.failure:解析响应时出错:错误:无效XML:%PDF-1.4 %����

代码语言:javascript
复制
1 0 obj
<<
/Creator (Apache FOP Version 2.3)
/Producer (Apache FOP Version 2.3)
/CreationDate (D:20180808160110+02'00')

我相信Ajax和"getRequestCycle().scheduleRequestHandlerAfterCurrent(requestHandler);".之间存在一个问题。我该怎么用这些。因此,我将代码简化为:

代码语言:javascript
复制
AjaxLink<Void> generatePdf = new AjaxLink<Void>("generatePdf") {
@Override
public void onClick(final AjaxRequestTarget target) {
ResourceStreamRequestHandler requestHandler = generateCouponPdfOnClick(coupon, PDFLanguage.ENGLISH);
getRequestCycle().scheduleRequestHandlerAfterCurrent(requestHandler);
}
};

当我知道单击AjaxLink时,什么都不会发生,但我会得到相同的Ajax错误输出。

如何将AjaxLink与ResourceStreamRequestHandler结合使用?

EN

回答 1

Stack Overflow用户

发布于 2018-08-09 10:59:00

我用这种方式解决了一个类似的用例。

您需要来自这里的Java类这里

或者,您可以使用我的变体,它以一个FileResourceStream作为输入。

代码语言:javascript
复制
import lombok.extern.slf4j.Slf4j;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.behavior.AbstractAjaxBehavior;
import org.apache.wicket.request.handler.resource.ResourceStreamRequestHandler;
import org.apache.wicket.request.resource.ContentDisposition;
import org.apache.wicket.util.resource.FileResourceStream;

/**
 * @author Sven Meier
 * @author Ernesto Reinaldo Barreiro (reiern70@gmail.com)
 * @author Jordi Deu-Pons (jordi@jordeu.net)
 */
@Slf4j
public class AJAXDownload extends AbstractAjaxBehavior {

    private boolean addAntiCache;
    private FileResourceStream fileResourceStream;
    private String fileName;

    public AJAXDownload() {
        this(true);
    }

    public AJAXDownload(boolean addAntiCache) {
        super();
        this.addAntiCache = addAntiCache;
    }

    /**
     * Call this method to initiate the download.
     */
    public void initiate(AjaxRequestTarget target, FileResourceStream fileResourceStream, String fileName) {
        this.fileResourceStream= fileResourceStream;
        this.fileName = fileName;
        String url = getCallbackUrl().toString();

        if (addAntiCache) {
            url = url + (url.contains("?") ? "&" : "?");
            url = url + "antiCache=" + System.currentTimeMillis();
        }

        // the timeout is needed to let Wicket release the channel
        target.appendJavaScript("setTimeout(\"window.location.href='" + url + "'\", 100);");
    }

    public void onRequest() {
        try{
            ResourceStreamRequestHandler handler = new ResourceStreamRequestHandler(fileResourceStream, fileName);
            handler.setContentDisposition(ContentDisposition.ATTACHMENT);
            getComponent().getRequestCycle().scheduleRequestHandlerAfterCurrent(handler);
        } catch (Exception e){
            log.error("Error while trying to download", e);
            onErrorOccurred();
        }
    }
    protected void onErrorOccurred(){}
}

如何使用?

  1. 必须将AjaxDownload添加到表单中。 form.add(ajaxDownload =新AJAXDownload());
  2. 在您的onSubmit中,您可以从AjaxLink调用: 文件yourPdfFile =//创建您的pdf文件;最终FileResourceStream resourceStream=新FileResourceStream(yourPdfFile);ajaxDownload.initiate(目标,resourceStream,"yourPDF.pdf");
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51748979

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档