Struts2 接收 DataTables 服务端处理参数以及简单的分页模型

本贴最后更新于 2810 天前,其中的信息可能已经时移世改

后端使用struts2的时候,Datatables使用服务端处理的话,怎么处理自动发送的参数呢?

结合实际开发,弄了一个比较简单易用的处理方法,仅适用于不是特别复杂的场景,另外附上分页模型。

Datatables版本为1.10.0


struts2获取DT发送参数的工具类,可在action中调用



/*
 * 获取DT发送的参数
 * 
 */
public static Map<String,Object> getDTParameters(){
	Map<String,Object> returnMap = new HashMap<String,Object>();		
	//排序的那一列位置
	String orderColumnNum = ServletActionContext.getRequest().getParameter("order[0][column]");
	//排序方式 asc或者desc
	String orderType = ServletActionContext.getRequest().getParameter("order[0][dir]");
	//全局搜索条件
	String searchValue = ServletActionContext.getRequest().getParameter("search[value]");
	//需要排序的那一列属性名称
	String orderDataName = ServletActionContext.getRequest().getParameter("columns["+orderColumnNum+"][data]");
	//获取当前所有的展示字段
	Map<String, String[]> params = ServletActionContext.getRequest().getParameterMap();
	List<String> dataParams = new ArrayList<String>();
	for(Map.Entry<String, String[]> entry:params.entrySet()){
		if(entry.getKey().indexOf("][data]")!=-1){
			String a = (params.get(entry.getKey()))[0];
			if(!a.equals("")){
				dataParams.add(a);
			}
		}
	}
	returnMap.put("orderDataName", orderDataName);
	returnMap.put("orderType", orderType);
	returnMap.put("searchValue", searchValue);
	returnMap.put("dataParams", dataParams);
	return returnMap;
}


Action 中对应的 list 方法


备注:此为BaseAction中的方法,如果你没有ActionBase类把T改成对应实体类型就行了


/**
* 通用 list方法
* 分页展示对应实体的集合
* @return
*/
public String list(){
Map<String,Object>  dt = StrutsUtils.getDTParameters();
PageModel<T> pu = baseService.findByPager(start, length,(String)dt.get("orderDataName"),(String)dt.get("orderType"),(String)dt.get("searchValue"),(List<String>)dt.get("dataParams"));
jsonMap.put("draw", draw);
jsonMap.put("data", pu.getDatas());
jsonMap.put("recordsTotal", pu.getRecordCount());
if(!((String)dt.get("searchValue")).equals("")){
jsonMap.put("recordsFiltered", pu.getDatas().size());
}else{
jsonMap.put("recordsFiltered", pu.getRecordCount());
}
jsonMap.put("returnCode", 0);
return SUCCESS;
}
Dao方法中实现

备注:同样为BaseDao,ORM框架为Hibernate


public PageModel<T> findByPager(int dataNo, int pageSize,String orderDataName,String orderType,String searchValue,List<String> dataParams) {
// TODO Auto-generated method stub
PageModel<T> pm=new PageModel<T>(orderDataName, orderType,searchValue,dataParams,dataNo,pageSize);

String hql="from "+clazz.getSimpleName();

//增加搜索条件
if(searchValue!=""){
	hql+=" where ";
	int i = 1;
	for(String s:dataParams){
		hql+=s+" like '%" + searchValue + "%'";
		i++;
		if(i<=dataParams.size()){
			hql+=" or ";
		}
	}
	
}

//增加排序
if(orderDataName!=""){
	hql += " order by " + orderDataName + " " + orderType;
}



pm.setDatas(getSession().createQuery(hql).setFirstResult(dataNo).setMaxResults(pageSize).setCacheable(true).list());
pm.setRecordCount(totalCount());
return pm;
}

分页模型PageModel<T>


/**
 * 
 */
package com.dcits.business.base.bean;

import java.util.ArrayList;
import java.util.List;

/**

  • @author xuwangcheng

  • 分页模型
    */
    public class PageModel<T> {

    //当前需要排序的列名称
    private String orderDataName;
    //排序方式,默认 asc
    private String orderType = "asc";
    //全局搜索条件
    private String searchValue = "";
    //当前展示的字段名
    private List<String> dataParams = new ArrayList<String>();
    //当前起始数据的位置
    private int dataNo=0;
    //每页显示的记录数
    private int pageSize=10;
    //总记录数
    private int recordCount;
    //总页数
    private int pageCount;
    //存放分页数据的集合
    private List<T> datas;

    public PageModel(){

    }

    public PageModel(String orderDataName, String orderType,
    String searchValue, List<String> dataParams, int dataNo,
    int pageSize) {
    super();
    this.orderDataName = orderDataName;
    this.orderType = orderType;
    this.searchValue = searchValue;
    this.dataParams = dataParams;
    this.dataNo = dataNo;
    this.pageSize = pageSize;
    }

    public List<String> getDataParams() {
    return dataParams;
    }

    public void setDataParams(List<String> dataParams) {
    this.dataParams = dataParams;
    }

    public String getOrderDataName() {
    return orderDataName;
    }

    public void setOrderDataName(String orderDataName) {
    this.orderDataName = orderDataName;
    }

    public String getOrderType() {
    return orderType;
    }

    public void setOrderType(String orderType) {
    this.orderType = orderType;
    }

    public String getSearchValue() {
    return searchValue;
    }

    public void setSearchValue(String searchValue) {
    this.searchValue = searchValue;
    }

    public int getDataNo() {
    return dataNo;
    }

    public void setDataNo(int dataNo) {
    this.dataNo = dataNo;
    }

    public int getPageSize() {
    return pageSize;
    }

    public void setPageSize(int pageSize) {
    this.pageSize = pageSize;
    }

    public int getRecordCount() {
    return recordCount;
    }

    public void setRecordCount(int recordCount) {
    this.recordCount = recordCount;
    }

    public int getPageCount() {
    if(this.getRecordCount()<=0){
    return 0;
    }else{
    pageCount=(recordCount+pageSize-1)/pageSize;
    }
    return pageCount;
    }

    public void setPageCount(int pageCount) {
    this.pageCount = pageCount;
    }

    public List<T> getDatas() {
    return datas;
    }

    public void setDatas(List<T> datas) {
    this.datas = datas;
    }

}


本人为Java新手,如有错误,欢迎指出并一起讨论!

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3170 引用 • 8209 回帖
  • Datatables
    1 引用 • 1 回帖
  • Struts2
    13 引用 • 14 回帖 • 1 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • eddy

    想想自己多久没用过 struts2 了

推荐标签 标签

  • 书籍

    宋真宗赵恒曾经说过:“书中自有黄金屋,书中自有颜如玉。”

    77 引用 • 390 回帖
  • 外包

    有空闲时间是接外包好呢还是学习好呢?

    26 引用 • 232 回帖 • 2 关注
  • iOS

    iOS 是由苹果公司开发的移动操作系统,最早于 2007 年 1 月 9 日的 Macworld 大会上公布这个系统,最初是设计给 iPhone 使用的,后来陆续套用到 iPod touch、iPad 以及 Apple TV 等产品上。iOS 与苹果的 Mac OS X 操作系统一样,属于类 Unix 的商业操作系统。

    84 引用 • 139 回帖
  • Google

    Google(Google Inc.,NASDAQ:GOOG)是一家美国上市公司(公有股份公司),于 1998 年 9 月 7 日以私有股份公司的形式创立,设计并管理一个互联网搜索引擎。Google 公司的总部称作“Googleplex”,它位于加利福尼亚山景城。Google 目前被公认为是全球规模最大的搜索引擎,它提供了简单易用的免费服务。不作恶(Don't be evil)是谷歌公司的一项非正式的公司口号。

    49 引用 • 192 回帖
  • 数据库

    据说 99% 的性能瓶颈都在数据库。

    336 引用 • 669 回帖
  • 阿里云

    阿里云是阿里巴巴集团旗下公司,是全球领先的云计算及人工智能科技公司。提供云服务器、云数据库、云安全等云计算服务,以及大数据、人工智能服务、精准定制基于场景的行业解决方案。

    89 引用 • 345 回帖
  • 酷鸟浏览器

    安全 · 稳定 · 快速
    为跨境从业人员提供专业的跨境浏览器

    3 引用 • 59 回帖 • 35 关注
  • TextBundle

    TextBundle 文件格式旨在应用程序之间交换 Markdown 或 Fountain 之类的纯文本文件时,提供更无缝的用户体验。

    1 引用 • 2 回帖 • 47 关注
  • FreeMarker

    FreeMarker 是一款好用且功能强大的 Java 模版引擎。

    23 引用 • 20 回帖 • 454 关注
  • CAP

    CAP 指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得。

    11 引用 • 5 回帖 • 597 关注
  • 禅道

    禅道是一款国产的开源项目管理软件,她的核心管理思想基于敏捷方法 scrum,内置了产品管理和项目管理,同时又根据国内研发现状补充了测试管理、计划管理、发布管理、文档管理、事务管理等功能,在一个软件中就可以将软件研发中的需求、任务、bug、用例、计划、发布等要素有序的跟踪管理起来,完整地覆盖了项目管理的核心流程。

    6 引用 • 15 回帖 • 146 关注
  • OpenStack

    OpenStack 是一个云操作系统,通过数据中心可控制大型的计算、存储、网络等资源池。所有的管理通过前端界面管理员就可以完成,同样也可以通过 Web 接口让最终用户部署资源。

    10 引用 • 1 关注
  • jsDelivr

    jsDelivr 是一个开源的 CDN 服务,可为 npm 包、GitHub 仓库提供免费、快速并且可靠的全球 CDN 加速服务。

    5 引用 • 31 回帖 • 50 关注
  • 代码片段

    代码片段是一段 CSS 或 JS 的代码,这些代码会在思源笔记加载时自动执行,用于改善笔记的样式或功能。

    用户在分享内容时请在帖子标题前添加 [css][js] 作为标签

    15 引用 • 84 回帖 • 1 关注
  • Solo

    Solo 是一款小而美的开源博客系统,专为程序员设计。Solo 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    1433 引用 • 10052 回帖 • 486 关注
  • jQuery

    jQuery 是一套跨浏览器的 JavaScript 库,强化 HTML 与 JavaScript 之间的操作。由 John Resig 在 2006 年 1 月的 BarCamp NYC 上释出第一个版本。全球约有 28% 的网站使用 jQuery,是非常受欢迎的 JavaScript 库。

    63 引用 • 134 回帖 • 726 关注
  • 钉钉

    钉钉,专为中国企业打造的免费沟通协同多端平台, 阿里巴巴出品。

    15 引用 • 67 回帖 • 346 关注
  • 域名

    域名(Domain Name),简称域名、网域,是由一串用点分隔的名字组成的 Internet 上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置)。

    43 引用 • 208 回帖
  • Vditor

    Vditor 是一款浏览器端的 Markdown 编辑器,支持所见即所得、即时渲染(类似 Typora)和分屏预览模式。它使用 TypeScript 实现,支持原生 JavaScript、Vue、React 和 Angular。

    345 引用 • 1778 回帖
  • Redis

    Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。从 2010 年 3 月 15 日起,Redis 的开发工作由 VMware 主持。从 2013 年 5 月开始,Redis 的开发由 Pivotal 赞助。

    286 引用 • 248 回帖 • 95 关注
  • FlowUs

    FlowUs.息流 个人及团队的新一代生产力工具。

    让复杂的信息管理更轻松、自由、充满创意。

    1 引用 • 3 关注
  • ngrok

    ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道。

    7 引用 • 63 回帖 • 625 关注
  • 小说

    小说是以刻画人物形象为中心,通过完整的故事情节和环境描写来反映社会生活的文学体裁。

    28 引用 • 108 回帖
  • H2

    H2 是一个开源的嵌入式数据库引擎,采用 Java 语言编写,不受平台的限制,同时 H2 提供了一个十分方便的 web 控制台用于操作和管理数据库内容。H2 还提供兼容模式,可以兼容一些主流的数据库,因此采用 H2 作为开发期的数据库非常方便。

    11 引用 • 54 回帖 • 656 关注
  • Hibernate

    Hibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,使得 Java 程序员可以随心所欲的使用对象编程思维来操纵数据库。

    39 引用 • 103 回帖 • 714 关注
  • CSS

    CSS(Cascading Style Sheet)“层叠样式表”是用于控制网页样式并允许将样式信息与网页内容分离的一种标记性语言。

    196 引用 • 530 回帖
  • 创造

    你创造的作品可能会帮助到很多人,如果是开源项目的话就更赞了!

    175 引用 • 994 回帖