Web应用经常需要服务静态内容,例如图片或者样式表.Ring提供了两个中间件函数来做这个事情.

    一个是wrap-file.它服务来自当前文件系统一个目录的静态内容:

    1. (use 'ring.middleware.file)
    2. (def app
    3. (wrap-file your-handler "/var/www/public"))

    另一个是wrap-resource.它服务来自JVM classpath下的静态内容:

    1. (use 'ring.middleware.resource)
    2. (def app
    3. (wrap-resource your-handler "public"))

    如果你使用一个Clojure构建工具,像Leiningen,一个项目的non-source-file资源保存在resources目录中.目录中的文件自动的保存jar或者war文件中.

    所以在上面的例子中,文件被放在resources/public目录将会被当做静态文件.

    经常性的你想要结合wrap-file或者wrap-resource和其他中间件,通常是wrap-content-typewrap-not-modified:

    1. (use 'ring.middleware.resource
    2. 'ring.middleware.content-type
    3. 'ring.middleware.not-modified)
    4.  
    5. (def app
    6. (-> your-handler
    7. (wrap-resource "public")
    8. (wrap-content-type)
    9. (wrap-not-modified))

    wrap-content-type中间件选择一个content-type基于文件扩展.例如,一个文件叫做hello.txt将会获得一个text/plain的content-type.

    wrap-not-modified中间件在响应中检查(最后定义)Last-Modified的header对应着在请求中的If-Modified-Since的header.通过确保客户端不需要下载它们已经缓存的资源,这回节省带宽.

    注意这个额外的中间件需要环绕(另一种说法 紧跟)wrap-resource或者wrap-file函数.