编程知识 cdmana.com

Spring boot static resource processing, wonderful!

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 !

版权声明
本文为[Java technology stack]所创,转载请带上原文链接,感谢

Scroll to Top