谈到velocity 不得不谈freemarker,freemarker的宏是一个好东东,JSP中很多类似的代码(参数不同而已,有可能只是遍历List的数据不同,href或者onclick事件不同),那么freemarker很拿手。velocity相对freemarker的宏就显得很逊色。
喜欢上velocity 是因为他的简洁,方便。语法与freemarker及其相像。拿工作中的分页查询来说。velocity好像也有宏,没用过velocity的宏。但是可以实现宏一样的效果,放在Map里也是可以动态实现的参数的。
首先我的jsp放一个div专业存储数据和分页信息。
<div id="content"></div>
页面就写一个这样的div即可。
刚进页面应该是默认显示第一页,so onload的时候就应该加载第一页数据。
function page(clickpage, g) {
var pageNo = (g == 'forward') ? clickpage- 1 : (g == "next") ? clickpage+ 1 : clickpage;
// 请求后台 传递pageNo参数,传递htmlData
document.getElementById("content").innerHTML = htmlDate;
window.location.href = url;
}
注意onload = "page(1,null)"
Action的方法处理大致如下:
String out = ""; // 要输出的HTML
String pageNo = HttpUtil.getAsString(request, "pageNo");
int pagesize = 16; // 每页显示16条数据
Matcher isNum = Pattern.compile("[0-9]*").matcher(pageNo);//整数正则
int currentpage = !isNum.matches()?1:pageNo.length()>9?1:Integer.parseInt(pageNo);
int allcount = sv.getXXCount();数据库中查询的所有行数;
if(currentpage<1){currentpage = 1;}
int allpage = allcount/pagesize==0?allcount/pagesize:allcount/pagesize+1;
if(currentpage*pagesize>allcount){
currentpage = allpage;// 最后一页
}
int start = (currentpage-1)*16+1;// 起始值为前几页+1
int currentpagesize = 0;
if(allcount<=pagesize){
currentpagesize = allcount;
}else{
currentpagesize = start+pagesize<allcount?pagesize:allcount%pagesize;
}
IXXXValue[] values = sv.getXXXValues(start,pagesize,currentpage,currentpagesize);
Map retMap = getCacheData(values);
List countList = new ArrayList();
int startpage = currentpage<10?1:currentpage-5;
int end = startpage + 10;
if(end>allpage)end = allpage;
for (int i = startpage; i <= end; i++) {
countList.add(i);
}
retMap.put("allcount", allcount);
retMap.put("currentpage", currentpage);
retMap.put("allpage", allpage);
retMap.put("countList", countList);
retMap.put("currentpagesize", currentpagesize);
out = VelocityHelper.evaluateTemplate(retMap, "vm/XXXPage.vm");
out就是我们要得到的HTML数据,看getCacheData(ivalues) 方法主要是把查询的数据对象放入Map中,然后把所有的Map存储到ArrayList中:
public static Map getCacheData(IXXXValues[] values) throws Exception {
List dataList = new ArrayList();
if(values != null){
for(int i=0; i<values.length; i++){
Map tmpMap = new HashMap();
tmpMap.put("col1", values[i].getXXX());
tmpMap.put("col2", values[i].getYYY());
dataList.add(tmpMap);
}
}
Map retMap = new HashMap();
retMap.put("dataList", dataList);
return retMap ;
}
然后我们看evaluateTemplate方法:
public static String evaluateTemplate(Map context, String filepath) throws Exception {
try{
Template template = Velocity.getTemplate(filepath, "GBK");
Writer writer = new StringWriter();
VelocityContext vContext = new VelocityContext(context);
template.merge(vContext, writer);
return writer.toString();
}catch (Exception ex) {
ex.printStackTrace();
throw new Exception(ex);
}
}
XXX.vm是我们的模板内容,主要的有:
#if ($dataList.size()>0)
<table>
#foreach($datalistOne in $dataList)
<tr class="">
<td>
#if($datalistOne.notes.length()>=3)
#if($!$datalistOne.notes)
$datalistOne.notes.substring(0,3)
#else
#end
#else
$datalistOne.notes
#end
</td>
</tr>
#end
</table>
<div>
#if ($currentpage==1)
<span class="front" style = "background-color:yellow;">上一页</span>
#else
<a href = "#" onclick = "page($currentpage,'forward')">上一页</a>
#end
#foreach( $something in $countList)
#if ($something== $currentpage)
<span class="current" style = "background-color:red;">$something</span>
#else
<a href = "#" onclick = "page($something,'144');">$something</a>
#end
#end
#if ($currentpage==$allpage)
<span class="front" style = "background-color:yellow;">下一页</span>
#else
<a href = "#" onclick = "page($currentpage,'next')">下一页</a>
#end
当前页$currentpage
总页数 $allpage
当前页条数 $currentpagesize
</div>
#else
没有查询到相关数据
#end
主要是功能,界面比较难看,分页模仿百度的分页效果,可以对页码进行分页,自动前进后退。
因为每次请求都替换了content ,所以不需要跳转页面。
在vm中开始用了javascript:void(0); 最开始时用页面跳转做的,分页的时候window.location.href无效了。
IE的一个傻逼哄哄的BUG引起window.location.href 跳转失败,被其他代码干扰,(例如void(0)、return false ),导致找不到父框架,解决办法后加一句window.event.returnValue = false;在AJAX盛行的今天,当在返回success状态(200)后特别容易出问题,避免刷新页面用void(0)。
遇到一个非常奇怪的问题,在三元表达式中web app和直接main()入口写执行结果不一样,看来() 非常重要,更加有可读性,在稍微复杂一点的三元运算中不管是为了可读性,还是为了少出现bug,最好在计算中都加上()。
分享到:
相关推荐
本文将深入探讨如何使用Velocity来实现静态页面的分页功能。 一、Velocity简介 Velocity是由Apache软件基金会开发的开源项目,它提供了一个简单的模板语言,使得开发者可以将内容与展示逻辑分离,让设计人员专注于...
本项目的核心是利用Velocity模板语言和分页技术,生成具有分页功能的静态网页。 Velocity的工作原理是将HTML模板与Java代码分离,开发者可以在HTML模板中插入特定的Velocity指令,然后由Velocity引擎负责解析这些...
本项目整合了这三个组件,并加入了Maven作为构建工具,以及Velocity模板引擎和PageHelper分页插件,以提供更便捷的开发体验。以下是关于这些技术的详细介绍: 1. **Spring框架**:Spring是Java企业级应用的核心框架...
在这个"velocity分页的例子"中,我们将探讨如何使用Velocity实现分页功能,这对于处理大量数据的网页展示至关重要。 分页是一种用户界面设计技术,用于将大量数据分割成多个小块,每次只显示一部分,以提高用户体验...
在这个项目中,“ssm+velocity增删改分页(含数据库)”是针对初学者的一个实践教程,涵盖了基本的Web应用开发流程,包括数据操作和用户界面的展示。 首先,让我们详细了解一下SSM框架: 1. **Spring**:这是一个...
总结,"velocity+ssh2+分页+权限"的整合涉及到Web开发中的多个关键环节,包括模板引擎的使用、MVC架构的实现、数据的分页展示以及安全的权限控制。通过这样的整合,开发者可以构建出高效、安全且易于维护的企业级...
将两者结合,我们可以利用`Velocity`的模板能力来动态生成PDF内容,这在SpringMVC框架中尤其方便。 `iText`库提供了一系列API,用于创建PDF文档、添加文字、图像、表格等元素。它支持流式和模型两种模式,前者适用...
在Spring MVC中,Spring Data与Thymeleaf或Velocity模板引擎配合,可以方便地在视图层展示分页结果。通常,你会在Controller中处理分页请求,然后将`Page`对象传递给视图,由模板引擎生成分页链接。 9. **Spring ...
Spring MVC、MyBatis 和 Velocity 是三个在Java Web开发中常用的框架。Spring MVC 作为MVC模式的实现,负责处理HTTP请求,MyBatis 是一个轻量级的持久层框架,用于简化数据库操作,而Velocity 则是一个快速、强大且...
在这个示例中,我们将深入理解如何在 Velocity 模板中实现分页宏。 分页宏的主要目的是展示数据的多个页面链接,让用户能够轻松浏览不同页的数据。在给定的代码中,`#macro(pager $url $pager)` 定义了一个名为 `...
在本文中,我们将探讨如何使用SpringMVC和Velocity框架实现一个仿Datatables的局部刷新分页功能。这个方法适用于那些不希望使用Datatables插件,但仍然需要保持页面风格统一和避免查询参数在页面上回显的情况。 ...
- 对于大量数据的页面,可以考虑分页静态化或者部分静态化,只对关键部分进行静态处理。 通过以上步骤,我们能够利用Velocity和FreeMarker模板引擎实现页面静态化,提高Web应用的性能和用户体验。在实际项目中,...
- 动态加载:分页加载商品列表,用户滚动到底部时自动加载更多商品。 **Velocity** Velocity是一个基于Java的模板引擎,它将HTML、CSS和JavaScript代码与Java代码分离,使开发者可以专注于内容的呈现,而无需关注...
PageBeanTag助手类可能是在服务器端与前端交互时使用的,例如在JSP或Velocity模板中,它可以帮助渲染分页链接。`PageBeanTag`可以提供以下功能: 1. `doStartTag()`: 开始标签处理,初始化分页参数。 2. `doEndTag...
在IT行业中,SpringBoot是一个备受推崇的框架,它极大地简化了Spring应用的初始搭建以及开发过程。...在实际开发过程中,可以根据需求进一步优化配置,如添加缓存机制、使用分页插件等,提升系统的性能。
在JSP分页中,通常会有一个AJAX请求,当用户点击分页按钮时,这个请求会被触发,向服务器发送当前页码,服务器根据页码查询对应的数据,然后返回给客户端,客户端再动态更新页面中的数据展示。 实现步骤如下: 1. ...
DWZ是一个开源的jQuery UI框架,专为Web开发提供一系列易于使用的组件,如表单验证、对话框、下拉菜单、分页等。DWZ提供了一套完整的前端解决方案,简化了页面布局和交互设计。在本项目中,DWZ被用于构建用户界面,...
介绍:http://blog.csdn.net/windxxf/archive/2010/10/27/5969811.aspx 基于NVelocity模板引擎实现的分页实例 数据库为Sql2005格式,App_Data目录下附加即可
6. 模板技术:现代的JSP开发往往结合FreeMarker、Velocity等模板技术,将业务逻辑与视图分离,使得分页实现更加清晰。 7. AJAX异步分页:为了提升用户体验,可以采用AJAX技术实现页面不刷新的分页,通过JavaScript...