求解!!!JSF实现下载功能老是报这个错,getOutputStream() has already been called for this response。

求解!!!JSF实现下载功能老是报这个错,getOutputStream() has already been called for this response。,第1张

问题:你需要清空并且关闭流对象。

我提供两种解决方案,并且解决了中文文件名乱码问题,兼容IE和火狐两种浏览器。

你可以选择。

方案一:代码写在一个jsp文件中。

下载请求页面传递过来的参数(当然具体看你要几个参数)

<rich:column>

<h:outputLink value="filejsp" rendered="true">

<f:param name="docId" value="#{itemiddocId}" / >

<f:param name="revNo" value="#{itemidrevNo}" />

<f:param name="attachmentNo" value="#{itemidattachmentNo}" />

<f:param name="filename" value="#{itemfileName}" />

<f:param name="storageName" value="#{itemstorageName}" />

<h:outputText value="#{itemfileName}" />

</h:outputLink>

</rich:column>

filejsp 文件代码:

<%@page language="java" contentType="application/octet-stream"pageEncoding="utf-8"%>

<%@page import="javaio,javautil,javanetURLEncoder"%>

<%responsereset();

String ATTACHMENTSTOREPATH = 已经上传了的附件的路径,自己应该知道?

int docId = 0;

int revNo = -1;

int attachmentNo = 0;

String filename = null;

String storageName = null;

try {

docId = IntegerparseInt(requestgetParameter("docId"));

revNo = IntegerparseInt(requestgetParameter("revNo"));

attachmentNo = IntegerparseInt(requestgetParameter("attachmentNo"));

//在火狐浏览器下载,含空格的文件名会出现异常,于是将空格用下划线代替

filename = (new String(requestgetParameter("filename")

getBytes("ISO-8859-1"),"UTF-8"))replace(" ", "_");

//将空格转化为下划线后重新对文件名进行UTF-8编码

filename = javanetURLEncoderencode(filename, "UTF-8"); storageName = requestgetParameter("storageName");

} catch (NumberFormatException nfe) {

}

if (docId >= 0 && revNo > -1 && attachmentNo >= 0) {

String filePath = null;

filePath = ATTACHMENTSTOREPATH + Fileseparator + storageName;

responsesetContentType("application/octet-stream");

//因为浏览器会将字符GBK编码,所以从数据库获得的UTF-8需要转换成GBK

//UTF-8一个汉字24位,GBK一个汉字16位

//Start UTF-8 to GBK(相对以前的程序主要就是修改了这里)

String str=filename;

StringBuffer sb = new StringBuffer();

for(int i=0; i<strlength(); i++) {

char c = strcharAt(i);

switch (c) {

case '+':

sbappend(' ');

break;

case '%':

try {

sbappend((char)IntegerparseInt(

strsubstring(i+1,i+3),16));

}

catch (NumberFormatException e) {

throw new IllegalArgumentException();

}

i += 2;

break;

default:

sbappend(c);

break;

}

}

String result = sbtoString();

result= new String(resultgetBytes("ISO-8859-1"),"UTF-8");

responseaddHeader("Content-Disposition", "attachment; filename=" + new String(resultgetBytes("GBK"),"ISO-8859-1"));

//End UTF-8 to GBK

BufferedOutputStream bos = null;

BufferedInputStream bis = null;

try {

bos = new BufferedOutputStream(responsegetOutputStream());

bis = new BufferedInputStream(new FileInputStream(filePath));

byte[] buffer = new byte[1024];

int n = -1;

while ((n = bisread(buffer)) > -1) {

boswrite(buffer, 0, n);

}

} catch (Exception e) {

eprintStackTrace();

} finally {

if (bis != null)

bisclose();

if (bos != null){

outclear(); out = pageContextpushBody(); bosclose(); } bis = null;

bos = null;

}

}

%>

此方案中如果你去掉:outclear();

out = pageContextpushBody();

报的错将和你的一模一样,不信你试试?

方案二:用Servlet下载,和你的是一样的。

还是页面过来的参数: <h:outputLink value="//">其中//是你调用的Servlet

<rich:column>

<h:outputLink value="//">

<f:param name="storage" value="#{liststorageName}" />

<f:param name="display" value="#{listdisplayName}" />

<f:param name="status" value="#{liststatus}" />

<h:outputText styleClass="input1_9pt_ul" value="#{listdisplayName}" />

</h:outputLink>

</rich:column>

public class PrFileServlet extends >

Spring:业务逻辑框架,和struts,hibernate组成mvc的三大框架,也就是大家所说的ssh框架

框架的出现让开发变得更加方便,快捷,以及可扩展性

学这个三大框架之前就会对应的学jsp,servlet和javabean

struts 1和2的区别:

struts1和struts2的区别其实并不是太大,两者的区别:

Action 类:

◆Struts1要求Action类继承一个抽象基类。Struts1的一个普遍问题是使用抽象类编程而不是接口

◆Struts 2 Action类可以实现一个Action接口,也可实现其他接口,使可选和定制的服务成为可能。Struts2提供一个ActionSupport基类去实现 常用的接口。Action接口不是必须的,任何有execute标识的POJO对象都可以用作Struts2的Action对象。

线程模式:

◆Struts1 Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。单例策略限制了Struts1 Action能作的事,并且要在开发时特别小心。Action资源必须是线程安全的或同步的。

◆Struts2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。(实际上,servlet容器给每个请求产生许多可丢弃的对象,并且不会导致性能和垃圾回收问题)

Servlet 依赖:

◆Struts1 Action 依赖于Servlet API ,因为当一个Action被调用时>

1、isu是国际滑冰联盟的简称。2、JSF是JavaServer Faces构建Java Web 应用程序的标准框架的简称。 3、sp是标准化病人的简称。fs(fans)是粉丝的简称。

1、isu是国际滑冰联盟的缩写。滑冰联盟,英文International Skating Union,英文缩写ISU,简称国际滑。

2、JavaServer Faces (JSF) 是一种用于构建Java Web 应用程序的标准框架(是Java Community Process 规定的JSR-127标准)。它提供了一种以组件为中心的用户界面(UI)构建方法,从而简化了Java服务器端应用程序的开发。由于由Java Community Process (JCP) 推动,属于Java EE 5中的技术规范,而受到了厂商的广泛支持。

3、sp又称为模拟病人,指那些经过标准化、系统化培训后,能准确表现病人的实际临床问题的正常人或病人。与其他完整的测验方法不同,SP本身不是一种独立的考试方法,它通常是许多临床能力评估方法中的一部分。

4、粉丝(英文:fans)是一个网络词语,外来语,在中国俗称追星族指迷恋、崇拜某个名人等的人,对某物狂热的爱好者,崇拜某明星、艺人或事物的一种群体。他们多数是年轻人,有着时尚流行的心态粉丝是英语单词“fans”的音译。“film fans”是影迷的意思。也可以理解为“XX迷”或者“XX追星族”一类意思。“fans”为“fan”的复数形式。fan有“爱好者、崇拜者”的意思,而fans有“狂热者”的意思。

以上就是关于求解!!!JSF实现下载功能老是报这个错,getOutputStream() has already been called for this response。全部的内容,包括:求解!!!JSF实现下载功能老是报这个错,getOutputStream() has already been called for this response。、什么是JSF的UI组件、jsf struts jsp spring 什么关系和区别等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9839991.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存