博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JFinal多参数搜索条件自动组装及参数传递
阅读量:5906 次
发布时间:2019-06-19

本文共 4695 字,大约阅读时间需要 15 分钟。

hot3.png

网站中常常会用到搜索功能。单个条件的搜索很好实现,多条件组合搜索时,如何优美地实现参数的组装和传递就成了一个重要的问题。

最近在用JFinal做点小东西,遇到了这个功能需求,经过一番努力实现了这个功能,记录分享如下:

JFinal在提交搜索后,需要对搜索条件一个个getPara()获取,如果参数多了肯定不方便;并且由于JFinal将表单提交的参数封装成了HashMap,无法知道实体对象属性的类型。因为对于不同的类型,在sql语句里会有不同的处理,比如String类型使用 like '%value%',Integer类型使用 =value 等等。

JFinal的实体类代码很简单:

public class Item extends Model
{ public static final Item dao = new Item(); }
在增加了私有属性定义及get、set方法后,页面的list不能正常显示值,不解后放弃了对实体类的改动。

于是给Item增加了一个对应的搜索实体类:

package com.demo.item;/** * ItemSearch model. */public class ItemSearch {		private Integer id;	private String name;	private String color;	private String picture;	public Integer getId() {		return id;	}	public void setId(Integer id) {		this.id = id;	}	public String getName() {		return name;	}	public void setName(String name) {		this.name = name;	}        public String getColor() {		return color;	}	public void setColor(String color) {		this.color = color;	}        ... ...	public ItemSearch() {		super();	}	}
里面的属性和Item一一对应。

接下来就是处理多搜索条件,自动拼接sql和urlParas的方法:

public static String[] makePara(Object obj, String objSearch, Map
paraMap) { String[] returnStr = new String[2]; StringBuffer sqlStr = new StringBuffer(128); StringBuffer paraStr = new StringBuffer(128); Set
nameSet = paraMap.keySet(); try { for(String name:nameSet){ String[] props = name.split("\\."); if(props[0].equals(objSearch)){ Class
type = obj.getClass().getDeclaredField(props[1]).getType(); if (paraMap.get(name) != null && !paraMap.get(name)[0].equals("")) { if(type == String.class){ sqlStr.append(" and ").append(props[1]).append(" like '%").append(paraMap.get(name)[0]).append("%'"); }else if(type == Integer.class){ sqlStr.append(" and ").append(props[1]).append("=").append(paraMap.get(name)[0]); }else if(type == Double.class){ sqlStr.append(" and ").append(props[1]).append("=").append(paraMap.get(name)[0]); }else if(type == Boolean.class){ sqlStr.append(" and ").append(props[1]).append("=").append(paraMap.get(name)[0]); }else if(type == Date.class){ sqlStr.append(" and ").append(props[1]).append(" ='").append(paraMap.get(name)[0]).append("'"); } paraStr.append("&").append(name).append("=").append(paraMap.get(name)[0]); } } } } catch (Exception e) { e.printStackTrace(); } returnStr[0] = sqlStr.toString(); returnStr[1] = paraStr.toString(); return returnStr; }
你会发现返回值是个String数组,因为这里我需要两个东西,查询用的sql条件语句和翻页时传递这些搜索条件的字符串。

好了,然后在Controller中怎么使用呢?请看下面的代码:

private ItemSearch itemSearch = new ItemSearch();	public ItemSearch getItemSearch() {		return itemSearch;	}	public void setItemSearch(ItemSearch itemSearch) {		this.itemSearch = itemSearch;	}
首先是定义一个itemSearch的搜索条件对象,这样通过反射可以得到每个属性的类型,然后是:

String sqlCondition = " 1=1";		Map
paraMap = getParaMap(); String[] paraStr = Utility.makePara(itemSearch, "itemSearch", paraMap); sqlCondition += paraStr[0]; setAttr("productPage", Item.dao.paginate(page, 15, "select *", "from item where" + sqlCondition + " order by id desc")); setAttr("searchCon", paraStr[1]);
JFinal中获取表单提交的全部数据用getParaMap()即可,然后就是调用上面拼接sql的方法makePara,这里需要传入3个参数,分别是itemSearch对象,搜索实体类的名字“itemSearch”(稍后判断有用),以及表单提交的全部搜索参数paraMap。
返回的参数paraStr[0]是用在sql里的,paraStr[1]是翻页时传递参数用的。

列表页面在用到分页组件时,需要增加一个参数:

urlParas=searchCon
其中,urlParas是在paginate模版里会用到的,searchCon就是刚才在Controller的方法里setAttr的paraStr[1]。

在paginate模版里是这样的:

<#macro paginate currentPage totalPage actionUrl urlParas>	<#if (totalPage <= 0) || (currentPage > totalPage)><#return>
<#local startPage = currentPage - 4> <#if (startPage < 1)><#local startPage = 1>
<#local endPage = currentPage + 4> <#if (endPage > totalPage)><#local endPage = totalPage>

原来第一行的urlParas参数是="",这里把=""去掉,然后放在分页链接的最后即可。

在搜索页面只要这样写就可以:

初看着好像没什么不同,但当你增加搜索条件时,只需要在form里增加一个input,name就是搜索对象.属性名, 而其它地方的代码不用再做任何改动。对于String类型自动使用like模糊搜索,数值类型使用=。

以上是我目前能想到且正在使用的方法,只需要为实体类增加一个包含私有属性及get、set方法的搜索实体类,参数拼接的方法类可以通用,翻页时也可以将搜索条件一直带着。

一般翻页携带参数可以是url、cookies、session这几种,上面方法使用的是url携带参数,当然你也可以把搜索条件放到session里,然后在非搜索访问任意列表action时删除搜索条件的session就可以了。

这是我在oschina发表的第一篇文章,希望对需要的人能有点点帮助就好了。

转载于:https://my.oschina.net/vikingz/blog/144374

你可能感兴趣的文章
RocketMQ事务消息实战
查看>>
手把手教你做出好看的文本输入框
查看>>
zabbix 3.2.7 (源码包)安装部署
查看>>
vsCode 快捷键、插件
查看>>
网络最大流问题算法小结 [转]
查看>>
iOS推送消息报错误“Domain=NSCocoaErrorDomain Code=3000”的可能问题
查看>>
kvm-1
查看>>
leetcode 64. Minimum Path Sum
查看>>
textkit
查看>>
CentOS7+CDH5.14.0安装CDH错误排查: HiveServer2 该角色的进程已退出。该角色的预期状态为已启动...
查看>>
The Oregon Trail 俄勒冈之旅
查看>>
Excel VBA连接MySql 数据库获取数据
查看>>
Developing a Service Provider using Java API(Service Provider Interface)(转)
查看>>
oschina程序开发
查看>>
“正在注册字体”问题解决
查看>>
iOS开发-OpenGL ES入门教程1
查看>>
Java 设计模式专栏
查看>>
使用ASP.NET Atlas SortBehavior实现客户端排序
查看>>
图像滤镜处理算法:灰度、黑白、底片、浮雕
查看>>
Office文档出错的几种原因与解决方法
查看>>