我有一个带有提交按钮的面板。在提交时,我想将一些文本写入文件并将文件提供给用户下载。不知道该怎么做。如果有人可以指向真正有用的链接或代码
问问题
1236 次
2 回答
0
正如Wicket wiki 上的条目中所述,您需要创建一个行为来构建您的文件,然后从提交链接触发该行为。这将确保模型更新在您用于创建文件之前完成。
从资源流创建请求的行为实现:
public abstract class AJAXDownload extends AbstractAjaxBehavior
{
private boolean addAntiCache;
public AJAXDownload() {
this(true);
}
public AJAXDownload(boolean addAntiCache) {
super();
this.addAntiCache = addAntiCache;
}
/**
* Call this method to initiate the download.
*/
public void initiate(AjaxRequestTarget target)
{
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()
{
ResourceStreamRequestHandler handler = new ResourceStreamRequestHandler(getResourceStream(),getFileName());
handler.setContentDisposition(ContentDisposition.ATTACHMENT);
getComponent().getRequestCycle().scheduleRequestHandlerAfterCurrent(handler);
}
/**
* Override this method for a file name which will let the browser prompt with a save/open dialog.
* @see ResourceStreamRequestTarget#getFileName()
*/
protected String getFileName()
{
return null;
}
/**
* Hook method providing the actual resource stream.
*/
protected abstract IResourceStream getResourceStream();
}
(提交)链接和行为实现:
final AJAXDownload download = new AJAXDownload()
{
@Override
protected IResourceStream getResourceStream()
{
return createResourceStream(item.getModelObject());
}
};
item.add(download);
item.add(new AjaxSubmitLink("link") {
@Override
public void onSubmit(AjaxRequestTarget target, Form<?> form)
{
// do whatever with the target, e.g. refresh components
target.add(...);
// finally initiate the download
download.initiate(target);
}
});
@magomi 针对这个问题创建了一个类似的实现。
于 2013-07-19T10:18:03.383 回答
0
这并不容易。我使用了下载链接,但下载链接没有使用任何表单变量,因为单击下载链接不会提交表单。它只使用初始值。我不得不使用 ajax onchange 事件来更新代表表单组件的实例变量,然后使用下载链接根据用户输入创建一个文件。
于 2013-04-03T03:20:12.653 回答