SpringMVC源码分析原理

1.SpringMVC下获取web资源的功能实现

WebMvcAutoConfiguration(mvc自动配置类)中的添加资源处理器代码如下:

public void addResourceHandlers(ResourceHandlerRegistry registry) {

//如果静态资源已经自定义,就失效了

if (!this.resourceProperties.isAddMappings()) {

logger.debug("Default resource handling disabled");

} else {

Duration cachePeriod = this.resourceProperties.getCache().getPeriod();

CacheControl cacheControl = this.resourceProperties.getCache().getCachecontrol().toHttpCacheControl();

//webjars比较热门的有jquery,npm,Bootstrap,以maven的方式去import

if (!registry.hasMappingForPattern("/webjars/**"))

this.customizeResourceHandlerRegistration(registry.addResourceHandler(new String[]{"/webjars/**"}).addResourceLocations(new String[]{"classpath:/META-INF/resources/webjars/"}).setCachePeriod(this.getSeconds(cachePeriod)).setCacheControl(cacheControl));

}

//方法二:获得资源路径

String staticPathPattern = this.mvcProperties.getStaticPathPattern();

if (!registry.hasMappingForPattern(staticPathPattern))

this.customizeResourceHandlerRegistration(registry.addResourceHandler(new String[]{staticPathPattern}).addResourceLocations(getResourceLocations(this.resourceProperties.getStaticLocations())).setCachePeriod(this.getSeconds(cachePeriod)).setCacheControl(cacheControl));

}

}

}

SpringMVC下定制首页

WebMvcAutoConfiguration(mvc自动配置类)中的获得首页代码如下:

@Bean

public WelcomePageHandlerMapping welcomePageHandlerMapping(ApplicationContext applicationContext) {

//

return new WelcomePageHandlerMapping(new TemplateAvailabilityProviders(applicationContext), applicationContext, this.getWelcomePage(), this.mvcProperties.getStaticPathPattern());

}

static String[] getResourceLocations(String[] staticLocations) {

String[] locations = new String[staticLocations.length + WebMvcAutoConfiguration.SERVLET_LOCATIONS.length];

System.arraycopy(staticLocations, 0, locations, 0, staticLocations.length);

System.arraycopy(WebMvcAutoConfiguration.SERVLET_LOCATIONS, 0, locations, staticLocations.length, WebMvcAutoConfiguration.SERVLET_LOCATIONS.length);

return locations;

}

private Optional<Resource> getWelcomePage() {

String[] locations = getResourceLocations(this.resourceProperties.getStaticLocations());

return Arrays.stream(locations).map(this::getIndexHtml).filter(this::isReadable).findFirst();

}

//index是默认的首页文件名

private Resource getIndexHtml(String location) {

return this.resourceLoader.getResource(location + "index.html");

}

注:springboot中,在template目录下的所有页面只能通过Controller来跳转!给个例子

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.GetMapping;

@Controller

public class CanController {

@GetMapping("/first")

public String say(){

return "begin";

begin.html中的内容:

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<title>初始测试</title>

<meta name = "viewpoint" content="width=device-width,

MT5 www.gendan5.com/mt5.htmlinitial-scale=1, maximum-scale=1, user-scalable=no" />

<link rel="stylesheet" "beta.2/css/bootstrap.min.css">

<link rel="stylesheet" href="webjars/bootstrap/css/bootstrap.css">

<body role="document">

<div class="container theme-showcase" role="main">

<!-- Main jumbotron for a primary marketing message or call to action -->

<div class="jumbotron">

<h1>这是一个小测试而已</h1>

<p>This is a template for Excavator. It includes  a jumbotron.Use it as a starting point to create something more unique..</p>

<p><a href="CanTranslate.html" class="btn btn-primary btn-lg" role="

我来评几句
登录后评论

已发表评论数()

相关站点

热门文章