SpringMVC 소스 코드 정서 도 야 - freeMarker 의 웹 설정

26784 단어
xml bean 방식 으로 다음 과 같이 보 여 줍 니 다.
    
    <bean id="viewResolver"
          class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
        <property name="cache" value="true" />
        <property name="prefix" value="screen/" />
        <property name="suffix" value=".html" />
        <property name="contentType" value="text/html;charset=UTF-8" />
        
        <property name="requestContextAttribute" value="request" />
        
        <property name="exposeSessionAttributes" value="true" />
        
        <property name="exposeRequestAttributes" value="true" />
        
        <property name="exposeSpringMacroHelpers" value="true" />
    bean>
    <bean id="freemarkerConfig"
          class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
        <property name="templateLoaderPath" value="/WEB-INF/views/" />
        <property name="freemarkerSettings">
            <props>
                <prop key="template_update_delay">0prop>
                <prop key="default_encoding">utf-8prop>
                <prop key="number_format">0.##########prop>
                <prop key="datetime_format">yyyy-MM-dd HH:mm:ssprop>
                <prop key="classic_compatible">trueprop>
                <prop key="template_exception_handler">ignoreprop>
                
                
            props>
        property>
    bean>

이상 의 간단 한 두 개의 bean 설정 은 springmvc 통합 FreeMarker 를 완 성 했 습 니 다. 상기 FreeMarkerViewResolver 는 앞에서 말 한 링크 를 직접 클릭 하면 됩 니 다.본 고 는 FreeMarkerConfigurer 유형 에 대해 간단 한 분석 을 한다.
FreeMarkerConfigurer \ # FreeMarker 의 웹 설정
이것 은 FreeMarker Config 인터페이스의 유일한 실현 클래스 입 니 다. SpringMVC 소스 코드 정서 도 야 - View 보기 렌 더 링 에서 FreeMarker View 가 초기 화 과정 에서 springmvc 컨 텍스트 가 존재 하지 않 으 면 FreeMarkerConfig bean 대상 이 존재 하지 않 으 면 이상 을 직접 던 져 FreeMarker 를 사용 해 야 한 다 는 것 을 나타 냅 니 다.
입구 함수 after PropertiesSet ()
FreeMarkerConfigurer 는 부모 클래스 FreeMarkerConfiguration Factory 를 계승 하고 InitialzingBean 인 터 페 이 스 를 실현 했다.
    @Override
    public void afterPropertiesSet() throws IOException, TemplateException {
        if (this.configuration == null) {
            //         ,         freemaker   Configuration 
            this.configuration = createConfiguration();
        }
    }

FreeMarkerConfiguration Factory \ # createConfiguration () - FreeMarker 웹 설정 만 들 기
부모 클래스 의 내부 속성 을 먼저 보 세 요. springmvc 설정 에서 도 흔히 볼 수 있 습 니 다.
    //              ,    
    private Resource configLocation;
    
    //    
    private Properties freemarkerSettings;

    //             ,  ,     classpath    
    private String[] templateLoaderPaths;

create 방법의 원본 코드 를 직접 봅 니 다.
    public Configuration createConfiguration() throws IOException, TemplateException {
        Configuration config = newConfiguration();
        Properties props = new Properties();

        //       configLocation  FreeMarker     
        if (this.configLocation != null) {
            if (logger.isInfoEnabled()) {
                logger.info("Loading FreeMarker configuration from " + this.configLocation);
            }
            PropertiesLoaderUtils.fillProperties(props, this.configLocation);
        }

        // Merge local properties if specified.
        if (this.freemarkerSettings != null) {
            props.putAll(this.freemarkerSettings);
        }

        //           ,  time_format。      Configuration#setSetting()  
        if (!props.isEmpty()) {
            config.setSettings(props);
        }

        if (!CollectionUtils.isEmpty(this.freemarkerVariables)) {
            config.setAllSharedVariables(new SimpleHash(this.freemarkerVariables, config.getObjectWrapper()));
        }

        if (this.defaultEncoding != null) {
            config.setDefaultEncoding(this.defaultEncoding);
        }

        List templateLoaders = new LinkedList(this.templateLoaders);

        // Register template loaders that are supposed to kick in early.
        if (this.preTemplateLoaders != null) {
            templateLoaders.addAll(this.preTemplateLoaders);
        }

        // Register default template loaders.
        if (this.templateLoaderPaths != null) {
            for (String path : this.templateLoaderPaths) {
                //  templateLoaderPath     ,        
                templateLoaders.add(getTemplateLoaderForPath(path));
            }
        }
        // templateLoaders      templateLoaders   
        postProcessTemplateLoaders(templateLoaders);

        // Register template loaders that are supposed to kick in late.
        if (this.postTemplateLoaders != null) {
            templateLoaders.addAll(this.postTemplateLoaders);
        }
        //    templateLoader       view    
        TemplateLoader loader = getAggregateTemplateLoader(templateLoaders);
        if (loader != null) {
            config.setTemplateLoader(loader);
        }
        //      
        postProcessConfiguration(config);
        return config;
    }

상기 코드 를 통 해 알 수 있 듯 이 구체 적 인 로드 보기 에 대응 하 는 실제 자원 은 templateLoader 를 통 해 불 러 옵 니 다. 다음은 구체 적 으로 분석 하 겠 습 니 다.
FreeMarkerConfigurationFactory \ # getTemplateLoaderForPath () - 템 플 릿 자원 로 더 만 들 기
원본 코드 를 올리다
    protected TemplateLoader getTemplateLoaderForPath(String templateLoaderPath) {
        //preferFileSystemAccess     true
        if (isPreferFileSystemAccess()) {
            // Try to load via the file system, fall back to SpringTemplateLoader
            // (for hot detection of template changes, if possible).
            try {
                //  DefaultResourceLoader getResource()   Resource
                Resource path = getResourceLoader().getResource(templateLoaderPath);
                // file   
                File file = path.getFile();  // will fail if not resolvable in the file system
                //   FileTemplateLoader   
                return new FileTemplateLoader(file);
            }
            catch (IOException ex) {
                //         SpringTemplateLoader
                return new SpringTemplateLoader(getResourceLoader(), templateLoaderPath);
            }
        }
        else {
            //     preferFileSystemAccess false     SpringTemplateLoader
            return new SpringTemplateLoader(getResourceLoader(), templateLoaderPath);
        }
    }

templateLoader 자원 가 져 오 는 방법 을 살 펴 보 겠 습 니 다.
DefaultResourceLoader#getResource()
    @Override
    public Resource getResource(String location) {
        //  location  templateLoaderPath
        Assert.notNull(location, "Location must not be null");
        //     "/"  ,        WEB-INF      
        if (location.startsWith("/")) {
            //        ServletContextResourceLoader   ,            
            return getResourceByPath(location);
        }
        else if (location.startsWith(CLASSPATH_URL_PREFIX)) {
            //  classpath:        
            return new ClassPathResource(location.substring(CLASSPATH_URL_PREFIX.length()), getClassLoader());
        }
        else {
            try {
                // Try to parse the location as a URL...
                URL url = new URL(location);
                return new UrlResource(url);
            }
            catch (MalformedURLException ex) {
                //     ServletContextResourceLoader     
                return getResourceByPath(location);
            }
        }
    }

FreeMarker 는 templateLoaderPath 가 지정 한 경로 에 대해 다음 과 같은 두 가지 해석 을 전개 합 니 다.
  • '/' 로 시작 하 는 경 로 는 보통 '/ WEB - INF' 이 고 ServletContextResource Loader 를 통 해 서버 의 자원 을 불 러 옵 니 다. 보통 ServletContext.getRealPath() 방법 으로 실제 자원 을 얻 습 니 다.기본 FreeMarker 자원 프로세서
  • 'classpath:' 로 시작 하 는 경로 입 니 다. 흔히 볼 수 있 는 resourceLoader 로 더 를 통 해 classpath 경로 의 자원 을 불 러 옵 니 다. 즉, src/main/resources 경로 의 자원
  • 을 불 러 올 수 있 습 니 다.

    좋은 웹페이지 즐겨찾기