早上上班的时间,路过一个小区,看到小区外停放着一辆卖西瓜的三轮车,车上坐了个小女孩,大概10岁左右吧,脖子上挂个布袋,小女孩晒的黑黑的。从她旁边过去没多远,同样碰到了一个孩子,也是10多岁,在母亲的陪伴下,拿着游泳圈,看样子,可能是要去游泳,可能天气太热了,老呆在空调房里也不好,家长带着孩子去游下泳,锻炼锻炼身体,挺好。
Continue reading ‘人和人之间的不同’
早上上班的时间,路过一个小区,看到小区外停放着一辆卖西瓜的三轮车,车上坐了个小女孩,大概10岁左右吧,脖子上挂个布袋,小女孩晒的黑黑的。从她旁边过去没多远,同样碰到了一个孩子,也是10多岁,在母亲的陪伴下,拿着游泳圈,看样子,可能是要去游泳,可能天气太热了,老呆在空调房里也不好,家长带着孩子去游下泳,锻炼锻炼身体,挺好。
Continue reading ‘人和人之间的不同’
比较郁闷,这个标题不知道怎么起,以前写过关于FreeMarker生成静态页面,还有调用的一些文章,但这次好像又稍微有点不同,说不同呢,又差不多,搞得都不知道自己在捣鼓些什么了,- -#,暂且就这样说好了。
自己平常在用到一些程序的时候,比较喜欢关注程序的模板方面,现在大部分的程序都能实现了灵活的模板设计,将模板和程序分离开来,一直都在想在java下的解决方案,每次想到这块,脑子里第一就会想到FreeMarker,总感觉能实现,但自己又说不清楚怎么来实现,正好,今天有点时间,抽空自己写了个简单的实力来实现这个功能,就类似于说,我可以自己定义一个方法的调用,然后决定我调用多少条文章,是否调用置顶了之类的东东,唉,说是不好说,直接来代码好了。
主要的文件一共有三个,一个Servlet,一个标记解析的类,一个模板文件,代码如下:
package com.fm.study;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
import freemarker.template.TemplateException;
/**
* 访问的Servlet
*
* @author HuZhigang
* @date 2009-6-29
*/
public class FMDemo extends HttpServlet {
/**
*
*/
private static final long serialVersionUID = 8295505224176026191L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
@SuppressWarnings("unchecked")
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();
Configuration cfg = new Configuration();
//设置FreeMarker需要读取的模板路径
String path = this.getServletContext().getRealPath("/")
+ "WEB-INF\\ftl";
cfg.setDirectoryForTemplateLoading(new File(path));
cfg.setObjectWrapper(new DefaultObjectWrapper());
cfg.setDefaultEncoding("utf-8");
//模板文件名
Template temp = cfg.getTemplate("index.ftl");
Map root = new HashMap();
//写入一个变量,key对应value
root.put("user", "Hmilyld");
//创建一个回调变量
root.put("call", new CallFactory());
temp.process(root, out);
} catch (TemplateException e) {
e.printStackTrace();
}
}
}
代码很简单,主要就是读取模板文件然后输出就可以了,主要注意的是这句:root.put(“call”, new CallFactory());我们定义一个变量,然后可以调用我们的方法。
下面是我们需要操作的方法,CallFactory需要实现TemplateMethodModel这个接口,然后我们所传入的参数以List的形式传入,这个时候,可以读取List来获取我们相关传入的参数,代码如下:
package com.fm.study;
import java.util.ArrayList;
import java.util.List;
import com.fm.bean.ArticleBean;
import com.fm.bean.ProductBean;
import freemarker.template.TemplateMethodModel;
import freemarker.template.TemplateModelException;
/**
* 解析标记的相关方法
*
* @author HuZhigang
* @date 2009-6-29
*/
public class CallFactory implements TemplateMethodModel {
@SuppressWarnings("unchecked")
public Object exec(List arg0) throws TemplateModelException {
String type = (String) arg0.get(0);
if ("article".equals(type)) {
// 如果标记为article,则调用文章的相关方法
return article(arg0);
} else if ("product".equals(type)) {
// 如果标记为product,则调用商品的相关方法
return product(arg0);
} else {
throw new TemplateModelException("Error!");
}
}
/**
* 调用文章的相关方法
*
* @return
* @author HuZhigang
*/
private Object article(List<String> param) {
List<ArticleBean> list = new ArrayList<ArticleBean>();
int count = Integer.parseInt(param.get(1));
for (int i = 0; i < count; i++) {
ArticleBean ab = new ArticleBean();
ab.setTitle("这里是标题--" + i);
ab.setContent("这里是内容--" + i);
ab.setAuthor("这里是作者" + i);
ab.setUrl("这里是url--" + i);
list.add(ab);
}
return list;
}
/**
* 调用产品的相关方法
*
* @return
* @author HuZhigang
*/
private Object product(List<String> param) {
List<ProductBean> list = new ArrayList<ProductBean>();
int count = Integer.parseInt(param.get(1));
for (int i = 0; i < count; i++) {
ProductBean pb = new ProductBean();
pb.setName("这里是商品标题--" + i);
pb.setMeta("这里是商品简介--" + i);
pb.setPrice((float) Math.random());
list.add(pb);
}
return list;
}
}
OK,主要实现的功能都在这个里面了,当然,你可以完全拆分开,不同的类来实现不同的方法,具体应用就看自己怎么用了,可以按照传入的条件判断需要调用多少内容,是否固定,是否推荐等等内容
下面就是我们最后的模板文件,很简单
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>FreeMarker标记解析演示</title>
<style>
body{
font-size:12px;
}
#article,#product{
float:left;
margin:5px;
}
td{
width:120px;
}
</style>
</head>
<body>
<h1>Hello,${user}</h1>
<div id="main">
<div id="article">
<h2>文章列表演示</h2>
<#--根据创建的call,调用我们需要调用的方法,我们这里传入article类型,然后数量为20条 -->
<#assign article = call("article",20,"true")>
<table border="1">
<tr>
<td>标题</td>
<td>内容</td>
<td>作者</td>
<td>url</td>
</tr>
<#--循环打印出所有内容-->
<#list article as art>
<tr>
<td>${art.title}</td>
<td>${art.content}</td>
<td>${art.author}</td>
<td>${art.url}</td>
</tr>
</#list>
</table>
</div>
<div id="product">
<h2>商品列表演示</h2>
<#--调用类型为商品,20条数据-->
<#assign product = call("product",20)>
<table border="1">
<tr>
<td>名称</td>
<td>价格</td>
<td>简介</td>
</tr>
<#list product as pro>
<tr>
<td>${pro.name}</td>
<td>${pro.price}</td>
<td>${pro.meta}</td>
</tr>
</#list>
</table>
</div>
</div>
</body>
</html>
OK,搞定,主要就是这么多的操作,还有其他的一些高级的应用,根据实际情况来自己修改,偶也没深入的去研究,只是翻开FreeMarker的API来看了下,大致的一个功能实现,嘿,对后面自己需要写的一个东西是用处大大啊。
TNND,怪不得老有人说,天气预报要反着看,本来今天满怀希望的等待着郑州会下雨,让天气凉爽点,结果倒好,和昨天一样,闷闷的天气,搞得人心情坏的不行,在家里呆着都不想出去,怀念冬天,至少冷了可以多穿衣服,这热了…已经脱的不能再脱了.:(
中午老婆还说,家里的电脑要换下了,都不能用了,唉,可怜这台老爷机,跟了我这么多年,还是难逃被更新的命运,从03年跟着我,到现在,6年了啊,陪伴了俺多少个日日夜夜,想当年那相当牛X的配置,到现在跑个eclipse都费劲了,可怜的机器.其实一直不想着换,反正在家里也就是看个网页,弄点资料什么的,没啥其他的大用途,不过现在老有一些问题,硬盘无缘无故的会停止工作,一直没搞明白是哪的问题,不过推测可能是过热?散热不行了?冬天这种问题出现的几率会小些,一到夏天就不行了,太热,还得每次都要开着空调才能耍,- -#,换了吧,这台还留在这里,争取以后当个珍藏品,嘿.
Continue reading ‘本来说郑州要下雨的’
每次都要用手机连接电脑,然后带电脑上网,本来速度就慢的要死,结果还要每次打开blog去随便写点什么,郁闷之下,装了个blog离线发布工具,Windows live writer,以前在用wordpress的时候用过段时间,感觉还蛮不错,方便了不少,这次转换到typecho后,本以为离线发布的功能没有了,结果很意外,竟然有这个功能,无需其他任何设置就可以直接使用,嘿,惊喜中,不错不错,很值得推荐的一个blog,再帮忙AD下。:)typecho所向披靡,哈!
Continue reading ‘在电脑上装了个Windows live writer,随笔一篇’
宝宝后天就要上班了,恢复的还算可以,本来身体就不是很好,希望一切都好起来,没什么事吧。
郑州这两天真的很热,热的有点过了头,每天都40多度,老天,中午都不能出去,皮肤感觉都在烧着一样,太热了,加上在分局那边跑着,哎,估计今年夏天有得爽了,要整个黑一圈啊。倒霉,还是写程序号,比这吃力不讨好的事情强多了,最起码不用来回跑,看到那些自以为的人就感觉恶心。坚持下吧,还有两个多月就能解脱了。好日子,快点到来吧!
热,真热!
很意外,没有想到竟然真的会有朋友搜索’胡志刚’这个关键字来找到这里,看来网络之大,什么事情都会有诶,任何的关键字都会有可能,嘿!
前段时间把blog从wp转换到Typecho后,blog的名字就改了,也是为了响应XXX的实名制吧,改成了自己的真实姓名’胡志刚’,本来么,没有其他什么好的名字来写,索性就实名上阵好了,其实还有一个想法,那就是希望能有某位好久没有联系的同学或者同事或者朋友能偶然通过搜索引擎找到Me,因为平时在无聊时,我就有个习惯,去Google搜索下某位朋友的名字,看能否找的到,嘿,是否有点BT?好像在窥视别人隐私一样,恩,不错,有快感.看来还是起了一定效果的,从Google和百度都有一些朋友搜索’胡志刚’跑到这里来的,哈哈,挺有趣,不知道这些朋友为什么会搜索这个关键字,是有朋友叫’胡志刚’?恩,不错,说不准还能找到些同名的朋友.
Continue reading ‘竟然真有部分朋友通过搜索’胡志刚’找到这里诶’
其实就算没事的话,也想请假休息几天了,这段时间太累了,虽说仔细算算也没做什么东西,但跨行业的工作让人感觉很疲惫,每天奔波与不同的地点,加上后方无止境的工作安排,不知道做到什么时间是个头,让人很头疼,在我看来,整个项目貌似都没有很好的进展,每个人都很疲惫,但效率还不是很乐观。
本来说今天下午火车到了后就回家呢,谁知道还要来公司一趟,其实回来也没什么事情,无非就是让项目上的人知道,哦,他们几个开会回来了,就这么多而已,实在是不想回来,不过还是算了,领导说了还是回来吧,省得回头有什么事了也不好说。结果等到现在,都4点多了,还没一个人过来,就我自己一个人来了,郁闷。
请假应该会批吧,今天回家商量商量看看怎么弄,头疼啊,唉,怕事。:(
来南京两次了,都没怎么出去转,这次正好赶到机会,国网那边完了后提供了一天的旅游时间,跟着把南京转了下,累得不行了,时间短,景点多,赶的那个叫急啊。
其实有时候到一些有历史古迹的地方转转挺好的,同一个地方,在N年前,有某位伟人在这里留下了什么,总统府,中山陵,南京的标志,孙中山,蒋介石曾经工作过和埋葬的地方,到了颐园,看看明朝徐达曾经的官邸,有种很不同的感觉,现在我站在这里,但在几百年前,这里却是皇家园林,很奇妙的感觉,如果时光能倒退,倒是很想看看当年这些人在这里是怎么走过的。
在鹫峰寺许了个愿,拜了拜佛,这个东西不全信,但也不能不信,希望家人健康长寿,希望自己工作顺利。
照片回头整理整理搞上来点,不过大部分都是景色,自己很少照相的。:)
这会感觉好累,洗澡,睡觉,明天就出发回郑州了,嘿。去解决郑州那边的事情吧,一切都会好起来,努力!