将根文件夹设置为索引

时间:2010-07-08 16:08:25

标签: java servlets file-io

我这里有这个代码:

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

/**
 *
 * @author Nathan Campos
 */
public class Files extends HttpServlet {
    PrintWriter out = null;              // moved outside doGet() for use in ls()
    @Override
    public void doGet(HttpServletRequest request,
                      HttpServletResponse response)
    throws ServletException, IOException {
        response.setContentType("text/html");
        // PrintWriter out = response.getWriter(); would create a copy no accessable in ls()
        out = response.getWriter();   // this uses the out declared outside
        File startDir = new File("C:\\test");
        ls(startDir);
    }

    private void ls(File f) {
        File[] list = f.listFiles();
        if ( list == null ) {
            out.println("Returned null");
                    return; // otherwise the for loop will crash
        }
        for(File file : list) {
            if(file.isDirectory()) {
                ls(file);
            } else {
                out.println("<a href='+file.toURL()+'>'+file.getName()+'</a>");
            }
        }
    }
}

但我想在文件夹C:\WorkFiles\ServletFiles上进行搜索。我怎么能这样做?

更新:当我尝试使用private void ls(File f)(不是static)时,我在浏览器上遇到此错误(运行Tomcat):

java.lang.NullPointerException
    Files.ls(Files.java:30)
    Files.doGet(Files.java:18)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:627)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)

2 个答案:

答案 0 :(得分:2)

应从配置中读取您启动的目录。但是你可以这样称呼它:

PrintWriter out = null; // moved outside doGet() for use in ls()

public void doGet(HttpServletRequest request,
                  HttpServletResponse response)
throws ServletException, IOException {
    response.setContentType("text/html");
    out = response.getWriter();

    File startDir = new File("C:\\WorkFiles\\ServletFiles");
    ls( startDir );
}

ls()中的打印行有问题(你不能混合'和')并且应该重写为

out.println("<a href="+file.toURL()+'>'+file.getName()+"</a>");

(假设你不是在redered html页面中输出而不是stdout)

注意:不推荐使用的file.toURL()方法抛出MalformedURLException

编辑:

由于listFiles可以返回null,因此您还应该添加

File[] list = f.listFiles();
if ( list == null ) return;

答案 1 :(得分:1)

与实际问题无关:

PrintWriter out = null;              // moved outside doGet() for use in ls()

这是非常坏主意。这样,响应编写器在所有HTTP请求中共享,并且每个新HTTP请求都覆盖上一个请求的响应编写器。当前一个请求实际上仍未完成时,客户端将永远不会检索响应的剩余部分,而是会在另一个客户端的最新请求的响应中显示。

换句话说:您的servlet 线程安全。不要将请求和/或会话特定数据作为servlet的实例变量。只需将其作为方法参数传递。

private void ls(File f, PrintWriter out) {
    // ...
}

另见: