SpringMVC Freemarker 全局变量的三种配置方式

 

 方法一 直接在spring-servlet.xml 中进行配置

复制代码
    <bean id="freemarkerConfiguration" class="org.springframework.beans.factory.config.PropertiesFactoryBean">  
        <property name="location" value="classpath:freemarker.properties" />  
    </bean>  
    <bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
        <property name="templateLoaderPaths" value="/templates" />
        <property name="defaultEncoding" value="utf-8" />
        <property name="freemarkerSettings">
            <props>
                <prop key="template_update_delay">0</prop>
                <prop key="url_escaping_charset">UTF-8</prop>
                <prop key="locale">UTF-8</prop>
                <prop key="datetime_format">yyyy-MM-dd HH:mm:ss</prop>
                <prop key="date_format">yyyy-MM-dd</prop>
                <prop key="number_format">#.##</prop>
                <prop key="classic_compatible">true</prop>
            </props>
        </property>
        <property name="freemarkerVariables">
            <map>
                <entry key="BasePath" value="${base.path}" />
                <entry key="IncPath" value="${web.root}" />
                <entry key="xml_escape" value-ref="fmXmlEscape" />
            </map>
        </property>
    </bean>

    <bean id="fmXmlEscape" class="freemarker.template.utility.XmlEscape" />    
复制代码

 freemarker.properties

base.path=localhost:8080
web.root=www.springmvc.com

 

 
 
方法二(推荐)自定义一个视图,继承FreeMarkerView
复制代码
public class MyFreeMarkerView extends FreeMarkerView {
    private static final String CONTEXT_PATH = "base";

    @Override
    protected void exposeHelpers(Map<String, Object> model, HttpServletRequest request) throws Exception {
        model.put(CONTEXT_PATH, request.getContextPath());
        model.put("cxb", "caoxiaobo");
        super.exposeHelpers(model, request);
    }
}
复制代码

 

复制代码
    <!--视图解释器 -->  
    <bean id="viewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver"> 
        <property name="exposeRequestAttributes" value="true" />
        <property name="exposeSessionAttributes" value="true" />
     <!-- 自定义视图 -->
     <property name="viewClass"> <value>com.view.freemarker.MyFreeMarkerView</value> </property> <property name="cache" value="true" /> <!-- <property name="prefix" value="/" /> --> <property name="suffix" value=".ftl"/> <property name="contentType" value="text/html;charset=UTF-8"></property> </bean>
复制代码

 

 
方法三 自定义一个 FreeMarkerConfigurer 继承 FreeMarkerConfigurationFactory 并实现FreeMarkerConfig, InitializingBean, ResourceLoaderAware, ServletContextAware
复制代码
// 这里其实就是完整的替换了FreeMarkerConfigurer
public
class MyFreeMarkerConfigurer extends FreeMarkerConfigurationFactory implements FreeMarkerConfig, InitializingBean, ResourceLoaderAware, ServletContextAware { private Configuration configuration; private TaglibFactory taglibFactory; @Override public void afterPropertiesSet() throws IOException, TemplateException { if (this.configuration == null) { this.configuration = createConfiguration(); } SimpleHash model = new SimpleHash(); model.put("baseUrl", "www.springmvc.com"); this.configuration.setAllSharedVariables(model); } // ... 省略很多方法 }
复制代码

 

复制代码
    <bean id="freemarkerConfig" class="com.view.freemarker.MyFreeMarkerConfigurer"> 
        <property name="templateLoaderPath" value="/" />   
        <property name="freemarkerSettings">  
            <props>  
                <prop key="locale">zh_CN</prop>
                <prop key="template_update_delay">0</prop>  
                <prop key="default_encoding">UTF-8</prop>  
                <prop key="number_format">0.##########</prop>  
                <prop key="datetime_format">yyyy-MM-dd HH:mm:ss</prop>  
                <prop key="classic_compatible">true</prop>  
                <prop key="template_exception_handler">ignore</prop>  
            </props>  
        </property>
    </bean> 
复制代码

 

posted @   cao_xiaobo  阅读(11801)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示