一个简单的文件服务器由三个组件组成:
- 绑定到给定地址的
HttpServer
, - 从给定目录路径提供文件的
HttpHandler
,以及 - 一个可选的
Filter
,用于打印与服务器处理的交换相关的日志消息。
简单文件服务器
createFileServer
静态工厂方法返回一个简单的开箱即用文件服务器的HttpServer
。 该服务器带有一个初始处理程序,该处理程序从给定目录路径(及其子目录)提供文件。 输出级别确定要打印到System.out
的日志消息。
简单文件服务器的示例:
var addr = new InetSocketAddress(8080);
var server = SimpleFileServer.createFileServer(addr, Path.of("/some/path"), OutputLevel.INFO);
server.start();
文件处理程序
createFileHandler
静态工厂方法返回一个服务文件和目录列表的HttpHandler
。 该处理程序仅支持HEAD和GET请求方法;要处理其他请求方法,可以向服务器添加其他处理程序,或通过使用HttpHandlers.handleOrElse(Predicate, HttpHandler, HttpHandler)
组合一个处理程序。
组合单个处理程序的示例:
var handler = HttpHandlers.handleOrElse(
(req) -> req.getRequestMethod().equals("PUT"),
(exchange) -> {
// 验证和处理PUT请求
},
SimpleFileServer.createFileHandler(Path.of("/some/path")))
);
输出过滤器
createOutputFilter
静态工厂方法返回一个后处理过滤器
,用于打印与服务器处理的交换相关的日志消息。 输出格式由outputLevel
指定。
输出过滤器的示例:
var filter = SimpleFileServer.createOutputFilter(System.out, OutputLevel.VERBOSE);
var server = HttpServer.create(new InetSocketAddress(8080), 10, "/some/path/", new SomeHandler(), filter);
server.start();
jwebserver工具
通过jwebserver
工具提供了一个简单的HTTP文件服务器实现。
- 工具指南:
- jwebserver
- 自版本:
- 18
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionstatic enum
描述了服务器在处理交换时产生的日志消息输出级别。 -
Method Summary
Modifier and TypeMethodDescriptionstatic HttpHandler
createFileHandler
(Path rootDirectory) 创建一个从给定目录路径(及其子目录)提供文件的文件处理程序。static HttpServer
createFileServer
(InetSocketAddress addr, Path rootDirectory, SimpleFileServer.OutputLevel outputLevel) 创建一个从给定路径提供文件的文件服务器。static Filter
createOutputFilter
(OutputStream out, SimpleFileServer.OutputLevel outputLevel)
-
Method Details
-
createFileServer
public static HttpServer createFileServer(InetSocketAddress addr, Path rootDirectory, SimpleFileServer.OutputLevel outputLevel) 创建一个从给定路径提供文件的文件服务器。服务器配置了一个初始上下文,将URI
path
映射到一个文件处理程序。 文件处理程序的创建方式类似于调用createFileHandler(rootDirectory)
,并且与通过调用createContext("/")
创建的上下文相关联。 返回的服务器未启动。可以提供输出级别以打印与服务器处理的交换相关的日志消息。 如果给定了
OutputLevel.NONE
,则不会打印任何日志消息。- 参数:
-
addr
- 要侦听的地址 -
rootDirectory
- 要提供的根目录,必须是绝对路径 -
outputLevel
- 日志消息输出级别 - 返回:
- 一个HttpServer
- 抛出:
-
IllegalArgumentException
- 如果根目录不存在、不是绝对路径、不是目录或不可读 -
UncheckedIOException
- 如果发生I/O错误 -
NullPointerException
- 如果任何参数为null -
SecurityException
- 如果安装了安全管理器并且拒绝了根目录的递归FilePermission
"read
"
-
createFileHandler
创建一个从给定目录路径(及其子目录)提供文件的文件处理程序。文件处理程序根据给定的
rootDirectory
路径解析请求URI,以确定要提供响应的关联文件系统上的路径p
。 如果路径p
是一个目录,则响应包含一个以HTML格式排列的目录列表作为响应主体。 如果路径p
是一个文件,则响应包含基于系统范围的mimeTable
上的getContentTypeFor调用确定的最佳猜测内容类型的“Content-Type”标头,以及文件内容作为响应主体。该处理程序仅支持使用HEAD或GET方法的请求,并对使用任何其他方法的请求回复
405
响应代码。- 参数:
-
rootDirectory
- 要提供的根目录,必须是绝对路径 - 返回:
- 一个文件处理程序
- 抛出:
-
IllegalArgumentException
- 如果rootDirectory不存在、不是绝对路径、不是目录或不可读 -
NullPointerException
- 如果参数为null -
SecurityException
- 如果安装了安全管理器并且拒绝了根目录的递归FilePermission
"read
"
-
createOutputFilter
- API注释:
- 为了不输出任何日志消息,建议不使用过滤器。
- 参数:
-
out
- 要打印到的流 -
outputLevel
- 输出级别 - 返回:
- 一个后处理过滤器
- 抛出:
-
IllegalArgumentException
- 如果给出了OutputLevel.NONE
-
NullPointerException
- 如果任何参数为null
-