`
步青龙
  • 浏览: 295596 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
博客专栏
72ba33fb-eefe-3de1-bd65-82a6e579265d
Java面试
浏览量:0
社区版块
存档分类
最新评论

velocity 之 分页查询

 
阅读更多

谈到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简介 Velocity是由Apache软件基金会开发的开源项目,它提供了一个简单的模板语言,使得开发者可以将内容与展示逻辑分离,让设计人员专注于...

    velocity生成静态网页并分页

    本项目的核心是利用Velocity模板语言和分页技术,生成具有分页功能的静态网页。 Velocity的工作原理是将HTML模板与Java代码分离,开发者可以在HTML模板中插入特定的Velocity指令,然后由Velocity引擎负责解析这些...

    ssm框架+maven+velocity+pagehelper分页整合

    本项目整合了这三个组件,并加入了Maven作为构建工具,以及Velocity模板引擎和PageHelper分页插件,以提供更便捷的开发体验。以下是关于这些技术的详细介绍: 1. **Spring框架**:Spring是Java企业级应用的核心框架...

    velocity分页的例子

    在这个"velocity分页的例子"中,我们将探讨如何使用Velocity实现分页功能,这对于处理大量数据的网页展示至关重要。 分页是一种用户界面设计技术,用于将大量数据分割成多个小块,每次只显示一部分,以提高用户体验...

    ssm+velocity增删改分页(含数据库)

    在这个项目中,“ssm+velocity增删改分页(含数据库)”是针对初学者的一个实践教程,涵盖了基本的Web应用开发流程,包括数据操作和用户界面的展示。 首先,让我们详细了解一下SSM框架: 1. **Spring**:这是一个...

    velocity+ssh2+分页+权限

    总结,"velocity+ssh2+分页+权限"的整合涉及到Web开发中的多个关键环节,包括模板引擎的使用、MVC架构的实现、数据的分页展示以及安全的权限控制。通过这样的整合,开发者可以构建出高效、安全且易于维护的企业级...

    itext加载velocity生成PDF

    将两者结合,我们可以利用`Velocity`的模板能力来动态生成PDF内容,这在SpringMVC框架中尤其方便。 `iText`库提供了一系列API,用于创建PDF文档、添加文字、图像、表格等元素。它支持流式和模型两种模式,前者适用...

    spring data 分页查询

    在Spring MVC中,Spring Data与Thymeleaf或Velocity模板引擎配合,可以方便地在视图层展示分页结果。通常,你会在Controller中处理分页请求,然后将`Page`对象传递给视图,由模板引擎生成分页链接。 9. **Spring ...

    springmvc+mybatis+velocity整合实例

    Spring MVC、MyBatis 和 Velocity 是三个在Java Web开发中常用的框架。Spring MVC 作为MVC模式的实现,负责处理HTTP请求,MyBatis 是一个轻量级的持久层框架,用于简化数据库操作,而Velocity 则是一个快速、强大且...

    Java web velocity分页宏示例

    在这个示例中,我们将深入理解如何在 Velocity 模板中实现分页宏。 分页宏的主要目的是展示数据的多个页面链接,让用户能够轻松浏览不同页的数据。在给定的代码中,`#macro(pager $url $pager)` 定义了一个名为 `...

    springMVC+velocity实现仿Datatables局部刷新分页方法

    在本文中,我们将探讨如何使用SpringMVC和Velocity框架实现一个仿Datatables的局部刷新分页功能。这个方法适用于那些不希望使用Datatables插件,但仍然需要保持页面风格统一和避免查询参数在页面上回显的情况。 ...

    velocity freemarke 模版 静态化 实现

    - 对于大量数据的页面,可以考虑分页静态化或者部分静态化,只对关键部分进行静态处理。 通过以上步骤,我们能够利用Velocity和FreeMarker模板引擎实现页面静态化,提高Web应用的性能和用户体验。在实际项目中,...

    SSH+Ajax+velocity小型购物商城

    - 动态加载:分页加载商品列表,用户滚动到底部时自动加载更多商品。 **Velocity** Velocity是一个基于Java的模板引擎,它将HTML、CSS和JavaScript代码与Java代码分离,使开发者可以专注于内容的呈现,而无需关注...

    自定义通用分页一行代码解决分页问题

    PageBeanTag助手类可能是在服务器端与前端交互时使用的,例如在JSP或Velocity模板中,它可以帮助渲染分页链接。`PageBeanTag`可以提供以下功能: 1. `doStartTag()`: 开始标签处理,初始化分页参数。 2. `doEndTag...

    SpringBoot集成Mybatis,velocity模板展示数据

    在IT行业中,SpringBoot是一个备受推崇的框架,它极大地简化了Spring应用的初始搭建以及开发过程。...在实际开发过程中,可以根据需求进一步优化配置,如添加缓存机制、使用分页插件等,提升系统的性能。

    JSP数据库数据AJAX无刷新分页

    在JSP分页中,通常会有一个AJAX请求,当用户点击分页按钮时,这个请求会被触发,向服务器发送当前页码,服务器根据页码查询对应的数据,然后返回给客户端,客户端再动态更新页面中的数据展示。 实现步骤如下: 1. ...

    Spring3.0.1+Mybatis3.0.5+Struts2.2.3.1+velocity1.7+DWZ

    DWZ是一个开源的jQuery UI框架,专为Web开发提供一系列易于使用的组件,如表单验证、对话框、下拉菜单、分页等。DWZ提供了一套完整的前端解决方案,简化了页面布局和交互设计。在本项目中,DWZ被用于构建用户界面,...

    基于NVelocity模板引擎实现的分页实例

    介绍:http://blog.csdn.net/windxxf/archive/2010/10/27/5969811.aspx 基于NVelocity模板引擎实现的分页实例 数据库为Sql2005格式,App_Data目录下附加即可

    jsp分页

    6. 模板技术:现代的JSP开发往往结合FreeMarker、Velocity等模板技术,将业务逻辑与视图分离,使得分页实现更加清晰。 7. AJAX异步分页:为了提升用户体验,可以采用AJAX技术实现页面不刷新的分页,通过JavaScript...

Global site tag (gtag.js) - Google Analytics