Spring Bootの実戦的静的資源処理


前の二つの章はSpring bootのRetsfulに対するサポートを共有しましたが、Retsfulのインターフェースは普通はデータだけを返します。webの開発をする時、私達はよく多くの静的資源があります。どうやって前の端に静的な資源を返しますか?以前ウェブ開発をしたことがある人はご存知のはずです。以前作成したウェブプロジェクトの下にwebappのカタログがあります。私たちは静的な資源をこのカタログの下に置いたら直接訪問できます。しかし、Spring bootに基づくプロジェクトにはこのカタログがありません。どうすればいいですか?
一、一番不器用な方法
まず、静的リソースをフローを通して直接フロントエンドに戻すという最も愚かな方法を共有します。我々は、mavenプロジェクトのresourceのルートディレクトリの下にhtmlファイルを作成し、ファイルをディレクトリの下に置いて、そして任意のアクセス経路を指定します。

@Controller
public class StaticResourceController {

  @RequestMapping("/static/**")
  public void getHtml(HttpServletRequest request, HttpServletResponse response) {
    String uri = request.getRequestURI();
    String[] arr = uri.split("static/");
    String resourceName = "index.html";
    if (arr.length > 1) {
      resourceName = arr[1];
    }
    String url = StaticResourceController.class.getResource("/").getPath() + "html/" + resourceName;
    try {
      FileReader reader = new FileReader(new File(url));
      BufferedReader br = new BufferedReader(reader);
      StringBuilder sb = new StringBuilder();
      String line = br.readLine();
      while (line != null) {
        sb.append(line);
        line = br.readLine();
      }
      response.getOutputStream().write(sb.toString().getBytes());
      response.flushBuffer();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}
その実現過程は簡単で、経路から資源uriを分離して、staticディレクトリの下からファイルを読み取り、先端に出力します。簡単なデモしかしないので、ここではテキストタイプのファイルしか処理していません。画像ファイルは同様の処理ができます。もちろん、実際にはそうはしません。Spring bootもきっともっといい解決方法があります。しかし、この方法は少し愚かですが、最も本質的なものです。枠がどんなに便利であれ、このような問題を解決してくれました。しかし、枠を外しても、私たちは相変わらず上手にウェブプロジェクトを書くことができます。今からまたSpring bootの静的資源に対するサポートを見てきます。
二、Spring boot標準静的資源アクセス方式
Spring bootデフォルトの対***へのアクセスは4つのディレクトリの下のファイルに直接アクセスできます。
classipath:/public/
classipath:/resource/
classipath:/static/
classipath:/META-INFO/resoces/
私たちは今リソースファイルのresourceディレクトリの下に次の4つのディレクトリを作成します。

注意青いバーの下のリソースフォルダのreourcesはクラスパスの下のフォルダのclassipath:/resorcersとは異なり、青いバーの下のresouresはこのディレクトリの下のファイルがリソースファイルであり、パッケージ化時にそのディレクトリの下のファイルを全部パッケージ化するクラスパスの下で、この名前は変更できます。pom.xmlでリソースディレクトリを指定すればいいです。

<resources>
   <resource>
     <directory>src/main/resources</directory>
   </resource>
</resources>
クラスパスにおけるレスポンスは、spring bootのデフォルトの静的リソースフォルダの一つであり、public、static、MEAT-INFO/resourceの機能と同じである。今私達はSpring bootを再起動すれば通過できます。
http://localhost:8080/1.html
http://localhost:8080/2.html
http://localhost:8080/3.html
http://localhost:8080/4.html
4つのURLが4つのディレクトリの静的リソースにアクセスされました。
三、静的リソースディレクトリをカスタマイズする
第二節の内容を通して、Spring bootがデフォルトでアクセスできる静的リソースのカタログを知っていますが、このカタログは固定されていますか?静的リソースディレクトリは自分で定義できますか?答えは肯定的です。私たちは今静的資源カタログをカスタマイズします。イメージのカタログを定義して画像を保存します。すべての道はイメージディレクトリの下のリソースにアクセスします。

@Configuration
public class ImageMvcConfig extends WebMvcConfigurerAdapter {

  @Override
  public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/image/**")
        .addResourceLocations("classpath:/images/");
  }
}
このコードは比較的簡単であるべきです。@Configrationは構成類を識別しています。これは前の文章で何度も言及されています。WebMvcConfigrer AdapterはSpringが提供するmvcを構成するアダプターです。中には多くの構成方法があります。addResource Handlersは静的資源を専門に扱う方法です。他の方法は後でまた説明します。上の構成が有効かどうか確認しています。imagsディレクトリの下にspring.jpgの写真を置いていますが、今はhttp://localhost:8080/image/spring.jpgを通じて画像を訪問しています。

実は上の方法以外にもっと簡単な方法があります。そのままappication.ymlに配置すればいいです。

spring:
 mvc:
  static-path-pattern: /image/**
 resources:
  static-locations: classpath:/images/
static-path-pattern:アクセスモード、デフォルトは/**、複数はカンマ区切りができます。
static-locations:リソースディレクトリ、複数のディレクトリをカンマで区切って、デフォルトのリソースディレクトリはclassipath:/META-INF/resorce/で、classicath:/で、classipath:/static/で、classipath:/public/
なお、この構成は、Spring bootのデフォルトの静的リソースディレクトリをカバーしており、例えば、一例で構成されているなら、static、public、resourceなどのディレクトリのリソースにアクセスできなくなる。
四、まとめ
本論文は主にSpring bootの静的資源に対する処理方式を共有しています。Spring bootはデフォルトではclasspathにアクセスできます。最後に、この4つのディレクトリに同じ名前のリソースが存在する場合、優先的にどのディレクトリのリソースに戻りますか?Sttic-locationsのデフォルト値順で推測できるはずですが、デフォルトではSpring bootは優先的に/META-INF/resourceの下のリソースに戻ります。もちろん、static-locationsの値をカスタマイズできますので、この優先順位も調整できます。
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。