Jetty嵌入式開發之靜態資源

ResourceHandler

提到靜態資源加載不得不提到的一個類,這是jetty提供的靜態資源處理類。html

Server server = new Server(8080);
    //封裝靜態資源訪問路徑
    ContextHandler contextHandler = new ContextHandler("/index");
    ResourceHandler resourceHandler = new ResourceHandler();
    resourceHandler.setDirectoriesListed(true);
    resourceHandler.setWelcomeFiles(new String[]{"index.html"});
    resourceHandler.setResourceBase(Objects
                    .requireNonNull(Application.class.getClassLoader().getResource("template")).getPath());
    contextHandler.setHandler(resourceHandler);
    server.setHandler(contextHandler);
    server.start();
    server.join();
複製代碼

因爲 ResourceHandler 並未提供訪問路徑匹配,故再封裝到 ContextHandler。java

  • 問題:以上代碼在一般請看小沒有問題,訪問 http://127.0.0.1:8080/index 能夠正常顯示 index.html 頁面 但若是 template 目錄位於 resources 目錄下,在打包運行時,訪問將訪問404

訪問結果

  • 緣由:因爲將資源文件打入類 jar 包,在代碼中是直接經過路徑訪問的資源,能夠打印看看代碼中指定的路徑
log.info(Application.class.getClassLoader().getResource("template").getPath());
複製代碼

打印結果:json

server.Application - file:/home/jawliet/Projects/json-rpc-demo/target/json-rpc-demo-1.0-SNAPSHOT-jar-with-dependencies.jar!/template

複製代碼

而這個路徑是沒法直接訪問的。運維

  • 解決方法:
  1. 將資源文件放到 jar 外部;
  2. 讀取 jar 內部資源 第一種對於部署,運維較爲方便,但也不排除須要將資源文件打入 jar 的狀況。其實在 jetty 中提供類一個工具類 Resource, 而這個這個問題剛好能解決這個問題

Resource

這裏很少廢話,直接上代碼工具

Server server = new Server(8080);
    //封裝靜態資源訪問路徑
    ContextHandler contextHandler = new ContextHandler("/index");
    ResourceHandler resourceHandler = new ResourceHandler();
    resourceHandler.setDirectoriesListed(true);
 // log.info(Application.class.getClassLoader().getResource("template").getPath());
// resourceHandler.setResourceBase(Objects
// .requireNonNull(Application.class.getClassLoader().getResource("template")).getPath());
    resourceHandler.setBaseResource(Resource.newResource(Application.class.getClassLoader().getResource("template")));
    resourceHandler.setWelcomeFiles(new String[]{"index.html"});
    contextHandler.setHandler(resourceHandler);
    server.setHandler(contextHandler);
    server.start();
    server.join();
複製代碼

這裏能夠看到,ResourceHandler 除了提供路徑的資源指定外,還提供類直接 Resource 的指定方式,其實在不少能指定路徑的地方都提供類 Resource 的指定方式,如:ui

SslContextFactory sslContextFactory = new SslContextFactory();
sslContextFactory.setKeyStoreResource(Resource.newResource(Application.class.getClassLoader().getResource("keystore.jks")));
複製代碼

Resource
Resource 有多個子類,感興趣的能夠本身研究
相關文章
相關標籤/搜索