gpt4 book ai didi

Java Wicket AjaxLink 和 RequestHandler - 如何?

转载 作者:行者123 更新时间:2023-12-02 10:55:55 25 4
gpt4 key购买 nike

使用场景:用户单击网站上的链接确实会获得动态生成的 PDF 两种语言:德语和英语。

这段代码有效。 generateCouponPdfOnClick 创建一个包含 pdf 文件的 ResourceStreamRequestHandler。

Link<Void> generatePdf = new Link<Void>("generatePdf") {
@Override
public void onClick() {
ResourceStreamRequestHandler requestHandler = generateCouponPdfOnClick(coupon, PDFLanguage.GERMAN);
getRequestCycle().scheduleRequestHandlerAfterCurrent(requestHandler);
}
};

现在我想更改代码以获取一个弹出窗口(Wicket Modalwindow,此处为 PdfDialogPage 类),用户可以通过单击两个按钮之一来选择 PDF 的语言(德语/英语)。如果用户单击按钮,ModalWindow 应关闭,并且应构建并显示 PDF。

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

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);
};

当我单击链接时,模式窗口将打开。我选择语言,例如英语,当向变量 pdflanguageanguage 写入“英语”时,modalWindow 将关闭。总之什么也没发生……并且 PDF 也没有生成。 Wicket Ajax 调试窗口告诉我以下日志:

</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
ERROR: Wicket.Ajax.Call.failure: Error while parsing response: Error: Invalid XML: %PDF-1.4
%����
1 0 obj
<<
/Creator (Apache FOP Version 2.3)
/Producer (Apache FOP Version 2.3)
/CreationDate (D:20180808160110+02'00')

我认为Ajax和“getRequestCycle().scheduleRequestHandlerAfterCurrent(requestHandler);”之间存在问题。我如何一起使用这些。所以我将代码减少为:

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 日志错误输出。

How do I use AjaxLink together with ResourceStreamRequestHandler?

最佳答案

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

您需要 here 中的 Java 类 AjaxDownload

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

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 = new AJAXDownload());
  2. 在 AjaxLink 的 onSubmit 中,您可以调用:

    File yourPdfFile = //create your pdf file;
    final FileResourceStream resourceStream= new FileResourceStream(yourPdfFile);
    ajaxDownload.initiate(target, resourceStream, "yourPDF.pdf");

关于Java Wicket AjaxLink 和 RequestHandler - 如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51748979/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com