`
netfork
  • 浏览: 490412 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

使用FreeMarker的宏来实现Struts2的分页显示

阅读更多
看到一些朋友在Struts2中,依然使用标签来实现分页显示,而在基于Struts2的开发中,可能很多朋友会采用FreeMarker模板来渲染表示层,那么对于采用FreeMarker进行渲染的页面来说,我在这里提出一种使用FreeMarker的宏来实现分页显示的作法,这种作法,我感觉更简单灵活。
貌似在网上也没找到类似的作法,所以,如果这种作法有什么隐患或性能问题,还请朋友们批评。

注:下面的代码只是示例性质的,难免有一些Bug或考虑不全之处存在,希望大家不必对代码本身过多要求,更多的是看一下这种作法是否可取。

首先,看一下使用方法。
在需要进行分页显示的文件中,引入分页显示的ftl库文件。
<#import "*/common/pager.ftl" as pager>


在需要显示分页列表的位置,加入以下代码,实现分页显示。
<@pager.p page=page totalpage=totalPage />


其中,“p”是宏的名字;“page=page”中的第一个page是宏的参数,第二个page是来自Action对象中的属性(带有get/set方法的成员变量),page属性主要是标注当前要显示的页号,即第几页;同样的,“totalpage=totalPage”也是类似的,totalpage属性主要是告诉分页宏,总页数是多少。

经过上面两段代码,再配合在Action中取得要显示数据的总页数,就可以分页了。

接下来,我们看一下分面效果截图。




最后,我们看一下分页效果的处理文件“pager.ftl”中宏“p”是如何定义的。
<#macro p page totalpage params='' maxsteps=6>
	<#assign ipage=page?number>
	<#if maxsteps <= 0>
		<#assign maxsteps=5>
	</#if>
	<#assign offset = ((ipage - 1) / maxsteps)?int>
	<#assign offsetLast = ((totalpage - 1) / maxsteps)?int>
	
	<#-- url附加参数的判断 -->
	<#assign requestParams = "">
	<#if (params?? && params != '')>
		<#assign requestParams = '&' + params>
	</#if>
	
	<#-- 首页 -->
	<#if ipage gt 1>
		<a href="?page=1${requestParams}">&lt;&lt;</a>
	<#else>
		<span class="disabled">&lt;&lt;</span>
	</#if>
	<#-- 前组-->
	<#if offset gt 0>
		<a href="?page=${offset * maxsteps}${requestParams}">…</a>
	<#else>
		<span class="disabled">…</span>
	</#if>
	<#-- 当前组中的页号-->
	<#if (offset + 1) * maxsteps < totalpage>
		<#assign pagelist = (offset + 1) * maxsteps>
	<#else>
		<#assign pagelist = totalpage>
	</#if>
	<#if ipage gt 0 && ipage lte totalpage>
		<#list (offset * maxsteps + 1)..pagelist as num>
			<#if ipage != num>
				<a href="?page=${num}${requestParams}">${num}</a>
			<#else>
				<strong>${num}</strong>
			</#if>
		</#list>
	</#if>
	<#-- 下组 -->
	<#if offset lt offsetLast>
		<a href="?page=${(offset + 1) * maxsteps + 1}${requestParams}">…</a>
	<#else>
		<span class="disabled">…</span>
	</#if>
	<#-- 尾页 -->
	<#if ipage lt totalpage>
		<a href="?page=${totalpage}${requestParams}">&gt;&gt;</a>
	<#else>
		<span class="disabled">&gt;&gt;</span>
	</#if>
	<#-- 前一页 -->
	<#if ipage gt 1>
		<a href="?page=${ipage - 1}${requestParams}">前一页</a>
	<#else>
		<span class="disabled">前一页</span>
	</#if>
	<#-- 后一页 -->
	<#if ipage lt totalpage>
		<a href="?page=${ipage + 1}${requestParams}">后一页</a>
	<#else>
		<span class="disabled">后一页</span>
	</#if>
</#macro>


对另外两个参数特别说明一下。
params:有时,我们分页的内容是通过查询获得的,或是分页中还有其他参数时,可以作为附加的参数附在分页URL后面。
maxsteps:目前的分页效果类似于.net中DataView的默认分页效果,默认当分页数超过六页时,最多显示六个页号。当然可以通过maxsteps参数,调整分页显示时最多显示的页号数。

  • 大小: 5.3 KB
分享到:
评论
6 楼 netfork 2009-05-27  
atianchen 写道
结合DetachedCriteria实现分页是比较完美的,仿造.Net 的DataView,我也做过类似
已经用了一年多了,效果还不错,我把列分为模板列和绑定列,同时支持排序指定,分页是个附加组件,使用效果如下:
<@xj.datagrid id="page" datasrc=page >
	<@xj.templatecolumn title="" width="8%">
		<@xj.celleditbutton click="editUser.action?user=${rowdata.id}" title="编辑"/>
	</@xj.templatecolumn>
	<@xj.sequence title="编号" sort="id"  width="5%"/>
	<@xj.column  title="登录名" name="loginname" sort="loginname"/>
		<@xj.templatecolumn  title="姓名" >
			<#if rowdata.info?exists && rowdata.info.realname?exists>
				${rowdata.info.realname}
			<#else>
				&nbsp;
			</#if>
		</@xj.templatecolumn>
	<@xj.pager/>
</@xj.datagrid>




没用过,看样子不错。

atianchen 写道

回楼上的,其实也算不上逻辑操作呀,对数据进行分页显示属于展示层逻辑,不属于业务逻辑


支持 + 赞同

5 楼 netfork 2009-05-27  
KimShen 写道
和把逻辑写在一个JSP然后input做法是一样的
一直认为FreeMarker增加了逻辑操作是他最大的失误


我倒觉得FreeMarker做的恰如其分。
在ftl文件中写入一定的表示用逻辑,还是非常方便的。
结合FreeMarker自带的函数和逻辑处理,再加上Macro,FreeMarker在表示层的处理还是相当完美的,
并且一点也不会影响到业务逻辑,相反相当清晰。 
直接用Jsp时,你就会陷入不知道哪个应该写Tag、哪个应该放到Jsp中处理、哪个应该在Action中处理的取舍中去。
Tag还是相当不爽的东西。
4 楼 atianchen 2009-05-27  
结合DetachedCriteria实现分页是比较完美的,仿造.Net 的DataView,我也做过类似
已经用了一年多了,效果还不错,我把列分为模板列和绑定列,同时支持排序指定,分页是个附加组件,使用效果如下:
<@xj.datagrid id="page" datasrc=page >
	<@xj.templatecolumn title="" width="8%">
		<@xj.celleditbutton click="editUser.action?user=${rowdata.id}" title="编辑"/>
	</@xj.templatecolumn>
	<@xj.sequence title="编号" sort="id"  width="5%"/>
	<@xj.column  title="登录名" name="loginname" sort="loginname"/>
		<@xj.templatecolumn  title="姓名" >
			<#if rowdata.info?exists && rowdata.info.realname?exists>
				${rowdata.info.realname}
			<#else>
				&nbsp;
			</#if>
		</@xj.templatecolumn>
	<@xj.pager/>
</@xj.datagrid>


回楼上的,其实也算不上逻辑操作呀,对数据进行分页显示属于展示层逻辑,不属于业务逻辑
3 楼 KimShen 2009-05-27  
和把逻辑写在一个JSP然后input做法是一样的
一直认为FreeMarker增加了逻辑操作是他最大的失误
2 楼 netfork 2009-05-27  
这贴必须得回,谢谢表扬。
本来以为用FreeMarker的宏写分页只是我想到了,就写了个篇文章,没想到后来发现原来很多人都想到了,而且JavaEye上有个人比我早写了类似的文章,而且实现上更完美更完善。比较无奈。
1 楼 treblesoftware 2009-05-27  
看了博主的几篇文章,写的都很棒。循环渐进,慢慢倒来。技术文笔值得欣赏。

相关推荐

    freemarker_struts2分页

    本篇文章将深入探讨如何在Struts2框架下结合FreeMarker实现分页功能,帮助开发者更高效地处理大数据量的展示问题。 首先,了解分页的基本原理。分页是用来解决一次性加载大量数据导致页面加载过慢或内存压力过大的...

    FreeMarker通用的分页

    在FreeMarker中实现通用的分页功能是提高Web应用程序性能和用户体验的重要一环。 ### FreeMarker通用分页知识点解析 #### 1. 分页宏(Macro)定义 FreeMarker中的宏允许我们封装可重用的代码块,这在实现通用分页...

    在struts2中使用freemarker模版

    这样做是为了确保Struts2在服务器启动时能优先加载这个servlet,以便支持FreeMarker模板中使用Struts2的标签。 在`struts.xml`配置文件中,定义一个action,比如`test`,并指定其结果类型为`freemarker`,这样当...

    经典struts2分页方法 JAVA_WEB必备分页 源码

    7. **JSP/Freemarker标签库**:在视图层,可以使用Struts2提供的`s:iterator`标签或自定义的分页标签来方便地遍历和展示数据,同时生成分页链接。 8. **URL参数**:为了支持用户点击分页链接,我们需要在URL中传递...

    Freemarker分页

    4. **Freemarker模板**:在Freemarker模板中,你可以使用Struts2提供的`&lt;s:iterator&gt;`标签遍历当前页的数据,同时使用自定义的Freemarker宏或Struts2的`&lt;s:url&gt;`标签生成分页链接。例如,可以创建一个`pagination....

    struts2+hibernate+freemarker项目实例

    在学习和使用这个项目实例时,你需要理解每个框架的核心概念和工作原理,如Struts2的动作(Action)和结果(Result),Hibernate的实体(Entity)、会话(Session)和查询,以及FreeMarker的模板语法。此外,还需要...

    struts2实现分页显示

    下面将详细讲解如何在Struts2框架下实现分页显示。 首先,我们需要理解分页的基本概念。分页是将大量数据分为多个部分(页)进行展示,用户可以逐页浏览,而不是一次性显示所有记录。这通常涉及到两个关键参数:...

    Spring,Spring Data Jpa,freemarker,bootstrap实现的分页源代码

    在本项目中,我们主要探讨了如何利用Spring框架、Spring Data JPA、FreeMarker模板引擎以及Bootstrap前端框架来实现一个高效且用户友好的分页功能。以下是对这些技术及其在分页实现中作用的详细解释。 **Spring框架...

    struts2中使用freeMarker

    - 当FreeMarker模板存在错误时,Struts2会捕获并显示错误信息,开发者需要根据错误提示进行调试。 通过以上步骤,开发者可以利用Struts2和FreeMarker的组合,高效地构建动态Web应用。同时,由于FreeMarker的灵活性...

    freemarker与struts2详细配置

    将FreeMarker与Struts2结合使用,可以实现灵活且高效的视图层渲染。 ### 1. 配置环境 在开始配置之前,确保已安装了Struts2框架和FreeMarker库。通常,Struts2的依赖已经包含了FreeMarker,但为了确保版本兼容,...

    jquery java struts2 实现分页 非常好看的分页

    总结来说,实现“jQuery Java Struts2 实现分页”涉及到前后端的协同工作:前端使用jQuery和其分页插件处理用户交互,样式通过CSS自定义;后端使用Java和Struts2框架处理分页逻辑,与数据库进行交互,返回所需数据。...

    Struts2 与Freemarker 的配置方法

    Struts2 和 Freemarker 的整合是企业级Java Web开发中常用的技术组合,它们结合使用能够实现灵活、高效的表现层设计。Struts2 是一个强大的MVC框架,而Freemarker则是一个模板引擎,用于生成动态内容。以下是关于...

    freemarker的分页功能

    标题与描述概述的知识点主要集中在Freemarker模板引擎在实现分页功能时的应用,特别是当后端数据库为MySQL的情况下。Freemarker是一个用于生成动态文本的模板引擎,它被广泛应用于Web开发中,用于将数据模型转换成...

    freemarker 实现宏分页

    因此,我们来详细探讨一下如何在FreeMarker中使用宏来实现分页功能。 首先,理解FreeMarker宏的概念。在FreeMarker模板语言中,宏类似于HTML中的自定义标签,可以复用和封装复杂的逻辑。通过定义宏,我们可以创建一...

    struts+hibernate做的分页显示

    在这个项目中,"struts+hibernate做的分页显示"主要是利用这两者来实现数据的分页展示,提升用户体验,降低服务器压力。 首先,Struts是一个基于MVC设计模式的Java Web框架,它简化了开发过程,提供了处理HTTP请求...

    struts2 +mysql 分页显示 源码

    前端页面通常使用JSP或FreeMarker等模板技术来渲染,通过Struts2的标签库,可以轻松地遍历分页对象中的数据并显示出来。同时,需要提供上一页、下一页等导航链接,这可以通过修改Action中的页码属性,然后重定向或...

    freemarker+struts2仿QQ分页效果

    不过由于小弟资历浅薄,也没心思看,主要是strut2的标签本来我就觉得不大习惯,另外上个月接触了freemarker后,实在是用的爽死了,为什么不用freemarker的macro指令写个通用的分页呢?马上想到模仿TX的...

    freemarker与struts2整合的实例应用

    适合初学freemarker的人参考的一个简单登录代码。主要是实现freemarker与struts2的整合

    FreeMarker 写的一个分页macro(宏)测试

    在这个"FreeMarker 写的一个分页macro(宏)测试"中,我们可以看到如何使用FreeMarker来实现一个简单的分页功能。下面我们将深入探讨这一主题。 首先,`PaginationUtil.java`可能是实现分页逻辑的工具类。在Java中,...

    Java freemarker demo 【struts + freemarker】 自己修改的一个小例子

    在这个“Java FreeMarker demo 【Struts + FreeMarker】”示例中,我们将会探索如何将FreeMarker与Struts框架结合,以实现MVC(Model-View-Controller)架构中的视图层功能。 Struts是一个基于MVC设计模式的Java ...

Global site tag (gtag.js) - Google Analytics