想要实现一个功能,就是,在页面的查询条件里面,能够在一个输入框里面,让用户能够
模糊搜索金额;支持像 >、>=、<、<=、=、>=20,<=50等一些基本的运算符的表达式。javascript
输入框的Title 能够设置为:
请输入要查询的金额范围,例如:
大于某个数值:>5000,表示支出金额大于5000元
大于等于数值:>=500,表示支出金额大于并包含500元
金额区间数值:>=500,<=1000,表示大于等于500而且小于等于1000元
【注意:请使用英文模式下的符号】
输入框的默认placeholder提示内容能够设置为:~ 例如:>=500,<=1000 ~html
<td title="请输入要查询的金额范围,例如: 大于某个数值:>5000,表示支出金额大于5000元 大于等于数值:>=500,表示支出金额大于并包含500元 金额区间数值:>=500,<=1000,表示大于等于500而且小于等于1000元 【注意:请使用英文模式下的符号】"> <input class="" type="text" id="jine_like" name="jine_like" value="${xmtjPage.jine_like}" placeholder="~ 例如:>=500,<=1000 ~" /> </td> 说明: :就是一个回车换行的制表符。 placeholder:就是html等文件中的输入框(如input)值为空的时候的默认显示,注意,这只是显示,当鼠标键入的时候,该提示会消失。
@RequestMapping("/queryXmZctjList") public String queryXmZctjList(Model modelXmtjPage xmtjPage) { String jine_like_demo = xmtjPage.getJine_like(); if(checkNumber(xmtjPage.getJine_like())){//校验查询条件的金额是否合法 String dmeo1 = xmtjPage.getJine_like(); if(null!=dmeo1 &&dmeo1.indexOf(",") != -1){ dmeo1 = dmeo1.replace(",", " and to_number(nvl(t.sjbxje,0)) "); xmtjPage.setJine_like(dmeo1); } }else{ xmtjPage.setJine_like(""); model.addAttribute("errMes", "您输入的查询条件含有不容许的字符,请检查后从新操做"); } List<ZctjEntity> zctjList = xmwhService.query(xmtjPage); model.addAttribute("zctjList", zctjList); xmtjPage.setJine_like(jine_like_demo); return "/../../listZctj"; }
checkNumber( )方法:校验用户输入的 字符串是否合法
说明:这个方法时颇有必要的,能够检测并控制用户的输入,防止一些人输入一些非法字符致使系统报错,甚至SQL脚本注入等危险操做的发生(这也只是我临时写的,颇有可能把控的不够严谨,不吝赐教!)。前端
// 校验字符串是否合法 public boolean checkNumber(String str) { boolean bb = true; if (null != str && !"".equals(str)) { if (containsStr(str)) { bb = false; } if (str.indexOf("《") != -1 || str.indexOf("》") != -1 || str.indexOf(",") != -1 || str.indexOf("。") != -1) { bb = false; } if (null != str && str.indexOf(",") != -1) { str = str.replace(",", " and sa.aass "); } try { kkssqService.query("xmwh.queryResultByDual", str);// 测试是否能够经过sql语法校验 } catch (Exception e) { bb = false; } } return bb; }
containsStr( )方法:检查是否包含英文字母java
//检查是否包含英文字母 public boolean containsStr(String cardNum) { String regex=".*[a-zA-Z]+.*"; Matcher m=Pattern.compile(regex).matcher(cardNum); return m.matches(); }
在xml(sql管理)里面,方法的合适位置写上java处理好的金额模糊查询的条件
注意:这里必须使用 jinelikejine_likejinelike,而不能使用经常使用的 #jine_like# 来取值了,由于java后台传递过来的参数值中包含敏感字符。sql
where 1=1 <isNotEmpty prepend="and" property="jine_like"> (to_number(nvl(t.sjbxje,0)) $jine_like$ ) </isNotEmpty>
例如咱们输入的是: >=300,<1500
断点到这里的时候,咱们看到了前端传递过来的值以下图:
而后,通过方法的合法性检查、处理后,获得以下参数:
app
这时候,咱们看控制台打印出来的最终的执行sql的where条件那块代码是这样的:jsp
.... where 1 = 1 and (to_number(nvl(t.sjbxje, 0)) >= 300 and to_number(nvl(t.sjbxje, 0)) < 1500)
如今咱们回头看页面的话,页面的查询结果就是咱们按照金额的范围来查询出的结果:
测试