0

基本的に、カウントと「ダウンロード」ボタンを表示する 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();

    }

}

助けてくれてありがとう。

4

1 に答える 1