我需要知道如何从不提交表单的按钮调用Struts2操作。当我单击按钮时,它应调用Struts2操作,该操作将对SSRS服务器(SQL Server Reporting Services)进行Web服务调用。服务器将报告发送到我放在响应中的流。然后显示一个弹出窗口以下载PDF文件。使用JSF很容易,commandButton提供了一个“action”属性。我想要相当于这个:
<h:commandButton id="editButton" value="Edit" action="#{myBean.edit}" />
public class MyBean {
public String edit() call web service, put the stream on the response return "OK"}}
如何在Struts2中? Ajaxa? JQuery的?道场?我是Struts2和Ajax的新手,我做了很多JSF。
谢谢
答案 0 :(得分:3)
如果不提交表单,则需要AJAX
。
但是,由于您只需要下载PDF,然后只需对返回Stream Result的动作执行GET调用(并且不会更改当前页面)。
指定contentDisposition: attachment
,您将询问用户下载文件的位置(或用于打开文件的应用程序),而contentDisposition: inline
会在浏览器中打开它,更改页面(即不是你想要的。)
然后在url中指定操作并使用它锚标记
<s:url action="downloadAction.action" var="url">
<s:param name="param1">value1</s:param>
</s:url>
<s:a href="%{url}" >download</s:a>
并在Struts.xml中
<result name="success" type="stream">
<param name="contentType">application/pdf</param>
<param name="contentDisposition">attachment;filename="yourPDF.pdf"</param>
</result>
在操作中,您需要(通过getter)提供名为InputStream
的{{1}}。
修改强>
如果您想通过按钮进行操作,就像您在评论中提到的那样:
inputStream
答案 1 :(得分:0)
在dojo中,您可以创建一个iframe并进行ajax调用以报告服务以获取pdf文件名,然后在ifrmae中下载此pdf文件:
var reportCP = new dijit.layout.ContentPane({
content: dojo.create("iframe")
});
new dijit.Button({
label: "Report",
onClick: function(){
dojo.request.post(yourServiceUrl, {
data : yourData,
handleAs: "json"
}).then(
function(response){
reportCP.content.src=response.fileName;
},
function(error){
alert(error);
}
);
}
});
或者您可以使用window.open将pdf流直接下载到新窗口中,例如:
new dijit.Button({
label: "Report",
onClick: function(){
window.open(yourReportServiceUrl,"","height=600, width=1000, scrollbars=1");
}
});