六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 220|回复: 0

使用velocity生成静态页面,及velocity的循环控制

[复制链接]

升级  80%

10

主题

10

主题

10

主题

童生

Rank: 1

积分
40
 楼主| 发表于 2013-2-7 20:02:12 | 显示全部楼层 |阅读模式
最近在做门户网站中用到了生成静态页面的技术,使用的是velocity,小小的总结一下---并不是很深入,不过够用
    一>首先在到http://velocity.apache.org/download.cgi下载velocity的jar包
    二>新建一个properties对象,为velocity的一些属性配值:
    Properties prop = new Properties();      prop.put("runtime.log", config.getServletContext().getRealPath("/WEB-INF/log/velocity.log"));      prop.put("file.resource.loader.path", config.getServletContext().getRealPath("/WEB-INF/vm"));//配置模版目录      prop.put("input.encoding", "gb2312");//输入编码      prop.put("output.encoding", "gb2312");//输出编码      Velocity.init(prop);//初始化      三>从数据库提取数据,并生成静态页面
    List pols = getPols();//数据库查询      try{      File saveDir = new  File(request.getSession().getServletContext().getRealPath("/html"));      //静态文件存放目录      if(!saveDir.exists())saveDir.mkdirs();      VelocityContext context = new VelocityContext();      context.put("pols", pols);//将数据放到velocity内容对象内      Template template = Velocity.getTemplate("Information/moban.vm");      //获得模版; 注意,是在properties里面已经配好的模版目录下     FileOutputStream outStream = new FileOutputStream(new File(saveDir,"index.html"));//生成静态文件名为index.html     OutputStreamWriter writer = new OutputStreamWriter(outStream,"gb2312");              BufferedWriter sw = new BufferedWriter(writer);     template.merge(context, sw);    sw.flush();    sw.close();     outStream.close();     }     catch(Exception e)     {             e.printStackTrace();     }     四>关于生成静态页面的时间,我认为应该在后台添加或修改的同时触发生成静态页面的方法,所以方法三是写在添加或更新的Action里面的,放置在添加,更新的方法语句之后.
    五>模版页的写法,velocity的语法我就不说了,网上一堆一堆的,这里我就说下刚使用velocity时遇到的一个小问题
如何循环遍历一个List集合,并控制循环边界的问题 : 要利用velocity中循环语句的$velocityCount(此参数名为固定的,不可更改)参数,它的作用是记录循环次数,控制循环边界可以用它来实现
 
    #foreach($pol in $pols)      #if($velocityCount<=2)      <li><a>$(pol.content)</a></li>      #end      #end      以上的语句实现的是只循环出集合中的前两个元素,并输出元素的content属性值,如果要求只循环出一个元素,应该写成
 
   #foreach($pol in $pols)     #if($velocityCount<=1)     <li><a>$(pol.content)</a></li>     #end     #end      如需详细的控制,可以写成  #if($velocityCount==1)
    如果需要一个List中的元素显示不同的属性,可以写成
 
   #foreach($pol in $pols)     #if($velocityCount<=2)     <li><a>$(pol.content)</a></li>     #else     <li><a href="${pol.name}.html" mce_href="${pol.name}.html">${pol.content}</a></li>         #end     #end      以上实现的就是让集合中前两个元素只输出pol的content属性值,而之后的元素显示pol的name和content属性值.
    六>OK,大概就这样!
 
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表