struts2怎么调用ajax
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了struts2怎么调用ajax相关的知识,希望对你有一定的参考价值。
参考技术A Struts2中有两种方式处理Ajax请求:(注:我使用的是最新的Struts
2.3.20)
1.
使用Stream
result的方式以流的形式写出到客户端。(这种方式我没有亲自做实验,下面的例子参考Struts2的官方文档)
这样书写我们的Action:
package
actions;
import
java.io.InputStream;import
java.io.StringBufferInputStream;import
com.opensymphony.xwork2.ActionSupport;
public
class
TextResult
extends
ActionSupport
private
InputStream
inputStream;
public
InputStream
getInputStream()
return
inputStream;
public
String
execute()
throws
Exception
inputStream
=
new
ByteArrayInputStream("Hello
World!
This
is
a
text
string
response
from
a
Struts
2
Action.".getBytes("UTF-8"));
return
SUCCESS;
这样配置我们的struts.xml:<action
name="text-result"
class="actions.TextResult">
<result
type="stream">
们可以这样书写我们的Action:
package
actions;
import
java.io.InputStream;import
java.io.StringBufferInputStream;import
com.opensymphony.xwork2.ActionSupport;
public
class
TextResult
extends
ActionSupport
private
InputStream
inputStream;
public
InputStream
getInputStream()
return
inputStream;
public
String
execute()
throws
Exception
inputStream
=
new
ByteArrayInputStream("Hello
World!
This
is
a
text
string
response
from
a
Struts
2
Action.".getBytes("UTF-8"));
return
SUCCESS;
这样配置我们的struts.xml:<action
name="text-result"
class="actions.TextResult">
<result
type="stream">
.
使用Struts2的插件机制:(下面我以返回JSON格式的数据为例进行说明,需要struts2-json-plugin-2.3.20包,这个包在Struts2的官方下载中已经包含,不需要额外下载)
首先是前台发送Ajax请求:(我这里使用JQuery)
$("#btnClick").click(function()
$.post("hello",
name:
"tanzhenyu",
function(data)
alert(data.greeting
+
",
"
+
data.name
+
"!");
,
"json");
);
我们的Action这样写:
public
HelloAction
extends
ActionSupport
private
String
name;//这里的nam用来接收Ajax的请求数据
private
Map<String,
String>
resultMap;//这里的Map用来返回结果JSON数据
public
getName()
return
name;
public
setName(String
name)
this.name
=
name;
public
getResultMap()
return
resultMap;
public
setResultMap(Map<String,
String>
resultMap)
this.resultMap
=
resultMap;
public
String
execute()
resultMap
=
new
Map<>();
resultMap.put("greeting",
"Hello");
resultMap.put("name",
name);
return
Action.SUCCESS;
这里注意的是:我们的Map对象不需要手动转成JSON对象,Struts2的JSON插件会帮我们转。
我们的配置文件可以这样写:
<package
name="default"
namespace="/"
extends="json-default">
<action
name="hello"
class="cn.tzy..hello.action.HelloAction">
<result
type="json">
<param
name="root">resultMap</param>
</result>
</action></package>
这里注意的是:extends必须是“json-default”,name为root的param是说明返回时被序列化的对象,值为一个OGNL表达式。
OK,成功搞定,如果有疑问可以参考Struts2官
使用 Java、Struts 2 和 AJAX 下载文件
【中文标题】使用 Java、Struts 2 和 AJAX 下载文件【英文标题】:File download using Java, Struts 2 and AJAX 【发布时间】:2011-01-08 12:18:27 【问题描述】:我想使用 java、struts2 和 ajax 提供文件下载。
在我的 html 页面上有一个名为“export”的按钮,点击哪个 ajax 调用将执行查询并使用代码创建 .xls 文件,我想将该文件提供给用户下载而不存储它在硬盘上。
有人知道如何在java中使用struts2和ajax吗?
有例子吗?
如果您需要我提供更多详细信息,请告诉我...
谢谢。
amar4kintu
【问题讨论】:
【参考方案1】:在这种情况下,您不必使用 AJAX。只需让您的按钮将表单提交给您的 Struts 操作,并让该操作使用 stream result 类型。
例子:
在您的 Struts XML 中:
<result name="download" type="stream">
<param name="contentDisposition">attachment;filename=report.xls</param>
<param name="contentType">application/vnd.ms-excel</param>
<param name="inputName">inputStream</param>
<param name="bufferSize">1024</param>
</result>
然后您的操作将提供一个public InputStream getInputStream()
来传递数据。
我认为您用来生成 Excel 文件的任何库 (POI?) 都可以将输出写入任意的OutputStream
。
一种将其转换为InputStream
的快捷方式:
// Using Workbook from Apache POI for example...
Workbook wb;
// ...
ByteArrayOutputStream bos = new ByteArrayOutputStream();
wb.write(bos);
InputStream bis = new ByteArrayInputStream(bos.toByteArray());
【讨论】:
您好,我在我的 struts.xml 中添加了以下内容仅供参考,我们可以使用 Annotation 来做同样的事情:
public class MyAction
private InputStream fileInputStream;
private String logoName;
@Action(value="/downloadLogo",
results=
@Result(name="success", type="stream",
params =
"contentType", "application/image/gif",
"inputName", "fileInputStream",
"contentDisposition", "filename=\"$logoName\"",
"bufferSize", "1024"
)
)
public String downloadLogo() throws Exception
logoName = "test.jpg";
fileInputStream = new FileInputStream(new File("DirePath", logoName));
【讨论】:
【参考方案3】:作为 amar4kintu 关于保存为 ExportReport.action 而不是 report.xls 文件的问题的后续行动,如果您的 struts.xml 文件中未遵循以下格式,则会在 IE 中发生这种情况:
<result name="download" type="stream">
<param name="contentDisposition">attachment;filename="$flashcardSetBean.title.xlsx"</param>
<param name="contentType">application/vnd.openxmlformats-officedocument.spreadsheetml.sheet</param>
<param name="inputName">inputStream</param>
<param name="bufferSize">1024</param>
</result>
似乎contentDisposition
行特别必须表明该文件是一个附件并且文件名用引号括起来。
【讨论】:
【参考方案4】:我会在 Action 类上使用这种注释:
@Result(name = "success", type= StreamResult.class,
params = "contentType", "application/vnd.ms-excel",
"contentDisposition", "attachment; filename=report.xls",
value = "reportFileStream"
)
【讨论】:
【参考方案5】:下面解释了一种将输出流传输到输入流的更好方法 as opposed to the response by ZoogieZork above
InputStream is = new PipedInputStream();
PipedOutputStream out = new PipedOutputStream((PipedInputStream) is);
wb.write(out);
这种方法的优点是整个缓冲区不存储在内存中,而是使用一个小的内部循环缓冲区进行管道传输。这在内存和 CPU 开销方面都更好。
参考: Convert a Java OutputStream to an InputStream
【讨论】:
【参考方案6】:atlast,我能够解决它如下..
我在我的动作类函数中写了以下行,我能够下载名称为 report.xls
而不是 ExportReport.action
的文件。我不知道确切..为什么?
response.setHeader("Content-Disposition","attachment;filename=rpt.xls");
以下内容在我的struts.xml
文件中。我从中删除了<contentDispositin>
参数,因为它不能从struts.xml
文件中工作,我将它放在我的操作Java 文件中,如上所述。
<result name="success" type="stream" >
<param name="inputName">fileStream</param>
<param name="contentType">application/vnd.ms-excel</param>
<param name="bufferSize">1024</param>
</result>
希望这会对某人有所帮助。
谢谢。
amar4kintu
【讨论】:
以上是关于struts2怎么调用ajax的主要内容,如果未能解决你的问题,请参考以下文章
Struts2 Spring JPA 整合时报错:No bean named 'entityManagerFactory' is defined ,请问各位是怎么解决