1. 개요
프리 마커는 템플릿 엔진으로 템플릿을 기반으로 텍스트 출력을 생성하기위한 일반적인 도구입니다. 순수한 자바로 작성되었습니다. Freemarker는 HTML 웹 페이지, 특히 MVC 패턴을 기반으로 응용 프로그램을 생성하도록 설계되었습니다. Freemarker에는 일부 프로그래밍 기능이 있지만 일반적으로 Java 프로그램에서 표시 할 데이터를 준비하고 Freemarker가 페이지를 생성하고 템플릿을 통해 준비된 데이터를 표시합니다 (아래 그림과 같이).
프리 마커는 웹 애플리케이션 프레임 워크가 아니지만 웹 애플리케이션 프레임 워크의 구성 요소로 적합합니다. Freemarker는 HTTP 또는 서블릿에 대해 알지 못하기 때문에 컨테이너와 관련이 없습니다. 프리 마커는 비 WEB 애플리케이션 환경에도 적용 할 수 있으며 프리 마커는 Model2 프레임 워크 (예 : Struts)의 뷰 구성 요소로 더 적합하며 템플릿에서 JSP 태그 라이브러리를 사용할 수도 있습니다. 또한 프리 마커는 무료입니다.
2. 프리 마커 준비 조건
Freemarker.2.3.16.jar, 다운로드 주소는 여기에 게시되지 않습니다 ... (이 JAR 패키지는 실제로 struts2에 있습니다)
3. 정적 페이지를 생성하는 프리 마커의 원리
프리 마커는 정적 페이지를 생성합니다. 먼저 자신을 정의하는 템플릿 페이지를 사용해야합니다. 이 템플릿 페이지는 가장 일반적인 HTML 일 수 있거나 프리 마커에서 중첩 값 표현식, 레이블 또는 사용자 정의 태그 등이 될 수 있습니다. 그런 다음 템플릿 페이지를 백그라운드에서 읽고 태그를 구문 분석하여 해당 작업을 완료 한 다음 키 값 쌍의 매개 변수를 전달하여 템플릿의 값 표현식을 대체합니다. 그 후, 정적 액세스의 목적을 달성하기 위해 구성된 경로에 따라 새로운 HTML 페이지를 생성 할 수 있습니다.
4. 프리 마커가 제공하는 레이블
Freemarker는 유용하고 일반적으로 사용되는 많은 태그를 제공합니다. 프리 마커 태그는 <# tag name>이라고합니다. $ {value}는 다음과 같이 출력 변수 이름의 내용을 나타냅니다.
1. 목록 :이 태그는 주로 다음과 같은 반복적으로 서버 측에서 전달되는 목록 컬렉션입니다.
<#list namelist as names> $ {names} </#list>이름은 목록 루프 일 때 취한 루프 변수입니다. Freemarker가 목록 태그를 구문 분석하면 다음과 같습니다.
for (문자열 이름 : namelist) {system.out.println (이름); }2. IF :이 태그는 주로 IF 판단에 사용됩니다.
<#if (이름 == "Chen Jingchou")> 그의 무기는 다음과 같습니다. 15 ~~ </#if>
이것은 조건부 판단 레이블입니다. 조건부 방정식은 괄호로 둘러싸여 있어야합니다.
if (names.equals ( "Chen Jingchou")) {System.out.println ( "그의 무기는 : 15 ~~"); }
3. 포함 :이 태그는 파일을 가져 오는 데 사용됩니다.
<#include "includ.html"/>
이 가져 오기 태그는 특히 페이지 재사용에 매우 유용합니다.
또한 $ {}를 사용하여 정적 파일에서 값을 얻을 수 있습니다. 값 방법은 EL 표현과 동일하며 매우 편리합니다.
다음은 예입니다 (static.html) :
<! docType html public "-// w3c // dtd html 4.01 Transitional // en" "http://www.w3.org/tr/html4/loose.dtd"> <html> <head> <meta http-equiv = "content-type" <title> 여기에 제목 삽입 </title> </head> <body> 설명 : $ {description} <br/> 컬렉션 크기 : $ {namelist? size} <br/> 반복 목록 컬렉션 : <br/> <#list namelist> 이것은 $ {names_index+1} person, <label syle = "<<brail"> if <<brable} <<brail}입니다. (Names == "Chen Jingchou")> 그의 무기는 다음과 같습니다. 15 ~~ <#elseif (names == "yuwentuo")> <#-마지막에는 반환이 없지만 결국에는 다시 돌아 오지 않습니다-> 그의 무기는 다음과 같습니다. 무기 맵? 키로 키를 키 ---> $ {key} <br/> value -----> $ {무기 맵 [키]! 빈 값 대신. 실제로, 당신은 또한 기본값을 줄 수 있습니다 ----- $ {weaponmap [key]? default ( "null")} 출력 전에 null인지 확인할 수도 있습니다.실제 코드 :
패키지 com.chenghui.test; import java.io.file; import java.io.fileoutputStream; import java.io.ioexception; import java.io.outputStreamwriter; import java.io.writer; java.util.arraylist 가져 오기; java.util.hashmap import; Java.util.list 가져 오기; java.util.map import; Freemarker.template.configuration 가져 오기; import freemarker.template.defaultObjectWrapper; Freemarker.template.template 가져 오기; import freemarker.template.templateException; 공개 클래스 createhtml {public static void main (string [] args) {try {// 적절한 구성 객체 구성 구성 구성 = 새 구성 (); configuration.setDirectoryFortemPlatEloading (새 파일 ( "d : // project // webProject // webContent // web-inf // template")); configuration.setObjectWrapper (새 defaultObjectWrapper ()); configuration.setDefaultEncoding ( "UTF-8"); // 이것은 설정되어야합니다. 그렇지 않으면 생성 된 페이지에서 차량이 나옵니다. // 템플릿을 얻거나 만듭니다. 템플릿 템플릿 = configuration.getTemplate ( "static.html"); Map <String, Object> Parammap = New Hashmap <String, Object> (); PARAMMAP.PUT ( "설명", "정적 파일을 생성하기 위해 프리 마커를 사용하는 법을 배우고 있습니다!"); <string> namelist = new ArrayList <string> (); namelist.add ( "Chen Jingchou"); namelist.add ( "yuer"); namelist.add ( "Yuwentuo"); Parammap.put ( "Namelist", Namelist); Map <String, Object> weaponmap = new Hashmap <String, Object> (); 무기 맵 .put ( "첫 번째", "Xuanyuan Sword"); 무기 맵 .put ( "두 번째", "Kongtong Seal"); 무기 맵 .put ( "Third", "Nuwa Stone"); 무기 맵 .put ( "네 번째", "Shennong Ding"); 무기 맵 .put ( "Fifth", "Fuxi Qin"); 무기 맵 .put ( "Sixth", "Kunlun Mirror"); 무기 맵. Parammap.put ( "무기 맵", 무기 맵); Writer Writer = New OutputStreamWriter (New FileOutputStream ( "Success.html"), "UTF-8"); Template.process (Parammap, Writer); System.out.println ( "축하, 세대가 성공적이었다 ~~"); } catch (ioexception e) {e.printstacktrace (); } catch (TemplateException e) {e.printstacktrace (); }}}
이것은 기본적으로 단순하고 단순한 세대로 간주 될 수 있지만, 프리 마커가 제공 한 태그는 우리의 요구를 전혀 충족시킬 수 없기 때문에 실제로는 실제로 사용되지 않습니다. 현재 우리의 요구를 완료하려면 사용자 정의 태그가 필요합니다. .
5. 프리 마커 사용자 정의 태그
프리 마커 사용자 정의 태그는 직접 태그를 작성한 다음 스스로 구문 분석하는 것입니다. 그들은 태그의 입력과 출력을 자체적으로 완전히 제어하여 프로그래머에게 플레이 할 공간을 많이 제공합니다.
단계에 따라 :
과거에는 태그를 작성할 때 <이후에 #을 추가해야하지만 사용자 정의 태그를 인식하려면 @을 추가 한 다음 나중에 일부 매개 변수를 정의 할 수 있습니다. 프로그램이 template.process (Parammap, Out)를 실행하면 전체 페이지의 모든 프리 마커 태그를 구문 분석합니다.
태그를 사용자 정의하려면 클래스를 사용자 정의한 다음 TempleatedirectiveModel을 구현하고 실행 메소드를 다시 작성하고 매개 변수 획득을 완료하고 매개 변수에 따라 무언가를 수행해야합니다.
사용자 정의 태그를 구문 분석 클래스에 바인딩하려면 Parse 클래스의 인스턴스를 Parammap에 넣어야하며 저장된 키는 사용자 정의 태그와 동일합니다. .
참고 : 사용자 정의 태그에서 태그에 아무것도 없으면 시작 태그와 엔드 태그는 동일한 줄이되어서는 안됩니다. 그렇지 않으면 오류 가보고됩니다.
Freemarker.log.jdk14loggerfactory $ jdk14logger 오류
나는 속이고, 이것은 프리 마커의 버그입니다.
다음은 static.html의 예입니다.
<! docType html public "-// w3c // dtd html 4.01 Transitional // en" "http://www.w3.org/tr/html4/loose.dtd"> <html> <head> <meta http-equiv = "content-type" <title> 제목 삽입 </title> </head> <body> <#-사용자 정의 변수-> <#Assign num = 'hehe'/// $ {num} <br/> 사용자 정의 태그 <@content name = "chenghui"age = "120"> $ {output} $ {append} </body> </html> </html>
다음은 위의 static.html 템플릿의 구문 분석 클래스입니다.
패키지 com.chenghui.test; static freemarker.template.objectwrapper.default_wrapper 가져 오기; import java.io.ioexception; import java.io.writer; java.util.map import; Freemarker.core.environment 가져 오기; Freemarker.template.templeatedirectiveBody; import Freemarker.template.templeatedirectiveModel; import freemarker.template.templateException; import freemarker.template.templatemodel; import Freemarker.template.templatemodelException; import Freemarker.template.templateNumberModel; import Freemarker.template.templatesCalarmodel; / ** * 사용자 정의 태그 해상도 클래스 * @Author 관리자 * */ public class contentive emplesment templeatedirectiveModel {private static final String param_name = "name"; 개인 정적 최종 문자열 param_age = "Age"; @override public void execute (환경 ENV, MAP 매개 변수, templateModel [] loopvars, templatedirective body) templateException, ioException {if (body == null) {새 templatemodelException ( "null body"); } else {문자열 이름 = getString (param_name, params); 정수 연령 = getint (param_age, params); // 매개 변수를 수신 한 후 특정 작업에 따라 특정 작업을 수행 한 다음 페이지에 데이터를 표시 할 수 있습니다. if (name! = null) {env.setVariable ( "output", default_wrapper.wrap ( "내용 디렉티브 파싱 클래스에서 얻은 매개 변수는"+name+","); } if (age! = null) {env.setVariable ( "부록", default_wrapper.wrap ( "age :"+age)); } writer out = env.getout (); out.write ( "여기에서 문서 작성자 쓰기 작업과 마찬가지로 페이지의 특정 내용을 볼 수 있습니다. <br/>"); Body.render (아웃); /* 조심 스럽으면 페이지에 out.write () 출력 문을 표시 한 다음 출력 내용을 출력합니다. 본문이 구문 분석 할 때 먼저 매개 변수를 ENV에 넣고 페이지가 해당 양식에 직면 할 때만 값을 얻는다는 것을 알 수 있습니다. 그러나 양식이 존재하지 않으면 오류 가보고됩니다. 프리 마커가 여기서 잘 수행되지 않았다고 생각하며, 오류는 구문 분석 할 때 페이지에 노출 될 것입니다. 이런 식으로 $ {output! "null"}을 보충 할 수 있으며, 항상 EL 표현만큼 좋지 않다고 생각합니다. */}}/ ** * 유형의 매개 변수의 값을 얻습니다. * @param paramname * @param parammap * @return * @throws templateModelException */ public static string getstring (문자열 paramname, map <string, parammap) templatemodel, parammap); if (model == null) {return null; } if (templatescalarmodel의 모델 인스턴스) {return ((templatescalarmodel) 모델) .getAsstring (); } else if (templateNumberModel의 모델 인스턴스) {return ((templateNumberModel) 모델) .getAsnumber (). toString (); } else {새 templateModelException (paramname)을 던집니다. }} / ** * * int * @param paramname 유형의 매개 변수 가져 오기 * @param parammap * @return * @throws templatemodelexception * / public static integer getint (문자열 paramname, map <string, templetemodel> parammap) 템플릿에서 TempletemodelException {parammap.get); if (model == null) {return null; } if (templatescalarmodel의 모델 인스턴스) {String str = ((TemplatesCalarmodel) 모델) .getAsstring (); try {return integer.valueof (str); } catch (numberformatexception e) {새 templatemodelException (paramname); }} else if (templateNumberModel의 모델 인스턴스) {return ((templateNumberModel) 모델) .getAsNumber (). intValue (); } else {새 templateModelException (paramname)을 던집니다. }}}그런 다음 추가 :
// 사용자 정의 태그 구문 분석 Parammap.put ( "Content", new ContentDirective ());
이런 식으로 기본적으로 사용할 수 있습니다. 프리 마커는 간단한 비즈니스 로직을 작성하는 문제를 해결하기 위해 사용자 정의 태그를 완료합니다. 그러나 실제 프로젝트에서는 아직 봄과 통합되지 않았으므로 구문 분석 클래스의 구문 분석 인스턴스를 구문 분석 시간에 넣어야합니다. .