春ブーツでは、デフォルトでは静的に対処するためのリソースを提供している、我々は設定されWebMvcConfigurerを使用することができます。個人的には、あなたが春のブート時のデフォルト設定は、特別な事情がある場合は、設定によって変更することができ、優れて使用することを示唆しています。
静的なデフォルトのマッピングリソースの1
春のブートデフォルト4つのディレクトリは、ファイルの下で(SRC /メイン/リソースリソースディレクトリの下のディレクトリにある)に直接アクセスすることができます。
- クラスパス:/ META-INF /リソース
- クラスパス:/リソース
- クラスパス:/静的
- クラスパス:/パブリック
静的リソースのための注文カタログ検索順序。同じ名前の静的リソースが被写体の前を見つけるために、存在する場合。
それは注意する必要があります。
- デフォルトの設定/ **クラスパスにマッピングされた:/ META-INF / resourcesディレクトリ4
- デフォルト設定/ webjars / **クラスパスにマッピングされた:/ META-INF /リソース / webjars /
// localhostを:8080 / img.jpg我々はimg.jpgにアクセスしたい場合は、アドレスを要求すべきは、httpです 。
静的リソースの2カスタムマッピング
私たちは瓶パッケージで提供されているが、実際には、いくつかの動的なリソースは、メンテナンスを必要としている、それがパッケージ上不可能である資源の上記の例。このリソースのために自由にアクセスする方法を、ディレクトリを指定しましたか?
需要のために、我々は今、クラスパスに* / /テストを追加する必要があります/テスト/ *マッピング
8080 /テスト:// localhostを:通常、直接アドレスhttp入力し 、/ img.jpgを単にアクセスすることはできません
この時点で、我々は唯一のaddResourceHandlersを達成するためにWebMvcConfigurerインターフェイスとメソッドを実装する必要があり、コードによってディレクトリのマッピングをカスタマイズする必要があります。コードは以下の通りです
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/test/**").addResourceLocations("classpath:/test/");
}
}
この時点で、直接アドレスを入力します。http:// localhostを:8080 /テスト / img.jpgを訪問することができ
、ノートを、当社独自のディレクトリマッピングを同時に使用することができ、デフォルトのマッピングを、影響しません。
自動マッピングをオーバーライド
私たちは/ *変更が/テスト/ *、システム構成がカバーされるようにマッピングする場合は、我々は繰り返しaddResourceLocationsを使用することができますディレクトリを追加し、最初の添加後よりも高い優先度を追加します。
registry.addResourceHandler("/**").addResourceLocations("classpath:/test/").addResourceLocations("classpath:/static/");
HTTPのルートディレクトリにURL img.jpgアクセステスト:// localhostを:8080 / img.jpg(/ **システムのデフォルト設定を上書きします)
外部ディレクトリを使用して
私たちは、フォルダへの絶対ファイルパスを使用する必要がある場合は、次のように書くことができます。
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/test/**").addResourceLocations("file:D:/test/");
}
}
あなたが指定したときに、ディスクにファイルの絶対パスを追加する必要があることに注意してください。
プロフィール構成マップ静的リソース
次のように実際には、我々はマッピングapplication.propertiesを設定することができ、コードは次のとおりです。
# 默认值为 /**
spring.mvc.static-path-pattern =
# 默认值为 classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/
spring.resources.static-locations = 这里设置要指向的路径,多个使用英文逗号隔开,
- spring.mvc.static経路パターンは、テスト/ **、ディレクトリ内の静的および他のimg.jpgファイルへのアクセスがローカルホストされるべきである/の修正として再定義されたパターンであることができる:8080 /試験/ img.jpg、前localhostに改訂:8080 / img.jpg。spring.mvc.static経路パターンのみ定義することができ、メモ
- Spring.resources.static-位置が導かれる経路パターンを再定義するために使用することができます。
3 WebJars
对于 web 开发而言,对静态资源版本管理是比较混乱的,以 Jquery,Bootstrap举例,可能各个前端框架所依赖的各个组件的版本都不尽相同,一不注意就可能引起不同版本的冲突问题。所以,是否有一种像后端管理 jar 包一样的解决方案呢?答案当然是有的,这就是我们要讲到的 WebJars。
WebJars 的工作原理
WebJars 是将 web 前端资源打成 jar 包文件。借助版本管理工具(例如 Maven )进行版本管理,保证这些 web 资源的版本唯一性,避免文件混乱、版本不一致等问题。
实际上 WebJars 就是将资源文件放到 classpath:/META-INF/resources/webjars/ 中,然后打包成 jar 发布到 maven 仓库中。
WebJars 的应用
在 Spring Boot 中默认将 /webjars/** 映射到 classpath:/META-INF/resources/webjars/ ,因此,在 JSP 页面中引入 jquery.js 的方法为:
<script type="text/javascript" src="${pageContext.request.contextPath }/webjars/jquery/2.1.4/jquery.js"></script>
同时需要在 pom.xml 文件中添加 jquery 的 WebJars 依赖
<dependency>
<groupId>org.webjars</groupId>
<artifactId>jquery</artifactId>
<version>2.1.4</version>
</dependency>
版本号统一管理
在实际开发中,也许我们会遇到升级版本号的情况,若有上千的页面,全部页面都按上面引入了 jquery.js ,那么如果有一天需要把版本号升级为 3.0.0,岂不累死?显然不能一个一个页面地去修改。
下面提供一个进行版本号统一管理的方法
在pom.xml 中添加依赖:
<dependency>
<groupId>org.webjars</groupId>
<artifactId>webjars-locator</artifactId>
</dependency>
增加一个WebJarsController:
@Controller
public class WebJarsController {
private final WebJarAssetLocator assetLocator = new WebJarAssetLocator();
@ResponseBody
@RequestMapping("/webjarslocator/{webjar}/**")
public ResponseEntity<Object> locateWebjarAsset(@PathVariable String webjar, HttpServletRequest request) {
try {
String mvcPrefix = "/webjarslocator/" + webjar + "/"; // This prefix must match the mapping path!
String mvcPath = (String) request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE);
String fullPath = assetLocator.getFullPath(webjar, mvcPath.substring(mvcPrefix.length()));
return new ResponseEntity<>(new ClassPathResource(fullPath), HttpStatus.OK);
} catch (Exception e) {
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
}
}
在页面中使用的方式:
<script type="text/javascript" src="${pageContext.request.contextPath }/webjarslocator/jquery/jquery.js"></script>
4 对静态资源的版本管理
当资源内容发生改变时,由于浏览器缓存,用户本地的资源还是旧资源,为了防止这种情况发生。我们可能会选择在资源文件后面加上参数“版本号”或其他方式。
使用版本号参数的例子:
<script type="text/javascript" src="${pageContext.request.contextPath }/js/common.js?v=1.0.1"></script>
当文件修改后,手工修改版本号来达到 URL 文件不被浏览器缓存的目的。同样也存在很多文件都需要修改的问题。
春にはこの問題に対する解決策を提供リソース名MD5ウェイ方式を。
まず、設定ファイルapplication.propertiesを変更する必要があります
spring.resources.chain.strategy.content.enabled = true
spring.resources.chain.strategy.content.paths = /**
すべて/ **静的リソース要求が処理されます。
そして、ResourceUrlProviderControllerファイルを作成します。
//处理静态资源URL
@ControllerAdvice
public class ResourceUrlProviderController {
@Autowired
private ResourceUrlProvider resourceUrlProvider;
@ModelAttribute("urls")
public ResourceUrlProvider urls() {
return this.resourceUrlProvider;
}
}
ページで使用されている文言:
<script type="text/javascript" src="${pageContext.request.contextPath }${urls.getForLookupPath('/js/common.js') }"></script>
そして、ページがアクセスされたときに、HTMLを実際に生成されたコードは次のとおりです。
<script type="text/javascript" src="/test/js/common-c6b7da8fffc9be141b48c073e39c7340.js"></script>
道をMD5ファイル名を使用する場合、春が再起動しないサービスの場合には、つまり、メカニズムをキャッシュしていることに注意してください、変更がこれらのリソースファイルを変更し、MD5のファイル名とその値は変化しません、だけでアクセスする前に、再びサービスを再起動しますそれが有効になります。
静的リソースの過程で春ブーツの5まとめ
- サードパーティのライブラリの場合、プロジェクト開発の周波数の変化による変更がバージョン番号を変更する場合でも、小さいです。だから私はWebJarsの方法を使用することをお勧めします、そしてダイナミックなバージョン番号(webjars-ロケータウェイ)で使用されます。
- 静的リソースファイルのために頻繁な変化に、私たち自身に保存されている(あなた自身のjs、cssファイルなどを書き込み)ので、私は使用するためにMD5リソース・ファイル名を使用することを推奨します。
- アンダー/静的なディレクトリ:プロジェクトのソースファイルの場合は、それをクラスパスに推奨されます。