我这里有这个代码:
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)
答案 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) {
// ...
}