author :liuxiaopeng
https://www.cnblogs.com/paddix/p/8301331.html
do web When developing , We tend to have a lot of static resources , Such as html、 picture 、css etc. . So how to return static resources to the front end ?
I've done it before web Development students should know , What we created before web There will be a webapp The catalog of , We only need to put static resources in this directory to directly access .
however , be based on Spring boot The project does not have this catalog , What should we do ?
One 、 The stupidest way
Let's first share the stupidest way , That is, static resources are directly returned to the front end through the flow , We are maven engineering resources To create a html The catalog of , And then we put html The files are placed in this directory , And specify any access path to /static/ The first one is to access the static resources under the directory , It is realized as follows :
@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();
}
}
}
In fact, the implementation process is very simple , Is to separate resources from the path first uri, And then from static Read files in directory , And output to the front end .
Because it's just a simple demonstration , So we only deal with text files , Image files can be processed in a similar way . Of course , We're not going to do that in practice ,Spring Boot There must be a better solution .
But this method is a little stupid , But it's the most essential thing , No matter how convenient the framework helps us deal with such problems , But get rid of the framework , We still need to be able to write a web project , Only know how it works , You'll be able to handle problems when they come up .
Now let's see Spring boot Support for static resources .
Two 、Spring boot Default static resource access
Spring boot Default pair /** Can directly access files in four directories :
-
classpath:/public/
-
classpath:/resources/
-
classpath:/static/
-
classpath:/META-INFO/resouces/
We are now in the resource file resources Create the following four directories under the directory :
Note the resource folder under the blue bar resources And the folder under the classpath classpath:/resources Is different , Under the blue bar resources Represents that the files in this directory are resource files , When packing, all files in this directory will be packed in the classpath , This name can be changed , stay pom.xml Just specify the resource directory :
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
And under the classpath resources yes spring boot One of the default static resource folders , and public、static as well as MEAT-INFO/resources The same function . Now let's restart Spring boot You can go through :
four URL Access to four directories of static resources .
3、 ... and 、 Custom static resource directory
We already know through the second section Spring boot The directory of static resources that can be accessed by default , But you will surely think , Is this directory fixed ? Can we define static resource directory by ourselves ?
The answer is yes , Let's now come from defining a static resource directory , Let's define a images To store pictures , all /image/** All the paths will visit images Directory of resources :
@Configuration
public class ImageMvcConfig extends WebMvcConfigurerAdapter {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/image/**")
.addResourceLocations("classpath:/images/");
}
}
This code should be simpler ,@Configuration Identify a configuration class , This has been mentioned many times in the previous article . Recommended reading :Spring Zero configuration @Configuration Annotations, .
WebMvcConfigurerAdapter yes Spring A configuration provided mvc Adapter for , There are many ways to configure it ,addResourceHandlers It's a way to deal with static resources , Other methods will be discussed later .
Now we are verifying whether the above configuration is valid . I am here images There is a table of contents spring.jpg Pictures of the , Now let's go through http://localhost:8080/image/spring.jpg To access the pictures :
In fact, in addition to the above method, there is a simpler way , It's directly in application.yml Medium configuration is ok :
spring:
mvc:
static-path-pattern: /image/**
resources:
static-locations: classpath:/images/
static-path-pattern: Access pattern , The default is /**, Multiple can be separated by commas
static-locations: Resource directory , Multiple directories separated by commas , The default resource directory is classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/
Be careful , This configuration will override Spring boot Default static resource directory , For example, if you configure it in the example , Can't access static、public、resources Wait for the resources in the directory .
Four 、 summary
This article mainly shared Spring boot How to deal with static resources ,Spring boot By default, you can access
classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/
Static resources in four directories , We can also customize it according to our own needs .
Last , It should be noted that , If there are resources of the same name in these four directories , Which directory resources will be returned first ?
You all pass static-locations The default value order of should be able to guess , By default ,Spring boot Will return first /META-INF/resources Resources under .
Of course , Because we can customize static-locations Value , So this priority can also be adjusted .
Recent hot article recommends :
1.Java 15 Official release , 14 A new feature , Refresh your mind !!
2. Finally, I got it through open source projects IntelliJ IDEA Activation code , It's delicious !
3. I use Java 8 Wrote a piece of logic , I can't understand it , You try ..
4. To hang up Tomcat ,Undertow It's very powerful !!
5.《Java Development Manual ( Song Mountain version )》 The latest release , Download it quickly !
I think it's good , Don't forget to like it + Forward !