zoukankan      html  css  js  c++  java
  • FreeMarer 模板加载,使用FreeMarker加载远程主机上模板文件

    FreeMarer 模板加载,使用FreeMarker加载远程主机上模板文件

    FreeMarker加载模板文件的三种方式:

    1、从文件目录加载

    2、从类路径加载

    3、从Servlet上下文加载

    其中第二个和第三个常用在Web开发环境中,类路径也会使用在普通的Java Project中,

    如果模板文件不是和应用程序放在同一台主机上,那么如何去读取和解析这些模板文件呢?答案是可以解决的,FreeMarker就提供给一种加载模板的方式,查看API就有URLTemplateLoader类,该类为抽象类,从名字就可以看出从给定的URL加载模板文件,这个URL并没有限定来源,

    来源可实现从FTP服务器,Hadoop,db等等。那么可以自定义个加载器,从这个类继承,实现里面的getUrl方法即可:

    /**
    * 自定义远程模板加载器,用来加载远程机器上存放的模板文件.HTTP
    *
    * @author wanglijun
    *
    */
    public class RemoteTemplateLoader extends URLTemplateLoader {
    // 远程模板文件的存储路径(目录)
    private String remotePath;

    private List<String> includePaths;

    public RemoteTemplateLoader(String remotePath) {
    if (remotePath == null) {
    throw new IllegalArgumentException("remotePath is null");
    }
    this.remotePath = canonicalizePrefix(remotePath);
    if (this.remotePath.indexOf('/') == 0) {
    this.remotePath = this.remotePath.substring(this.remotePath.indexOf('/') + 1);
    }
    }

    @Override
    public Object findTemplateSource(String name) throws IOException {
    if(this.includePaths!=null&&this.includePaths.contains(name)){
    return super.findTemplateSource(name);
    }
    return null;

    }

    @Override
    protected URL getURL(String name) {
    // name = name.replace("_zh", "");
    String fullPath = this.remotePath + name;
    System.out.println(fullPath);
    if ((this.remotePath.equals("/")) && (!isSchemeless(fullPath))) {
    return null;
    }

    URL url = null;
    try {
    url = new URL(fullPath);
    } catch (MalformedURLException e) {
    e.printStackTrace();
    }
    return url;
    }

    private static boolean isSchemeless(String fullPath) {
    int i = 0;
    int ln = fullPath.length();

    if ((i < ln) && (fullPath.charAt(i) == '/'))
    i++;

    while (i < ln) {
    char c = fullPath.charAt(i);
    if (c == '/')
    return true;
    if (c == ':')
    return false;
    i++;
    }
    return true;
    }

    public void setRemotePath(String remotePath) {
    this.remotePath = remotePath;
    }

    public List<String> getIncludePaths() {
    return includePaths;
    }

    public void setIncludePaths(List<String> includePaths) {
    this.includePaths = includePaths;
    }
    }

    Spring MVC配置文件如下:

    <!-- 针对free marker的视图 -->
    <bean id="viewResolver"
    class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
    <property name="cache" value="false" />
    <property name="order" value="1" />
    <property name="viewClass"
    value="org.springframework.web.servlet.view.freemarker.FreeMarkerView" />
    <!-- <property name="viewNames"> <array> <value>*.ftl</value> </array>
    </property> -->
    <property name="requestContextAttribute" value="request" />
    <property name="exposeSpringMacroHelpers" value="true" />
    <property name="exposeRequestAttributes" value="true" />
    <property name="exposeSessionAttributes" value="true" />
    <property name="allowSessionOverride" value="true" />
    <!--编码 -->
    <property name="contentType" value="text/html;charset=UTF-8" />
    </bean>

    <bean id="freeMarkerConfigurer"
    class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
    <property name="configuration" ref="freemarkerConfiguration" />
    </bean>
    <bean id="remoteTemplateLoader" class="com.saic.demo.web.RemoteTemplateLoader">
    <constructor-arg name="remotePath" value="http://192.168.1.20:9090/" />

    <!--设置远程加载路径-->

    <property name="includePaths">
    <list>
    <value>footer.ftl</value>
    <value>common/footer.ftl</value>
    </list>
    </property>
    </bean>

    <util:list id="preTemplateLoaders" list-class="java.util.ArrayList"
    value-type="com.saic.demo.web.RemoteTemplateLoader">
    <ref bean="remoteTemplateLoader" />
    </util:list>

    <bean id="freemarkerConfiguration"
    class="org.springframework.ui.freemarker.FreeMarkerConfigurationFactoryBean">
    <property name="postTemplateLoaders" ref="preTemplateLoaders" />
    <!-- 模板加载路径 -->
    <property name="templateLoaderPaths">
    <list>
    <value>/WEB-INF/views/</value>
    <value>classpath:/views/</value>
    </list>
    </property>
    <property name="defaultEncoding" value="utf-8" />
    </bean>

    需要注意的是:通过远程加载模板,FreeMarker没有check远程加载此文件是否存在,所以只能通过本地列表(includePaths)判断是否存在,加快模板加载速度。

                         另外也通过http和FTP方式判断此模板是否远程服务器存在,但考虑性能及文件加载数量(主要是加载一些公共头信息文件,文件数据量有限)

                         通过此扩展功能可实现(header.ftl、footer.ftl及公共模块的管理),在项目中可实现多个WEB网络实现统一的管理。

  • 相关阅读:
    poj-1069(三角形和六边形)(转)
    poj-1024(唯一最短路径)(转)
    poj-1022(四维模仿)(转)
    poj-1020(填蛋糕)(转)
    poj-1011
    poj-1010(转)
    poj-2312
    nyoj--幸运三角形
    nyoj--Divideing Jewels
    关于 APP在接入flutter之后在多任务下看不到AppName,只有APP图标,正常应该是APP图标+APP名称
  • 原文地址:https://www.cnblogs.com/scwanglijun/p/4035357.html
Copyright © 2011-2022 走看看