Установка корневой папки для индексации - PullRequest
0 голосов
/ 08 июля 2010

У меня есть этот код здесь:

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 ]

2 голосов
/ 08 июля 2010

Каталог, с которого вы начинаете, должен читаться из конфигурации. Однако вы можете назвать это так:

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>");

(при условии, что вы не хотите выводить на отрисованную html-страницу вместо stdout)

Примечание: устаревший метод file.toURL () выбрасывает MalformedURLException

EDIT:

Поскольку listFiles может возвращать ноль, вы также должны добавить

File[] list = f.listFiles();
if ( list == null ) return;
1 голос
/ 09 июля 2010

Не имеет отношения к актуальной проблеме:

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

Это крайне плохая идея. Таким образом, средство записи ответов совместно используется для всех запросов HTTP, и каждый новый запрос HTTP будет переопределять средства записи ответа для предыдущего запроса. Когда предыдущий запрос был еще незавершенным, клиент никогда не получит остаток ответа, и вместо этого это будет показано в ответе на последний запрос другого клиента.

Другими словами: ваш сервлет не поточно-безопасный. Не используйте данные запроса и / или сессии как переменную экземпляра сервлета. Просто передайте это как аргумент метода.

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

Смотри также:

...