1. Descripción general
Freemarker es un motor de plantilla, una herramienta general para generar salida de texto basada en plantillas. Está escrito en Java puro. Freemarker está diseñado para generar páginas web HTML, especialmente aplicaciones basadas en el patrón MVC. Aunque Freemarker tiene algunas capacidades de programación, generalmente prepara los datos que se mostrarán mediante programas Java, y genera las páginas por Freemarker y muestra los datos preparados a través de la plantilla (como se muestra a continuación).
Freemarker no es un marco de aplicaciones web, pero es adecuado como un componente del marco de aplicaciones web. Freemarker no está relacionado con los contenedores porque no sabe sobre http o servlets; Freemarker también se puede aplicar a entornos de aplicación no WEB, Freemarker es más adecuado como un componente de vista de los marcos Model2 (como Struts), y también puede usar la biblioteca de etiquetas JSP en plantillas. Además, Freemarker es gratuito.
2. Condiciones de preparación de marca freem
Freemarker.2.3.16.Jar, la dirección de descarga no se publicará aquí ... (este paquete JAR está en Struts2)
3. El principio de las páginas estáticas generadoras de marca freem
Freemarker genera una página estática. Primero, debe usar la página de plantilla que se defina. Esta página de plantilla puede ser el HTML más ordinario, o puede ser una expresión de valor anidado, etiqueta o etiqueta personalizada, etc. en el marcador libre. Luego, la página de plantilla se lee en segundo plano, analice las etiquetas para completar la operación correspondiente y luego pase los parámetros en el par de valor clave para reemplazar la expresión de valor en la plantilla. Después de eso, se puede generar una nueva página HTML de acuerdo con la ruta configurada para lograr el propósito del acceso estático.
4. Etiquetas proporcionadas por Freemarker
Freemarker proporciona muchas etiquetas útiles y de uso común. Las etiquetas Freemarker se llaman <# Nombre de la etiqueta> así. $ {valor} representa el contenido del nombre de la variable de salida, como sigue:
1. Lista: Esta etiqueta es principalmente una colección de listas que se pasa desde el lado del servidor a través de iterativamente, como:
<#list namelist como nombres> $ {nombres} </#list>El nombre es una variable de bucle tomada cuando el bucle de la lista. Cuando Freemarker analiza la etiqueta de la lista, es equivalente a:
for (nombres de cadenas: namelist) {System.out.println (nombres); }2. Si: esta etiqueta se usa principalmente para el juicio if, como:
<#if (nombres == "Chen Jingchou")> Sus armas son: Quince ~~ </#if>
Esta es una etiqueta de juicio condicional. Cabe señalar que la ecuación condicional debe estar encerrada en los soportes, lo cual es equivalente a:
if (names.equals ("chen jingchou")) {system.out.println ("sus armas son: quince ~~"); }
3. Incluir: esta etiqueta se usa para importar archivos.
<#include "include.html"/>
Esta etiqueta de importación es muy útil, especialmente para la reutilización de la página.
Además, puede usar $ {} para obtener el valor en un archivo estático. El método de valor es el mismo que la expresión EL, que es muy conveniente.
Aquí hay un ejemplo (static.html):
<! DocType html public "-// w3c // dtd html 4.01 <title> Insertar título aquí </title> </head> <body> Descripción: $ {descripción} <br/> tamaño de colección: $ {namelist? size} <br/> colección de listas iterativas: <br/> <#list namelist como nombres> esta es la persona $ {names_index+1}, llamada: <estilo de etiqueta = "color: red" (Names == "Chen Jingchou")> sus armas son: Quince ~~ <#Elseif (nombres == "Yuwentuo")> <#-Tenga en cuenta que no hay retorno aquí pero al final-> sus armas son: Xuanyuan Sword ~ ・ ・ <#else> Su truco es: Gu Venise </#if> <br/> </#List> iterative Collection Collect Collection Arma de arma? Keys como clave> clave ---> $ {key} <br/> valor -----> $ {armaMap [clave]! ("nulo")} <#-Fremarker no es compatible con NULL, ¡se puede usar! en lugar de valor vacío. De hecho, también puede dar un valor predeterminado ----- $ {WeaponMap [Key]? Default ("NULL")} También puede determinar si es NULL antes de la salida <#if arma de arma [clave]?Código real:
paquete com.chenghui.test; import java.io.file; import java.io.fileOutputStream; import java.io.ioException; import java.io.outputstreamwriter; import java.io.writer; import java.util.arrayList; import java.util.hashmap; import java.util.list; import java.util.map; importar freemarker.template.configuration; import freemarker.template.defaultObjectWrapper; importar freemarker.template.template; importar freemarker.template.templateException; public class createHtml {public static void main (string [] args) {try {// crea una configuración de configuración de objeto de configuración adecuada = nueva configuración (); Configuration.SetDirectoryFortEmplAtLoading (nuevo archivo ("d: // proyecto // webproject // webcontent // webinf // plantlate")); configuration.setObjectWrapper (new DefaultObjectWrapper ()); configuración.setDefaultEncoding ("UTF-8"); // Esto debe establecerse, de lo contrario se verá confuso en la página generada // obtener o crear una plantilla. Plantilla plantplate = configuration.gettemplate ("static.html"); Map <string, object> parammap = new HashMap <String, Object> (); Parammap.put ("Descripción", "¡Estoy aprendiendo a usar Freemarker para generar archivos estáticos!"); List <String> namelist = new ArrayList <String> (); namelist.add ("Chen Jingchou"); namelist.add ("yuer"); namelist.add ("yuwentuo"); parammap.put ("namelist", namelist); Map <string, object> armaMap = new Hashmap <String, Object> (); WeaponMap.put ("Primero", "Sword Xuanyuan"); WeaponMap.put ("Segundo", "Kongtong Seal"); WeaponMap.put ("Third", "Nuwa Stone"); WeaponMap.put ("Cuarto", "Shennong Ding"); WeaponMap.put ("Fifth", "Fuxi Qin"); WeaponMap.put ("Sixth", "Kunlun Mirror"); armaMap.put ("Séptimo", nulo); parammap.put ("Arma de arma", Mapa de armas); Escritor escritor = nuevo outputStreamWriter (nuevo FileOutputStream ("Success.html"), "UTF-8"); Template.process (parammap, escritor); System.out.println ("Felicitaciones, la generación fue exitosa ~~"); } catch (ioException e) {E.PrintStackTrace (); } catch (TemplateException e) {E.PrintStackTrace (); }}}
Básicamente, esto puede considerarse como una generación simple y simple, pero aún está lejos de ser utilizada en la práctica, porque las etiquetas dadas por Freemarker no pueden satisfacer nuestras necesidades en absoluto. En este momento, se necesitan etiquetas personalizadas para completar nuestras necesidades. .
5. Etiquetas personalizadas de Freemarker
Las etiquetas personalizadas de Freemarker son para escribir las etiquetas usted mismo y luego analizarlas usted mismo. Controlan completamente la entrada y la salida de las etiquetas por sí mismos, lo que proporciona enormemente a los programadores mucho espacio para jugar.
Basado en los pasos:
En el pasado, al escribir etiquetas, debe agregar # después de <, pero para reconocer las etiquetas personalizadas, debe agregar @ después, y luego puede definir algunos parámetros más adelante. Cuando el programa ejecuta Template.process (Parammap, Out);, analizará todas las etiquetas de marca libre en toda la página.
Personalizar la etiqueta requiere personalizar una clase, luego implementar el TemplatedIrectivEmodel, reescribir el método Ejecutar, completar la adquisición de parámetros, hacer algo de acuerdo con los parámetros, etc.
Para unir etiquetas personalizadas a clases de análisis, debe poner una instancia de la clase de análisis en Parammap, y la clave almacenada es la misma que la etiqueta personalizada. .
Nota: En la etiqueta personalizada, si no hay nada en la etiqueta, la etiqueta de inicio y la etiqueta final no deben ser la misma línea, de lo contrario se informará un error.
freemarker.log.jdk14loggerFactory $ jdk14logger error
Me han engañado, y este es un error en Freemarker.
Aquí hay un ejemplo de static.html:
<! DocType html public "-// w3c // dtd html 4.01 <title> Inserte el título aquí </title> </head> <body> <#-variables personalizadas-> <#assign num = 'jeje' /// $ {num} <br/> etiquetas personalizadas <@content name = "chenghui" age = "120"> $ {output} $ {append} </@contenido> </body> </hml>>
Aquí está la clase de análisis de la plantilla static.html arriba:
paquete com.chenghui.test; importar freemarker.template.objectwrapper.default_wrapper; import java.io.ioException; import java.io.writer; import java.util.map; importar freemarker.core.environment; import freemarker.template.templatedirectiveBody; import freemarker.template.templatedIrectivEmodel; importar freemarker.template.templateException; import freemarker.template.templateModel; import freemarker.template.templateModelException; import freemarker.template.templateNumberModel; import freemarker.template.templatescalararmodel; / ** * Clase de resolución de etiqueta personalizada * @Author Administrator * */ public Class ContentDirective Implements TemplateDirectivEModel {private static final String param_name = "nombre"; Cadena final estática privada param_age = "edad"; @Override public void ejecute (Environment Env, Map Params, TemplateModel [] LoopVars, TemplatedIrectiveBody Body) arroja TemplateException, ioexception {if (Body == NULL) {tirar nueva TemplateModelException ("Body Null"); } else {String name = getString (param_name, params); Entero edad = getInt (param_age, params); // Después de recibir los parámetros, puede realizar operaciones específicas de acuerdo con la operación específica y luego mostrar los datos en la página. if (name! = null) {env.setVariable ("output", default_wrapper.wrap ("Los parámetros obtenidos de la clase de análisis ContentDirective son:"+nombre+",")); } if (edad! = null) {env.setVariable ("append", default_wrapper.wrap ("edad:"+edad)); } Escritor out = env.getOut (); out.write ("Desde aquí puede ver el contenido específico en la página, al igual que la operación de escritura de documentos. Writer. <br/>"); Body.render (fuera); /* Si tiene cuidado, encontrará que la página muestra la instrucción OUT.Write () de salida y luego emite el contenido de salida. Se puede ver que cuando el cuerpo está analizando, primero colocará los parámetros en el env, y solo cuando la página encuentre el formulario correspondiente, obtendrá el valor. Sin embargo, si el formulario no existe, se informará un error. Creo que el Freemarker no se hace bien aquí, y el error estará expuesto a la página al analizar. Puede compensar $ {salida! "NULL"} de esta manera, y siempre siente que no es tan bueno como la expresión de EL. */}}/ ** * Obtenga el valor del parámetro de tipo de cadena * @param paramName * @param parammap * @return * @throws templateLexception */ public static string getString (string paramName, map <string, string, string, Templateel> parammap) lanza if (model == null) {return null; } if (modelo instancia de plantlatesCalarModel) {return ((platlatescalarmodel) modelo) .getAsstring (); } else if (modelo instancia de templatenumberModel) {return ((TemplAtEnMeModel) modelo) .getAsNumber (). toString (); } else {lanzar nueva TemplateModelException (paramName); }} / ** * * Obtener el parámetro de tipo int * @param paramname * @param parammap * @return * @throws templateModelException * / public static integer getInt (string paramName, map <string, parammodel> parammap) lanza if (model == null) {return null; } if (modelo instanceo de plantlatesCalarModel) {String str = ((TemplatesCalarModel) modelo) .getAsstring (); intente {return integer.valueOf (str); } Catch (NumberFormateException e) {tire nuevo TemplateModelException (paramName); }} else if (model instanceof TempLatEngergModel) {return ((TemplAtEnumberModel) modelo) .getAsNumber (). intValue (); } else {lanzar nueva TemplateModelException (paramName); }}}Luego agregue:
// Etiqueta personalizada Parsing Parammap.put ("Content", New ContentDirective ());De esta manera, básicamente se puede usar. Freemarker completa las etiquetas personalizadas para resolver el problema de escribir una lógica comercial simple. Sin embargo, es imposible hacer esto en proyectos reales, porque aún no se ha integrado con la primavera, y debe poner la instancia de análisis de la clase de análisis en el tiempo de análisis. .