SpringMVC 소스 코드 정서 도 야 - freeMarker 의 웹 설정
<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 가 지정 한 경로 에 대해 다음 과 같은 두 가지 해석 을 전개 합 니 다.
ServletContext.getRealPath()
방법 으로 실제 자원 을 얻 습 니 다.기본 FreeMarker 자원 프로세서 src/main/resources
경로 의 자원 이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.