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" />