自定义下载servlet

时间:2012-01-24 20:28:32

标签: jsf servlets download

我从绝对路径中查看了BalusC的自定义下载servlet代码(参见http://balusc.blogspot.com/2007/07/fileservlet.html#FileServletServingFromAbsolutePath)。我不是Java Web开发人员专家,所以如果有人可以解释这部分代码,我会很高兴

private String filePath;

// Actions ------------------------------------------------------------------------------------

public void init() throws ServletException {

    // Define base path somehow. You can define it as init-param of the servlet.
    this.filePath = "/files";

    // In a Windows environment with the Applicationserver running on the
    // c: volume, the above path is exactly the same as "c:\files".
    // In UNIX, it is just straightforward "/files".
}

什么时候调用init方法?为什么我们需要在init方法中设置filePath?

我有一个XHTML(Mojarra + IceFaces),类似下面的代码,效果很好。我的页面仅缺少下载outputLink标记

引用的文件的部分
                <ice:tree id="tree"
                          value="#{treeBean.model}"
                          var="item"
                          hideRootNode="false"
                          hideNavigation="false"
                          >
                    <ice:treeNode>
                        <f:facet name="icon">
                            <ice:panelGroup style="display: inline">
                                <h:graphicImage value="#{item.userObject.icon}" />
                            </ice:panelGroup>
                        </f:facet>
                        <f:facet name="content">
                            <ice:panelGroup style="display: inline-block">
                                <ice:outputLink value="#{item.userObject.filePath}">
                                    <ice:outputText value="#{item.userObject.fileName}"/>
                                </ice:outputLink>
                            </ice:panelGroup>
                        </f:facet>
                    </ice:treeNode>
                </ice:tree>

在我的Backing bean中,我有两个字段fileName(只是扩展名为file.jpeg的文件名)和filepath(服务器中文件的ABSOLUTE路径)。最后我想用自定义服务器下载文件,我该怎么做?

干杯,

更新

让我们说mi base-dir是/SRC,在那个目录下我有我所有的xhtml页面和WEB-INF和META-INF,并且我有一个名为 dataFiles <的目录/ strong>在dataFiles下我有以下结构

  --dataFiles
  |----Enterprise1
  |    |--User1
  |    |   |--goodFiles
  |    |   |  |--ok.txt
  |    |   |--badFiles
  |    |      |--bad.txt
  |    |--User2 
  |    |   |--goodFiles
  |    |   |  |--ok.txt
  |    |   |--badFiles
  |    |      |--bad.txt
  |----Enterprise2
       |--User1
       |   |--goodFiles
       |   |  |--ok.txt
       |   |--badFiles
       |      |--bad.txt
       |--User2 
           |--goodFiles
           |  |--ok.txt
           |--badFiles
              |--bad.txt

我是如何用IceFaces渲染树的,我只是在支持bean中有文件名(即ok.txt或bad.txt),但我无法弄清楚如何下载链接所指向的文件树。

1 个答案:

答案 0 :(得分:0)

好吧终于搞定了。

首先感谢BalusC,这里有一些帖子帮助我理解但有人删除了它们。无论如何,这是我所学到的。

  1. 在Servlet的 init 方法中, filePath 变量必须指向 绝对 路径,其中要下载的文件是。
  2. web.xml 中,当浏览器具有该url模式时,servlet-map-url-pattern将导致执行servlet。
  3. 在xhtml页面中,链接的值应以url-pattern开头,后跟名称(或路径+ FileName),因此当您单击链接时,下载开始。
  4. 这就是我所要做的一切!

    在问题的示例中,servlet的init方法中的filePath变量将指向绝对路径,例如 C:\ myApp \ dataFiles 然后在xhtml中将使用类似

    的方式调用servlet
    <ice:outputLink value="dl/myPath/#{myBean.fileName}>
        <ice:outputText value="#{myBean.fileName}"/>
    </ice:outputLink>
    

    注1:outputLink值的第一部分为 dl / ,这是因为要下载的servlet的url-pattern映射到它

    注2:在outputLink中, myPath 的值可以是 dl / Enterprise1 / User1 / file1.ext

    干杯