jsp生成静态页并分页
大家都做过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>