回答編集履歴

1 検証したコードを記載しました。

argius

argius score 9444

2016/06/14 14:41  投稿

記載されているコードが完全に動作するものでないので、推測になってしまいますが、
普通に書いていれば、特にメソッドに分けたところでタブが閉じないという現象は
発生しないと思います。
実際に書いてみて確認しています。
`new XSSFWorkbook()`の処理が登場していないので、
メソッドに分けたときとそうでないときで`XSSFWorkbook`の処理の仕方が
違っている疑いもありますが、実際に見てみないと分かりません。
あとは、エラーが発生した場合に動作が変わる可能性もあるかも知れません。
`printStackTrace()`の情報が何かログかコンソールに出ていませんか?
ブラウザーの種類やHTML側の処理にもよるかもしれません。
ChromeとFirefoxで`a`タグの`target="_blank"`にしてタブを開いてダウンロードさせてみましたが、
タブが閉じないというのは確認できませんでした。
タブが閉じないというのは確認できませんでした。
---
(追記)
検証したコードです。
アプリケーションサーバーはTomcat8です。
```lang-java
// import省略
@WebServlet("/servlet1")
public final class Servlet1 extends HttpServlet {
   private static final long serialVersionUID = 1L;
   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse response) throws ServletException, IOException {
       doUpdateExcel(req, response);
       System.out.println("end of doGet"); // ダウンロード後に出力される
   }
   protected void doDownload(HttpServletResponse response) throws IOException {
       response.setContentType("application/octet-stream");
       String fileName = null;
       try {
           fileName = new String(getExcelFileName().getBytes("Windows-31J"), "ISO-8859-1");
       } catch (UnsupportedEncodingException e1) {
           e1.printStackTrace();
       }
       response.setHeader("Content-Disposition", "attachments; filename=\"" + fileName + "\"");
       response.setHeader("Cache-Control", "public");
       response.setHeader("Pragma", "public");
       // どうやって作っているか分からないのでとりあえずローカルのファイルを開く
       Workbook wb = new XSSFWorkbook("../" + getExcelFileName());
       try {
           OutputStream out = new BufferedOutputStream(response.getOutputStream());
           wb.write(out);
       } catch (IOException e) {
           e.printStackTrace();
       } finally {
           try {
               wb.close();
           } catch (IOException e) {
               e.printStackTrace();
           }
       }
   }
   protected void doUpdateExcel(HttpServletRequest request, HttpServletResponse response) throws ServletException,
                                                                                         IOException {
       // --- エクセルを生成する処理 ---
       doDownload(response); // ここで上記のエクセルダウンロードを呼び出すと、タブが自動で閉じられない
   }
   private String getExcelFileName() {
       return "dltest.xlsx";
   }
}
```

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る