1. 程式人生 > >mvc靜態資源訪問之快取cache-period

mvc靜態資源訪問之快取cache-period

cache-period 對靜態資源的快取,這樣的話,下次請求就不會再請求伺服器,而是利用了瀏覽器的快取、從而降低了伺服器的壓力。
2
底層是怎楊處理的?

  <!-- 對靜態資源的訪問-->
    <mvc:resources mapping="/images/**" location="/images/" cache-period="31556926"/>
    <mvc:resources mapping="/css/**" location="/css/" cache-period="31556926"/>
    <mvc:resources mapping
="/js/**" location="/js/" cache-period="31556926"/>

<mvc: 類的均在MvcNamespaceHandler 中定義

public class MvcNamespaceHandler extends NamespaceHandlerSupport {
    public MvcNamespaceHandler() {
    }

    public void init() {
        this.registerBeanDefinitionParser("annotation-driven", new AnnotationDrivenBeanDefinitionParser
()); this.registerBeanDefinitionParser("default-servlet-handler", new DefaultServletHandlerBeanDefinitionParser()); this.registerBeanDefinitionParser("interceptors", new InterceptorsBeanDefinitionParser()); // 瞅瞅這裡 this.registerBeanDefinitionParser("resources", new ResourcesBeanDefinitionParser
()); this.registerBeanDefinitionParser("view-controller", new ViewControllerBeanDefinitionParser()); this.registerBeanDefinitionParser("redirect-view-controller", new ViewControllerBeanDefinitionParser()); this.registerBeanDefinitionParser("status-controller", new ViewControllerBeanDefinitionParser()); this.registerBeanDefinitionParser("view-resolvers", new ViewResolversBeanDefinitionParser()); this.registerBeanDefinitionParser("tiles-configurer", new TilesConfigurerBeanDefinitionParser()); this.registerBeanDefinitionParser("freemarker-configurer", new FreeMarkerConfigurerBeanDefinitionParser()); this.registerBeanDefinitionParser("velocity-configurer", new VelocityConfigurerBeanDefinitionParser()); this.registerBeanDefinitionParser("groovy-configurer", new GroovyMarkupConfigurerBeanDefinitionParser()); this.registerBeanDefinitionParser("script-template-configurer", new ScriptTemplateConfigurerBeanDefinitionParser()); this.registerBeanDefinitionParser("cors", new CorsBeanDefinitionParser()); } }

我們檢視 new ResourcesBeanDefinitionParser()建立物件

private String registerResourceHandler(ParserContext parserContext, Element element, Object source) {
        String locationAttr = element.getAttribute("location");
        if (!StringUtils.hasText(locationAttr)) {
            parserContext.getReaderContext().error("The 'location' attribute is required.", parserContext.extractSource(element));
            return null;
        } else {
            ManagedList<String> locations = new ManagedList();
            locations.addAll(Arrays.asList(StringUtils.commaDelimitedListToStringArray(locationAttr)));
            RootBeanDefinition resourceHandlerDef = new RootBeanDefinition(ResourceHttpRequestHandler.class);
            resourceHandlerDef.setSource(source);
            resourceHandlerDef.setRole(2);
            resourceHandlerDef.getPropertyValues().add("locations", locations);
            // 這裡對cache-period 解析
            String cacheSeconds = element.getAttribute("cache-period");
            if (StringUtils.hasText(cacheSeconds)) {
                resourceHandlerDef.getPropertyValues().add("cacheSeconds", cacheSeconds);
            }

            Element cacheControlElement = DomUtils.getChildElementByTagName(element, "cache-control");
            if (cacheControlElement != null) {
                CacheControl cacheControl = this.parseCacheControl(cacheControlElement);
                resourceHandlerDef.getPropertyValues().add("cacheControl", cacheControl);
            }

            Element resourceChainElement = DomUtils.getChildElementByTagName(element, "resource-chain");
            if (resourceChainElement != null) {
                this.parseResourceChain(resourceHandlerDef, parserContext, resourceChainElement, source);
            }

            String beanName = parserContext.getReaderContext().generateBeanName(resourceHandlerDef);
            parserContext.getRegistry().registerBeanDefinition(beanName, resourceHandlerDef);
            parserContext.registerComponent(new BeanComponentDefinition(resourceHandlerDef, beanName));
            return beanName;
        }
    }

ResourceHttpRequestHandler 類註釋如下

{@link HttpRequestHandler} that serves static resources optimized for superior browser performance
 * (according to the guidelines of Page Speed, YSlow, etc.) by allowing for flexible cache settings
 * ({@linkplain #setCacheSeconds "cacheSeconds" property}, last-modified support).

大概意思就是對靜態化資源快取做了一個靈活的屬性配置、