想要實現一個功能,就是,在頁面的查詢條件裏面,能夠在一個輸入框裏面,讓用戶能夠
模糊搜索金額;支持像 >、>=、<、<=、=、>=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)
如今咱們回頭看頁面的話,頁面的查詢結果就是咱們按照金額的範圍來查詢出的結果:
測試