p> 기본
구성은 애플리케이션 수준의 공개 구성 정보와 템플릿에서 사용할 수 있는 전역 공유 변수를 저장하는 개체입니다. 동시에 템플릿 인스턴스 생성 및 캐싱도 담당합니다. 구성은 실제로 생성자를 사용하여 생성된 freemarker.template.Configuration 개체의 인스턴스입니다. 일반적으로 애플리케이션은 공유된 단일 인스턴스 구성 개체를 사용합니다.
구성 개체는 템플릿 개체의 메서드로 사용할 수 있습니다. 각 템플릿 인스턴스는 템플릿 생성자를 통해 연결되는 구성 인스턴스와 연결되며 일반적으로 이 메서드를 사용하여 Configuration.getTemplate 템플릿 개체를 얻습니다.
공유 변수
공유 변수는 모든 템플릿에서 사용하도록 정의된 변수입니다. 구성 객체의 setSharedVariable 메소드를 통해 공유 변수를 추가할 수 있습니다.
구성 cfg = new Configuration(); ... cfg.setSharedVariable("wrap", new WrapDirective()) cfg.setSharedVariable("company", "Foo Inc."); .DEFAULT_WRAPPER
구성 개체와 연결된 모든 템플릿 인스턴스는 to_upper 변환기 및 회사를 획득하여 문자열을 얻을 수 있으므로 이러한 변수를 루트에 반복해서 추가할 필요가 없습니다. 동일한 이름의 변수를 루트에 추가하면 새로 추가된 변수가 이전 공유 변수를 덮어쓰게 됩니다.
경고!
구성 개체가 여러 스레드에 의해 호출되는 경우 TemplateModel 구현 클래스는 서블릿 기반 웹 사이트와 같이 스레드로부터 안전하지 않으므로 공유 변수로 사용하지 마십시오.
구성 객체에는 초기화 시 일부 공유 변환기 변수가 이미 포함되어 있습니다.
name class
name class Capture_output freemarker.template.utility.CaptureOutput 압축 freemarker.template.utility.StandardCompress html_escape freemarker.template.utility.HtmlEscape Normalize_newlines freemarker.template.utility.NormalizeNewlines xml_escape freemarker.template.utility.XmlEscape
구성 매개변수
구성 매개변수는 FreeMarker의 실행 동작에 영향을 줄 수 있는 이름입니다. 매개변수. 예를 들어 로케일, 숫자_형식.
구성 매개변수는 구성 인스턴스에 저장되며 템플릿 인스턴스(Template)로 수정할 수 있습니다. 예를 들어 구성에서 로캘을 "en_US"로 설정한 경우 단일 템플릿 인스턴스에서 setLocale 메서드를 사용하여 기본 구성을 수정하지 않는 한 모든 템플릿 개체는 "en_US"를 사용합니다. 따라서 구성에서 설정한 매개변수는 기본 매개변수로 간주할 수 있으며, 이는 템플릿 수준에서 설정한 매개변수로 재정의될 수 있으며, 이에 의해 설정된 매개변수 정보는 환경에 설정된 매개변수로 덮어쓰기될 수 있습니다. 템플릿 파일 지침에 따라 설정) 다음과 같습니다.
${1.2}<#setting locale="en_US">${1.2}
이 호출 방법을 세 개의 레이어로 상상해 볼 수 있습니다. (구성 개체 레이어, 템플릿 레이어, 실행 환경 레이어) 다음 표는 각 레이어에 대한 매개 변수 설정을 보여줍니다.
설정 A 설정 B 설정 C 설정 D 설정 E 설정 F 레이어 3: 환경 1 - - 1 - - 레이어 2: 템플릿 2 2 - - 2 - 레이어 1: 구성 3 3 3 3 - -
그러면 구성 매개변수의 최종 결과는 다음과 같습니다. A = 1, B = 2, C = 3, D = 1, E = 2. F 매개변수는 null일 가능성이 높습니다.
설정 가능한 매개변수 목록을 쿼리하려면 FreeMarker API 문서의 다음 두 부분을 참조하세요.
모든 레이어 구성
freemarker.core.Configurable.setSetting (String, String)
구성 계층 구성
freemarker.template.Configuration.setSetting(String,String)
템플릿 로드
템플릿 로더
템플릿 로더는 추상 경로("index.ftl" 또는 "products/catalog.ftl")를 기준으로 원본 데이터를 로드하는 개체이며, 어떤 종류의 리소스가 로드되는지( 디렉토리의 파일 데이터 또는 데이터베이스의 데이터)는 특정 로더 구현에 따라 다릅니다. cfg.getTemplate을 호출하면 FreeMarker는 이전에 구성 개체에 대해 구성한 템플릿 로더를 요청합니다. 템플릿 로더는 파일 로드를 담당합니다.
내장 템플릿 로더
다음 세 가지 방법을 사용하여 세 가지 템플릿 로드 방법을 설정할 수 있습니다.
void setDirectoryForTemplateLoading(File dir);
또는
void setClassForTemplateLoading(Class cl, String prefix);
또는
void setServletContextForTemplateLoading(Object servletContext, String path);
Display 위의 첫 번째 방법은 다음을 지정합니다. 파일 시스템의 디렉터리. FreeMarker는 이 디렉터리에 템플릿을 기록합니다. 말할 필요도 없이 이 디렉터리가 존재해야 합니다. 그렇지 않으면 예외가 발생합니다.
두 번째 메소드는 Class를 입력 매개변수로 사용합니다. ClassLoader를 사용하여 템플릿을 로드하려는 경우 이 메소드를 사용하여 동시에 템플릿 파일을 찾을 수 있습니다. 이 템플릿 로딩 방법은 특히 프로덕션 시스템에서 이전 방법보다 더 안정적입니다. 리소스 파일, 아이콘 등을 .jar 파일로 쉽게 패키징할 수 있습니다.
세 번째 방법은 웹 애플리케이션의 컨텍스트와 기본 경로(WEN-INF의 상위 경로 기준)를 매개변수로 사용합니다. 이 스타일의 템플릿 로더는 웹 애플리케이션 컨텍스트에서 템플릿을 로드합니다.
여러 위치에서 템플릿 로드
여러 위치에서 템플릿을 로드하려면 다양한 위치에 해당하는 단일 템플릿 로더를 만든 다음 이름으로 래핑할 수 있습니다. MultiTemplateLoader 호출 템플릿 로더를 생성하고 마지막으로 setTemplateLoader(TemplateLoader loader) 메소드를 통해 이를 Configuration 객체로 설정합니다. 다음은 서로 다른 두 위치에서 템플릿을 로드하는 예입니다.
import freemarker.cache.* // 템플릿 로더 라이브 이 패키지에서 ... FileTemplateLoader ftl1 = new FileTemplateLoader(new File("/tmp/templates")); FileTemplateLoader ftl2 = new FileTemplateLoader(new File("/usr/data/templates")); ClassTemplateLoader ctl = new ClassTemplateLoader( getClass(), ""); TemplateLoader[] loaders = new TemplateLoader[] { ftl1, ftl2, ctl }; MultiTemplateLoader(loaders); cfg.setTemplateLoader(mtl); /tmp/templates 경로에서 템플릿 파일을 검색합니다. 템플릿 파일이 없으면 /usr/data/templates 경로로 돌아가서 검색합니다. 템플릿 파일이 없으면 클래스 로더를 사용하여 로드를 시도합니다. .
다른 리소스에서 템플릿 파일 가져오기
이러한 내장 템플릿 로더가 요구 사항을 충족하지 않으면 직접 템플릿 로더를 사용자 정의할 수 있습니다. freemarker를 구현하기만 하면 됩니다. .cache만 사용하면 됩니다. TemplateLoader 인터페이스로 이동한 다음 setTemplateLoader(TemplateLoader 로더) 메소드를 통해 이를 Configuration 객체에 전달합니다.
템플릿 캐싱
FreeMarker 캐싱 템플릿은 getTemplate 메소드를 통해 템플릿을 얻을 때 FreeMarker가 Template 개체를 반환할 뿐만 아니라 다음에 템플릿을 사용할 때 개체를 캐시한다는 의미입니다. 동일한 경로로 요청되면 캐시에 템플릿 개체가 반환됩니다. 템플릿 파일을 변경하면 FreeMarker는 다음에 템플릿을 얻을 때 자동으로 템플릿을 다시 로드하고 다시 구문 분석합니다. 그럼에도 불구하고 파일이 수정되었는지 직접 확인하는 것이 시간이 많이 걸리는 작업인 경우 FreeMarker는 구성 개체 수준에서 구성 매개 변수 "업데이트 지연"을 제공합니다. 이 매개변수는 FreeMarker가 템플릿 버전을 확인하는 데 걸리는 시간을 의미합니다. 기본 설정은 5초이며, 이는 템플릿이 5초마다 수정되었는지 확인한다는 의미입니다. 이 매개변수를 0 으로 설정합니다. 주목해야 할 또 다른 점은 모든 로더가 이 판단 방법을 지원하는 것은 아니라는 것입니다. 예를 들어 클래스 로더를 기반으로 하는 템플릿 로더는 템플릿 파일이 수정되었음을 발견하지 못합니다.
이것은 FreeMarker가 캐시에서 템플릿을 삭제하는 방법입니다. Configuration 객체 메소드clearTemplateCache를 사용하여 캐시에서 템플릿 객체를 수동으로 지울 수 있습니다. 실제로 캐시 부분은 FreeMarker에 구성 요소로 추가될 수 있습니다(즉, 타사 캐싱 솔루션을 사용할 수 있음). 대부분의 개발자에게는 FreeMarker와 함께 제공되는 freemarker.cache.MruCacheStorage 구현으로 충분합니다. 이 캐시는 2단계 가장 최근에 사용된 정책을 사용합니다. 첫 번째 레벨에서는 최대 시간에 도달할 때까지 모든 캐시 항목이 강력하게 참조되며(소프트하게 참조되는 항목이 아니라 JVM에 알려지지 않음) 최근에 가장 적게 사용된 항목이 두 번째 레벨 캐시로 마이그레이션됩니다. 이 수준의 항목은 만료될 때까지 약한 참조를 사용합니다. 참조 및 강력한 참조 영역의 크기를 생성자에서 설정할 수 있는 경우, 예를 들어 강한 참조 영역을 20으로, 약한 참조 영역을 250으로 설정하려는 경우 다음 코드를 사용할 수 있습니다.
cfg .setCacheStorage(new freemarker.cache.MruCacheStorage(20, 250))
MruCacheStorage가 기본 캐시 구현이므로 다음과 같이 설정할 수도 있습니다.
cfg.setSetting (Configuration.CACHE_STORAGE_KEY, "strong:20, Soft:250");
새 구성을 생성하면 기본적으로 MruCacheStorage 캐시 구현을 사용하며 기본값 maxStrongSize는 0, maxSoftSize는 다음과 같습니다. Integer.MAX_VALUE(즉, 이론적인 최대값)입니다. 그러나 부하가 높은 시스템의 경우 maxStrongSize를 0이 아닌 값으로 설정하는 것이 좋습니다. 그렇지 않으면 템플릿을 자주 다시 로드하고 다시 구문 분석하게 됩니다.
예외 처리
가능한 예외
FreeMarker에서 생성된 예외는 일반적으로 다음 범주에 속합니다.
FreeMarker의 초기화 단계에서 생성된 예외: 일반적으로 애플리케이션은 FreeMarker를 한 번만 초기화하면 되며, 이 기간 동안 클래스에서 생성된 예외를 초기화 예외라고 합니다.
템플릿 로드 및 구문 분석 중 예외: Configuration.getTemplate() 메서드를 통해 템플릿을 얻을 때(템플릿이 이전에 캐시되지 않은 경우) 두 가지 유형의 예외가 생성됩니다.
IOException: 템플릿을 찾을 수 없거나 파일을 읽을 수 있는 권한이 없는 등 템플릿을 읽을 때 다른 IO 예외가 발생하기 때문입니다. 템플릿 파일의 잘못된 구문으로 인해 freemarker.core.ParseException이 발생했습니다. ;
실행 중 예외: Template.process(...) 메서드를 호출하면 두 가지 유형의 예외가 발생합니다.
IOException 출력에 데이터를 쓸 때 발생하는 오류입니다. freemarker.template.TemplatException 런타임 중에 생성되는 기타 예외 예를 들어, 가장 일반적인 오류 중 하나는 템플릿이 존재하지 않는 변수를 참조한다는 것입니다.
FreeMarker 구성(구성) 관련 기사를 더 보려면 비용을 지불하세요. PHP 중국어 웹사이트에 주목하세요!