Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > JasperReports и Struts


Автор: brejnev 18.2.2008, 11:07
Хочу создать отчет( в pdf) с помощью JasperReports из web-приложения(struts). 

Делаю согласно книге "JasperReports for Java Developers"

Action-класс
Код

public class QuestionnaireReportAction extends BaseAction {

    @Override
    public ActionForward execute(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
  Collection<QuestionnairePerson> persons = personManager.listPersons();


        ServletOutputStream servletOutputStream = response.getOutputStream();
        InputStream reportStream = getServlet().getServletConfig().getServletContext().getResourceAsStream("report.jasper");
        response.setContentType("application/pdf");
 
      
        JRDataSource dataSource = new JRBeanCollectionDataSource(persons);

        JasperRunManager.runReportToPdfStream(reportStream, servletOutputStream, new HashMap(), dataSource);

        servletOutputStream.flush();
        servletOutputStream.close();

        return mapping.getInputForward();
    }
}



struts-config.xml
Код

        <action input="/WEB-INF/pages/dm/task/ViewTask.jsp" 
                name="TaskActionForm" 
                scope="request"
                path="/dm/filled/callReport" 
                type="ru.izhnet.web.action.dm.filled.QuestionnaireReportAction"/>


код JSP, из которого вызываю action
Код

        <html:form action="/dm/filled/callReport?task_id=${task.key}" target="_new"  >
            <html:submit>
                <bean:message key="dm.questionnaire.results"/>
            </html:submit>
        </html:form>


Создается пустой pdf-файл и вываливается вот такая ошибка.
Код

ApplicationDispatcher[/Owl] PWC1231: Servlet.service() for servlet jsp threw exception
java.lang.IllegalStateException: PWC3991: getOutputStream() has already been called for this response
        at org.apache.coyote.tomcat5.CoyoteResponse.getWriter(CoyoteResponse.java:700)
        at org.apache.coyote.tomcat5.CoyoteResponseFacade.getWriter(CoyoteResponseFacade.java:210)
        at javax.servlet.ServletResponseWrapper.getWriter(ServletResponseWrapper.java:135)
        at javax.servlet.ServletResponseWrapper.getWriter(ServletResponseWrapper.java:135)
        at org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:171)
        at org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:164)
        at org.apache.jasper.runtime.PageContextImpl.release(PageContextImpl.java:221)
        at org.apache.jasper.runtime.JspFactoryImpl.internalReleasePageContext(JspFactoryImpl.java:157)
        at org.apache.jasper.runtime.JspFactoryImpl.releasePageContext(JspFactoryImpl.java:108)
        at org.apache.jsp.WEB_002dINF.pages.dm.task.ViewTask_jsp._jspService(ViewTask_jsp.java from :267)
        at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:93)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:831)
        at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:373)
        at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:470)
        at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:364)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:831)
        at org.apache.catalina.core.ApplicationFilterChain.servletService(ApplicationFilterChain.java:411)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:317)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:198)
        at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:198)
        at org.apache.catalina.core.ApplicationDispatcher.doInvoke(ApplicationDispatcher.java:853)
        at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:703)
        at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:660)
        at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:578)
        at org.apache.struts.action.RequestProcessor.doInclude(RequestProcessor.java:1116)
        at org.apache.struts.tiles.TilesRequestProcessor.doForward(TilesRequestProcessor.java:260)
        at org.apache.struts.action.RequestProcessor.processForwardConfig(RequestProcessor.java:398)
        at org.apache.struts.tiles.TilesRequestProcessor.processForwardConfig(TilesRequestProcessor.java:318)
        at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:241)
        at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
        at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:738)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:831)
        at org.apache.catalina.core.ApplicationFilterChain.servletService(ApplicationFilterChain.java:411)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:317)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:198)
        at ru.izhnet.web.filter.SelectLanguageFilter.doFilter(SelectLanguageFilter.java:30)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:198)
        at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:198)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:288)
        at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:271)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:202)
        at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:632)
        at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:577)
        at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:94)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:206)
        at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:632)
        at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:577)
        at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:571)
        at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1080)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:150)
        at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:632)
        at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:577)
        at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:571)
        at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1080)
        at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:270)
        at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.invokeAdapter(DefaultProcessorTask.java:637)
        at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.doProcess(DefaultProcessorTask.java:568)
        at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.process(DefaultProcessorTask.java:813)
        at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.executeProcessorTask(DefaultReadTask.java:339)
        at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:261)
        at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:212)
        at com.sun.enterprise.web.connector.grizzly.TaskBase.run(TaskBase.java:265)
        at com.sun.enterprise.web.connector.grizzly.ssl.SSLWorkerThread.run(SSLWorkerThread.java:106)


Искал в гугле. Как я понял, такая ошибка возникает если в выходной поток response.getOutputStream() пытаются одновременно писаться pdf-файл и JSP. Только что с этим делать, мне не понятно.

Автор: AleksandrIL 27.9.2011, 15:48
Здравствуйте. Столкнулся с этой же ситуацией. Если нашли ответ, напишите - буду очень признателен.

Автор: Ares4322 28.9.2011, 16:19
А у Вас версия библиотек совпадает с версией из книги? Может причина того, что не работает пример, в этом?
Я в своем проекте на Struts2 использую JR. Но использую не через плагин, а через отдельный сервлет. Как вариант, можете попробовать сделать так же.

Автор: leniviy 1.10.2011, 16:09
У объекта response есть 2 аутпута. Можно писать либо в первый, либо во второй, но не в оба сразу.
Проблема явно не в джаспере. Можно не вызывать runReportToPdfStream(), а просто вызвать:
response.getOutputStream().write(1);
будет та же самая ошибка.

Автор: 5ad1sT 3.10.2011, 18:34
Попробуйте return null; сделать.
Я использовал POI библиотеку и писал так же, как и вы в outputStream и все работало. Но был нюанс, вконце action обязательно retrun null;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)