2

次のコードスニペットを使用して、ブラウザでPDFファイルを開こうとしています。

    public ActionResult action(Request request, AspectModel arg1)
        throws ServletException {
    if ("PDF".equals(request.event())) {
    try{
    HttpServletResponse resp=(HttpServletResponse) request.getResponse();
    resp.setContentType("application/pdf");
    resp.setHeader("Content-Disposition","inline;filename=AccountOpeningSummary.pdf");
    resp.setHeader("Cache-Control", "cache, must-revalidate");
    resp.setHeader("Cache-Control", "no-store,public");
    resp.setDateHeader("Expires", 0);
    resp.setHeader("Pragma", "public");
    OutputStream OutStream = resp.getOutputStream();
    OutStream.write(infos,0,infos.length);
    OutStream.flush();        
    OutStream.close(); 
    }catch (Exception e) {
        System.out.println("PDF Write Exception...........................####"+e);
    }
    }
    return null;
}

次のエラーが発生します。

java.lang.IllegalStateException: getOutputStream() has already been called for this response
    at org.apache.catalina.connector.Response.getWriter(Response.java:626)
    at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:215)
    at javax.servlet.ServletResponseWrapper.getWriter(ServletResponseWrapper.java:105)
    at org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:125)
    at org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:118)
    at org.apache.jasper.runtime.JspWriterImpl.flush(JspWriterImpl.java:177)
    at abaxx.web.taglib.IncludeTag.doEndTag(IncludeTag.java:69)
    at org.apache.jsp.parts.index_jsp._jspx_meth_xx_005finclude_005f0(index_jsp.java:237)
    at org.apache.jsp.parts.index_jsp._jspService(index_jsp.java:93)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:419)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:389)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:333)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:684)
    at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:593)
    at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:530)
    at abaxx.core.foundation.internal.SelfDestroyingHttpServletRequestWrapper$1.include(SelfDestroyingHttpServletRequestWrapper.java:36)
    at abaxx.core.foundation.internal.SelfDestroyingHttpServletRequestWrapper$1.include(SelfDestroyingHttpServletRequestWrapper.java:36)
    at abaxx.web.parts.internal.ServletRequestContext.doInclude(ServletRequestContext.java:85)
    at abaxx.web.parts.RequestContext.include(RequestContext.java:429)
    at abaxx.web.parts.VisualPart.basicDisplay(VisualPart.java:740)
    at abaxx.web.parts.CompositePart.basicDisplay(CompositePart.java:111)
    at abaxx.web.parts.VisualPart.doDisplay(VisualPart.java:762)
    at abaxx.web.control.DisplayLoopInterceptor.display(DisplayLoopInterceptor.java:233)
    at abaxx.web.security.StandardSecurityPolicy$DisplayHook.display(StandardSecurityPolicy.java:321)
    at abaxx.web.control.PerformanceMonitor$DisplayPerformanceInterceptor.display(PerformanceMonitor.java:187)
    at abaxx.web.control.DisplayLoopInterceptor.doDisplay(DisplayLoopInterceptor.java:80)
    at abaxx.web.parts.VisualPart.display(VisualPart.java:104)
    at abaxx.web.control.DisplayLoopInterceptor.process(DisplayLoopInterceptor.java:128)
    at vanilla.portal.builder.PBDisplayLoopInterceptor.process(PBDisplayLoopInterceptor.java:60)
    at vanilla.common.EncodingExtension$ResponseEncodingInterceptor.process(EncodingExtension.java:107)
    at abaxx.web.preferences.PreferencesHookup$2.process(PreferencesHookup.java:126)
    at vanilla.common.HttpHeaderInterceptor.process(HttpHeaderInterceptor.java:36)
    at abaxx.web.control.PageflowInterceptor.process(PageflowInterceptor.java:62)
    at abaxx.workflow.pageflow.PageflowInterceptor.process(PageflowInterceptor.java:93)
    at abaxx.web.control.ActionInterceptor.process(ActionInterceptor.java:49)
    at abaxx.web.security.StandardSecurityPolicy$ActionHook.process(StandardSecurityPolicy.java:211)
    at abaxx.web.control.SessionTimeoutInterceptor.process(SessionTimeoutInterceptor.java:59)
    at abaxx.track.TrackingInterceptor.finishTracking(TrackingInterceptor.java:151)
    at abaxx.track.TrackingInterceptor.process(TrackingInterceptor.java:100)
    at abaxx.web.control.AccessViolationInterceptor.process(AccessViolationInterceptor.java:110)
    at abaxx.web.control.RequestProcessor$P9.process(RequestProcessor.java:72)
    at abaxx.web.control.PerformanceMonitor$RequestPerformanceInterceptor.process(PerformanceMonitor.java:153)
    at vanilla.common.EncodingExtension$RequestEncodingInterceptor.process(EncodingExtension.java:61)
    at abaxx.web.control.MaintenanceInterceptor.process(MaintenanceInterceptor.java:44)
    at abaxx.web.control.AbaXXComponentsHookup$ClientSessionHookupInterceptor.process(AbaXXComponentsHookup.java:42)
    at abaxx.web.security.SecurityPolicy$FakeContainerLoginInterceptor.process(SecurityPolicy.java:136)
    at abaxx.web.control.RequestProcessor.process(RequestProcessor.java:187)
    at abaxx.web.control.ApplicationServlet.doGet(ApplicationServlet.java:144)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at abaxx.web.control.url.RequestFilter.doFilter(RequestFilter.java:28)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at abaxx.web.control.CachingHeaderFilter.doFilter(CachingHeaderFilter.java:29)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at vanilla.common.EncodingExtension.doFilter(EncodingExtension.java:121)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:563)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:403)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:301)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:162)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:309)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:619)

私はまた、使用を閉じることによって試しましたgetWriter()

HttpServletResponse resp=(HttpServletResponse) request.getResponse();
Writer rt=resp.getWriter();
resp.getWriter().close();

誰か助けてもらえますか?

4

3 に答える 3

3

編集:質問が大幅に変更されたので...

JSPはまだ応答として自分自身をレンダリングしようとしているようです。リクエストを処理していることをコンテナに通知する必要があります。これはおそらくPDFのみのリクエストであるため、JSPの近くに移動しないでください。PDFをダウンロードするために別のサーブレットを呼び出すようにコンテナを設定する必要があります。そうすれば、JSPの部分がまったく関与しなくなります。

(はい、それはあなたが質問で示したコードを移動することを意味します。それはおそらく現在JSPの一部です;そうではないはずです。)

于 2012-07-30T12:15:22.443 に答える
2

これは、応答出力ストリームを使用するPDF生成コードをJSPファイルに配置したためです<jsp:include>。JSPファイルは文字ベースのHTMLコードを生成するように設計されているため(PDFファイルのようにバイナリベースではない)、JSPファイルは暗黙的に応答ライターを使用します。そもそもJSPは、PDF生成コードを配置するのに間違った場所です。HTMLとPDFはあまりうまく混ざりません。

設計上の問題を解決するには、拡張する単純なクラスを作成し、HttpServletそのすべてのJavaコードをdoGet()メソッドに移動する必要があります(またはdoPost()、応答する要求の種類によっては)。最後に、@WebServletアノテーションまたは<servlet-mapping>インによってそのサーブレットを目的のURLパターンにマッピングしweb.xml、PDFリクエストのURLをJSPのものからサーブレットのものに変更します。

@WebServletアノテーションを使用できるように、Tomcat 7、Glassfish3などのサーブレット3.0互換コンテナを使用していると仮定した場合の基本的なキックオフの例を次に示します。

@WebServlet("/pdfServlet")
public class HelloServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // Put your code here.
    }

}

http://localhost:8080/contextname/pdfServletの代わりにそれを呼び出しindex.jspます。


結局のところ、PDFをHTMLページにインラインで表示する必要がある場合は、<iframe>の代わりにが必要です<jsp:include>。例えば

<iframe src="pdfServlet"></iframe>

このように、ブラウザは完全に別個のHTTPリクエストによってPDFファイルをダウンロードします。

于 2012-07-30T12:36:38.853 に答える
1

どのバージョンのabaxxを使用していますか?最近のバージョンでは、コントローラーで応答を生成すると、アクションメソッドからActionResult.ABORTを返すことができます。nullを返すと、フレームワークは表示フェーズに進み、JSPをレンダリングします。

于 2012-08-06T08:38:53.220 に答える