1. نظرة عامة
Freemarker هو محرك قالب ، وهو أداة عامة لإنشاء إخراج النص على أساس القوالب. هو مكتوب في جافا النقية. تم تصميم Freemarker لإنشاء صفحات الويب HTML ، وخاصة التطبيقات القائمة على نمط MVC. على الرغم من أن FreeMarker لديها بعض قدرات البرمجة ، إلا أنه يعد عادة البيانات التي سيتم عرضها بواسطة برامج Java ، وتنشئ الصفحات بواسطة Freemarker ، وتعرض البيانات المعدة من خلال القالب (كما هو موضح أدناه).
FreeMarker ليس إطارًا لتطبيقات الويب ، ولكنه مناسب كمكون لإطار تطبيق الويب. لا يرتبط Freemarker بالحاويات لأنه لا يعرف HTTP أو Servlets ؛ يمكن أيضًا تطبيق FreeMarker على بيئات التطبيقات غير الوصمية ، يعد Freemarker أكثر ملاءمة كمكون عرض لأطر Model2 (مثل الدعامات) ، ويمكنك أيضًا استخدام مكتبة علامات JSP في القوالب. أيضا ، freemarker مجاني.
2. شروط تحضير الجاذبية
Freemarker.2.3.16.jar ، لن يتم نشر عنوان التنزيل هنا ... (هذه الحزمة الجرة موجودة بالفعل في Struts2)
3. مبدأ توليد صفحات ثابتة
يولد Freemarker صفحة ثابتة. أولاً ، تحتاج إلى استخدام صفحة القالب التي تحددها نفسك. يمكن أن تكون صفحة القالب هذه هي HTML الأكثر عادية ، أو يمكن أن تكون تعبيرًا متداخلًا من القيمة أو العلامة أو العلامة المخصصة ، إلخ. بعد ذلك ، تتم قراءة صفحة القالب في الخلفية ، وتحليل العلامات الموجودة فيه لإكمال العملية المقابلة ، ثم تمرير المعلمات في زوج القيمة الرئيسية لاستبدال تعبير القيمة في القالب. بعد ذلك ، يمكن إنشاء صفحة HTML جديدة وفقًا للمسار المكون لتحقيق الغرض من الوصول الثابت.
4. التسميات التي يقدمها Freemarker
يوفر Freemarker العديد من العلامات المفيدة والاستخدام بشكل شائع. تتم تسمية علامات freemarker <# اسم العلامة> مثل هذا. يمثل $ {value} محتوى اسم متغير الإخراج ، على النحو التالي:
1. القائمة: هذه العلامة هي أساسا مجموعة قائمة تم تمريرها من جانب الخادم من خلال تكرار ، مثل:
<#list namelist كأسماء> $ {names} </#list>الاسم هو متغير حلقة مأخوذة عند حلقة القائمة. عندما يقوم Freemarker بتوزيع علامة القائمة ، فإنه يعادل:
لـ (أسماء السلسلة: 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 <title> insert title هنا </title> </head> <body> الوصف: $ {description} <br/> حجم المجموعة: $ {namelist؟ size} <br/> مجموعة القائمة التكرارية: <br/> <#list namelist as names> هذا هو $ {names_index+1} (الأسماء == "chen jingchou")> أسلحته هي: خمسة عشر ~~ <#elseif (names == "yuwentuo")> <#-لاحظ أنه لا يوجد عودة هنا ولكن في النهاية-> eparonmap؟ مفاتيح كمفتاح> مفتاح ---> $ {key} <br/> القيمة -----> $ {seleponmap [key]! ("null")} <#-لا يدعم fremarker خالية ،! بدلا من القيمة الفارغة. في الواقع ، يمكنك أيضًا إعطاء قيمة افتراضية ----- $ {apponmap [key]؟ الافتراضي ("null")} يمكنك أيضًا تحديد ما إذا كان لاغريًا قبل الإخراج <#felemap [key]الكود الفعلي:
حزمة 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 {// إنشاء تكوين كائن تكوين مناسب = configuration () ؛ configuration.setDirectoryFormateLateLoading (ملف جديد ("d: // project // webproject // webcontent // web-inf // template")) ؛ configuration.setObjectWrapper (defaultObjectWrapper ()) ؛ configuration.setDefaultEncoding ("UTF-8") ؛ // يجب تعيين هذا ، وإلا فإنه سيتم تشويهه في الصفحة التي تم إنشاؤها // الحصول على قالب أو إنشاء قالب. قالب قالب = configuration.getTemplate ("static.html") ؛ خريطة <string ، object> parammap = new hashmap <string ، Object> () ؛ parammap.put ("الوصف" ، "أنا أتعلم استخدام علامة freeMarker لإنشاء ملفات ثابتة!") ؛ قائمة <Tring> namelist = new ArrayList <String> () ؛ namelist.add ("Chen Jingchou") ؛ namelist.add ("yuer") ؛ namelist.add ("Yuwentuo") ؛ parammap.put ("namelist" ، namelist) ؛ خريطة <string ، object> eparonMap = new hashmap <string ، Object> () ؛ seponmap.put ("First" ، "Xuanyuan Sword") ؛ seponmap.put ("Second" ، "Kongtong Seal") ؛ seponmap.put ("Third" ، "Nuwa Stone") ؛ seponmap.put ("الرابع" ، "Shennong Ding") ؛ seponmap.put ("Fifth" ، "Fuxi Qin") ؛ seponmap.put ("Sixth" ، "Kunlun Mirror") ؛ seponmap.put ("Seventh" ، NULL) ؛ parammap.put ("seponmap" ، seleponmap) ؛ كاتب الكاتب = جديد OutputStreamWriter (FileOutputStream جديد ("Success.html") ، "UTF-8") ؛ template.process (parammap ، كاتب) ؛ System.out.println ("تهانينا ، كان الجيل ناجحًا ~~") ؛ } catch (ioException e) {E.PrintStackTrace () ؛ } catch (templateException e) {E.PrintStackTrace () ؛ }}}
يمكن اعتبار ذلك في الأساس جيلًا بسيطًا وبسيطًا ، لكنه لا يزال بعيدًا عن استخدامه في الممارسة ، لأن العلامات التي قدمها Freemarker لا يمكنها تلبية احتياجاتنا على الإطلاق. في هذا الوقت ، هناك حاجة إلى علامات مخصصة لإكمال احتياجاتنا. .
5. علامات مخصصة لجهاز FreeMarker
العلامات المخصصة المخصصة لكتابة العلامات بنفسك ثم تحليلها بنفسك. إنهم يتحكمون تمامًا في مدخلات وإخراج العلامات بأنفسهم ، والتي توفر للمبرمجين إلى حد كبير مساحة كبيرة للعب.
بناءً على الخطوات:
في الماضي ، عند كتابة العلامات ، تحتاج إلى إضافة # بعد <، ولكن للتعرف على العلامات المخصصة ، تحتاج إلى إضافة @ بعد ذلك ، وبعد ذلك يمكنك تحديد بعض المعلمات لاحقًا. عندما ينفذ البرنامج template.process (parammap ، out) ؛ ، سوف يحلل جميع العلامات المخصصة على الصفحة بأكملها.
يتطلب تخصيص العلامة تخصيص فئة ، ثم تنفيذ TampleTiveIrectiveModel ، وإعادة كتابة طريقة التنفيذ ، واستكمال الاستحواذ على المعلمات ، القيام بشيء وفقًا للمعلمات ، وما إلى ذلك.
لربط العلامات المخصصة للفئات تحليل ، تحتاج إلى وضع مثيل لفئة التحليل في Parammap ، والمفتاح المخزن هو نفس العلامة المخصصة. .
ملاحظة: في العلامة المخصصة ، إذا لم يكن هناك شيء في العلامة ، يجب ألا تكون علامة البدء والعلامة النهائية هي نفس السطر ، وإلا سيتم الإبلاغ عن خطأ.
freemarker.log.jdk14loggerfactory $ jdk14logger خطأ
لقد تم خداع ، وهذا خطأ في المؤشر.
فيما يلي مثال على static.html:
<! doctype html public "-// w3c // dtd html 4.01 Transitional // en" "http://www.w3 <title> insert title هنا </title> </head> <body> <#-المتغيرات المخصصة-> <#assign num = 'hehe' /// $ {num} <br/> العلامات المخصصة </@content> </body> </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.templatedIrective ؛ استيراد freemarker.template.templatedirectiveModel ؛ استيراد freemarker.template.templateException ؛ استيراد freemarker.template.templatemodel ؛ استيراد freemarker.template.templateModeLException ؛ استيراد freemarker.template.templatenumberModel ؛ استيراد freemarker.template.templatescalarmodel ؛ / ** * فئة دقة العلامة المخصصة * Author Administrator * */ content contentDirective Prectires templeatedirectiveModel {private static final string param_name = "name" ؛ Static Final String Param_age = "العمر" ؛ Override public void execute (Enval Env ، map params ، templatemodel [] loopvars ، body -body templatedicive -body) tamplateException ، ioException {if (body == null) {رمي templatemodelexception جديد ("body null") ؛ } آخر {string name = getString (param_name ، params) ؛ عدد صحيح العمر = 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)) ؛ } الكاتب out = env.getout () ؛ out.write ("من هنا يمكنك رؤية المحتوى المحدد على الصفحة ، تمامًا مثل عملية كتابة المستند. body.render (out) ؛ /* إذا كنت حريصًا ، فستجد أن الصفحة تعرض عبارة الإخراج out.write () ، ثم إخراج محتوى الإخراج. يمكن ملاحظة أنه عندما يتم تحليل الجسم ، فإنه سيضع المعلمات أولاً في ENV ، وفقط عندما تواجه الصفحة النموذج المقابل ، ستحصل على القيمة. ومع ذلك ، إذا لم يكن النموذج موجودًا ، فسيتم الإبلاغ عن خطأ. أعتقد أن المؤشر لم يتم بشكل جيد هنا ، وسيتم تعريض الخطأ للصفحة عند التحليل. يمكنك تعويض $ {output! "null"} بهذه الطريقة ، وتشعر دائمًا أنه ليس جيدًا مثل تعبير EL. */}}/ ** * احصل على قيمة المعلمة من سلسلة type * param paramname * param parammap * return * throws templateModeLException */ سلسلة ثابتة عامة getTring (سلسلة paramname ، map <string ، templatemodel> parammap) remplateModeModelexpection {templateModel. if (model == null) {return null ؛ } if (model dealthof templatescalarmodel) {return ((templatescalarmodel) model) .getAssTring () ؛ } آخر إذا (model eastyof templatenumbermodel) {return ((templatenumbermodel) model) .getAsNumber (). toString () ؛ } آخر {رمي templatemodelexception جديد (paramname) ؛ }} / ** * * احصل على معلمة من النوع int * param paramname * param parammap * regurn * throws templatemodelexception * / public static integer getInt (String paramname ، map <string ، templatemodel> parammap) relmedeModelexception if (model == null) {return null ؛ } if (model dealthof templatescalarmodel) {string str = ((templatescalarmodel) model) .getAssTring () ؛ حاول {return integer.valueof (str) ؛ } catch (numberFormatexception e) {رمي templatemodelexception جديد (paramName) ؛ }} else if (model eastyof templateNumberModel) {return ((templatenumberModel) model) .getAsNumber (). Intvalue () ؛ } آخر {رمي templatemodelexception جديد (paramname) ؛ }}}ثم أضف:
// العلامة المخصصة parammap.put ("المحتوى" ، contentDirective ()) ؛بهذه الطريقة ، يمكن استخدامه بشكل أساسي. يكمل Freemarker علامات مخصصة لحل مشكلة كتابة منطق العمل البسيط. ومع ذلك ، من المستحيل القيام بذلك في المشاريع الفعلية ، لأنه لم يتم دمجه مع الربيع حتى الآن ، وتحتاج إلى وضع مثيل التحليل لفئة التحليل في وقت التحليل. .