2

応答オブジェクトから ServletOutputStream オブジェクトを取得しようとすると、java.lang.IllegalStateException が発生します。以下は私のコードです:

<%@ page import="java.util.*,java.io.*"%>             

<%
try {
    System.out.print("request came");
    File f = new File ("E:/dd.txt");

    String name = f.getName().substring(f.getName().lastIndexOf("/") + 1,f.getName().length());
    InputStream in = new FileInputStream(f);

    ServletOutputStream outs = response.getOutputStream();

    response.setContentType ("application/txt");
    response.setHeader ("Content-Disposition", "attachment; filename="+f.getName()+"");
    int bit = 256;
    int i = 0;
    try {
        while ((bit) >= 0) {
            bit = in.read();
            outs.write(bit);
        }
    } catch (IOException ioe) {
        ioe.printStackTrace(System.out);
    }
    outs.flush();
    outs.close();
    in.close();         
} catch (Exception ioe) {
    ioe.printStackTrace(System.out);
}
%>

以下はスタックトレースです。

java.lang.IllegalStateException
   at org.apache.jasper.runtime.ServletResponseWrapperInclude.getOutputStream(ServletResponseWrapperInclude.java:63)
   at org.apache.jsp.html.portlet.vitage.custom.QUADWAVE.Procfiledownloadess1_005f36901_005f48.filedownload.downloadscreen_jsp._jspService(downloadscreen_jsp.java:5
   at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)
   at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
   at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:331)
   at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329)
   at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
   at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
4

4 に答える 4

5

JSP ファイル内のコードによってファイルをダウンロードしようとしています。ビューテクノロジとしての JSP は、実際にはこの仕事には不適切なツールです。外部のすべて<% %>(通常は HTML、XML、JSON などのテキスト ベースのコンテンツ) も、空白を含めて HTTP 応答に書き込まれます。これは、Java コードで記述されたダウンロード コンテンツの整合性を損なうだけであり、ドキュメント/オーディオ/ビデオ ファイルなどのバイナリ ファイルを提供している場合はなおさらです。

具体的な問題は、JSP が内部的response.getWriter()にすべてのテンプレート コンテンツ (外部のすべて<% %>) を印刷するために使用し、次に を使用しようとしているために発生しますgetOutputStream()。これは違法な状態です。1 つの応答で両方を同時に使用することはできません。getWriter()代わりに使用することとは別に、改行を含むの外側の空白を削除する<% %>ことで解決できます。

だから、交換

<%@ page import="java.util.*,java.io.*"%>             

<%
    // Your Java code.
%>

<%@ page import="java.util.*,java.io.*"%><%
    // Your Java code.
%>

(そして、最後の後にも空白/改行がないことを絶対に確認してください%>

ただし、実際にはジョブに JSP を使用するべきではありません。仕事には間違ったツールと言われています。ジョブには通常のHTTP サーブレット クラスを使用する必要があります。拡張するクラスを作成HttpServletし、JSP にあるすべての Java コードをメソッドに移動するだけですdoGet()。最後に、そのサーブレットを URL にマップし、代わりにその URL を呼び出します。

@WebServlet("/download")
public class DownloadServlet extends HttpServlet {

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

}

この記事では、より具体的な例を見つけることができます。

以下も参照してください。

于 2013-01-01T12:56:41.813 に答える
0

response.getWriter();以前に呼び出されたため、エラーが発生していますresponse.getOutputStream();。サービス呼び出しで と のgetWriter()両方を呼び出すことは違法です。getOutputStream()そしてJSPは、デフォルトでgetWriter().

交換してみる

ServletOutputStream outs = response.getOutputStream(); 

PrintWriter outs = response.getWriter();
于 2013-01-01T12:18:08.723 に答える
0
  1. jspに暗黙的に存在する「out」を使用してみましたか?

  2. あなたのプログラムには、ディスクからファイルを読み取る権限がありますか?

ありがとう、
プラテック

于 2013-01-01T12:23:21.943 に答える