我的编程空间,编程开发者的网络收藏夹
学习永远不晚

基于Struts2和Freemarkeri的Batis分页是怎么样的

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

基于Struts2和Freemarkeri的Batis分页是怎么样的

这篇文章给大家介绍基于Struts2和Freemarkeri的Batis分页是怎么样的,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

之前介绍过基于Hibernate分页的原理和设计,这里我们所用的分页都是物理分页技术,不是JS实现的页面分页技术,是在SQL语句上执行的分页,可以获取结果集数量固定的列表,执行效率很高。下面来看看iBatis中如何设计分页,本文基于Struts2,Spring3来整合,因为暂时Spring不支持MyBatis3(可以选用MyBatis官方的MyBatis-Spring插件来实现,配有中文文档,很好理解),我们这里仍然以iBatis2作为载体来介绍。

首先就是搭建开发环境,这里可以说也是对Struts2,Spring3和iBatis2进行了简单的整合,大家也可以来参考。项目的结构如下,使用Maven创建的web项目:

基于Struts2和Freemarkeri的Batis分页是怎么样的

添加必要的依赖,因为整合了Struts2和Spring,依赖就比较多了,如下:

基于Struts2和Freemarkeri的Batis分页是怎么样的

首先来配置一下Struts2,这个就比较简单了,相信大家都不陌生。在web.xml中:

Xml代码

    <filter>            <filter-name>struts2filter-name>        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilterfilter-class>    filter>    <filter-mapping>        <filter-name>struts2filter-name>        <url-pattern>*.actionurl-pattern>    filter-mapping>

然后是struts.xml,配置Struts相关的内容,这里我们配置freemarker为默认的结果类型,然后配置一个测试的Action,因为和Spring进行了集成,所以Action具体的配置放到Spring中来进行,如下即可:

Xml代码

<?xml version="1.0" encoding="UTF-8" ?>        "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"         "http://struts.apache.org/dtds/struts-2.1.7.dtd">    <struts>        <package name="ibatis-paging" extends="struts-default"            namespace="/">            <result-types>                <result-type name="freemarker"            class="org.apache.struts2.views.freemarker.FreemarkerResult"                    default="true" />            result-types>            <action name="user_*" class="userAction" method="{1}">                <result name="list">user_list.ftlresult>            action>        package>    struts>

对Freemarker做一个简单的设置,卸载freeemarer.properties文件中即可,这里我们主要是引用了一个宏文件,就是分页宏的配置,如下:

Properties代码

template_update_delay=5    default_encoding=UTF-8    url_escaping_charset=UTF-8    number_format=0.#     date_format=yyyy-MM-dd     time_format=HH:mm:ss     datetime_format=yyyy-MM-dd HH:mm:ss     boolean_format=true,false     whitespace_stripping=true     tag_syntax=auto_detect     auto_import=/Freemarker/page_macro.ftl as p

Log4J的配置这里不再贴出代码,大家可以去下载源码,一看就明白了,之后我们配置Spring,在resources文件夹下创建spring子目录,里面放置Spring的配置文件,在web.xml中如下设置即可加载Spring的配置文件:

Xml代码

<context-param>        <param-name>contextConfigLocationparam-name>        <param-value>classpath:spring    public class PagingList {         private int rowCount = 0; // 记录总数         private int pageCount = 1; // 分页总数         private int pageSize = 10; // 每页记录数         private int pageNum = 1; // 当前页数         private int startIndex = 1; // 起始记录数         private int endIndex = 1; // 结束记录数         private List list;// 记录列表                 public PagingList(String statementName, Object parameterObject,                 int pageNum, int pageSize, SqlMapClientTemplate sqlMapClientTemplate) {             preProcessParams(pageNum, pageSize);             execute(statementName, parameterObject, pageNum, pageSize,                     sqlMapClientTemplate);         }                 public PagingList(String statementName, int pageNum, int pageSize,                 SqlMapClientTemplate sqlMapClientTemplate) {             preProcessParams(pageNum, pageSize);             execute(statementName, pageNum, pageSize, sqlMapClientTemplate);         }                 blic void execute(String statementName, Object parameterObject,                 int pageNum, int pageSize, SqlMapClientTemplate sqlMapClientTemplate) {             // 计算记录总数             this.rowCount = sqlMapClientTemplate.queryForList(statementName,                     parameterObject).size();             // 计算分页数及起止记录             countPage();             // 获取分页列表             this.list = sqlMapClientTemplate.queryForList(statementName,                     parameterObject, (pageNum - 1) * pageSize, pageSize);         }                 public void execute(String statementName, int pageNum, int pageSize,                 SqlMapClientTemplate sqlMapClientTemplate) {             // 计算记录总数             this.rowCount = sqlMapClientTemplate.queryForList(statementName).size();             // 计算分页数及起止记录             countPage();             // 获取分页列表             this.list = sqlMapClientTemplate.queryForList(statementName,                     (pageNum - 1) * pageSize, pageSize);         }                 private void preProcessParams(int pageNum, int pageSize) {             if (pageNum > 0) {                 this.pageNum = pageNum;             }             if (pageSize > 0) {                 this.pageSize = pageSize;             }             if (pageSize > 1000) {                 this.pageSize = 1000;             }         }                 private void countPage() {             // 计算分页总数             if ((rowCount % pageSize) == 0) {                 pageCount = rowCount / pageSize;             } else {                 pageCount = rowCount / pageSize + 1;             }             if (pageCount == 0) {                 pageCount = 1;             }             // 判断pageNum是否过界             if (pageNum > pageCount && rowCount != 0) {                 pageNum = pageCount;             }             // 计算起止记录             startIndex = (pageNum - 1) * pageSize + 1;             endIndex = (pageNum) * pageSize;         }                 public List getList() {             return list;         }                 public int getStartIndex() {             return startIndex;         }         public Integer getStartIndexInteger() {             return new Integer(startIndex);         }                 public int getEndIndex() {             return endIndex;         }         public Integer getEndIndexInteger() {             return new Integer(endIndex);         }                 public int getPageCount() {             return pageCount;         }         public int getPageNum() {             return pageNum;         }         public int getPageSize() {             return pageSize;         }         public int getRowCount() {             return rowCount;         }     }

写好分页类,还要和框架进行集成,那么我们可以抽象出Service的基类,在业务逻辑层中调用它来获取分页信息:

Java代码

package org.ourpioneer.service;     import org.ourpioneer.bean.PagingList;     import org.springframework.orm.ibatis.SqlMapClientTemplate;     import com.opensymphony.xwork2.ActionContext;     import com.opensymphony.xwork2.util.ValueStack;     public class BaseService {                 public ValueStack getValueStack() {             return ActionContext.getContext().getValueStack();         }                 public PagingList getPagingList(String statementName,                 SqlMapClientTemplate sqlMapClientTemplate) {             int pageNum = ((Integer) getValueStack().findValue("pageNum"))                     .intValue();             int pageSize = ((Integer) getValueStack().findValue("pageSize"))                     .intValue();             return new PagingList(statementName, pageNum, pageSize,                     sqlMapClientTemplate);         }                 public PagingList getPagingList(String statementName,                 Object parameterObject, SqlMapClientTemplate sqlMapClientTemplate) {             int pageNum = ((Integer) getValueStack().findValue("pageNum"))                     .intValue();             int pageSize = ((Integer) getValueStack().findValue("pageSize"))                     .intValue();             return new PagingList(statementName, parameterObject, pageNum,                     pageSize, sqlMapClientTemplate);         }     }

两个构造方法我们都使用了,也就是一个带参数,一个不带参数。下面来看抽象出的Action基类,主要是处理页面传入的分页参数的处理:

Java代码

package org.ourpioneer.action;     import java.util.Map;     import javax.servlet.http.HttpServletRequest;     import org.apache.struts2.ServletActionContext;     import org.ourpioneer.util.QueryUtil;     import com.opensymphony.xwork2.ActionContext;     import com.opensymphony.xwork2.ActionSupport;     public class BaseAction extends ActionSupport {         @Override        public String execute() throws Exception {             return SUCCESS;         }         public Map getParameters() {             return ActionContext.getContext().getParameters();         }         public HttpServletRequest getRequest() {             return ServletActionContext.getRequest();         }                 protected int pageNum = 1;         protected int pageSize = 10;         public int getPageNum() {             return pageNum;         }         public void setPageNum(int pageNum) {             this.pageNum = pageNum;         }         public int getPageSize() {             return pageSize;         }         public void setPageSize(int pageSize) {             this.pageSize = pageSize;         }         public int getMaxPageSize() {             return 1000;         }         public int getDefaultPageSize() {             return 10;         }         // 页面解析分页信息使用的方法         public String getQueryStringWithoutPageNum() {             Map m = getParameters();             m.remove("pageNum");             return QueryUtil.getQueryString(m);         }         public String getFullUrlWithoutPageNum() {             return getRequest().getServletPath() + "?"                    + getQueryStringWithoutPageNum();         }         public String getQueryStringWithoutPageInfo() {             Map m = getParameters();             m.remove("pageNum");             m.remove("pageSize");             return QueryUtil.getQueryString(m);         }         public String getFullUrlWithoutPageInfo() {             return getRequest().getServletPath() + "?"                    + getQueryStringWithoutPageInfo();         }     }

这里为了演示,我们将分页的信息都直接定义死了,大家可以根据需要来修改,其中处理信息的QueryUtil大家可以直接参考源代码,这里不做说明了,下面是UserAction处理代码的编写:

Java代码

package org.ourpioneer.action;     import org.ourpioneer.bean.PagingList;     import org.ourpioneer.service.UserService;     public class UserAction extends BaseAction {         private UserService userService;         public PagingList userList;         public void setUserService(UserService userService) {             this.userService = userService;         }         public PagingList getUserList() {             return userList;         }         public String list() {             userList = userService.getAllUsers();             return "list";         }     }

根据前面的配置,我们也不难写出代码,下面就是视图处理了,我们使用了Freemarker进行解析,也编写了FreeMarker的分页宏:

Html代码

<#-- 处理分页参数 -->    <#function getPageUrl pageNum>    <#local pageUrl=base+fullUrlWithoutPageInfo>    <#if pageUrl?ends_with("?")>    <#return pageUrl + "pageSize=" + pageSize + "&pageNum=" + pageNum>    <#else>    <#return pageUrl + "&pageSize=" + pageSize + "&pageNum=" + pageNum>    #if>    #function>    <#-- 全部或分页显示 -->    <#function getPageUrlResize size>    <#local pageUrl=base+fullUrlWithoutPageInfo>    <#if pageUrl?ends_with("?")>    <#return pageUrl + "pageNum=1&pageSize=" + size>    <#else>    <#return pageUrl + "&pageNum=1&pageSize=" + size>    #if>    #function>        <#-- 分页信息 -->    <#macro paging pagingList>    <#local pageCount=pagingList.pageCount>    <#local rowCount=pagingList.rowCount>    <#local pageNum=pagingList.pageNum>    <#local pageSize=pagingList.pageSize>    <#if rowCount == 0>        <#if useFlag?exists>            <div style="border:1px solid #666;padding:2 5 2 5;background:#efefef;color:#333">没有相关记录div>        <#else>            <#assign useFlag = 1>        #if>    <#else>    <table>        <tr>            <td style="line-height:150%">共 ${rowCount} 条记录 ${pageCount} 页              <#if pageCount gt 1 && pageSize!=maxPageSize>                <span class="selectedPage" style="padding:2px 3px 0 3px"><a class="page" href="${getPageUrlResize(maxPageSize)}">全部显示a>span>            <#elseif pageSize==maxPageSize>                <span class="selectedPage" style="padding:2px 3px 0 3px"><a class="page" href="${getPageUrlResize(defaultPageSize)}">分页显示a>span>            #if>            <#if (pageCount <= 11)>                <#local startPage = 1>                <#local endPage = pageCount>            <#elseif (pageNum + 5 > pageCount)>                <#local startPage = pageCount - 10>                <#local endPage = pageCount>            <#elseif (pageNum - 5 < 1)>                <#local startPage = 1>                <#local endPage = 11>            <#else>                <#local startPage = pageNum - 5>                <#local endPage = pageNum + 5>            #if>            <#if (pageCount > 1)>                <#if (pageNum != 1)>                    <#if (pageCount > 11)>                        <a class="page" href="${getPageUrl(1)}" style="font-family:Webdings" title="首页">9a>                    #if>                    <a class="page" href="${getPageUrl(pageNum-1)}" style="font-family:Webdings" title="上页">3a>                <#else>                    <#if (pageCount > 11)>                        <span style="font-family:Webdings;color:#999">9span>                    #if>                    <span style="font-family:Webdings;color:#999">3span>                #if>                <#list startPage..endPage as x>                    <#if x=pageNum>                        <span class="selectedPage">${x}span>                    <#else>                        <span class="noSelectedPage"><a class="page" href="${getPageUrl(x)}">${x}a>span>                    #if>                #list>                <#if (pageCount != pageNum)>                    <a class="page" href="${getPageUrl(pageNum+1)}" style="font-family:Webdings" title="下页">4a>                    <#if (pageCount > 11)>                        <a class="page" href="${getPageUrl(pageCount)}" style="font-family:Webdings" title="尾页">:a>                    #if>                <#else>                    <span style="font-family:Webdings;color:#999">4span>                    <#if (pageCount > 11)>                        <span style="font-family:Webdings;color:#999">:span>                    #if>                #if>            #if>            td>        tr>    table>    #if>    #macro>
 

之后,我们来运行项目:

基于Struts2和Freemarkeri的Batis分页是怎么样的

可以通过点击全部显示和页面来查看分页效果。

关于基于Struts2和Freemarkeri的Batis分页是怎么样的就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

基于Struts2和Freemarkeri的Batis分页是怎么样的

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

基于Struts2和Freemarkeri的Batis分页是怎么样的

这篇文章给大家介绍基于Struts2和Freemarkeri的Batis分页是怎么样的,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。之前介绍过基于Hibernate分页的原理和设计,这里我们所用的分页都是物理分页技术,
2023-06-17

基于struts2开发的试题库管理系统是怎样的

这篇文章将为大家详细讲解有关基于struts2开发的试题库管理系统是怎样的,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一、研究的现状、意义(包括选题背景、意义、国内外研究现状等)1.1 国
2023-06-02

基于DF的Tokenizer分词是怎么样的

这篇文章给大家介绍基于DF的Tokenizer分词是怎么样的,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Tokenizer分词进行文本分析前,对文本中句子进行分词我们处理的第一步。大家都是Spark的机器学习库分为基
2023-06-19

五种基于JVM的脚本语言分别是怎样的

这期内容当中小编将会给大家带来有关五种基于JVM的脚本语言分别是怎样的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用
2023-06-17

基于 Spark 的数据分析实践是怎样进行的

今天就跟大家聊聊有关基于 Spark 的数据分析实践是怎样进行的,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。引言:Spark是在借鉴了MapReduce之上发展而来的,继承了其分布
2023-06-02

基于Linux操作系统 Fedora是怎么样的

这篇文章给大家介绍基于Linux操作系统 Fedora是怎么样的,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。虽然前几天我们就已经拿到了下载地址,直到今天,延期数次的Fedora11版本才终于到达正式版的文件夹里。Fe
2023-06-17

基于SSH开发架构的重新分层是什么样的

这期内容当中小编将会给大家带来有关基于SSH开发架构的重新分层是什么样的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。现代的企业开发中,越来越多地引入了多层架构设计模式。Struts+Spring+Hib
2023-06-17

VNPY基于SAR和肯特纳的交易策略是怎样的

VNPY基于SAR和肯特纳的交易策略是怎样的,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一个比较简单策略,主要是为了验证SAR出场指标的;然后和可以结合其他下单值,做的一
2023-06-02

基于Kubernetes的微服务监控体系是怎么样的

今天就跟大家聊聊有关基于Kubernetes的微服务监控体系是怎么样的,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。监控系统是运维体系乃至整个软件产品生命周期中最重要的一环,完善的监
2023-06-17

基于md5的文件完整性检测是怎么样的

这期内容当中小编将会给大家带来有关基于md5的文件完整性检测是怎么样的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。md5sum是Linux平台下面用来检测文件完整性的给力工具,维基百科是这样来解释 md
2023-06-06

基于Groovy 加速Google App Engine开发是怎么样的

这篇文章将为大家详细讲解有关基于Groovy 加速Google App Engine开发是怎么样的,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。轻量级是全新的趋势虽然 Google 的基础设
2023-06-17

yum仓库基于file和http两种服务器的搭建过程是怎么样的

这期内容当中小编将会给大家带来有关yum仓库基于file和http两种服务器的搭建过程是怎么样的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。YUM: Yellowdog Update Modifier,
2023-06-06

django项目基于钩子验证的注册功能是怎么样的

这期内容当中小编将会给大家带来有关django项目基于钩子验证的注册功能是怎么样的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。  前端html  注册  {# 注册的开始#}  onsubmit="re
2023-06-02

基于CRF序列标注的中文依存句法分析器的Java实现是怎么样的

这篇文章给大家介绍基于CRF序列标注的中文依存句法分析器的Java实现是怎么样的,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。这是一个基于CRF的中文依存句法分析器,内部CRF模型的特征函数采用 双数组Trie树(Do
2023-06-02

vuex的核心概念和基本使用是怎么样的

vuex的核心概念和基本使用是怎么样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。介绍Vuex是实现组件全局状态(数据)管理的一种机制,可以方便的实现组件之间的数据共享开始安
2023-06-22

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录