大家都做过SQL分页,可能做静态页分页的不多,这个东西做业务系统用不到,但是做小型企业网站用的比较多,其实像这种小型网站真是没啥技术含量,无非是文章管理,产品介绍,在线留言之类的,逻辑太过简单,也就用到了在线编辑器和前台静态化(不过也有很多公司还是直接从数据库中读的) PHP中有个Smarty模板,JAVA中有Velocity和FreeMarker,其实生成静态页和freemarker没有啥关系,你用txt,xml都行,直接也String都可以的,废话不多说了,开始。
效果图:
JAR包清单
commons-io-1.4.jar
commons-lang-2.4.jar
freemarker.jar
1.首先建立文章实体类
public class Article implements Serializable { public int id; public String title; public String context; public Date createDate; // get.. set.. public String toString() { return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE); } }
为什么不用private,其实根本无所谓,没破坏啥封装,看long大发的Android javaeye客户端代码不也是public的吗!
2. 建立ArticleDao,里面有2个方法,一个是获取所以文章(这里采用循环数据),另一个获取分页数据.
/** * 拿到所有文章 * @return List<Article> */ public static List<Article> getAllArticles() { List<Article> lstArticle = new ArrayList<Article>(); for (int i = 1; i <= 33; i++) { Article a = new Article(); a.id = i; a.title = "Title_" + i; a.context = "Context_" + i; a.createDate = new Date(); lstArticle.add(a); } return lstArticle; } /** * 根据当前页和每页大小拿到分页数据 * * @param pageNo * 当前页 * @param pageSize * 每页大小 * @param lstArticle * 数据 * @return List<Article> */ public static List<Article> getDataByPageNo(int pageNo, int pageSize, List<Article> lstArticle) { int totalpage = pageNo * pageSize > lstArticle.size() ? lstArticle.size() : pageNo * pageSize; return lstArticle.subList((pageNo - 1) * pageSize, totalpage); }
3.编写ArticleService层
* 思路,先调用ArticleDao.getAllArticle() 拿到所有数据,然后算出有多少页,再从第1页开始取数据
比如现在取第一页的数据,就开始生成一个xxx_1.html,接下来去第2页数据,就开始生成xxx_2.html
那么这样就可以有分页功能了哦 :)
public class ArticleService { /** * 默认存放路径 */ private static String DEFAULT_DIRECTORY_NAME = "Article"; private static Configuration cfg = FreeMarkerManager.getInstance().getConfiguration(); /** * 发布静态页 * * @param pageSize * 每页显示多少条 * @param directory * 存放目录名字 * @throws Exception */ public static void releaseArticle(int pageSize, String directory) throws Exception { // 删除文件后再重建 File file = new File("c:/ " + directory + "/"); FileUtils.deleteDirectory(file); file.mkdirs(); // 拿到所有数据 List<Article> lstArticle = ArticleDao.getAllArticles(); if (lstArticle != null && lstArticle.size() > 0) { // 得到一共有多少页数据 PageModel<Article> pms = new PageModel<Article>(1, pageSize, null, lstArticle.size()); long totalPage = pms.getTotalpage(); Template tmp = cfg.getTemplate("TestList.ftl"); // 将每页的数据生成静态页 for (int i = 1; i <= totalPage; i++) { PageModel<Article> pm = new PageModel<Article>(i, pageSize, ArticleDao.getDataByPageNo(i, pageSize, lstArticle), lstArticle.size()); Map<String, Object> root = new HashMap<String, Object>(); root.put("pm", pm); Writer out = new FileWriter("c:/ " + directory + "/t_" + i + ".html"); tmp.process(root, out); } } } /** * 发布静态页 * * @param pageSize * 每页显示多少条 * @throws Exception */ public static void releaseArticle(int pageSize) throws Exception { releaseArticle(pageSize, DEFAULT_DIRECTORY_NAME); } /** * 发布静态页 * * @throws Exception */ public static void releaseArticle() throws Exception { releaseArticle(10, DEFAULT_DIRECTORY_NAME); } }
4. 对应的模板文件 .ftl
<#macro isDisabled comparePage> <#if "${comparePage}" == "${pm.pageNo}"><#t> disabled="disabled" href="#"<#t> <#else> href="t_${comparePage}.html"<#t> </#if> </#macro> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title> New Document </title> <meta name="Generator" content="EditPlus"> <meta name="Author" content=""> <meta name="Keywords" content=""> <meta name="Description" content=""> </head> <body> <center> <#list pm.getList() as article> <a href="#">${article.id} ${article.title} ${article.context} ${article.createDate?if_exists?string("yyyy-MM-dd HH:mm:ss")}</a><br/> </#list><br/><br/> <a <@isDisabled comparePage="1" />>首页</a> <#t> <a <@isDisabled comparePage="${pm.previousPageNo}" />>上一页</a> <#t> <a <@isDisabled comparePage="${pm.nextPageNo}" />>下一页</a> <#t> <a <@isDisabled comparePage="${pm.bottomPages}" />>尾页</a> <#t> ${pm.pageNo}/${pm.bottomPages} <#t> 共${pm.totalRecord}条记录 </center> </body> </html>