1. 程式人生 > >實現模糊查詢時對特殊字元進行處理和對查詢結果進行處理

實現模糊查詢時對特殊字元進行處理和對查詢結果進行處理

最近正處於期末考試周,部落格好久沒有更新。而且程式碼也寫的比較少所以也不知道有什麼好東西分享給大家。在這次的課程設計中老師佈置了一個完成資訊檢索的作業,我是用網頁實現的。功能比較簡單寫了將近半天的時間就完成功能,但是我還有點意猶未盡的感覺所以自己又完善了一下細節。然後我注意到如果在實際開發中,我們要用模糊查詢來進行檢索那返回的結果中最好是應該把查詢條件進行高亮顯示的這樣也算是提高使用者體驗。所以知道做什麼了之後,馬上就想到應該是在封裝結果集的時候在返回的字串結果中新增html元素(哼  我這麼機智,肯定分分鐘就想到了)。我的思路是在封裝RowMapper的時候用已經添加了html元素的字串替換原來的字串(String的replace()方法)。原來的字串也就是傳到後臺的查詢條件。RowMapper獲取查詢條件的方式我用的是構造方法傳參。好 解決問題的基本思路就是這樣,下面請看程式碼:
    private class SearchByResumeRowMapper implements RowMpper<List<Info>> {
        
        private String name;
        
        public SearchByResumeRowMapper(String name) {
            this.name = name.replace("%","");
        }
        
        @Override
        public List<Info> mapperRow(ResultSet rs) throws SQLException {
            List<Info> list = new ArrayList<Info>();
            while(rs.next()){
                Info info = new Info();
                info.setTypeName(rs.getString("typeName"));
                info.setAuther(rs.getString("auther"));
                info.setResume((rs.getString("resume")).replace(name, "<b style=\"color:red\">" + name + "</b>"));
                info.setOrigin(rs.getString("origin"));
                info.setPublishDate(rs.getString("publishDate"));
                info.setTitle(rs.getString("title"));
                
                list.add(info);
            }
            
            return list;
        }
    }

這裡我只貼出來了RowMapper這個類。

這時問題來了,如果我們在頁面上的查詢條件寫成“%”或者是“_”,這時查出來的結果就會出問題。原因是我們沒有對模糊查詢的特殊字元進行處理,所以對sql進行改進:

SELECT 欄位 FROM info WHERE param LIKE ? ESCAPE '\\';

這句sql的ESCAPE的意思是對\後面的一個字元只當成普通字元處理(sql語句中用兩個反斜槓是因為轉義字元,其實就是一個反斜槓)。比如SELECT 欄位 FROM info WHERE param LIKE '%\\%%' ESCAPE '\\';這句話的意思是查詢含有%的param欄位。(為了避免java轉義字元反斜槓造成程式的混亂 這裡我們可以用別的字元 比如正斜槓。樓主這裡用的是反斜槓)。下面是改良過後的程式碼:

在servlet裡對特殊字元進行處理

content = content.replace("\\", "\\\\");
content = content.replace("_", "\\_");
content = content.replace("%", "\\%");
content = content.replace("[", "\\["); 
content = content.replace("]", "\\]");
然後下邊是改良後的RowMapper
    private class SearchByResumeRowMapper implements RowMpper<List<Info>> {
        
        private String name;
        
        public SearchByResumeRowMapper(String name) {
            String tmp = name.substring(1,name.length()-1); 
            //deal the "_","%","[","]","\" in result and the sequence can't be changed!
            //English of Chinese boy... sorry...
            tmp = tmp.replace("\\_", "_");
            tmp = tmp.replace("\\%", "%");
            tmp = tmp.replace("\\[", "["); 
            tmp = tmp.replace("\\]", "]");
            tmp = tmp.replace("\\\\", "\\");
            this.name = tmp;
        }
        
        @Override
        public List<Info> mapperRow(ResultSet rs) throws SQLException {
            List<Info> list = new ArrayList<Info>();
            while(rs.next()){
                Info info = new Info();
                info.setTypeName(rs.getString("typeName"));
                info.setAuther(rs.getString("auther"));
                info.setResume((rs.getString("resume")).replace(name, "<b style=\"color:red\">" + name + "</b>"));
                info.setOrigin(rs.getString("origin"));
                info.setPublishDate(rs.getString("publishDate"));
                info.setTitle(rs.getString("title"));
                
                list.add(info);
            }
            
            return list;
        }
    }

當然了 這只是一個很簡單的小功能,但是覺得收穫也挺大的,所以記錄一下。

把程式碼放到github上了,有興趣的可以看看,並不是正經專案就是一個課設。所以程式碼有些簡陋。。。

點選檢視程式碼



相關推薦

實現模糊查詢特殊字元進行處理查詢結果進行處理

最近正處於期末考試周,部落格好久沒有更新。而且程式碼也寫的比較少所以也不知道有什麼好東西分享給大家。在這次的課程設計中老師佈置了一個完成資訊檢索的作業,我是用網頁實現的。功能比較簡單寫了將近半天的時間就完成功能,但是我還有點意猶未盡的感覺所以自己又完善了一下細節。然後我注意到如果在實際開發中,我們要用模糊查詢

js/jquery特殊字元進行轉義防止js注入使用示例

  /** JQuery Html Encoding、Decoding * 原理是利用JQuery自帶的html()和text()函式可以轉義Html字元 * 虛擬一個Div通過賦值和取值來得到想要的Html編碼或者解碼 */ <script src="https://cdn.b

使用jquery ajax特殊字元進行轉義,防止js注入

在使用ajax進行留言的時候,出現了一個問題.因為留言內容寫完之後,通過ajax提交內容,同時使用js把留言的內容新增到頁面上來.瀏覽留言的時候也是通過ajax請求,然後再顯示的.這樣,如果有人在留言裡寫入了js語句,這結語句都會被執行.解決辦法就是對這些特殊字元進行轉義再

使用jquery特殊字元進行轉義,防止js注入

使用ajax進行留言的時候,出現了一個問題.因為留言內容寫完之後,通過ajax提交內容,同時使用js把留言的內容新增到頁面上來.瀏覽留言的時候也是通過ajax請求,然後再顯示的.這樣,如果有人在留言裡寫入了js語句,這結語句都會被執行.解決辦法就是對這些特殊字元進行轉義再顯示出來.如果在jsp中使用jstl

JSON中特殊字元處理

        在前臺通過textarea儲存資料到後臺資料庫時,如果資料中存在回車符等特殊字元時,就無法把資料封裝成json資料傳到前臺顯示,這時需要在傳回前臺之前轉義或替換資料中的特殊字元,然後在拼接封裝成json資料。替換方法如下: /** * 處理json中的特

iOS Http傳輸過程中特殊字元處理

在進行http傳輸的過程,如果有特殊的符合,例如“+,&。*”,不會進行處理,都直接替換掉了。 原因:預設的系統不會對這些特殊符號進行轉義,只會進行替換 解決辦法:在post之前對這些特殊符

JAVA特殊字元處理

最近在維護OA系統的時候,剛好遇到幾個類似的問題。總結了一下大概是下面三種情況。1.在拼接原生SQL的時候,特殊字元如【'】,破壞了SQL的完整性。public String escapeExprSpecialWord(String keyword) { if

關於gson特殊字元處理

gson的坑: gson會預設將特殊字元轉化成unicode編碼 Gson gson = new GsonBuilder().disableHtmlEscaping().create();// Gs

xml 特殊字元處理(新增cdata標籤)

有時候會在xml裡新增包含類似'&'的特殊字元,這樣在進行XML解析時會導致錯誤解析得到不正確的資訊,故而有必要針對這些特殊字元進行處理.利用cdata標籤,這樣xml在解析時就不會錯誤判斷了

php特殊字元處理

在magic_quotes_gpc=On的情況下,如果輸入的資料有單引號(’)、雙引號(”)、反斜線()與 NUL(NULL 字元)等字元都會被加上反斜線。這些轉義是必須的,如果這個選項為off,那麼我們就必須呼叫addslashes這個函式來為字串增加轉義。正是因為這個選項必須為On,但是又讓使用者進行配置

從Cookie 中取出來特殊字元的轉換

    頁面存入Cookie中的值含有特殊字元,但所傳的值中包含一些特殊字元比如“:”,Cookie中是無法對特殊字元直接承載的,所以在存入Cookie時,將其轉換為unicode編碼: document.cookie = key + "=" + escape(value);

JAVA中URLEncoder函式特殊字元處理解決辦法

最近做登陸這一塊的介面,需要對接另外一家公司php的登陸介面,由於他們的賬號密碼包含了有特殊字元*,經過了很多的曲折,特記錄下來。 特殊字元*,在java中encode函式是不會進行轉碼處理。

PHP錶單提交特殊字元的過濾處理

PHP關於表單提交特殊字元的處理方法做個彙總,主要涉及htmlspecialchars/addslashes/stripslashes/strip_tags/mysql_real_escape_string等幾個函式聯合使用,與大家共同交流。 一、幾個與特殊字元處理有關的

正則表示式:Notepad++查詢兩段特殊字元之間文字並在該目標字元後面新增字元

今日在工作中使用Notepad++處理json檔案時遇到一個正則表示式查詢並新增字元的問題: 問題描述: 我們工作團隊人員需要遷移一個平臺的文章內容到另一個平臺,使用富文字編輯器進行復制遷移,其中文字連結需要手工新增,但由於提前沒做要求,大家都沒有設定連結的跳轉目標頁,也就

指標系統學習5-使用字元指標變數字元陣列的討論

雖然用字元陣列和字元指標變數都能實現字串的儲存和運算,但它們二者之間是有區別的,不應混為一談……主要概括起來有以下幾點:1. 字元陣列由若干個元素組成,每個元素中  放一個字元,而字元指標變數中存放的是地址(字串第1個字元的地址),決不是將字串放到字元指標變數中。 2. 賦值方式。對字元陣列只能對

Java——實現氣泡排序,選擇排序,快速排序二分查詢

在學習C語言時,對排序演算法和二分查詢有一定的理解並進行了實現。 不過打算用Java重新實現一下氣泡排序(Bubble Sort),選擇排序(Selection Sort),快速排序(Quick Sort)和二分查詢(binary_search)。 package pra

將圖片檔案轉化為位元組陣列字串,並進行Base64編碼處理 位元組陣列字串進行Base64解碼並生成圖片

public static String imageToBase64(String path) { // 將圖片檔案轉化為位元組陣列字串,並對其進行Base64編碼處理 byte[] data = null; // 讀取圖片位元組

JSHTML字元的轉義反轉義

var HtmlUtil = { /*1.用瀏覽器內部轉換器實現html轉碼*/ htmlEncode:function (html){ //1.首先動態建立一個容器標籤元素,如DIV var temp = document.c

Order by group by 的聯合使用 並某一欄位中的不同結果進行重新命名自由排序

最需要注意的一點就是 group by 必須包含在 roder by  子句中 如:       SELECT replace(replace(replace(replace(jb,'1','一級'),'2','二級'),'3','三級'),'4','四級')jb,ysxm

Day28:面向象編程——類

軟件 聲明 關於 main 部分 一個 自動 個人 rgs 一、面向對象的程序設計   在此之前用到的事面向過程的程序設計,它的核心是過程(流水線式思維),過程即解決問題的步驟,面向過程的設計就好比設計好一條流水線,考慮周全什麽時候處理什麽東西。 優點:極大的降低了程序