1. Обзор
Freemarker - это шаблонный двигатель, общий инструмент для генерации вывода текста на основе шаблонов. Это написано в чистой Java. Freemarker предназначен для создания HTML -веб -страниц, особенно приложений, основанных на шаблоне MVC. Хотя Freemarker обладает некоторыми возможностями программирования, он обычно готовит данные, которые будут отображаться программами Java, и генерирует страницы Freemarker и отображает подготовленные данные через шаблон (как показано ниже).
Freemarker не является платформой веб -приложений, но подходит в качестве компонента платформы веб -приложений. Freemarker не связан с контейнерами, потому что он не знает о HTTP или сервлетах; Freemarker также может применяться к не-WEB-средам приложений, Freemarker более подходит в качестве компонента представления модели2 фреймворков (таких как стойки), и вы также можете использовать библиотеку тегов JSP в шаблонах. Кроме того, Freemarker бесплатный.
2. Условия подготовки Freemarker
Freemarker.2.3.16.jar, адрес загрузки не будет опубликован здесь ... (этот пакет JAR на самом деле в Struts2)
3. Принцип фримаркера генерирует статические страницы
Freemarker генерирует статическую страницу. Во -первых, вам нужно использовать страницу шаблона, которую вы определяете. Эта страница шаблона может быть наиболее обычным HTML, или в Freemarker может быть вложенное выражение значения, метка или пользовательская тега и т. Д. Затем страница шаблона считывается в фоновом режиме, проанализируйте теги в нем, чтобы завершить соответствующую операцию, а затем пройти параметры в паре ключевых значений, чтобы заменить выражение значения в шаблоне. После этого новая HTML -страница может быть сгенерирована в соответствии с настроенным путем для достижения цели статического доступа.
4. Метки, предоставленные Freemarker
Freemarker предоставляет много полезных и обычно используемых тегов. Теги Freemarker названы <# Имя тега> Как это. $ {value} представляет содержимое имени переменной вывода, следующим образом:
1. Список: этот тег в основном является коллекцией списков, передаваемой со стороны сервера через итеративно, например:
<#List Namelist как имена> $ {имена} </#List>Имя - это переменная цикла, взятая при петле списка. Когда Freemarker анализирует тег списка, он эквивалентен:
for (String names: namelist) {System.out.println (names); }2. Если: этот тег в основном используется для суждения, например:
<#if (names == "Chen jingchou")> его оружие: пятнадцать ~~ </#if>
Это растущий лейбл. Следует отметить, что условное уравнение должно быть заключено в скобки, что эквивалентно:
if (names.equals ("Chen jingchou")) {System.out.println ("Его оружие: пятнадцать ~~"); }
3. Включите: этот тег используется для импорта файлов.
<#include "include.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-velity" http-equiv = "content-" http-eviv = "content" <title> Вставьте заголовок здесь </title> </head> <body> Описание: $ {description} <br/> Размер коллекции: $ {namelist? Size} <br/> Коллекция итеративных списков: <br/> <#list namelist как имена> $ inme {name_index+1}, называемый: <label = "color: red"> $ {names {name {name} </name {name} </name {names} </name {name} </name {name} </name} </names {name as {name as {name} </namex {name_index+1} (names == "Chen jingchou")> Его оружие: Пятнадцать ~~ <#elseif (names == "yuwentuo")> <#-Примечание, что здесь нет возвращения, но в конце-> Его оружие: xuanyuan Меч ~ ・ <#else> ее трюк: gu poison ~~ </#> <brbr/> </#stick> iteraticative #lice #lice #lip> word #lip> word #lice> word #lip> word: #liptaination #lice> word: #liptaination #lice> word: #liptaination #lice> wyperataination map/stictative map/stictative #lip #lic Оружие? Клавиши как клавиша> Ключ ---> $ {КЛЮЧ} <br/> value -----> $ {WireonMap [Key]! ("NULL")} <#-Fremarker не поддерживает NULL, может быть использован! вместо пустого значения. Фактически, вы также можете дать значение по умолчанию ----- $ {Wirfonmap [Key]? Default ("null")} Вы также можете определить, является ли он NULL до вывода <#if WiefOnmap [Key] ??> </#if>-> <br/> </#list> include import file: <br/> <#include "include.html"/> </halbore> </html> </html> </html> </html> </html> </html> </html> </html> </html> </html> </html> </html> </html> </html> </html>Фактический код:
пакет com.chenghui.test; Импорт java.io.file; Импорт java.io.fileOutputStream; импортировать java.io.ioexception; импортировать java.io.outputstreamwriter; Импорт java.io.writer; импортировать java.util.arraylist; импортировать java.util.hashmap; импортировать java.util.list; импортировать java.util.map; импортировать freemarker.template.configuration; импортировать freemarker.template.defaultobjectwrapper; импортировать freemarker.template.template; импортировать freemarker.template.templateexception; открытый класс createhtml {public static void main (string [] args) {try {// Создать подходящую конфигурацию объекта конфигурации = new configuration (); configuration.setDirectoryForteMplayLateLoading (new File ("d: // project // webproject // webcontent // web-inf // шаблон")); configuration.setObjectWrapper (новый defaultObjectWrapper ()); configuration.setDefaultEncoding ("UTF-8"); // Это должно быть установлено, иначе оно будет искажено на сгенерированной странице // Получить или создать шаблон. Шаблон шаблона = configuration.getTemplate ("static.html"); Map <string, object> parammap = new hashmap <string, object> (); parammap.put («Описание», «Я учусь использовать Freemarker для генерации статических файлов!»); List <string> namelist = new ArrayList <string> (); namelist.add ("Чен Джингчу"); namelist.add ("yuer"); namelist.add ("yuwentuo"); Parammap.put («Намеилист», Наукалист); Map <string, object> wironmap = new hashmap <string, object> (); Wireonmap.put («First», «Сюанюанский меч»); Wireonmap.put («Второе», «КОНГТОНГ ПЕЛО»); Wireonmap.put («Третий», «Нува Стоун»); Wireonmap.put («Четвертый», «Шеннонг Дин»); Wireonmap.put («Пятый», «Фуси Цин»); Wireonmap.put («Шестой», «Кунлун зеркало»); Wireonmap.put («Седьмое», NULL); parammap.put ("Wemonmap", Wireonmap); Writer writer = new outputstreamwriter (new FileOutputStream ("success.html"), "UTF-8"); Template.process (Парамма, писатель); System.out.println («Поздравляю, поколение было успешным ~~»); } catch (ioException e) {e.printstackTrace (); } catch (templateException e) {e.printstacktrace (); }}}
Это в основном можно рассматривать как простое и простое поколение, но оно все еще далека от использования на практике, потому что теги, данные Freemarker, не могут удовлетворить наши потребности вообще. В настоящее время для удовлетворения наших потребностей необходимы пользовательские теги. Полем
5. Freemarker пользовательские теги
Пользовательские теги Freemarker должны написать теги самостоятельно, а затем анализировать их самостоятельно. Они сами по себе полностью контролируют ввод и вывод тегов, что значительно предоставляет программистам много места для игры.
На основании шагов:
В прошлом, при написании тегов, вам нужно добавить # после <, но чтобы распознать пользовательские теги, вам нужно добавить @ после этого, а затем вы можете определить некоторые параметры позже. Когда программа выполняет шаблон.
Настройка тега требует настройки класса, а затем реализации Templatediectivemodel, переписывание метода выполнения, завершение получения параметров, сделать что -то в соответствии с параметрами и т. Д.
Чтобы привязать пользовательские теги с классом анализа, вам необходимо поместить экземпляр класса Parse в парамбу, а сохраненная клавиша такая же, как пользовательский тег. Полем
ПРИМЕЧАНИЕ. В пользовательском теге, если в теге ничего нет, Tag Tag и End Tag не должны быть той же строкой, в противном случае будет сообщена ошибка.
freemarker.log.jdk14loggerfactory $ jdk14logger ошибка
Я был одурачен, и это ошибка в Freemarker.
Вот пример 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-velity" http-equiv = "content-" http-eviv = "content" <title> Вставьте заголовок здесь </title> </head> <body> <#-пользовательские переменные-> <#assign num = 'hehehe' /// $ {num} <br/> пользовательские теги <@content name = "chenghui" Age = "120"> $ {output} $ {Приложение} </@Content> </body> </html> {hall> </body> </html> </html> </html> </html>
Вот класс диаграммы шаблона static.html выше:
пакет com.chenghui.test; Импорт static freemarker.template.objectwrapper.default_wrapper; импортировать java.io.ioexception; Импорт java.io.writer; импортировать java.util.map; Импорт freemarker.core.environment; Импорт freemarker.template.templatedirectivebody; импортировать freemarker.template.templediectivemodel; импортировать freemarker.template.templateexception; импортировать freemarker.template.templatemodel; импортировать freemarker.template.templatemodelexception; импортировать freemarker.template.templateNumberModel; импортировать freemarker.template.templatescalarmodel; / ** * Custom Tag Class * @author Administrator * */ Public Class ContentDirective реализует TemplatedIereVemodel {Private Static Final String Param_Name = "name"; частная статическая конечная строка param_age = "age"; @Override public void execute (Environment env, Params Map, Templatemodel [] Loopvars, Templatedirective Body) Throws TemplateException, ioException {if (body == null) {Выбросить новое TemplateModeLexception («Null Body»); } else {string name = getString (param_name, params); Integer age = getInt (param_age, params); // После получения параметров вы можете выполнить определенные операции в соответствии с конкретной операцией, а затем отобразить данные на странице. if (name! = null) {env.setVariable ("output", default_wrapper.wrap («Параметры, полученные из класса анализации контента, являются:"+name+",")); } if (age! = null) {env.setVariable ("append", default_wrapper.wrap ("age:"+age)); } Writer out = env.getOut (); out.write («Отсюда вы можете увидеть конкретный контент на странице, как и операция записи документа. <br/>»); Body.Render (Out); /* Если вы осторожны, вы обнаружите, что на странице показано вывод Out.write () вывода, а затем вывод содержимого вывода. Можно видеть, что когда тело анализирует, он сначала поместит параметры в ENV, и только когда страница встречает соответствующую форму, она получит значение. Однако, если форма не существует, будет сообщена ошибка. Я думаю, что Freemarker здесь не очень хорошо, и при анализе ошибки будет подвергнута ошибке на странице. Вы можете восполнить $ {output! "Null"} таким образом, и вы всегда чувствуете, что это не так хорошо, как выражение EL. */}}/ ** * Получить значение параметра типа строки * @param paramname * @param parammap * @return * @Throws TemplateModelException */ public Static String getString (String paramname, map <string, templatemodel> parammap) Thraysemodelexception {templatemodel = parammap.get); if (model == null) {return null; } if (model exantef 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 (String paramname, map <string, templatemodel> parammap) Templatemodelexception {templatemodel = parammap.get (parammaMeme); 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); }}}Затем добавьте:
// Custom Tag Parmamap.put ("Content", New ContentDirective ());Таким образом, это можно в основном использовать. Freemarker завершает пользовательские теги, чтобы решить проблему написания простой бизнес -логики. Тем не менее, это невозможно сделать в реальных проектах, потому что это еще не было интегрировано с пружиной, и вам необходимо поместить экземпляр анализа класса синтаксического анализа во время анализа. Полем