mustache的默認分割符號爲 {{ }}html
固然也能夠在模板文件的第一行添加 {{=<% %>}}java
更多關於mustache的文檔: http://mustache.github.io/mustache.5.htmlgit
將默認的{{}}分隔符替換爲 <% %>github
假如你不喜歡每一個模板文件都添加這一行.咱們應該能夠修改默認的配置文件.web
直接貼代碼了.緩存
主要是覆蓋mustacheModule,重寫裏面的DefaultMustacheFactory中的compile與cacheide
package com.web_test.module import com.github.mustachejava._ import com.google.common.cache.{CacheLoader, LoadingCache, CacheBuilder} import com.google.inject.Provides import com.twitter.finatra.annotations.Flag import com.twitter.finatra.http.internal.marshalling.mustache.ScalaObjectHandler import com.twitter.finatra.http.modules.{LocalFilesystemDefaultMustacheFactory, DocRootModule} import com.twitter.finatra.http.modules.MustacheModule._ import com.twitter.finatra.http.routing.FileResolver import com.twitter.inject.TwitterModule import java.io._ import javax.inject.Singleton import scala.collection.mutable object myMustacheModule extends TwitterModule { private val templatesDir = flag("mustache.templates.dir", "templates", "templates resource directory") override def modules = Seq(DocRootModule) @Provides @Singleton def provideMustacheFactory( resolver: FileResolver, @Flag("local.doc.root") localDocRoot: String): MustacheFactory = { // templates are cached only if there is no local.doc.root // val cacheMustacheTemplates = localDocRoot.isEmpty val templatesDirectory = templatesDir() new DefaultMustacheFactory(templatesDirectory) { setObjectHandler(new ScalaObjectHandler) // 新建一個mp的mustache解析工具 // 使用 mp 覆蓋 默認裏面的 mc, 由於mc沒法override,因此須要重寫一個.而且在下面使用mp替換掉 val mp = new MustacheParser(this) { // 覆蓋 override def compile(file: String): Mustache = { val reader: Reader = getReader(file) if (reader == null) { throw new MustacheNotFoundException(file) } compile(reader, file) // 調用下面的方法 } // 自定義解析符號. // 主要是第三個參數與第四個參數,默認的是{{和}} override def compile( reader: Reader, file : String): Mustache = { super.compile(reader,file,"<%","%>") } } // scala.concurrent. val cachex = new mutable.HashMap[String,Mustache]() // 初始化cacheLoader protected class MustacheCacheLoader extends CacheLoader[String, Mustache] { @throws(classOf[Exception]) override def load(key: String): Mustache = { mp.compile(key) } } // 爲了可以從入口進入,須要覆蓋 createMustacheCache // 裏面會有cacheLoader,可是須要使用mp來自定義的標籤. override def createMustacheCache: LoadingCache[String, Mustache] = { return CacheBuilder.newBuilder.build(new MustacheCacheLoader) } // 用於緩存cache的地方 override def compilePartial (template: String) : Mustache = { // cache 獲取失敗,則使用mp的compile 編譯 ( 上面override裏裏面的自定義參數 ) cachex.get(template) match { case Some(item) => item case _ => { // 解析結果,存放到cachex裏面 val mustache = mp.compile(template) cachex ++= Map(template -> mustache ) mustache.init mustache } } } // 便於調試代碼 override def compile(name: String): Mustache = { super.compile(name) } } } }