2012-01-24 5 views
1

JSF 2 응용 프로그램의 페이지에 파일을 다운로드하려면 링크를 표시해야합니다. 이제 문제는 파일에 생성시 데이터베이스에 대한 새로운 시각에 의존하는 데이터가 포함되어 있다는 것입니다. 그러나 내가하고 싶은 것은 그것을 만들고 사용자에게 하나의 동작으로 다운로드 할 수있는 링크를 제공하는 것입니다.액션 링크 및 하나의 링크 다운로드

두 가지 작업 즉, 파일을 생성하는 버튼이 있고 생성 된 파일을 다운로드하기위한 링크로 바꾸는 것이 매우 간단합니다.

다시 한 번 commandLink에서 한 번의 클릭으로 문제를 해결할 수 있습니까?

EDIT, 아래 BalusC의 의견을 따르십시오. 여기에 제가하려고하는 일의 구체적인 내용이 있습니다. 나는 xhtml에 이것을 가지고있다 :

<h:panelGroup rendered="#{!bean.showLinkToExcelFile()}"> 
    <h:form> 
     <td><h:commandButton value="Generate list of your Bids for download" action="#{bean.createBidsList()}"/></td>  
    </h:form> 
</h:panelGroup> 
<h:panelGroup rendered="#{bean.showLinkToExcelFile()}"> 
    <td><a href="#{bean.findBidsListFileName()}">Download Your Bids</a></td> 
</h:panelGroup> 

이것은 작동한다. 이 단추는 Excel 파일을 만들어 위치에 저장하고 데이터베이스의 파일 이름을 업데이트합니다. 그런 다음 링크가 파일을 제공합니다. 그러나 그것은 사용자를위한 2 단계 프로세스입니다. 내가 원하는 것은 단지 한 걸음입니다. 예를 들어 하나의 링크, 너무 :

<a href="#{bean.findBidsListFileName()}">Download Your Bids</a> 

이 나, 가장 가능성이, 완벽하게, 엑셀 백 엔드에 파일을 생성/자원/위치에 저장하고하는 JSF CommandLink는 열려있는 대화 상자를 "저장" 사용자의 컴퓨터에서

+0

대답은 예입니다. 더 많은 질문이 있으십니까? 적절하게 요구 사항을 구현하는 동안 정확히 어디에 집착하고 있는지 보여주고 정교하게 표현하십시오. – BalusC

+0

감사합니다, BalusC. 나는 그 질문을 편집했다. – Herzog

답변

5

JSF가 로컬 디스크 파일 시스템의 OutputStream 대신 HTTP 응답의 OutputStream에 즉시 보고서를 쓰게 할 수 있습니다.

다음은 엑셀 보고서를 만들 Apache POI를 사용하는 가정, 기본 예제 :

public void createAndDownloadBidsReport() throws IOException { 
    // Prepare Excel report to be downloaded. 
    HSSFWorkbook bidsReport = createBidsReportSomehow(); 
    String filename = "bids.xls"; 

    // Prepare response to show a Save As dialogue with Excel report. 
    FacesContext facesContext = FacesContext.getCurrentInstance(); 
    ExternalContext externalContext = facesContext.getExternalContext(); 
    externalContext.setResponseContentType("application/vnd.ms-excel"); 
    externalContext.setResponseHeader("Content-Disposition", "attachment; filename=\"" + filename + "\""); 

    // Write Excel report to response body. 
    bidsReport.write(externalContext.getResponseOutputStream()); 

    // Inform JSF that response is completed and it thus doesn't have to navigate. 
    facesContext.responseComplete(); 
} 

당신은 단지 하나의 명령 링크 (또는 버튼)으로 끝날 수있는이 방법.

<h:form> 
    <h:commandLink value="Create and download bids report" action="#{bean.createAndDownloadBidsReport}" /> 
</h:form> 

디스크 파일 시스템에는 저장되지 않습니다. 정말로에 사본이 있어야한다면 원하는 디스크 파일 시스템 위치에 쓰는 다른 bidsReport.write() 행을 추가해야합니다.

+1

실제로 jxl을 사용하고 있지만이 방법은 상관 없습니다. 아름다운. – Herzog

+0

당신을 진심으로 환영합니다. – BalusC

+0

BalusC, 내가 가지고있는 버그에 대해 질문을 편집했습니다. 현재 질문과 관련이 없으면 삭제하겠습니다. 감사. – Herzog

0

정상적인 다운로드 링크를 사용하고 URL을 문서를 즉시 생성하는 서블릿에 매핑합니다.