上次進行了分頁代碼的優化,但是不足之處就是在Action層中寫hql語句,如果hql語句比較復雜,例如條件查詢,會有一些參數的判斷,是非常容易出錯的。下面對分頁查詢進一步優化,將會變得非常簡單。
下面我們就完成一個帶條件的查詢,如下圖,可以選擇部門、按照姓名、按照賬號進行條件查詢,同時分頁。
一:還是先看簡單的,jsp界面代碼的進一步抽取。
(1)之前已經把公共的頁碼顯示的代碼抽取出去了,但是每個界面還是要寫一段javascript代碼,來指定對應的xxx.action
其實也可以直接定義一個form,
然後得到form,提交form即可,所以以後直接寫個form標簽,指定action即可
我們要完成條件查詢,將內容放在form標簽內,提交表單在Action層就得到對應的屬性值了
二:下面就是解決在Action層寫hql語句的問題,可以定義一個QueryHelper類,將來通過這個類來拼接hql語句和傳遞參數列表,處理好之後作為參數傳遞給PageBean處理即可(關於PageBean請看上一篇博客)
(1)需要拼接from(必須要有的語句)、where、orderby語句,定義這三個屬性,還有需要得到對應的參數列表
(2)定義構造函數,在Action層new一個對象的時候就傳遞from語句的參數(就是類名)
(3)拼接where語句,Action層需要傳遞條件和參數列表,注意這裡的參數是可變參數,因為是不確定的,具體看下面注釋。
剛剛定義屬性的時候對whereClause和orderByClause初始化為空字符串,所以第一次調用此方法拼接是from xxx where xxx.yyy=?,下面再調用就是where xxx.yyy=?and xxx.zzz=?
還有這裡方法的類型都是QueryHelper類型的,return this;表示返回類的對象,這樣就可以接著調用自己的方法增加條件了,不用一個語句一個語句的分開寫了(具體看下面Action層中的調用)
(3)下面一個方法的主要作用是判斷是否要去拼接where語句,這麼做的原因是因為界面的條件是多個,用戶可能不全部選擇,那麼就需要在Action中判斷了,if(xxx) 調用拼接;所以這麼做就可以直接一路調用下來,不用在Action中if判斷了
(4)同理orderby也是如此,這裡就不列出了,此次條件查詢不需排序。
得到hql語句的方法:
(5)得到查詢總記錄條數的hql語句和參數列表的語句:
三:
(1)在Action中,聲明界面傳遞過來的屬性,實現get、set方法
(2)構造一個QueryHelp對象,如下圖:(就是這裡可以通過"."就可以調用自己的方法了),
要得到PageBean對象將QueryHelp對象作為參數傳遞過去即可
(3)這裡可以進一步優化,因為每個Action中都需要service調用getPageBean()方法,然後將得到的PageBean對象放到棧頂。所以可以將其抽取到QueryHepler類中,直接寫個方法就完成此功能。
如下圖:
所以這裡直接一路下來就可以得到分頁的信息並將其放到了棧頂。完畢。
四:總結
至此分頁相關的代碼優化基本差不多了,之後再寫分頁的操作將會非常的容易而且不易出錯。