1

ディレクトリが存在しない場合、およびファイルがサーブレットで同じプレフィックスで既に作成されている場合に、例外を処理したいと思います。

リクエストを取得した後のサーブレットが PDF を書き込み、FileOutputStream前の受信ページにリダイレクトを正常に送信した場合、リクエスト スコープに原因を説明するメッセージが書き込まれることは望ましくありません。

しかし、ディレクトリが存在しない場合 (ディレクトリ変数が のようなパスをもたらす'D:\pdf')、または同様の名前のファイルが存在する場合は、リクエスト スコープでサンプル エラー メッセージを送信したいと考えています。

私の条件式は正しいですか?私は使用しており、それが意図されている方法でFileOutputStreamもありますか? ServletOutputStream1 つのサーブレットが に送信ServletOutputStreamまたは書き込みできることを読みましたPrintWriter

ガイダンスや正しい方向に私を送るために、私は非常に義務付けられています.

サーブレットのオーバーライドされたメソッドは次のとおりです。

public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        System.out.println("headr " + request.getHeader("referer"));
        // response.setContentType("application/pdf");
        // response.setHeader("content-disposition", "attachment; filename=pdf.pdf");
        // response.setStatus(HttpServletResponse.SC_NO_CONTENT);  

        String prefix = request.getParameter("prefix");
        String no = request.getParameter("no");
        String html = request.getParameter("source");

        String directory = new SibsDelegate().getDirectoryPath();

        File file = new File(directory);
        if ( file.exists() && !new File(file, "prefix"+"-"+"no").exists())
        {
            System.out.println("exists");
           try 
           {
              HtmlCleaner cleaner = new HtmlCleaner();
              CleanerProperties props = cleaner.getProperties();

              TagNode node = cleaner.clean(html);

              // OutputStream os = response.getOutputStream();

              final XmlSerializer xmlSerializer = new PrettyXmlSerializer(props);
              final String html1 = xmlSerializer.getAsString(node);

              ITextRenderer renderer = new ITextRenderer();
              renderer.setDocumentFromString(html1);
              renderer.layout();

              String filename = prefix + "-" + no +".pdf";
              String fileNameWithPath = "D:\\pdf\\" + filename;
              FileOutputStream fos = new FileOutputStream( fileNameWithPath, false);
              renderer.createPDF( fos );
              fos.close();

              System.out.println( "PDF: '" + fileNameWithPath + "' created." );

              RequestDispatcher rd = null;
              // set message in request scope -- TODO
              request.getRequestDispatcher("Common_Receipt.jsp").forward(request, response);


              //  response.sendRedirect("Common_Receipt.jsp");


            } 
            catch (Exception ex) 
            {
               ex.printStackTrace();
            }
            finally
            {
                // fos.close();
            }

        }  

    }
4

1 に答える 1

1

あなたのファイルチェックは良さそうですが、私はそれを2つの異なるエラータイプに分割しません。代わりに、ディレクトリチェックをtry catchの外側に置き、ファイルチェックを内側に置いて、あなたのエラーを処理できるようにしますIOExceptions:

if (!file.exists() || !file.isDirectory()) {
    // handle directory doesnt exist
    // note that "error" is just a string variable you can make it whatever you want
    request.setAttribute("error", "Directory already exists!!!!!");
    // you can output this attribue in your jsp to tell the user there was an error
    request.getRequestDispatcher("Common_Receipt.jsp").forward(request, response);
}
FileOutputStream fos = null;
try {
    File outputFile = new File(file, "prefix"+"-"+"no");
    if(outputFile.exists()) {
        // handle file output already exists
        throw new FileAlreadyExistsException(prefix+"-"+no+".pdf");
    }
    fos = new FileOutputStream( outputFile, false);

    // do your writing to the file here
} catch(FileAlreadyExistsException e) {
    request.setAttribute("error", "your file already exists dummy");
    request.getRequestDispatcher("Common_Receipt.jsp").forward(request, response);
} catch(IOException e) {
    // had a problem writing to the file, you decide how to handle it, or group it with the FileAlreadyExistsException. Note that FileAlreadyExistsException extends IOException so to group then just put
    // your code from the FileAlreadyExistsException block into here
    request.setAttribute("error", "woah something bad happened");
    request.getRequestDispatcher("Common_Receipt.jsp").forward(request, response);
} finnaly {
    if(fos != null) fos.close();
}

それがあなたの質問に答えたかどうか教えてください。あなたの質問を読んで少し混乱しました。

于 2013-09-10T19:41:27.987 に答える