Jakarta ee 为什么JSF实现在文件上传/下载期间调用response.getWriter()?
这是我的第一个问题 我想在导入其他包含一些业务元素的文件后立即创建报告文件 使用Jakarta ee 为什么JSF实现在文件上传/下载期间调用response.getWriter()?,jakarta-ee,servlets,download,jsf-2.2,ajax4jsf,Jakarta Ee,Servlets,Download,Jsf 2.2,Ajax4jsf,这是我的第一个问题 我想在导入其他包含一些业务元素的文件后立即创建报告文件 使用h:inputFile选择导入文件后,我使用h:commandButton和嵌套的a4j:ajax触发Bean操作: FacesContext facesContext = FacesContext.getCurrentInstance(); try { HttpServletRequest req = (HttpServletRequest) facesContext.ge
h:inputFile
选择导入文件后,我使用h:commandButton
和嵌套的a4j:ajax
触发Bean操作:
FacesContext facesContext = FacesContext.getCurrentInstance();
try {
HttpServletRequest req = (HttpServletRequest) facesContext.getExternalContext().getRequest();
HttpServletResponse res = (HttpServletResponse) facesContext.getExternalContext().getResponse();
byte[] byteSourceExcelFile = IOUtils.toByteArray(sourceExcelFile.getInputStream());
req.setAttribute("excel", DatatypeConverter.printBase64Binary(byteSourceExcelFile));
RequestDispatcher dispatcher = req.getRequestDispatcher("importReport.jsf");
dispatcher.forward(req, res);
} catch (IOException e) {
FacesUtils.createErrorMessage(e.getMessage(), null, msgs);
} catch (ServletException e) {
FacesUtils.createErrorMessage(e.getMessage(), null, msgs);
} finally {
facesContext.responseComplete();
fileClear();
}
请求被转发到servlet,在servlet中导入工作正常,但当我尝试获取输出二进制数据所需的对象时:
ServletOutputStream outputStream = response.getOutputStream();
我得到一个错误:
org.apache.myfaces.view.facelets.el.ContextAwareELException: javax.el.ELException: java.lang.IllegalStateException: SRVE0209E: Writer already obtained
我调试了servlet代码,并注意到响应对象中的字段\u gotWriter
为true。这表明:
PrintWriter outputStream = response.getWriter();
被称为。我的过滤器都没有。此外,用于获取数据的其他servlet也可以正常工作
在WebSphere8.5.5上使用MyFaces2.2.3作为共享库
上述机制与WebSphere7JSF实现(Sun RI 1.2)和Richfaces(3.3.3)组件rich:fileUpload配合使用。
ServletOutputStream
对象替换PrintWriter
对象我希望这是提问的恰当方式。如果有任何建议,我将不胜感激。response.getOutputStream()和response.getWriter()不应同时调用。您需要检查importReport.jsf中是否有任何输出。如果是,请删除它们或使用单独的类来处理导入逻辑。这是关于嵌套在
h:commandButton
中的a4j:ajax
。
事实证明,这是在请求处理过程中调用<代码>响应.GETWrror()/<代码>的原因(我仍然不知道在哪里和为什么)。p>
现在我需要弄清楚如何更新jsf页面上需要的元素。但这是另一个故事
附录:JSF1.2
值得一提的是,在从WAS-7(Sun RI 1.2)迁移到WAS-8.5.5(MyFaces 2.2.3)之前,上述机制与以下组合一起工作:
<h:commandButton action="#{listBean['processImport']}" >
<a4j:support oncomplete="js();" reRender="fileUploadId"/>
</h:commandButton>
但不适用于:
<a4j:commandButton action="#{listBean['processImport']}" oncomplete="js();" reRender="fileUploadId" />
编辑:上次IE安全更新14-037(KB2962872)后,浏览器接收到文件,但无法再打开或保存。您的代码没有调用
response.getWriter()
,但JSF实现的框架调用了。@Isaac为什么会发生在这种特殊情况下(不是在其他情况下)?如果我知道,我会写下来作为答案。。。但是您得到的错误意味着一个名为response.getWriter()
的东西,因此如果它不是您的代码,那么它一定是JSF实现。我不是JSF专家,所以我不能进一步评论,对不起。我希望这也能突破WAS7.0。OP说代码是7。
<h:commandButton action="#{listBean['processImport']}" >
<a4j:support oncomplete="js();" reRender="fileUploadId"/>
</h:commandButton>
<a4j:commandButton action="#{listBean['processImport']}" oncomplete="js();" reRender="fileUploadId" />