SpringBoot入门-2

Posted 钢铁-程序猿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot入门-2相关的知识,希望对你有一定的参考价值。

SpringBoot入门-2

一、SpringBoot Web开发

SpringBoot到底帮我们配置了什么?我们能不能进行修改?能修改那些东西?能不能扩展?

  • xxxAutoConfiguration:向容器中自动配置组件
  • xxxProperties:自动配置类,装配配置文件中自定义的一些内容

需要解决的问题:

  • 导入静态资源
  • 首页(http://localhost:端口号/
  • jsp,模版引擎Thymeleaf
  • 装配扩展SpringMVC
  • 增删改查
  • 拦截器
  • 国际化

1、静态资源

打开WebMvcAutoConfiguration,可以看到有一个静态类,WebMvcAutoConfigurationAdapter

protected void addResourceHandlers(ResourceHandlerRegistry registry) 
	//如果静态资源的东西被自定义了
	//怎么自定义,找到WebMvcAutoConfigurationAdapter的注解中的WebMvcProperties,对其中关于静态资源的配置,自己在配置文件中配置一下即可。
    super.addResourceHandlers(registry);
    if (!this.resourceProperties.isAddMappings()) 
        logger.debug("Default resource handling disabled");
     else 
        ServletContext servletContext = this.getServletContext();
        //
        this.addResourceHandler(registry, "/webjars/**", "classpath:/META-INF/resources/webjars/");
        //getStaticPathPattern函数返回this.staticPathPattern,初始化:this.staticPathPattern = "/**";
        //表示当前目录下的所有东西都识别
        this.addResourceHandler(registry, this.mvcProperties.getStaticPathPattern(), (registration) -> 
            registration.addResourceLocations(this.resourceProperties.getStaticLocations());
            if (servletContext != null) 
                registration.addResourceLocations(new Resource[]new ServletContextResource(servletContext, "/"));
            

        );
    

什么是wenjars,webjars可以通过maven的方式导入资源,在url中输入/webjars/**相当于在classpath:/META-INF/resources/webjars/下面找。

比如通过http://localhost:8080/webjars/3.4.1/jquery.js就可以访问到这个js文件。

webjars官网

  • addResourceHandlers函数调用的getStaticPathPattern函数会返回this.staticPathPattern,初始化:this.staticPathPattern = “/**”;
    //表示当前目录下的所有东西都识别
  • registry.addResourceHandler(new String[]staticPathPattern).addResourceLocations(this.resourceProperties.getStaticLocations());
    //this.resourceProperties.getStaticLocations()对应下面四个的位置
private static final String[] CLASSPATH_RESOURCE_LOCATIONS = new String[]"classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/";

总结

1、在SpringBoot中,我们可以使用以下方式处理静态资源

  • webjars 通过localhost:8080/webjars/访问
  • public,static,/**,resources 通过localhost:8080/访问

2、优先级:resources>static>public
3、如果自定义目录,默认目录会失效。

二、首页

首页如何定制。还是在WebMvcAutoConfiguration里。

@Bean
public WelcomePageHandlerMapping welcomePageHandlerMapping(ApplicationContext applicationContext, FormattingConversionService mvcConversionService, ResourceUrlProvider mvcResourceUrlProvider) 
	//getWelcomePage会获取CLASSPATH_RESOURCE_LOCATIONS路径
	//this.mvcProperties.getStaticPathPattern()会返回/**
    WelcomePageHandlerMapping welcomePageHandlerMapping = new WelcomePageHandlerMapping(new TemplateAvailabilityProviders(applicationContext), applicationContext, this.getWelcomePage(), this.mvcProperties.getStaticPathPattern());
    welcomePageHandlerMapping.setInterceptors(this.getInterceptors(mvcConversionService, mvcResourceUrlProvider));
    welcomePageHandlerMapping.setCorsConfigurations(this.getCorsConfigurations());
    return welcomePageHandlerMapping;

从源码可以看出,在Resources目录下的public、resources、static中创建index.html,则可以通过http://localhost:端口号进行访问到。

模版引擎

前端交给我们的页面,是html页面,如果是我们以前开发,我们需要把他们转成jsp页面,jsp的好处就是当我们查出一些数据转发到jsp页面以后,我们可以用jsp轻松实现数据的现实及交互等。jsp支持非常强大的功能,包括能以jar的方式,不是war,像第二,我们用的还是嵌入式的Tomcat。所以呢,他现在默认是不支持jsp的。

那不支持jsp,如果我们直接用纯静态页面的方式,那给我们开发辉带来非常大的麻烦,那怎么办呢?SpringBoot推荐你可以来使用模版引擎。

那么这模版引擎,我们其实大家听到很多,其实jsp就是一个模版引擎,还有用的比较多的freemarker,包括Springboot给我们推荐的Thymeleaf。模版引擎有非常多,但再多的模版引擎,他们的思想都是一样的。

Thymeleaf

第一步:引入thymeleaf,怎么引入呢?对于SpringBoot来说,什么事情不都是一个start的事情嘛,我们去在项目中引入一下,给大家三个网址:

thymeleaf依赖:

<dependency>
	<groupId>org.thymeleaf</groupId>
	<artifactId>thymeleaf-spring5</artifactId>
</dependency>
<dependency>
	<groupId>org.thymeleaf.extras</groupId>
	<artifactId>thymeleaf-extras-java8time</artifactId>
</dependency>

Thymeleaf的自动配置类:ThymeleafProperties
前缀:“classpath:/templates”
后缀:".html"

public static final String DEFAULT_PREFIX = "classpath:/templates/";
public static final String DEFAULT_SUFFIX = ".html";

如果需要访问Resources/templates下的test.html,可以通过以下定义的Controller进行访问,http://localhost:8080/test

@Controller
public class IndexController 
    @RequestMapping("/test")
    public String test()
    
        return "test";
    

结论:只要需要使用thymeleaf,只需要导入对应的依赖就可以了。我们将html放在我们的templates目录下即可。

P16

以上是关于SpringBoot入门-2的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 2从入门到入坟 | 自动配置篇:源码分析之自动包规则原理

SpringBoot快速入门

SpringBoot起飞之路-入门原理分析

SpringBoot起飞之路-入门原理分析

SpringBoot入门 MQ使用

Spring Boot 2从入门到入坟 | 自动配置篇:源码分析之自动包规则原理