1. Ikhtisar
Freemarker adalah mesin templat, alat umum untuk menghasilkan output teks berdasarkan templat. Itu ditulis dalam java murni. Freemarker dirancang untuk menghasilkan halaman web HTML, terutama aplikasi berdasarkan pola MVC. Meskipun Freemarker memiliki beberapa kemampuan pemrograman, biasanya menyiapkan data yang akan ditampilkan oleh program Java, dan menghasilkan halaman oleh Freemarker, dan menampilkan data yang disiapkan melalui templat (seperti yang ditunjukkan di bawah).
Freemarker bukan kerangka kerja aplikasi web, tetapi cocok sebagai komponen dari kerangka kerja aplikasi web. Freemarker tidak terkait dengan wadah karena tidak tahu tentang HTTP atau servlet; Freemarker juga dapat diterapkan pada lingkungan aplikasi non-WEB, Freemarker lebih cocok sebagai komponen tampilan kerangka kerja Model2 (seperti struts), dan Anda juga dapat menggunakan pustaka tag JSP dalam templat. Juga, Freemarker gratis.
2. Kondisi persiapan freemarker
Freemarker.2.3.16.jar, alamat unduhan tidak akan diposting di sini ... (paket jar ini sebenarnya ada di struts2)
3. Prinsip Freemarker Menghasilkan Halaman Statis
Freemarker menghasilkan halaman statis. Pertama, Anda perlu menggunakan halaman template yang Anda tentukan sendiri. Halaman template ini bisa menjadi HTML paling biasa, atau bisa berupa ekspresi nilai bersarang, label atau tag khusus, dll. Di freemarker. Kemudian, halaman template dibaca di latar belakang, parse tag di dalamnya untuk menyelesaikan operasi yang sesuai, dan kemudian lulus parameter pada pasangan nilai kunci untuk menggantikan ekspresi nilai dalam templat. Setelah itu, halaman HTML baru dapat dihasilkan sesuai dengan jalur yang dikonfigurasi untuk mencapai tujuan akses statis.
4. Label yang disediakan oleh Freemarker
Freemarker menyediakan banyak tag yang berguna dan umum digunakan. Tag freemarker bernama <# name tag> seperti ini. $ {value} mewakili konten nama variabel output, sebagai berikut:
1. Daftar: Tag ini terutama koleksi daftar yang diteruskan dari sisi server melalui iteratif, seperti:
<#list nameList sebagai nama> $ {names} </#list>Nama adalah variabel loop yang diambil saat daftar daftar. Ketika Freemarker menguraikan tag daftar, itu setara dengan:
untuk (nama string: naMeList) {system.out.println (nama); }2. If: Tag ini terutama digunakan untuk jika penilaian, seperti:
<#jam (nama == "Chen Jingchou")> senjatanya adalah: lima belas ~~ </#if>
Ini adalah label penilaian bersyarat. Perlu dicatat bahwa persamaan bersyarat harus dilampirkan dalam tanda kurung, yang setara dengan:
if (names.equals ("Chen Jingchou")) {System.out.println ("senjatanya adalah: lima belas ~~"); }
3. Termasuk: Tag ini digunakan untuk mengimpor file.
<#include "include.html"/>
Tag impor ini sangat berguna, terutama untuk penggunaan kembali halaman.
Selain itu, Anda dapat menggunakan $ {} untuk mendapatkan nilai dalam file statis. Metode nilai sama dengan ekspresi EL, yang sangat nyaman.
Berikut adalah contoh (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" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> Description: ${description} <br/> Collection size: ${nameList?size} <br/> Iterative list collection: <br/> <#list nameList as names> This is the ${names_index+1} person, called: <label style="color:red">${names}</label> if judgment: <br/> <#if (Nama == "Chen Jingchou")> senjatanya adalah: lima belas ~~ <#elseif (name == "yuwentuo")> <#-perhatikan bahwa tidak ada pengembalian di sini tetapi pada akhirnya-> senjatanya adalah: xuanyuan Sword ~ ・ <#else> triknya adalah: gu poison ~ ~#if> <br/list#list WeaponMap? Keys sebagai Key> Key ---> $ {key} <br/> Nilai -----> $ {WeaponMap [KEY]! ("NULL")} <#-Fremarker tidak mendukung NULL, dapat digunakan! bukannya nilai kosong. Faktanya, Anda juga dapat memberikan nilai default ----- $ {weaponmap [key]? Default ("null")} Anda juga dapat menentukan apakah itu null sebelum output <#if weaponmap [key] ??> </if>-> <br/> </#list> termasuk file impor: <br/> <sinclude "include.html"Kode aktual:
paket com.chenghui.test; impor java.io.file; impor java.io.fileoutputStream; impor java.io.ioException; impor java.io.outputStreamWriter; impor java.io.writer; impor java.util.arraylist; impor java.util.hashmap; impor java.util.list; impor java.util.map; impor freemarker.template.configuration; impor freemarker.template.defaultObjectWrapper; impor freemarker.template.template; impor freemarker.template.templateException; kelas publik createHtml {public static void main (string [] args) {try {// buat konfigurasi konfigurasi konfigurasi konfigurasi yang sesuai = konfigurasi baru (); configuration.setDirectoryFortempleTeloading (file baru ("D: // Project // WebProject // WebContent // Web-inf // Template")); configuration.setObjectWrapper (New DefaultObjectWrapper ()); configuration.setDefaultEncoding ("UTF-8"); // Ini harus diatur, jika tidak, itu akan dibumbui di halaman yang dihasilkan // dapatkan atau buat templat. Template template = configuration.gettemplate ("static.html"); Peta <string, object> parammap = hashmap baru <string, object> (); parammap.put ("deskripsi", "Saya belajar menggunakan freemarker untuk menghasilkan file statis!"); Daftar <String> naMeList = ArrayList baru <string> (); namelist.add ("Chen Jingchou"); namelist.add ("yuer"); namelist.add ("yuwentuo"); parammap.put ("namelist", namelist); Peta <String, Object> weaponmap = hashmap baru <string, object> (); weangonmap.put ("pertama", "pedang Xuanyuan"); weangonmap.put ("kedua", "kongtong seal"); weangonmap.put ("ketiga", "Nuwa Stone"); weangonmap.put ("keempat", "shennong ding"); weangonmap.put ("kelima", "fuxi qin"); weaponmap.put ("Sixth", "Kunlun Mirror"); weangonmap.put ("ketujuh", null); parammap.put ("WeaponMap", WeaponMap); Penulis penulis = outputStreamWriter baru (FileOutputStream baru ("Success.html"), "UTF-8"); template.process (parammap, penulis); System.out.println ("Selamat, generasi berhasil ~~"); } catch (ioException e) {e.printstacktrace (); } catch (templateException e) {e.printstacktrace (); }}}
Ini pada dasarnya dapat dianggap sebagai generasi sederhana dan sederhana, tetapi masih jauh dari digunakan dalam praktik, karena tag yang diberikan oleh Freemarker tidak dapat memenuhi kebutuhan kita sama sekali. Pada saat ini, tag khusus diperlukan untuk memenuhi kebutuhan kami. .
5. Tag Kustom Freemarker
Tag kustom freemarker adalah untuk menulis tag sendiri dan kemudian menguraikannya sendiri. Mereka sepenuhnya mengontrol input dan output tag sendiri, yang sangat memberikan banyak ruang untuk bermain.
Berdasarkan langkah -langkah:
Di masa lalu, saat menulis tag, Anda perlu menambahkan # setelah <, tetapi untuk mengenali tag khusus, Anda perlu menambahkan @ setelah itu, dan kemudian Anda dapat menentukan beberapa parameter nanti. Ketika program mengeksekusi template.process (parammap, out);, itu akan mengurai semua tag freemarker di seluruh halaman.
Menyesuaikan tag memerlukan penyesuaian kelas, kemudian menerapkan templatedirectiveModel, menulis ulang metode eksekusi, menyelesaikan akuisisi parameter, melakukan sesuatu sesuai dengan parameter, dll.
Untuk mengikat tag khusus ke kelas parse, Anda perlu memberi contoh kelas parse di parammap, dan kunci yang disimpan sama dengan tag khusus. .
Catatan: Di tag khusus, jika tidak ada apa pun di tag, tag start dan tag akhir tidak boleh sama dengan baris yang sama, jika tidak, kesalahan akan dilaporkan.
freemarker.log.jdk14loggerFactory $ jdk14logger kesalahan
Saya tertipu, dan ini adalah bug di Freemarker.
Berikut adalah contoh 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" content="text/html; charset=UTF-8"> <title>Insert title Di sini </itement> </head> <body> <#-variabel khusus-> <#assign num = 'hehe' /// $ {num} <br/> tag khusus <@content name = "chenghui" usia = "120"> $ {output} $ {append} </@content> </body> htm
Berikut adalah kelas parsing dari template statis.html di atas:
paket com.chenghui.test; impor static freemarker.template.objectwrapper.default_wrapper; impor java.io.ioException; impor java.io.writer; impor java.util.map; impor freemarker.core.environment; impor freemarker.template.templatedirectiveBody; impor freemarker.template.templatedirectivemodel; impor freemarker.template.templateException; impor freemarker.template.templatemodel; impor freemarker.template.templatemodelException; impor freemarker.template.templatenumberModel; impor freemarker.template.templatesCalarmodel; / ** * Kelas Resolusi Tag Kustom * @Author Administrator * */ Kelas Publik ContentDirective Implement TemplatedIrtIveModel {Private Static Final String param_name = "name"; string final statis privat param_age = "usia"; @Override public void mengeksekusi (lingkungan env, peta params, templateModel [] loopvars, body templatedirective body) melempar templateexception, ioException {if (body == null) {lempar TemplatemodelException baru ("nol body"); } else {string name = getString (param_name, params); Integer Age = getInt (param_age, params); // Setelah menerima parameter, Anda dapat melakukan operasi tertentu sesuai dengan operasi tertentu, dan kemudian menampilkan data pada halaman. if (name! = null) {env.setVariable ("output", default_wrapper.wrap ("Parameter yang diperoleh dari kelas parsing ContentDirective adalah:"+name+",")); } if (usia! = null) {env.setVariable ("append", default_wrapper.wrap ("usia:"+usia)); } Writer out = env.getout (); out.write ("Dari sini Anda dapat melihat konten spesifik di halaman, seperti dokumen. Operasi tulis penulis. <br/>"); body.render (out); /* Jika Anda berhati -hati, Anda akan menemukan bahwa halaman menunjukkan pernyataan output out.write (), dan kemudian output konten output. Dapat dilihat bahwa ketika tubuh parsing, pertama -tama akan memasukkan parameter ke dalam env, dan hanya ketika halaman menemukan formulir yang sesuai, itu akan mendapatkan nilainya. Namun, jika formulir tidak ada, kesalahan akan dilaporkan. Saya pikir freemarker tidak dilakukan dengan baik di sini, dan kesalahan akan terpapar ke halaman saat parsing. Anda dapat menebus $ {output! "Null"} dengan cara ini, dan Anda selalu merasa bahwa itu tidak sebagus ekspresi EL. */ } } /** * Get the value of the parameter of type String* @param paramName * @param paramMap * @return * @throws TemplateModelException */ public static String getString(String paramName, Map<String, TemplateModel> paramMap) throws TemplateModelException{ TemplateModel model = paramMap.get(paramName); if (model == null) {return null; } if (model instanceof TemplatesCalarmodel) {return ((TemplatesCalarmodel) model) .getAsstring (); } else if (model instanceof TemplatenumberModel) {return ((TemplatenumberModel) model) .getAsnumber (). tostring (); } else {lempar TemplateModelException baru (paramName); }} / ** * * Dapatkan parameter tipe int * @param paramname * @param parammap * @return * @throws TemplateModelException * / public static integer getInt (string paramname, peta <string, templateModel> parammap) lemparan TemplateModelException {TemplateModel> parammap = TemplateModelException {Templatemodel> parammap = TemplatImodeModelget {TEMPLATEMODEL> PARAMMAP = TemplatTiModelget (TEMPLATEMODEL> PARAMMAP = TemplatTiModel (TEMPLATEMODEDETEMOD (TEMPLATEDEMODE. if (model == null) {return null; } if (model instanceof templatesCalarmodel) {string str = ((TemplatesCalarmodel) model) .getAsstring (); coba {return integer.valueof (str); } catch (NumberFormateException e) {Throw TemplateModelException baru (paramName); }} lain jika (model contoh dari templatenumberModel) {return ((TemplatenumberModel) model) .getAsnumber (). intvalue (); } else {lempar TemplateModelException baru (paramName); }}}Lalu tambahkan:
// tag khusus parsing parammap.put ("konten", contentDirective baru ());Dengan cara ini, pada dasarnya dapat digunakan. Freemarker menyelesaikan tag khusus untuk menyelesaikan masalah menulis logika bisnis sederhana. Namun, tidak mungkin untuk melakukan ini dalam proyek -proyek aktual, karena belum diintegrasikan dengan musim semi, dan Anda perlu menempatkan contoh parsing dari kelas parsing dalam waktu penguraian. .