- PR -

JSFでのダウンロードについて

1
投稿者投稿内容
とも
会議室デビュー日: 2005/08/12
投稿数: 10
投稿日時: 2006-03-20 11:20
こんにちは。

JSFでExcelのダウンロード後の画面遷移で悩んでおります。
ダウンロード自体は正しく行われるのですが、その後、
画面上のアンカー(処理選択へ戻る)をクリックしても、1回は必ず
同じ画面を再表示します。2回目のクリックで、正しい遷移を行います。
ちなみに、ダウンロードを行う前は、1回目のクリックで正しい遷移を行います。

ダウンロード後も、1回目のクリックで正しく画面遷移させる為には、
どのようにすれば宜しいのでしょうか?

環境:Java 1.4.2_08、Tomcat 5.0.28、MyFaces 1.0.9(FacesIDE 0.1.7)

<<aki180d05.jsp 抜粋>>
<h:commandButton type="submit" value="ダウンロード"
  id="downloadBtn" action="#{aki180Bean.downloadAction}"/>

<h:commandLink value="処理選択へ戻る"
  action="submenu" immediate="true"/>

<<faces-config.xml>>
<navigation-rule>
  <from-view-id>/jsp/ak/aki180d05.jsp</from-view-id>
  <!-- aki180 to submenu -->
  <navigation-case>
    <from-outcome>submenu</from-outcome>
    <to-view-id>/jsp/ak/aki180d01.jsp</to-view-id>
  </navigation-case>
</navigation-rule>

<<java>>
public String downloadAction() throws Exception {
 FacesContext facescontext = FacesContext.getCurrentInstance();
 ExternalContext externalcontext = facescontext.getExternalContext();
 HttpServletResponse response = (HttpServletResponse)externalcontext.getResponse();
 String outFileName = "";

 try {
  //ダウンロードファイル作成
  outFileName = createOutputFile();

  response.setContentType("application/octet-stream");
  response.setHeader("Content-Disposition", "attachment; filename=\\\\\\\\"AAA.xls\\\\\\\\"");
  BufferedOutputStream output = new BufferedOutputStream(response.getOutputStream());
  BufferedInputStream input = new BufferedInputStream(new FileInputStream(outFileName));

  byte buf[] = new byte[1024];
  int len;
  while ((len = input.read(buf)) != -1) {
   output.write(buf, 0, len);
  }
  output.flush();
  output.close();
  input.close();

  //ダウンロードファイル削除
  File file = new File(outFileName);
  if (file.delete() == false) {
   //エラーログ出力
  }

  facescontext.responseComplete();

  return "";
 } catch (Exception e) {
  e.printStackTrace();
  throw e;
 }
}
よしだひろゆき
大ベテラン
会議室デビュー日: 2004/11/22
投稿数: 141
投稿日時: 2006-03-20 15:32
Tomcat 4.1.24, JSF RI 1.1_01で試してみましたが,再現しません.ちゃんと動作します.

とりあえず,PhaseListenerを入れて,どのフェーズが動いているかログを採ってみては
いかがでしょうか?

それと
<h:messages layout="table"/>

<h:outputText value="#{param}"/>
を入れておくと,何が起きているか分かることがあります.
1

スキルアップ/キャリアアップ(JOB@IT)