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

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

后端使用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 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3201 引用 • 8216 回帖
  • Datatables
    1 引用 • 1 回帖
  • Struts2
    13 引用 • 14 回帖 • 1 关注

相关帖子

欢迎来到这里!

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

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

    想想自己多久没用过 struts2 了

推荐标签 标签

  • 一些有用的避坑指南。

    69 引用 • 93 回帖
  • 小说

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

    32 引用 • 108 回帖 • 1 关注
  • OpenResty

    OpenResty 是一个基于 NGINX 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

    17 引用 • 53 关注
  • BookxNote

    BookxNote 是一款全新的电子书学习工具,助力您的学习与思考,让您的大脑更高效的记忆。

    笔记整理交给我,一心只读圣贤书。

    1 引用 • 1 回帖
  • wolai

    我来 wolai:不仅仅是未来的云端笔记!

    2 引用 • 14 回帖 • 5 关注
  • 印象笔记
    3 引用 • 16 回帖 • 1 关注
  • 宕机

    宕机,多指一些网站、游戏、网络应用等服务器一种区别于正常运行的状态,也叫“Down 机”、“当机”或“死机”。宕机状态不仅仅是指服务器“挂掉了”、“死机了”状态,也包括服务器假死、停用、关闭等一些原因而导致出现的不能够正常运行的状态。

    13 引用 • 82 回帖 • 78 关注
  • golang

    Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。

    499 引用 • 1395 回帖 • 246 关注
  • 30Seconds

    📙 前端知识精选集,包含 HTML、CSS、JavaScript、React、Node、安全等方面,每天仅需 30 秒。

    • 精选常见面试题,帮助您准备下一次面试
    • 精选常见交互,帮助您拥有简洁酷炫的站点
    • 精选有用的 React 片段,帮助你获取最佳实践
    • 精选常见代码集,帮助您提高打码效率
    • 整理前端界的最新资讯,邀您一同探索新世界
    488 引用 • 384 回帖 • 10 关注
  • Lute

    Lute 是一款结构化的 Markdown 引擎,支持 Go 和 JavaScript。

    29 引用 • 202 回帖 • 28 关注
  • WordPress

    WordPress 是一个使用 PHP 语言开发的博客平台,用户可以在支持 PHP 和 MySQL 数据库的服务器上架设自己的博客。也可以把 WordPress 当作一个内容管理系统(CMS)来使用。WordPress 是一个免费的开源项目,在 GNU 通用公共许可证(GPLv2)下授权发布。

    67 引用 • 114 回帖 • 193 关注
  • 酷鸟浏览器

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

    3 引用 • 59 回帖 • 48 关注
  • Flutter

    Flutter 是谷歌的移动 UI 框架,可以快速在 iOS 和 Android 上构建高质量的原生用户界面。 Flutter 可以与现有的代码一起工作,它正在被越来越多的开发者和组织使用,并且 Flutter 是完全免费、开源的。

    39 引用 • 92 回帖 • 4 关注
  • 持续集成

    持续集成(Continuous Integration)是一种软件开发实践,即团队开发成员经常集成他们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。

    15 引用 • 7 回帖 • 1 关注
  • PostgreSQL

    PostgreSQL 是一款功能强大的企业级数据库系统,在 BSD 开源许可证下发布。

    22 引用 • 22 回帖 • 2 关注
  • 友情链接

    确认过眼神后的灵魂连接,站在链在!

    24 引用 • 373 回帖 • 1 关注
  • 代码片段

    代码片段分为 CSS 与 JS 两种代码,添加在 [设置 - 外观 - 代码片段] 中,这些代码会在思源笔记加载时自动执行,用于改善笔记的样式或功能。

    用户在该标签下分享代码片段时需在帖子标题前添加 [css] [js] 用于区分代码片段类型。

    170 引用 • 1150 回帖 • 2 关注
  • ZooKeeper

    ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务,是 Google 的 Chubby 一个开源的实现,是 Hadoop 和 HBase 的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

    59 引用 • 29 回帖
  • Sublime

    Sublime Text 是一款可以用来写代码、写文章的文本编辑器。支持代码高亮、自动完成,还支持通过插件进行扩展。

    10 引用 • 5 回帖 • 2 关注
  • 又拍云

    又拍云是国内领先的 CDN 服务提供商,国家工信部认证通过的“可信云”,乌云众测平台认证的“安全云”,为移动时代的创业者提供新一代的 CDN 加速服务。

    20 引用 • 37 回帖 • 576 关注
  • Kafka

    Kafka 是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是现代系统中许多功能的基础。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。

    36 引用 • 35 回帖 • 2 关注
  • Thymeleaf

    Thymeleaf 是一款用于渲染 XML/XHTML/HTML5 内容的模板引擎。类似 Velocity、 FreeMarker 等,它也可以轻易的与 Spring 等 Web 框架进行集成作为 Web 应用的模板引擎。与其它模板引擎相比,Thymeleaf 最大的特点是能够直接在浏览器中打开并正确显示模板页面,而不需要启动整个 Web 应用。

    11 引用 • 19 回帖 • 391 关注
  • GitLab

    GitLab 是利用 Ruby 一个开源的版本管理系统,实现一个自托管的 Git 项目仓库,可通过 Web 界面操作公开或私有项目。

    46 引用 • 72 回帖 • 1 关注
  • OneDrive
    2 引用
  • Log4j

    Log4j 是 Apache 开源的一款使用广泛的 Java 日志组件。

    20 引用 • 18 回帖 • 29 关注
  • 爬虫

    网络爬虫(Spider、Crawler),是一种按照一定的规则,自动地抓取万维网信息的程序。

    106 引用 • 275 回帖
  • LeetCode

    LeetCode(力扣)是一个全球极客挚爱的高质量技术成长平台,想要学习和提升专业能力从这里开始,充足技术干货等你来啃,轻松拿下 Dream Offer!

    209 引用 • 72 回帖