使用FreeMarker加载远程主机上模板文件,比如FTP,Hadoop等(转载)

都知道FreeMarker加载模板文件有以下三种方式:

1、从文件目录加载

2、从类路径加载

3、从Servlet上下文加载

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

本文主要说明如果模板文件不是和应用程序放在同一台主机上,那么如何去读取和解析这些模板文件呢?答案是可以解决的,FreeMarker就提供给

我们一种加载模板的方式,查看API就有URLTemplateLoader类,该类为抽象类,从名字就可以看出从给定的URL加载模板文件,这个URL并没有限定来源,

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

[java] view plaincopy

  1. /**
  2. *
  3. */
  4. package com.XX.XX.freemarker;
  5. import java.net.MalformedURLException;
  6. import java.net.URL;
  7. import freemarker.cache.URLTemplateLoader;
  8. /**
  9. * 自定义远程模板加载器,用来加载远程机器上存放的模板文件,比如FTP,Handoop等上的模板文件
  10. * @author Administrator
  11. *
  12. */
  13. public class RemoteTemplateLoader extends URLTemplateLoader
  14. {
  15. //远程模板文件的存储路径(目录)
  16. private String remotePath;
  17. public RemoteTemplateLoader (String remotePath)
  18. {
  19. if (remotePath == null)
  20. {
  21. throw new IllegalArgumentException("remotePath is null");
  22. }
  23. this.remotePath = canonicalizePrefix(remotePath);
  24. if (this.remotePath.indexOf(‘/‘) == 0)
  25. {
  26. this.remotePath = this.remotePath.substring(this.remotePath.indexOf(‘/‘) + 1);
  27. }
  28. }
  29. @Override
  30. protected URL getURL(String name)
  31. {
  32. String fullPath = this.remotePath + name;
  33. if ((this.remotePath.equals("/")) && (!isSchemeless(fullPath)))
  34. {
  35. return null;
  36. }
  37. if (this.remotePath.indexOf("streamFile") == -1 && this.remotePath.indexOf("webhdfs") != -1)//这个是针对不直接使用文件流形式进行访问和读取文件而使用的格式
  38. {
  39. fullPath = fullPath + "?op=OPEN";
  40. }
  41. URL url = null;
  42. try
  43. {
  44. url = new URL(fullPath);
  45. }
  46. catch (MalformedURLException e)
  47. {
  48. e.printStackTrace();
  49. }
  50. return url;
  51. }
  52. private static boolean isSchemeless(String fullPath) {
  53. int i = 0;
  54. int ln = fullPath.length();
  55. if ((i < ln) && (fullPath.charAt(i) == ‘/‘)) i++;
  56. while (i < ln) {
  57. char c = fullPath.charAt(i);
  58. if (c == ‘/‘) return true;
  59. if (c == ‘:‘) return false;
  60. i++;
  61. }
  62. return true;
  63. }
  64. }
时间: 2024-08-03 06:54:19

使用FreeMarker加载远程主机上模板文件,比如FTP,Hadoop等(转载)的相关文章

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

FreeMarker加载模板文件的三种方式: 1.从文件目录加载 2.从类路径加载 3.从Servlet上下文加载 其中第二个和第三个常用在Web开发环境中,类路径也会使用在普通的Java Project中, 如果模板文件不是和应用程序放在同一台主机上,那么如何去读取和解析这些模板文件呢?答案是可以解决的,FreeMarker就提供给一种加载模板的方式,查看API就有URLTemplateLoader类,该类为抽象类,从名字就可以看出从给定的URL加载模板文件,这个URL并没有限定来源, 来源可

ThinkPHP 3.2.3 自动加载公共函数文件的方法

方法一.加载默认的公共函数文件 在 ThinkPHP 3.2.3 中,默认的公共函数文件位于公共模块 ./Application/Common 下,访问所有的模块之前都会首先加载公共模块下面的配置文件(Conf/config.php)和公共函数文件(Common/function.php),即默认的公共函数文件为 ./Application/Common/Common/function.php. 例如,在 ./Application/Common/Common 下新建 function.php,

Struts2的国际化(二)-利用超链接实现动态加载国际化资源文件

原理:程序是根据Locale来确定国际化资源文件,因此关键之处在于知道 Struts2 框架是如何确定 Local 对象的 ! 由于Struts2 使用 i18n 拦截器处理国际化,并且将其注册在默认的拦截器中,因此,可以通过阅读 I18N 拦截器知道. 具体确定 Locale 对象的过程: > Struts2 使用 i18n 拦截器 处理国际化,并且将其注册在默认的拦截器栈中 > i18n拦截器在执行Action方法前,自动查找请求中一个名为 request_locale 的参数. 如果该参

ios UIWebView 加载网页、文件、 html

UIWebView  是用来加载加载网页数据的一个框.UIWebView可以用来加载pdf word doc 等等文件 生成webview 有两种方法,1.通过storyboard 拖拽 2.通过alloc init 来初始化 创建webview,下列文本中 _webView.dataDetectorTypes = UIDataDetectorTypeAll; 是识别webview中的类型,例如 当webview中有电话号码,点击号码就能直接打电话 - (UIWebView *)webView

spring不断重新加载所有类文件

第一次写博文,可能有点兴奋和啰嗦,先说说使用的环境:resin+spring+struts,服务器是测试用的,由运维同事维护,里面有几个项目,仅供开发的同事修改. 事情从昨天下午开始, 查看测试服务器log时,发现spring不断的加载类文件,但却没有任何错误信息提示,初步判断应该是某开发的同事修改了配置文件导致的问题,但看了一遍没发现什么问题,难道服务器作了什么动作?于是问了一名运维同事,说没作什么修改,一听心血来潮,因为这个问题可以加入我的问题库里面. 因为配置正常,怀疑是某些类加载不正常导

PHP加载另一个文件类的方法

加载另一个文件类的方法 当前文件下有a.php 和b.php,想要在class b中引入class a <?php    class a    {        public $name = 'zhouqi';        public function say()        {            echo 'hello '.$this->name;        }    } <?php    class b    {        //require('a.php'); 错

使用jQuery动态加载js脚本文件的方法

动态加载Javascript是一项非常强大且有用的技术.这方面的主题在网上已经讨论了不少,我也经常会在一些个人项目上使用RequireJS和Dojo加载js 它们很强大,但有时候也会得不偿失.如果你使用的是jQuery,它里面有一个内置的方法可以用来加载单个js文件.当你需要延迟加载一些js插件或其它类型的文件时,可以使用这个方法.下面就介绍一下如何使用它! 一.jQuery getScript()方法加载JavaScript jQuery内置了一个方法可以加载单一的js文件:当加载完成后你可以

能否使用require(&#39;.json&#39;)的方式加载大量JSON文件?

Node.js中推崇非阻塞I/O,但是require一个模块时却是同步调用的,这会带来性能上的开销,但并不是每次require都很耗时,因为在require成功之后会缓存起来,在此加载时直接从缓存读取,并没有额外开销. 当通过.json的方式加载文件时,固然方便,但大量使用时会导致这些数据被缓存.大量数据会驻留在内存中,导致GC频繁和内存泄漏. 摘自:<技术之瞳> 能否使用require('.json')的方式加载大量JSON文件?

pygame加载中文名mp3文件出现error

好一阵子没有写东西了,最近几天在做一个基于Python pygame的音乐播放器,本来想做完了,再来发篇文章的,可越做越深,框架大致出来了,考虑周期比较长,也可能是我个人问题,做得比较慢.下面来谈谈pygame.mixer.music.load()加载中文名的mp3文件问题. (发表时间2017-03-30 22:45:58 原创链接http://www.cnblogs.com/dearvee/p/6649055.html) #前言: 今天刚刚做了个音乐列表,但笔者发现在指定目录mp3文件名为中