基本的に、カウントと「ダウンロード」ボタンを表示する JSF ページがあります。ボタンをクリックすると、テキスト ファイルが作成およびダウンロードされ、ページのカウントがインクリメントされます。
CommandButton をクリックすると、bean.download メソッドが呼び出され、テキストが ByteArrayOutputStream に書き込まれ、ダウンロードされます。ただし、カウントは更新されません (ページは再読み込みされません)。
ByteArrayOutputStream に書き込むメソッドを呼び出さない場合、ページは更新され、新しいカウント値が表示されます。
JSF ページ:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">
<h:body>
<h:form id="mainForm">
<h:outputText id="countLbl" value="Download Count = #{bean.count}" />
<br />
<h:commandButton value="Do Download" action="#{bean.download}"/>
</h:form>
</h:body>
</html>
セッション Bean: Bean
import javax.annotation.PostConstruct;
import javax.enterprise.context.SessionScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.inject.Named;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
@Named
@SessionScoped
public class Bean implements Serializable {
private int count;
@PostConstruct
private void init() {
count = 0;
}
public String download() {
count++;
try {
doDownload();
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException(e);
} catch (ServletException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
return "";
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public void doDownload() throws IOException, ServletException {
final ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
String line = "dummy text";
baos.write(line.getBytes());
baos.close();
sendReport(baos.toByteArray());
} catch (IOException e) {
e.printStackTrace();
throw e;
} catch (ServletException e) {
e.printStackTrace();
throw e;
}
}
public static void sendReport(byte[] bs) throws IOException,
ServletException {
FacesContext facesContext = FacesContext.getCurrentInstance();
ExternalContext externalContext = facesContext.getExternalContext();
HttpServletResponse response = (HttpServletResponse) externalContext
.getResponse();
response.reset();
response.setHeader("Expires", "0");
response.setHeader("Cache-Control",
"no-store, no-cache, post-check=0, pre-check=0");
response.setHeader("Pragma", "no-cache");
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-disposition",
"attachment; filename=\"down.csv\"");
response.setContentLength(bs.length);
ServletOutputStream os = response.getOutputStream();
os.write(bs);
os.close();
facesContext.responseComplete();
}
}
助けてくれてありがとう。