1. Visão geral
O Freemarker é um mecanismo de modelo, uma ferramenta geral para gerar saída de texto com base em modelos. Está escrito em puro java. O Freemarker foi projetado para gerar páginas da Web HTML, especialmente aplicativos com base no padrão MVC. Embora o Freemarker tenha alguns recursos de programação, ele geralmente prepara os dados a serem exibidos pelos programas Java e gera as páginas do Freemarker e exibe os dados preparados através do modelo (como mostrado abaixo).
O Freemarker não é uma estrutura de aplicativos da Web, mas é adequado como um componente da estrutura de aplicativos da Web. O Freemarker não está relacionado a contêineres porque não conhece HTTP ou servlets; O Freemarker também pode ser aplicado a ambientes de aplicativos que não são da Web, o Freemarker é mais adequado como um componente de exibição do Model2 Frameworks (como Struts) e você também pode usar a biblioteca de tags JSP em modelos. Além disso, o Freemarker é gratuito.
2. Condições de preparação do Freemarker
Freemarker.2.3.16.Jar, o endereço de download não será publicado aqui ... (este pacote JAR está na verdade no Struts2)
3. O princípio do Freemarker gerando páginas estáticas
O Freemarker gera uma página estática. Primeiro, você precisa usar a página do modelo que você se define. Esta página de modelo pode ser a HTML mais comum, ou pode ser uma expressão de valor aninhada, etiqueta ou tag personalizada, etc. no Freemarker. Em seguida, a página do modelo é lida em segundo plano, analise as tags para concluir a operação correspondente e, em seguida, passe os parâmetros no par de valores-chave para substituir a expressão do valor no modelo. Depois disso, uma nova página HTML pode ser gerada de acordo com o caminho configurado para obter o objetivo do acesso estático.
4. Rótulos fornecidos pela Freemarker
O Freemarker fornece muitas tags úteis e comumente usadas. As tags Freemarker são nomeadas <# Nome da tag> como este. $ {value} representa o conteúdo do nome da variável de saída, como segue:
1. Lista: Esta tag é principalmente uma coleção de listas passada do lado do servidor por iterativamente, como:
<#list namelist como nomes> $ {nomes} </#list>O nome é uma variável de loop tomada quando o loop da lista. Quando o Freemarker analisa a tag da lista, é equivalente a:
para (nomes de string: namelist) {System.out.println (nomes); }2. Se: esta tag é usada principalmente para julgamento, como:
<#if (nomes == "chen jingchou")> Suas armas são: quinze ~~ </#se>
Este é um rótulo de julgamento condicional. Deve -se notar que a equação condicional deve ser fechada entre colchetes, o que é equivalente a:
if (names.equals ("chen jingchou")) {system.out.println ("suas armas são: quinze ~~"); }
3. Inclua: esta tag é usada para importar arquivos.
<#include "incluir.html"/>
Esta tag de importação é muito útil, especialmente para a reutilização da página.
Além disso, você pode usar $ {} para obter o valor em um arquivo estático. O método de valor é o mesmo que a expressão de EL, que é muito conveniente.
Aqui está um exemplo (static.html):
<! Doctype html public "-// w3c // dtd html 4.01 transitória // pt" "http://www.w3.org/tr/html4/loose.dtd"> <html> <head> <meta http-equiv = contentnppe " <título> Insira o título aqui </title> </head> <body> Descrição: $ {description} <br/> Tamanho da coleção: $ {namelist? size} <br/> Coleção de listas iterativas: <br/> <#list namelist como nomes> este é o $ {name_index+1} pessoa chamada: <estilo <estilo = "" (nomes == "chen jingchou")> Suas armas são: quinze ~~ <#elseif (nomes == "yuwentuo")> <#-observe que não há retorno aqui, mas no final-> suas armas: xuanyuan sword ~ ・ <#else> sua listagem é: guia ~ ~~ </#se> ArmaNMAP? Chaves como key> key ---> $ {key} <br/> valor -----> $ {weaponMap [key]! ("null")} <#-Fremarker não suporta nulo, pode ser usado! em vez de valor vazio. De fato, você também pode fornecer um valor padrão ----- $ {weaponmap [key]? Padrão ("null")} Você também pode determinar se é nulo antes da saída <#if weaponmap [key]?Código real:
pacote com.chenghui.test; importar java.io.file; importar java.io.fileOutputStream; importar java.io.ioException; importar java.io.OutputStreamWriter; importar java.io.writer; importar java.util.arraylist; importar java.util.hashmap; importar java.util.list; importar java.util.map; importar freemarker.template.configuration; importar freemarker.template.defaultObjectWrapper; importar freemarker.template.template; importar freemarker.template.templateException; public class Createhtml {public static void main (string [] args) {try {// crie um ajuste de configuração de configuração adequado Configuração da configuração = new Configuration (); Configuration.SetDirectoryfortemplatELoading (novo arquivo ("d: // Project // webProject // webcontent // web-inf // template"); Configuration.setObjectWrapper (new DefaultObjectWrapper ()); Configuration.SetDefaultEncoding ("UTF-8"); // Isso deve ser definido, caso contrário, ele será distorcido na página gerada // obtenha ou crie um modelo. Modelo de modelo = configuration.getTemplate ("static.html"); Mapa <string, objeto> parammap = new hashmap <string, object> (); parammap.put ("Descrição", "Estou aprendendo a usar o Freemarker para gerar arquivos estáticos!"); List <String> namelist = new ArrayList <String> (); namelist.add ("Chen Jingchou"); namelist.add ("yuer"); namelist.add ("yuwentuo"); parammap.put ("namelist", namelist); Mapa <string, object> weaponmap = new hashmap <string, object> (); armanMap.put ("First", "Xuanyuan Sword"); armanmap.put ("Segundo", "selo de Kongtong"); armanMap.put ("Terceiro", "Nuwa Stone"); armanMap.put ("Quarto", "Shennong Ding"); armanMap.put ("quinto", "Fuxi Qin"); armanMap.put ("Sixth", "Kunlun Mirror"); armanmap.put ("Sétimo", nulo); parammap.put ("weaponmap", weaponmap); Writer Writer = New OtpitStreamWriter (new FileOutputStream ("SUCCEST.HTML"), "UTF-8"); template.process (parammap, escritor); System.out.println ("Parabéns, a geração foi bem -sucedida ~~"); } catch (ioexception e) {e.printStackTrace (); } catch (modelplateException e) {e.printStackTrace (); }}}
Isso pode basicamente ser considerado uma geração simples e simples, mas ainda está longe de ser usada na prática, porque as tags fornecidas pelo Freemarker não podem atender às nossas necessidades. No momento, são necessárias tags personalizadas para concluir nossas necessidades. .
5. Tags personalizadas do Freemarker
As tags personalizadas do Freemarker devem escrever as tags sozinho e depois analisá -las. Eles controlam completamente a entrada e a saída das tags sozinhas, o que fornece muito aos programadores muito espaço para jogar.
Com base em etapas:
No passado, ao escrever tags, você precisa adicionar # depois <, mas para reconhecer tags personalizadas, você precisa adicionar @ posteriormente e, em seguida, pode definir alguns parâmetros posteriormente. Quando o programa executar o modelo.process (parammap, fora);, ele analisará todas as tags do Freemarker em toda a página.
A personalização da tag requer a personalização de uma classe, implementando o modelo modificado, reescrevendo o método Execute, concluindo a aquisição de parâmetros, faça algo de acordo com os parâmetros, etc.
Para vincular tags personalizadas às classes de análise, você precisa colocar uma instância da classe Parse em Parammap, e a tecla armazenada é a mesma da tag personalizada. .
Nota: Na tag personalizada, se não houver nada na tag, a tag de início e a etiqueta final não devem ser a mesma linha, caso contrário, um erro será relatado.
freemarker.log.jdk14LoggerFactory $ JDK14Logger Erro
Fui enganado, e isso é um bug no Freemarker.
Aqui está um exemplo de static.html:
<! Doctype html public "-// w3c // dtd html 4.01 transitória // pt" "http://www.w3.org/tr/html4/loose.dtd"> <html> <head> <meta http-equiv = contentnppe " <TITLE> Insira o título aqui </ititle> </head> <body> <#-variáveis personalizadas-> <#assign num = 'hehe' /// $ {num} <br/> tags personalizadas <@Content name = "chenghui" enge = "120"> $ {output} {Append} </@Content>
Aqui está a classe de análise do modelo estático.html acima:
pacote com.chenghui.test; importar static freemarker.template.objectwrapper.default_wrapper; importar java.io.ioException; importar java.io.writer; importar java.util.map; importar freemarker.core.environment; importar freemarker.template.templatedirivectbody; importar freemarker.template.templatedirectiveModel; importar freemarker.template.templateException; importar freemarker.template.templatemodel; importar freemarker.template.templatemodException; importar freemarker.template.templateNumberModel; importar freemarker.template.templatescalarmodel; / ** * Classe de resolução de tags personalizada * @Author Administrator * */ public class ContentDirection implementos modeladosirectiveModel {private static final string param_name = "name"; String final estática privada param_age = "Age"; @Override public void Execute (ambiente Env, mapa params, templatemodel [] loopvars, corpo de corpo de moda) lança modelo de modelo, ioexception {if (body == null) {lança nova templateModeException ("null body"); } else {string name = getString (param_name, params); Idade inteira = getInt (param_age, params); // Depois de receber os parâmetros, você pode executar operações específicas de acordo com a operação específica e, em seguida, exibir os dados na página. if (name! = null) {Env.SetVariable ("output", default_wrapper.wrap ("Os parâmetros obtidos da classe de análise do conteúdodiretivo são:"+nome+",")); } if (idade! = null) {Env.SetVariable ("Append", default_wrapper.wrap ("idade:"+idade)); } Writer out = Env.getout (); out.write ("daqui, você pode ver o conteúdo específico na página, assim como o documento.writer write operação. <br/>"); corpo.render (Out); /* Se você tiver cuidado, descobrirá que a página mostra a instrução de saída out.Write () e, em seguida, produza o conteúdo da saída. Pode -se observar que, quando o corpo estiver analisando, ele primeiro colocará os parâmetros no Env e somente quando a página encontrar o formulário correspondente, ele receberá o valor. No entanto, se o formulário não existir, um erro será relatado. Eu acho que o Freemarker não é bem feito aqui, e o erro será exposto à página ao analisar. Você pode compensar $ {output! "Null"} dessa maneira, e sempre sente que não é tão bom quanto a expressão de EL. */}}/ ** * Obtenha o valor do parâmetro do tipo string * @param paramname * @param parammap * @return * @throws TemplatemodElexception */ public static string getString (string paramName, map <string, templatemodel> paramMap) thupLeMeMEnMEMEMEnMod, map <string, templatemodel> paramMap) theMomMEMMEMMEname, {Map <Sutem, Model; if (modelo == null) {return null; } if (Instância do modelo de modaMedCalarmodel) {return ((modelo de modaSCALarmodel) .getasstring (); } else if (modelo de modelo de templateNumberModel) {return (((templateNumberModel) modelo) .getAsNumber (). ToString (); } else {lança nova templatemodException (paramname); }} / ** * * Obtenha o parâmetro do tipo int * @param paramname * @param parammap * @return * @throws TemplatemodException * / público estático getInt (string paramName, map <string, templatemodel> parammap) lança o templateMetMet. if (modelo == null) {return null; } if (Instância do modelo de modaMedCalarmodel) {String str = ((modelo de modaSCALarmodel)) .getasstring (); tente {return integer.valueof (str); } catch (numberFormatexception e) {lança nova templatemodException (paramname); }} else if (modelo de modelo de templateNumberModel) {return ((modelumumberModel). } else {lança nova templatemodException (paramname); }}}Em seguida, adicione:
// tag personalizado parsing parammap.put ("content", new contentDirective ());Dessa forma, ele pode basicamente ser usado. O Freemarker conclui tags personalizadas para resolver o problema de escrever lógica de negócios simples. No entanto, é impossível fazer isso em projetos reais, porque ainda não foi integrado à primavera e você precisa colocar a instância de análise da classe de análise no tempo de análise. .