P> พื้นฐาน
การกำหนดค่าเป็นวัตถุที่เก็บข้อมูลการกำหนดค่าทั่วไปในระดับแอปพลิเคชันและตัวแปรที่ใช้ร่วมกันทั่วโลกที่เทมเพลตสามารถใช้งานได้ นอกจากนี้ยังรับผิดชอบในการสร้างและแคชของอินสแตนซ์แม่แบบ การกำหนดค่าเป็นอินสแตนซ์ของวัตถุ freemarker.template.configuration ที่สร้างขึ้นโดยใช้ตัวสร้าง โดยทั่วไปแอปพลิเคชันจะใช้วัตถุการกำหนดค่าอินสแตนซ์เดี่ยวที่ใช้ร่วมกัน
วัตถุการกำหนดค่าสามารถใช้โดยวิธีการวัตถุเทมเพลต แต่ละอินสแตนซ์เทมเพลตเชื่อมโยงกับอินสแตนซ์การกำหนดค่า มันเกี่ยวข้องกับตัวสร้างเทมเพลต โดยปกติคุณจะใช้วิธีนี้เพื่อรับวัตถุเทมเพลตโดยการกำหนดค่า GetTemplate
ตัวแปรที่ใช้ร่วมกัน
ตัวแปรที่ใช้ร่วมกันเป็นสิ่งที่กำหนดไว้สำหรับการใช้งานโดยเทมเพลตทั้งหมด คุณสามารถเพิ่มตัวแปรที่ใช้ร่วมกันผ่านวิธีการ setsharedVariable ของวัตถุการกำหนดค่า
การกำหนดค่า CFG = การกำหนดค่าใหม่ (); ... cfg.setsharedVariable ("wrap", new wrapdirective ()); cfg.setsharedVariable ("บริษัท ", "Foo Inc. "); // การใช้ ObjectWrapper.default_wrapperอินสแตนซ์ของเทมเพลตทั้งหมดที่เกี่ยวข้องกับวัตถุการกำหนดค่านี้สามารถรับสตริงได้โดยได้รับตัวแปลง TO_UPPER บริษัท และดังนั้นคุณไม่จำเป็นต้องเพิ่มตัวแปรเหล่านี้ลงในรูทอีกครั้งและอีกครั้ง หากคุณเพิ่มตัวแปรที่มีชื่อเดียวกันกับรูทตัวแปรที่เพิ่มใหม่จะเขียนทับตัวแปรที่แชร์ก่อนหน้านี้
เตือน!
หากวัตถุการกำหนดค่าเรียกว่า multithReaded อย่าใช้คลาสการใช้งาน TemplateModel เป็นตัวแปรที่ใช้ร่วมกันเนื่องจากไม่ปลอดภัยเช่นเว็บไซต์ที่ใช้เซิร์ฟเล็ต
วัตถุการกำหนดค่าเริ่มต้นด้วยตัวแปรตัวแปลงที่ใช้ร่วมกันอยู่แล้ว:
ชื่อคลาส
พารามิเตอร์การกำหนดค่า
พารามิเตอร์การกำหนดค่าเป็นพารามิเตอร์ที่มีชื่อซึ่งอาจส่งผลกระทบต่อพฤติกรรมการปฏิบัติงานของ Freemarker ตัวอย่างเช่น locale, number_format
พารามิเตอร์การกำหนดค่าจะถูกเก็บไว้ในอินสแตนซ์การกำหนดค่าและสามารถแก้ไขได้โดยอินสแตนซ์เทมเพลต ตัวอย่างเช่นหากคุณตั้งค่าตำแหน่งเท่ากับ "en_us" ในการกำหนดค่าวัตถุเทมเพลตทั้งหมดจะถูกใช้ "en_us" เว้นแต่คุณจะใช้เมธอด setLocale เพื่อแก้ไขการกำหนดค่าเริ่มต้นในอินสแตนซ์เทมเพลตเดียว ดังนั้นพารามิเตอร์ที่กำหนดโดยการกำหนดค่าสามารถถือได้ว่าเป็นพารามิเตอร์เริ่มต้นซึ่งสามารถเขียนทับได้โดยพารามิเตอร์ที่ตั้งไว้ในระดับแรกของเทมเพลตและข้อมูลพารามิเตอร์ที่กำหนดโดยทั้งสองสามารถเขียนทับได้โดยพารามิเตอร์ที่ตั้งค่าในสภาพแวดล้อม (นั่นคือชุดคำสั่งไฟล์เทมเพลต) ดังนี้:
$ {1.2} <#การตั้งค่า locale = "en_us"> $ {1.2}คุณสามารถจินตนาการถึงวิธีการเรียกนี้เป็น 3 เลเยอร์ (เลเยอร์วัตถุการกำหนดค่าเลเยอร์เทมเพลตและเลเยอร์สภาพแวดล้อมที่รัน) ตารางต่อไปนี้แสดงการตั้งค่าสำหรับพารามิเตอร์ของแต่ละเลเยอร์:
จากนั้นผลลัพธ์สุดท้ายของพารามิเตอร์การกำหนดค่าคือ: a = 1, b = 2, c = 3, d = 1, e = 2. พารามิเตอร์ F น่าจะเป็นโมฆะ
หากคุณต้องการสอบถามรายการพารามิเตอร์ที่สามารถตั้งค่าได้คุณสามารถปรึกษาเอกสารสองส่วนต่อไปนี้ของเอกสาร Freemarker API:
การกำหนดค่าทั้งหมด
freemarker.core.configable.setsetting (สตริง, สตริง)
การกำหนดค่าเลเยอร์การกำหนดค่า
freemarker.template.configuration.setSetting (สตริง, สตริง)
เทมเพลตการโหลด
ตัวโหลดเทมเพลต
ตัวโหลดเทมเพลตเป็นวัตถุที่โหลดข้อมูลต้นฉบับตามเส้นทางนามธรรม ("index.ftl" หรือ "ผลิตภัณฑ์/catalog.ftl") และทรัพยากรประเภทใด (ข้อมูลไฟล์ในไดเรกทอรีหรือข้อมูลในฐานข้อมูล) จะถูกโหลดขึ้นอยู่กับการใช้งานตัวโหลดเฉพาะ เมื่อคุณเรียก CFG.GetTemplate Freemarker จะถามคุณว่าตัวโหลดเทมเพลตที่คุณกำหนดค่าให้กับวัตถุการกำหนดค่าก่อนซึ่งรับผิดชอบการโหลดไฟล์
ตัวโหลดเทมเพลตในตัว <br /> คุณสามารถใช้สามวิธีต่อไปนี้เพื่อตั้งค่าการโหลดเทมเพลต
โมฆะ setDirectoryfortemPlateLoading (ไฟล์ dir);
หรือ
โมฆะ setclassfortemplateLoading (คลาส Cl, คำนำหน้าสตริง);
หรือ
โมฆะ setServletContextfortemPlateLoading (Object servletContext, เส้นทางสตริง);
วิธีแรกด้านบนระบุไดเรกทอรีในระบบไฟล์ Freemarker จะบันทึกเทมเพลตในไดเรกทอรีนี้ ไม่จำเป็นต้องพูดไดเรกทอรีนี้จะต้องมีอยู่หรือข้อยกเว้นจะถูกโยนลงไป
วิธีที่สองใช้คลาสเป็นพารามิเตอร์อินพุต เมื่อคุณต้องการใช้ classloader เพื่อโหลดเทมเพลตคุณสามารถใช้วิธีนี้ได้ วิธีนี้จะถูกเรียกให้ค้นหาไฟล์เทมเพลต ในขณะเดียวกันวิธีการโหลดเทมเพลตนี้มีความเสถียรมากกว่าวิธีการก่อนหน้านี้โดยเฉพาะในระบบการผลิต คุณสามารถบรรจุไฟล์ทรัพยากรไอคอน ฯลฯ ลงในไฟล์. jar ได้อย่างง่ายดาย
วิธีที่สามใช้บริบทและเส้นทางพื้นฐานของเว็บแอปพลิเคชัน (สัมพันธ์กับเส้นทางหลักของ Wen-Inf) เป็นพารามิเตอร์ ตัวโหลดเทมเพลตของวิธีนี้จะโหลดเทมเพลตจากบริบทของแอปพลิเคชันเว็บ
กำลังโหลดเทมเพลตจากหลาย ๆ ตำแหน่ง
หากคุณต้องการโหลดเทมเพลตจากหลาย ๆ ตำแหน่งคุณสามารถสร้างตัวโหลดเทมเพลตเดียวที่สอดคล้องกับตำแหน่งที่แตกต่างกันจากนั้นห่อไว้ในตัวโหลดเทมเพลตที่เรียกว่า MultItEmplateLoader และในที่สุดก็ตั้งค่าเป็นวัตถุการกำหนดค่าผ่านวิธีการ SetTemPlateLoader นี่คือตัวอย่างของการโหลดเทมเพลตจากสองตำแหน่งที่แตกต่างกัน:
นำเข้า freemarker.cache.*; // ตัวโหลดเทมเพลตสดในแพ็คเกจนี้ ... fileTemplateLoader ftl1 = ใหม่ fileTeMplateLoader (ไฟล์ใหม่ ("/tmp/templates")); fileTemplateLoader ftl2 = ใหม่ fileTemplateLoader (ไฟล์ใหม่ ("/usr/data/templates")); classtemplateloader ctl = new classtemplateloader (getclass (), ""); templateLoader [] loaders = ใหม่ templateLoader [] {ftl1, ftl2, ctl}; MultItemPlateLoader MTL = New MultItemPlateLoader (Loaders); cfg.settemplateLoader (MTL);Freemarker จะค้นหาไฟล์เทมเพลตใน Path /TMP /เทมเพลตก่อน หากไม่พบให้กลับไปที่เส้นทาง/usr/data/templates หากไม่พบให้ลองโหลดในคลาส-โหลด
รับไฟล์เทมเพลตจากแหล่งข้อมูลอื่น ๆ
หากไม่มีตัวโหลดเทมเพลตในตัวเหล่านี้ตรงตามความต้องการของคุณคุณสามารถปรับแต่งตัวโหลดเทมเพลตด้วยตัวเองเพียงแค่ใช้อินเตอร์เฟส freemarker.cache.templateloader แล้วส่งผ่านไปยังวัตถุการกำหนดค่าผ่านวิธีการ SetTemplateloader (TemplateLoader Loader)
เทมเพลตแคช
เทมเพลตแคช Freemarker หมายความว่าเมื่อคุณได้รับเทมเพลตผ่านวิธี getTemplate Freemarker จะไม่เพียง แต่ส่งคืนวัตถุเทมเพลต แต่ยังแคชวัตถุด้วย เมื่อคุณขอเทมเพลตที่มีเส้นทางเดียวกันในครั้งต่อไปมันจะส่งคืนวัตถุเทมเพลตในแคช หากคุณเปลี่ยนไฟล์เทมเพลตในครั้งต่อไปที่คุณได้รับเทมเพลต Freemarker จะโหลดซ้ำโดยอัตโนมัติและกลับมาใช้เทมเพลตอีกครั้ง แม้จะมีสิ่งนี้หากเป็นการดำเนินการที่ใช้เวลานานเพื่อตรวจสอบโดยตรงว่าไฟล์ได้รับการแก้ไขหรือไม่ Freemarker จะให้พารามิเตอร์การกำหนดค่า "การอัปเดตล่าช้า" ที่ระดับวัตถุการกำหนดค่า พารามิเตอร์นี้หมายถึงระยะเวลาสำหรับ Freemarker ในการกำหนดเวอร์ชันของเทมเพลต การตั้งค่าเริ่มต้นคือ 5 วินาทีซึ่งหมายความว่าแต่ละ 5 วินาทีจะพิจารณาว่าเทมเพลตได้รับการแก้ไขหรือไม่ หากคุณต้องการตัดสินแบบเรียลไทม์ให้ตั้งค่าพารามิเตอร์นี้เป็น 0 สิ่งที่ควรทราบอีกอย่างหนึ่งคือไม่ใช่ว่าตัวโหลดทั้งหมดไม่สนับสนุนวิธีการตัดสินนี้ ตัวอย่างเช่นตัวโหลดเทมเพลตที่ใช้คลาส-โหลดจะไม่พบว่าคุณได้แก้ไขไฟล์เทมเพลตแล้ว
นี่คือวิธีที่ freemarker ลบเทมเพลตในแคชคุณสามารถใช้วิธีการกำหนดค่าวัตถุ ClearTemplatecache เพื่อชี้แจงวัตถุเทมเพลตด้วยตนเองในแคช ในความเป็นจริงชิ้นส่วนแคชสามารถเพิ่มลงใน freemarker เป็นส่วนประกอบ (นั่นคือสามารถใช้รูปแบบแคชของบุคคลที่สาม) คุณสามารถทำได้โดยการตั้งค่าพารามิเตอร์ CACHE_STORAGE มันเพียงพอสำหรับนักพัฒนาส่วนใหญ่ที่จะใช้ freemarker.cache.mrucachestorage ที่มาพร้อมกับ Freemarker แคชนี้ใช้นโยบาย 2 ระดับที่ใช้ล่าสุด ในระดับแรกรายการแคชทั้งหมดใช้การอ้างอิงที่แข็งแกร่ง: รายการไม่ชัดเจนโดย JVM การอ้างอิงเบา ๆ ที่มีการอ้างอิงที่ค่อนข้างอ่อนแอ จนกว่าจะถึงเวลาสูงสุดรายการที่ใช้อย่างน้อยเมื่อเร็ว ๆ นี้จะถูกย้ายไปยังแคชรอง ในระดับนี้รายการนั้นมีการอ้างอิงที่อ่อนแอทั้งหมดจนกว่าจะถึงหมดอายุ หากขนาดของพื้นที่อ้างอิงและการอ้างอิงที่แข็งแกร่งสามารถตั้งค่าในตัวสร้างตัวอย่างเช่นหากคุณต้องการตั้งค่าภูมิภาคอ้างอิงที่แข็งแกร่งเป็น 20 และพื้นที่อ้างอิงที่อ่อนแอเป็น 250 คุณสามารถใช้รหัสต่อไปนี้:
CFG.SetCachestorage (New Freemarker.cache.mrucachestorage (20, 250))
เนื่องจาก mrucachestorage เป็นการใช้งานแคชเริ่มต้นคุณจึงสามารถตั้งค่าได้เช่นนี้:
cfg.setSetting (configuration.cache_storage_key, "strong: 20, soft: 250");
เมื่อคุณสร้างการกำหนดค่าใหม่จะถูกนำไปใช้โดยค่าเริ่มต้นโดยใช้แคช mrucachestorage และค่าเริ่มต้น maxstrongsize เท่ากับ 0 และ maxsoftsize เท่ากับจำนวนเต็ม max_value (นั่นคือค่าสูงสุดทางทฤษฎี) อย่างไรก็ตามสำหรับระบบโหลดสูงเราขอแนะนำให้ตั้งค่า maxstrongsize เป็นค่าที่ไม่ใช่ 0 มิฉะนั้นจะทำให้เกิดการโหลดซ้ำบ่อยครั้งและการแยกเทมเพลตอีกครั้ง
การจัดการข้อยกเว้น
ข้อยกเว้นที่เป็นไปได้
ข้อยกเว้นที่สร้างโดย Freemarker โดยทั่วไปสามารถจำแนกได้เป็นหมวดหมู่ต่อไปนี้:
ข้อยกเว้นที่สร้างขึ้นในขั้นตอนการเริ่มต้นของ Freemarker : โดยปกติคุณจะต้องเริ่มต้น freemarker หนึ่งครั้งในแอปพลิเคชันของคุณและข้อยกเว้นที่สร้างขึ้นในช่วงเวลานี้เรียกว่าข้อยกเว้นการเริ่มต้น
ข้อยกเว้นระหว่างเทมเพลตการโหลดและการแยกวิเคราะห์ : เมื่อคุณได้รับเทมเพลตผ่านวิธีการกำหนดค่า. getTemplate () (หากเทมเพลตไม่ได้ถูกแคชมาก่อน) จะมีการสร้างข้อยกเว้นสองประเภท:
IOException: เนื่องจากไม่พบเทมเพลตหรือข้อยกเว้น IO อื่น ๆ เกิดขึ้นเมื่ออ่านเทมเพลตเช่นคุณไม่ได้รับอนุญาตให้อ่านไฟล์ ฯลฯ ; freemarker.core.parseException เนื่องจากไวยากรณ์ของไฟล์เทมเพลตไม่ถูกต้อง
ข้อยกเว้นระหว่างการดำเนินการ: เมื่อคุณเรียกเมธอดเทมเพลต process (... ) วิธีการสองประเภทของข้อยกเว้นจะถูกโยน:
IOException ข้อผิดพลาดที่เกิดขึ้นเมื่อเขียนข้อมูลในเอาต์พุต freemarker.template.templatexception ยกเว้นข้อยกเว้นอื่น ๆ ที่สร้างขึ้นระหว่างรันไทม์เช่นข้อผิดพลาดที่พบบ่อยที่สุดคือเทมเพลตหมายถึงตัวแปรที่ไม่มีอยู่;