據說JFinal更新到2.2後,功能更強大了,因此立刻拿來試試。以前一直對國際化挺好奇的,可是項目中缺不多機會用到,因此就打算試試。結果遇到了如下問題:關於JFinal2.2中I18nInterceptor的問題html
在@JFinal 的指導下,本身從新實現了一個I81n的攔截器:java
public class MyI18nInterceptor extends I18nInterceptor{ private static String defaultLocale = Locale.getDefault().getLanguage() + "_" + Locale.getDefault().getCountry(); public void intercept(Invocation inv) { Controller c = inv.getController(); String localeParaName = getLocaleParaName(); String locale = c.getPara(localeParaName); if (StrKit.notBlank(locale)) { c.setCookie(localeParaName, locale, Const.DEFAULT_I18N_MAX_AGE_OF_COOKIE); } else { locale = c.getCookie(localeParaName); if (StrKit.isBlank(locale)) locale = defaultLocale; } Res res = I18n.use(getBaseName(), locale); c.setAttr(getResName(), res); inv.invoke();//執行相應的action SearchService page = c.getAttr("resultPage"); if(null != page) { String paginate = res.format("Pageinate",page.getPageNumber(),page.getTotalPage()); c.setAttr("pageMsg",paginate); } } }
這裏跟原來提供的區別就是,個人實現仍是經過選擇properties文件來變動頁面的語言,而原來是經過改變資源文件的路徑,即變動html文件來實現變動頁面的語言,可是原來的實現存在如下問題:spa
if (isSwitchView) { switchView(locale, c); } else { Res res = I18n.use(getBaseName(), locale); c.setAttr(getResName(), res); } inv.invoke();
因爲沒有執行inv.invoke(),Controller中的render的值仍然爲空,因此執行switchView時沒有效果;.net
個人實現,有一個好處就是,若是有些值須要在執行完action以後格式化輸出,那就在inv.invoke( )後獲取相應的值,而後進行格式化後再配置到Controller的Attrs中,這樣在Controller中的action中,代碼就更加簡潔了。code
但願對你們有所幫助~orm