jsp生成静态页并分页

大家都做过SQL分页,可能做静态页分页的不多,这个东西做业务系统用不到,但是做小型企业网站用的比较多,其实像这种小型网站真是没啥技术含量,无非是文章管理,产品介绍,在线留言之类的,逻辑太过简单,也就用到了在线编辑器和前台静态化(不过也有很多公司还是直接从数据库中读的) PHP中有个Smarty模板,JAVA中有Velocity和FreeMarker,其实生成静态页和freemarker没有啥关系,你用txt,xml都行,直接也String都可以的,废话不多说了,开始。

 

效果图:

jsp生成静态页并分页

 

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>

你可能感兴趣的:(html,jsp,freemarker,android,velocity)