在jsp中调用ajax送了一个需下载的文件名给servlet,下载完成文件后需用需返回一个字符串,但是总是出错
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在jsp中调用ajax送了一个需下载的文件名给servlet,下载完成文件后需用需返回一个字符串,但是总是出错相关的知识,希望对你有一定的参考价值。
源程序:从jsp收到目录ddir和文件名str
File fileLoad=new File(ddir,str);
OutputStream o = response.getOutputStream(); // 建立字节输出流对象
BufferedOutputStream bos=new BufferedOutputStream(o);
byte b[]=new byte[500];
response.setHeader("Content-disposition","attachment;filename="+new String(str.getBytes("gb2312"),"iso8859-1")); //使用保存文件的对话框
long fileLength=fileLoad.length();/ //文件的长度:
String length=String.valueOf(fileLength);
response.setHeader("Content_Length",length);
FileInputStream in=new FileInputStream(fileLoad); // 读取文件,发送给客户下载:
int n=0;
while((n=in.read(b))!=-1)
bos.write(b,0,n); ;
o.flush();
o.write ("文件下载完成");
有人说是输出对象不对,不能重复使用o, 但我需要向ajax 返回一个字符串,如何处理?
的InputStream inStream中新的文件输入流(FI);/ /文件存储路径
字符串FNAME = NULL;
(fpath.lastIndexOf(“/”)!= -1)
FNAME = fpath.substring(fpath.lastIndexOf(“/”)+1);
代码 else if(fpath.lastIndexOf(“\ \”)!= - 1)
FNAME = fpath.substring(fpath.lastIndexOf(“\ \”)+1);
其他
FNAME =新的日期()。的toString()+“。”
反应“”+ fpath.substring(fpath.lastIndexOf(“。”)+1);
/ /设置输出格式
响应。复位(); ...的setContentType(“本”);
response.addHeader(“内容处置”,“附件,文件名=”+新的String((FNAME)。:GetBytes会(“GBK”),“ISO8859-1”)); 参考技术B OutputStream o = response.getOutputStream();
我用的是PrintWriter out = response.getWriter();
out.print("true"); //true ==文件下载完成
完全可以实现你说的要求,我写的是注册 查找用户名是否重复的追问
谢谢回答,这种方法已试过,报错信息如下:
java.io.IOExceptionerror!!java.lang.IllegalStateException: getOutputStream() has already been called for this responseerror !
可能是:
1.我 用了OutputStream o = response.getOutputStream();作为文件下载
2.再用PrintWriter out = response.getWriter();作为向客户端相应
但在servlet中getOutputStream()和response.getWriter();有冲突
你用你之前的 程序报什么错,是AJAX没有得到返回值还是?
追问ajax没有得到返回值
追答如果程序 也就是servlet没问题 那就用alert提示 看是否AJAX出现问题 如果提示到了
if(Ajax.readyState==4)alert(1);
if(Ajax.status==200)alert(2) 是status==200也就是alert(2)没有提示就可以理解是没有取得返回值,我不知道你说的没有取得返回值是什么样的概念,还有要考虑乱码的问题 你尽可能的用英文来代替 等用熟悉了,或者程序应用的需求 操作数据库之类的 再用中文吧。你再测试下
ajax你写的对么??追问
$.ajax(
url: "downtest",
type: "post",
dataType:"html",
data: $(this).text(),
success: function (data1)
alert ("客户端收到服务器返回:"+data1);
//success
); //ajax 错误是没有收到 data1
Struts 2 操作未将所需结果返回给 Jquery Ajax 调用
【中文标题】Struts 2 操作未将所需结果返回给 Jquery Ajax 调用【英文标题】:Struts 2 action not returning desired result to Jquery Ajax call 【发布时间】:2016-07-10 14:10:10 【问题描述】:我正在使用以下代码从 jQuery Ajax 调用一个操作,它会返回 JSP 页面的完整代码。我只需要在动作类中定义的数组列表。
dashboard.js
$.ajax(
url : 'ELD/getAllDivisions',
type : 'POST',
dataType: 'text/javascript',
success : function(data)
alert("success");
var response = data;
alert(response);
);
DivisionAction.java
@Autowired
private DivisionService divisionService;
private List<DivisionModel> divisionList = new ArrayList<DivisionModel>();
public String getAllDivisions()
divisionList = divisionService.getAllDivisions();
return SUCCESS;
struts.xml
<constant name="struts.devMode" value="true" />
<package name="DIVISION" namespace="/" extends="struts-default">
<action name="getAllDivisions" method="getAllDivisions" class="foo.bar.DivisionAction">
<result name="success">/jsp/users/AdminDashboard.jsp</result>
</action>
响应
我只需要从动作类返回的数组列表。
【问题讨论】:
【参考方案1】:你有两种方法:
旧的(不必要的复杂)方式
返回一个 JSP,在 JSP 中迭代您的列表并执行您需要的任何操作:创建一个 JSON 数组,或编写 HTML 元素(例如<option>
元素)等...例如:
<action name="getAllDivisions" method="getAllDivisions" class="foo.bar.DivisionAction">
<result name="success">/jsp/users/allDivisions.jsp</result>
</action>
allDivisions.jsp
<%@ taglib prefix="s" uri="/struts-tags" %>
[
<s:iterator value="divisionList" status="ctr">
"id" : "<s:property value='modelId' />",
"modelName" : "<s:property value='modelName' />"
<s:if test="%#ctr.count < divisionList.size"> , </s:if>
</s:iterator>
]
新的(正确的)方式
使用 JSON 插件,返回 JSON 结果,指定您的 List 作为根对象 (read more):
<package name="DIVISION" namespace="/" extends="json-default">
<action name="getAllDivisions" method="getAllDivisions" class="foo.bar.DivisionAction">
<result name="success" type="json>
<param name="root"> divisionList </param>
</result>
</action>
【讨论】:
Old 方式并不是那么可怕,如果响应应该只包含在 jsp 中(即不需要在 js 中操作响应)。 链接的问题不应该涵盖如何返回 JSON 结果的主题,它掩盖了我的答案,即使用三种返回 JSON 结果的方式,my question 中的一种从未被任何人覆盖。 新(正确)方式工作并产生了我想要的。谢谢。 为什么返回带有includeProperties
的列表会总是返回一个空列表?我遇到了这个问题,我可以使用这个答案,但不明白为什么 includeProperties
不起作用。 <param name="includeProperties">divisionList</param>
以上是关于在jsp中调用ajax送了一个需下载的文件名给servlet,下载完成文件后需用需返回一个字符串,但是总是出错的主要内容,如果未能解决你的问题,请参考以下文章