在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 返回一个字符串,如何处理?

参考技术A 关键的代码。 。

的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)没有提示就可以理解是没有取得返回值,我不知道你说的没有取得返回值是什么样的概念,还有要考虑乱码的问题 你尽可能的用英文来代替 等用熟悉了,或者程序应用的需求 操作数据库之类的 再用中文吧。你再测试下

参考技术C 什么错误??你把错误贴出来啊
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 元素(例如&lt;option&gt; 元素)等...例如:

<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 不起作用。 &lt;param name="includeProperties"&gt;divisionList&lt;/param&gt;

以上是关于在jsp中调用ajax送了一个需下载的文件名给servlet,下载完成文件后需用需返回一个字符串,但是总是出错的主要内容,如果未能解决你的问题,请参考以下文章

通过ajax调用servlet下载文件。

急 ajax 调用问题

j2ee,jsp,servlet文件下载server端

对 jsp 的 Ajax 调用和 jsp 重定向到进一步的 jsp

java中怎么用jsp调用已有的接口,加密拼接参数

你可以使用ajax函数将一个变量从jsp发送到一个servlet并在没有表单的情况下同时打开它吗? [复制]