- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用场景:用户单击网站上的链接确实会获得动态生成的 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(){}
}
如何使用?
您必须将 AjaxDownload 添加到您的表单
form.add(ajaxDownload = new AJAXDownload());
在 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/
我有两个 AjaxLink(都在同一个容器下),我想切换它们的可见性,这样如果单击 linkA,linkA 就会隐藏,并且 linkB 可见,反之亦然。 以下是我的 linkA 实现: linkA=
单击 Ajaxlink 时,我需要显示 JSON 文件中的数据。我已经实现了以下代码,但该代码不起作用。如果我犯了任何错误,请纠正我的代码。 (是否可以在AjaxLink中添加标签) 提前致谢。 Aj
我在我的网站上设计了一个三级菜单,我使用 yii 作为 php-framework。 例如: ItemA Item_a1 Item_a11 Item_a12 Item_a2ItemB ...
在 Wicket 口中,AttributeModifier 不会更改 AjaxLink 的属性“class”。它应该更改类属性并更改链接的外观。 public class TestPage exten
我在我的 .java 文件中创建了一个新的 AjaxLink add(new AjaxLink("link"){
BootStrap.php: doctype('XHTML1_STRICT'); $view->headTitle('Book Store'); $vie
在我们的项目中,我们有一个 AjaxLink: Add 包含Page.class: add(new AjaxLink() { @Override public void onClick
使用场景:用户单击网站上的链接确实会获得动态生成的 PDF 两种语言:德语和英语。 这段代码有效。 generateCouponPdfOnClick 创建一个包含 pdf 文件的 ResourceSt
我正在使用 Wicket 6.11,并且遇到了一个奇怪的错误。我在一个大型应用程序中拥有带有图标的 wicket AjaxLinks,其 isLinkEnabled() 可以根据各种情况返回 fals
在通过 Ajax 删除条目后,我尝试在 PropertyListView 进行更新,但由于某种原因它无法工作。 我已将 PropertyListView 添加到 WebMarkupContainer
我尝试实现一个使用 Wicket 的 AjaxLink 更新网站中表格的链接(实际上是很多链接)。但我失败了,表永远不会更新(我有“setOutputMarkupId(true)”并调用“setDef
我想通过 Ajax 链接用 NewsEntries 更新我的 ListView。我有每个月的链接,点击后我想显示特定月份的新闻。 我尝试了这个教程,但它不起作用: http://blog.xebia.
ajax执行成功后如何更改ajax链接的URL参数?以下代码不起作用,但解释了我想要做什么。 CHtml::ajaxLink($text, array('/core/bookmark/create')
我正在使用CGridView显示从名为Object的模型生成的表。我希望能够选中一个复选框,然后转到提交 Controller 的“创建”操作,我将在其中使用所选行的 ID。我读到我可以使用 $.fn
我正在构建一个 Wicket 网络应用程序,它必须处理大量并发请求。我已经设置了一个测试环境和一些 jmeter 脚本来进行负载测试,我注意到如果我使大多数页面无状态,我可以减少应用程序的 CPU 和
有 Wicket AjaxLink,单击时会调用标准处理程序(这会打开模式窗口)如何在标准处理程序之前插入单击链接后将执行的 JavaScript 代码以检查一系列条件? 最佳答案 您可以使用 Aja
我只是想知道 Wicket 中 AjaxLink 和 AjaxButton 之间的区别以及何时最好使用它们。 最佳答案 AjaxButton 提交一个表单,即所有表单组件将其值发送到服务器。 Ajax
Java: item.add(new AjaxLink("edit"){ @Override public void onClick(AjaxRequestTarget target) {
在我的页面上,我有一个包含三个页面的选项卡 View 。为此,我使用 CHtml::ajaxLink 如下 'html',
我正在尝试在我的 Web 应用程序中创建一些 ajax 功能,但我无法让所有拼图 block 都适合: 我想添加一个链接,单击该链接将打开一个可由用户填写的新输入(文本)字段。在后端,我想对单击链接进
我是一名优秀的程序员,十分优秀!