注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

罔少年

QQ 332256483

 
 
 

日志

 
 

Android freemarker 2016 应用  

2016-09-01 10:05:59|  分类: android |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
Android freemarker - 我是小黄人 - lanaiver6291的博客
 
1、freemarker是什么?
模板引擎,可以将数据和模板整合,生成 .html文件

2、freemarker应用
基于本地模板,只要载入数据源,就能生成想要的.html
3、freemarker应优点
节约流量,加快网页加载速度

4、具体应用
WebView加载本地模板引擎
main.tpl -------> main.ftl --------> main.html ------> webView.load(main.html)

----------------------------------------------------------------------------------------------------------------------------
1】将main.tpl 文件放到assets目录下
main.tpl 

<html>
<head>
<title>Welcome!</title>
</head>
<body>
<h1>Welcome ${user}!</h1>
<p>Our latest product:


<!-- 如果使用对象传值,会无法生成,测试了无数遍,一直没找到原因 -->

<!--
<a href="${product.url}">${
product.name}</a>!

-->


</body>
</html>

compile 'org.freemarker:freemarker-gae:2.3.25-incubating'

2】根据main.tpl生成main.ftl
private void prepareTemplate() throws IOException {
//获取app目录 data/data/package/file/
String destPath = getFilesDir().getAbsolutePath();
File dir = new File(destPath);
//判断文件夹是否存在并创建
if (!dir.exists()) {
dir.mkdir();
}
//需要生成的.ftl模板文件名及路径
String tempFile = destPath + "/" + "main.ftl";
if (!(new File(tempFile).exists())) {
//获取assets.tpl模板文件
InputStream is = getResources().getAssets().open("main.tpl");
//生成.ftl模板文件
FileOutputStream fos = new FileOutputStream(tempFile);
byte[] buffer = new byte[7168];
int count = 0;
while ((count = is.read(buffer)) > 0) {
fos.write(buffer, 0, count);
}
fos.flush();
fos.close();
is.close();
}
}
3】根据main.ftl 和数据 生成main.html
private void genHTML(Product object) {
String destPath = getFilesDir().getAbsolutePath();
FileWriter out = null;
    //数据源
Map root = new HashMap();
root.put("user", "user"); //传入字符串
//root.put("product", object.url()); //传入对象(会报错)

try {
Configuration cfg = new Configuration(new Version(2,3,0));
cfg.setDefaultEncoding("UTF-8");
//设置报错提示
cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
//设置报错提示
cfg.setLogTemplateExceptions(true);
out = new FileWriter(new File(destPath + "main.html"));
//设置.ftl模板文件路径
cfg.setDirectoryForTemplateLoading(new File(destPath));
//设置template加载的.ftl模板文件名称
Template temp = cfg.getTemplate("main.ftl");
//讲数据源和模板生成.html文件
temp.process(root, out);
out.flush();

} catch (MalformedTemplateNameException e) {

} catch (IOException e) {

} catch (Exception e){

}finally {
try {
if (out != null)
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
4】webView加载main.html文件
webview.post(new Runnable() {
@Override
public void run() {
String templateDirRoot = getFilesDir().getAbsolutePath();
String url = "file://" + templateDirRoot + "main.html";
webview.loadUrl(url);
}
});

5、疑问
1】为什么要把main.tpl先转成main.ftl文件,而不直接把main.ftl文件也放到assets中,然后template直接加载main.ftl文件?
因为assets中的文件无法直接读取,所以需要先把文件放到data/data/package/....中再操作

2】如果在main.ftl文件中有 ${model.name} 就无法再继续转成main.html文件

Unresolved exception class when finding catch block: java.beans.IntrospectionException


解决:官方说可以,但自己测试了无数遍,就是无法编译对象模式

//正确写法

User user = new User();

user.setName="张三"


Map map = HashMap();

map.put("name", user.getName());


//main.tpl

<html>

<body>

${name}

<body>

<html>

//错误写法

User user = new User();

user.setName="张三"


Map map = HashMap();

map.put("user", user);


//main.tpl

<html>

<body>

${user.name}

<body>

<html>


总结:最后发现这玩意其实页面加载速度并不快,毕竟需要对SD卡文件读写。当然数据流量确实省了。也省去了.java与.html之间的数据交互代码


  评论这张
 
阅读(23)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017