使用JSF应用程序下载日志文件?

时间:2012-01-16 09:15:45

标签: jsf tomcat download richfaces

在我的应用程序中由JSF2.0 + Richfaces3.3.3 + Tomcat6.0.29开发。

我将我的日志文件保存到以下位置: E:\ Tomcat-6.0.29 \ Tomcat6.0 \ logs \ project.log
我的tomcat(webapps)位置: E:\ Tomcat-6.0.29 \ Tomcat 6.0 \ webapps

当我点击a4j:commandbutton我想下载该日志文件时,不更改内容和文件名。

以下代码适用于(JSF1.2)。但
转换JSF2.0后,以下代码无效。

download.jsp

<h:form id="downloadForm" binding="#{Download.initForm}">
        <a4j:outputPanel id="downloadOutputPanel"> 
                 <a4j:commandButton value="Download Log"
                                    action="#{Download.downloadButtonAction}"
                                    reRender="downloadOutputPanel"/>                              </a4j:outputpanel>
</h:form>

Download.java

package com.test;

import java.io.File; import javax.faces.component.html.HtmlForm;

import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;

public class Download{

private HtmlForm initForm;    

public String downloadButtonAction()
{        
    String fileName = "logs" + File.separator + "project.log";
    System.setProperty("download.logfile", "download-logfile") ;
    downloadLogFile(fileName);
    return null;
}

private void downloadLogFile(String fileName)
{
   try
   {
     FacesContext facesContext = FacesContext.getCurrentInstance();
     ExternalContext context = facesContext.getExternalContext();
     HttpServletResponse response = (HttpServletResponse) context.getResponse();
     fileName = fileName.replace(File.separator, "/");

response.sendRedirect("/" + "JSF-Richfaces-3.3.3-Demo-2" + 
                            /faces/fileDownloadServlet/" + fileName);  
}
catch (Exception ex)
{
  System.out.println("Exception occours while downloading templates: "+ ex);
 }
 }

public HtmlForm getInitForm(){        
    return initForm;
}

public void setInitForm(HtmlForm initForm){
    this.initForm = initForm;
}   
}

我的 FileDownloadServlet.java

package com.test;

import javax.servlet.ServletException;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.Closeable;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLDecoder;
import javax.servlet.ServletConfig;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class FileDownloadServlet extends HttpServlet
{
ServletConfig servletConfig;    

@Override
public void init(ServletConfig servletConfig)
{
    this.servletConfig = servletConfig;
}

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws IOException
{
    String contentType = null;
    String filePath = "";
    String fileName = "";

    String requestURI = request.getRequestURI();
    try
    {
        fileName = requestURI.substring(requestURI.lastIndexOf('/') + 1);                     
        String catalinaHome = "." + File.separator + ".." + File.separator;

        if (System.getProperty("os.name").contains("Windows"))
        {
            catalinaHome = "";
        }
        filePath = catalinaHome +  requestURI.substring(requestURI.indexOf(System.getProperty("download.logfile")), requestURI.lastIndexOf("/"));
        filePath = filePath.replace("/", File.separator);           
    }
    catch (Exception exception)
    {
        System.out.println("Exception occurred while parsing the request URI : " + exception);
    }
    finally
    {
        System.out.println("File path after parsing in download servlet : " + filePath);
    }

    filePath = filePath + File.separator + fileName;                
    fileName = URLDecoder.decode(fileName, "UTF-8");        
    File file = new File(filePath);             

    try
    {            
        contentType = request.getSession().getServletContext().getMimeType(fileName);
    }
    catch (Exception exception)
    {
        System.out.println("Exception while getting content type : ", exception);
    }

    if (contentType == null)
    {
        contentType = "application/octet-stream";
    }        

    BufferedInputStream input = null;
    BufferedOutputStream output = null;
    try
    {            
        input = new BufferedInputStream(new FileInputStream(file));
        int contentLength = input.available();           

        response.reset();
        response.setContentType(contentType);
        response.setContentLength(contentLength);
        response.setHeader("Content-disposition", "attachment; filename=\"" +
                fileName + "\"");
        output = new BufferedOutputStream(response.getOutputStream());

        for (int data;
                (data = input.read()) != -1;)
        {
            output.write(data);
        }

        output.flush();
    }
    catch (Exception e)
    {           
        System.out.println("Exception in File Download : " + e);
    }
    finally
    {           
        close(output);
        close(input);
    }
}


private static void close(Closeable resource)
{
    if (resource != null)
    {
        try
        {
            resource.close();
        }
        catch (IOException e)
        {               
            System.out.println("Error ", e);
        }
    }
}
}

的web.xml

...
...
 <servlet>
    <servlet-name>fileDownloadServlet</servlet-name>
    <servlet-class>com.test.FileDownloadServlet</servlet-class>
</servlet>
 <servlet-mapping>
    <servlet-name>fileDownloadServlet</servlet-name>
    <url-pattern>/fileDownloadServlet/*</url-pattern>
</servlet-mapping>
...
...

错误是:

HTTP Status 404 - /fileDownloadServlet/logs/project.log not found
type Status report
message /fileDownloadServlet/logs/project.log not found
description The requested resource (/fileDownloadServlet/logs/project.log not found) ` is not available.`
Apache Tomcat/6.0.29

同时我的地址栏显示此网址 的的http://本地主机:8080 / JSF-RichFaces的-3,3,3-演示-2 /面/ fileDownloadServlet /日志/ project.log

帮帮我...... 提前谢谢。

1 个答案:

答案 0 :(得分:2)

我宁愿建议使用另一个servlet进行压缩,而是使用h:outputLink指向它。即使你设法以某种方式通过FacesServlet推送文件,它也可能不是可移植的,或者可能会导致一些意想不到的问题。

  1. 您需要实现一个简单的servlet来生成一个 压缩日志文件
  2. 将此servlet的mapping添加到您的web.xml
  3. 添加h:outputLinklink指向新的servlet