1. <ul id="0c1fb"></ul>

      <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
      <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区

      RELATEED CONSULTING
      相關(guān)咨詢
      選擇下列產(chǎn)品馬上在線溝通
      服務(wù)時(shí)間:8:30-17:00
      你可能遇到了下面的問題
      關(guān)閉右側(cè)工具欄

      新聞中心

      這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
      JavaWeb項(xiàng)目之多條件過濾

      相信很多同學(xué)在學(xué)習(xí)java基礎(chǔ)之后,面對(duì)各種項(xiàng)目還是相當(dāng)頭疼,那今天我將手把手教你學(xué)會(huì)JavaWeb項(xiàng)目中的多條件過濾,希望你能在與我實(shí)戰(zhàn)的過程中積累經(jīng)驗(yàn),更進(jìn)一步。

      創(chuàng)新互聯(lián)公司10多年企業(yè)網(wǎng)站制作服務(wù);為您提供網(wǎng)站建設(shè),網(wǎng)站制作,網(wǎng)頁設(shè)計(jì)及高端網(wǎng)站定制服務(wù),企業(yè)網(wǎng)站制作及推廣,對(duì)發(fā)電機(jī)維修等多個(gè)方面擁有多年的營銷推廣經(jīng)驗(yàn)的網(wǎng)站建設(shè)公司。

      分頁查詢
      需求分析:在列表頁面中,顯示指定條數(shù)的數(shù)據(jù),通過翻頁按鈕完成首頁/上一頁/下一頁/尾頁的查詢
      數(shù)據(jù)分析:
      通過觀察,頁面上需要顯示下面的幾個(gè)數(shù)據(jù):
      當(dāng)前頁:currentPage
      頁面大小:pageSize
      總頁數(shù):totalPage
      首頁:1
      上一頁:prevPage
      下一頁:nextPage
      尾頁:endPage
      總條數(shù):totalCount
      結(jié)果集:result
      JavaWeb項(xiàng)目之多條件過濾

      那么,我們應(yīng)該如何方便快速的將這多個(gè)數(shù)據(jù)共享到頁面上呢?答案是:封裝
      我們應(yīng)該將這幾個(gè)參數(shù)封裝到一個(gè)對(duì)象中,然后共享這個(gè)對(duì)象即可,所以,我們有了下面這個(gè)類
      @Getterpublic class PageResult {
      public static final PageResult EMPTY_RESULT = new PageResult(Collections.EMPTY_LIST, 0, 1, 3);
      //1:兩傳
      private int currentPage;
      private int pageSize;

      //2:兩查
      private List result;
      private int totalCount;
      
      //3:三計(jì)算
      private int prevPage;
      private int nextPage;
      private int endPage;
      
      public PageResult(List result, int totalCount, int currentPage, int pageSize){
      
          this.result = result;
          this.totalCount = totalCount;
          this.pageSize = pageSize;
          this.currentPage = currentPage;
          //計(jì)算
          this.endPage = totalCount % pageSize == 0 ?
                      totalCount / pageSize : totalCount / pageSize  + 1; 
          this.prevPage = currentPage - 1 > 0 ? currentPage - 1 : 1;
          this.nextPage = currentPage + 1 > endPage ? endPage :currentPage + 1;
      }

      }
      在這個(gè)類中,我們提供了一個(gè)構(gòu)造器來快速封裝數(shù)據(jù)
      其中,endPage/prevPage/nextPage是通過上面的幾個(gè)參數(shù)計(jì)算得來的
      在這些數(shù)據(jù)中,存在兩個(gè)需要從數(shù)據(jù)庫中查詢得到的數(shù)據(jù):總條數(shù)/結(jié)果集
      這兩個(gè)數(shù)據(jù)我們需要下面兩條SQL進(jìn)行查詢
      查詢部門表中數(shù)據(jù)的總條數(shù)
      SELECT count(id) FROM department
      使用LIMIT關(guān)鍵字查詢指定頁面的數(shù)據(jù)
      SELECT id, name, sn FROM department LIMIT #{start}, #{pageSize}
      #{start}: 使用(currentPage-1)pageSize表達(dá)式計(jì)算出來的開始索引#{pageSize}: 每次查詢的最大條數(shù)
      要執(zhí)行這兩條SQL,需要用戶傳遞兩個(gè)參數(shù):currentPage和pageSize
      為了參數(shù)方便傳遞,我們將這兩個(gè)參數(shù)封裝到一個(gè)類中:QueryObject
      @Setter@Getterpublic class QueryObject {
      // 默認(rèn)查詢第一頁的數(shù)據(jù)
      private int currentPage = 1;
      // 頁面中默認(rèn)顯示10條數(shù)據(jù)
      private int pageSize = 5;
      public int getStart(){
      return (currentPage - 1)
      pageSize;
      }
      }
      可以看出,查詢結(jié)果集中的#{start}表達(dá)式,是訪問查詢對(duì)象中的getStart()方法來獲取到計(jì)算得到的開始索引
      到此,我們都已經(jīng)封裝好了分頁查詢中最核心的兩個(gè)類:
      QueryObject:封裝用戶傳遞過來的currentPage/pageSize
      PageResult:封裝頁面上顯示需要的result/totalCount/currentPage/pageSize/totalPage/prevPage/pageSize
      有了這兩個(gè)類,我們就可以在service中定義下面的方法,來處理分頁查詢的業(yè)務(wù)了:

      public PageResult query(QueryObject qo) {
          //查詢表中數(shù)據(jù)的總條數(shù)
          int totalCount = dao.queryForCount(qo);
          //當(dāng)查詢到的總條數(shù)為0時(shí),說明沒有數(shù)據(jù),此時(shí)就不應(yīng)該再之后下面的查詢
          //直接返回相應(yīng)的默認(rèn)值即可
          if (totalCount == 0) {
              return PageResult.EMPTY_RESULT;
          }
          List data = dao.queryForList(qo);
          PageResult result = new PageResult(data, totalCount, qo.getCurrentPage(), qo.getPageSize());
          return result;
      }

      該方法接收用戶傳遞的數(shù)據(jù)(QueryObject),返回用戶需要的數(shù)據(jù)(PageResult)
      通過調(diào)用dao中的兩個(gè)方法執(zhí)行兩條SQL查詢數(shù)據(jù)(總條數(shù)和結(jié)果集)


      然后將數(shù)據(jù)封裝到PageResult對(duì)象中返回給表現(xiàn)層
      表現(xiàn)層獲取到service中封裝的PageResult對(duì)象后,共享到request作用域中
      然后請(qǐng)求轉(zhuǎn)發(fā)到list.jsp頁面
      protected void list(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      //接收用戶傳遞的currentPage和pageSize
      String currentPage = req.getParameter("currentPage");
      String pageSize = req.getParameter("pageSize");
      //將數(shù)據(jù)封裝到QueryObject中,傳遞給service進(jìn)行處理
      QueryObject qo = new QueryObject();
      if(!StringUtils.isNullOrEmpty(currentPage)){
      qo.setCurrentPage(Integer.valueOf(currentPage));
      }
      if(!StringUtils.isNullOrEmpty(pageSize)){
      qo.setPageSize(Integer.valueOf(pageSize));
      }
      PageResult result = service.query(qo);
      //共享獲取到的PageResult對(duì)象
      req.setAttribute("result", result);
      req.setAttribute("qo", qo);
      //請(qǐng)求轉(zhuǎn)發(fā)回到list.jsp頁面
      req.getRequestDispatcher("/WEB-INF/views/department/list.jsp").forward(req, resp);
      }
      在list.jsp頁面上,使用EL+JSTL獲取數(shù)據(jù)并顯示在對(duì)應(yīng)的位置
      部門列表


      ${vs.count}
      ${entity.name}
      ${entity.sn}


      編輯


      刪除



      分頁條


      首頁
      上一頁
      下一頁
      尾頁

       當(dāng)前頁: ${result.currentPage} / ${result.endPage}
      
       跳轉(zhuǎn)到第: 
       每頁顯示:
       

      效果如下
      JavaWeb項(xiàng)目之多條件過濾

      說明:
      在點(diǎn)擊翻頁的時(shí)候,通過執(zhí)行相應(yīng)的JS代碼提交表單來發(fā)起請(qǐng)求
      將需要查詢的當(dāng)前頁的值設(shè)值給表單中的id為currentPage的輸入框,然后提交表單
      目的主要是和后面的高級(jí)查詢進(jìn)行合并使用
      做到這里,我們部門的分頁功能就完成了
      因?yàn)椴块T的字段比較少,所以,在這個(gè)模塊中,沒有設(shè)計(jì)高級(jí)查詢的功能,這個(gè)功能我們?cè)趩T工模塊中再去實(shí)現(xiàn)
      接下來,我們來看看員工模塊相應(yīng)功能的實(shí)現(xiàn)

      在完成部門的CRUD和分頁查詢后發(fā)現(xiàn),其他模塊的這些功能基本相似
      不同之處主要在于字段不同而已,所以,在這里,我們主要對(duì)這些不同點(diǎn)進(jìn)行說明,其他的按照前面的實(shí)現(xiàn)即可
      首先,來看看員工的表結(jié)構(gòu)

      JavaWeb項(xiàng)目之多條件過濾

      在該表中,前六個(gè)字段都是基本的字段,第七個(gè)(dept_id),這個(gè)字段是關(guān)聯(lián)部門的外鍵列
      所以,待會(huì)兒我們?cè)谕瓿蒀RUD的過程中,需要注意維護(hù)該字段的值
      清楚表結(jié)構(gòu)之后,我們來對(duì)員工的CRUD做一個(gè)簡(jiǎn)單的分析
      查詢功能:

      JavaWeb項(xiàng)目之多條件過濾

      可以看到,處理部門這一列顯示的數(shù)據(jù)比較特殊之外,其他的都是基本的數(shù)據(jù)展示而已
      什么是特殊?什么是不特殊?
      員工除了部門的信息外,其他的數(shù)據(jù)都是直接來自于數(shù)據(jù)庫,而部門在表中只存儲(chǔ)了對(duì)應(yīng)的編號(hào),但是頁面上需要顯示部門的名稱,那么這個(gè)問題我們是怎么解決的呢?
      好,首先解釋一下,這個(gè)問題的解決方案在目前我們的web階段還沒有涉及過,所以,我在這只能點(diǎn)到為止
      我們的解決方案是:在執(zhí)行該數(shù)據(jù)的查詢的時(shí)候,使用多表查詢,將員工及其所在部門的信息查詢出來,SQL如下:
      SELECT
      e.id,
      e.name,
      e.password,
      e.email,
      e.age,
      e.admin,
      e.dept_id,
      d.id d_id,
      d.name d_name,
      d.sn d_sn
      FROM employee e LEFT JOIN department d on e.dept_id = d.idlimit #{start}, #{pageSize}
      這條SQL能夠查詢到如下的結(jié)果

      JavaWeb項(xiàng)目之多條件過濾

      然后在resultMap中如下的配置,完成數(shù)據(jù)的封裝,員工相關(guān)的數(shù)據(jù)封裝到Employee對(duì)象中,部門相關(guān)的數(shù)據(jù)封裝到Department對(duì)象中














      最后,在select元素中使用resultMap來完成映射





      首先,在跳轉(zhuǎn)到該頁面之間,我們先將所有的部門信息查詢到
      然后在頁面上循環(huán)遍歷,生成對(duì)應(yīng)的option元素,將部門的id作為option的value(提交的數(shù)據(jù)),將部門的name作為option的文本內(nèi)容(顯示的數(shù)據(jù))
      最后,在用戶選擇對(duì)應(yīng)選項(xiàng)后,提交表單,會(huì)將對(duì)應(yīng)option元素的value提交到后臺(tái),完整數(shù)據(jù)如下:

      JavaWeb項(xiàng)目之多條件過濾

      通過上圖,可以清晰的看到,我們已經(jīng)將完整的數(shù)據(jù)提交到后臺(tái)
      后臺(tái)獲取到這些數(shù)據(jù)之后,就能夠?qū)⑵浔4娴綌?shù)據(jù)庫中
      那么,我們的保存功能就算完成了
      更新功能:
      更新和保存只有一個(gè)地方不同,就是需要數(shù)據(jù)回顯
      而數(shù)據(jù)回顯中,我們只對(duì)部門(下拉框)和超級(jí)管理員(復(fù)選框)做一個(gè)說明,其他的因?yàn)槎际瞧胀ǖ膇nput元素,使用value屬性顯示數(shù)據(jù)即可
      而下拉框和復(fù)選框需要單獨(dú)進(jìn)行處理,如下:


      這里,我們選擇使用EL表達(dá)式的三元運(yùn)算符進(jìn)行判斷,為下拉框添加selected屬性,為復(fù)選框添加checked屬性
      編輯的時(shí)候,數(shù)據(jù)能回顯,接下來的操作和新增一致
      刪除功能
      和部門的刪除一致,這里就不再贅述
      到此,員工的CRUD結(jié)束
      高級(jí)查詢
      功能需求:
      輸入關(guān)鍵字和部門信息進(jìn)去過濾查詢,關(guān)鍵字是根據(jù)姓名和郵箱兩個(gè)字段查詢
      頁面設(shè)計(jì)
      JavaWeb項(xiàng)目之多條件過濾

      高級(jí)查詢效果圖
      當(dāng)用戶輸入關(guān)鍵字"趙"和部門"總經(jīng)辦"后,在列表中顯示的查詢結(jié)果則為所有總經(jīng)辦姓趙的員工
      那么此時(shí)應(yīng)該執(zhí)行下面的SQL來查詢相應(yīng)的數(shù)據(jù)
      SELECT
      e.id, e.name, e.password, e.email, e.age, e.admin, e.dept_id, d.id d_id, d.name d_name, d.sn d_sn
      from
      employee e
      LEFT JOIN
      department d
      ON
      e.dept_id = d.id
      WHERE
      (e.name LIKE concat('%',? ,'%') OR e.email LIKE concat('%',? ,'%')) AND e.dept_id = ? LIMIT ?, ?
      在該SQL中,WHERE后面的條件是根據(jù)用戶傳遞的高級(jí)查詢相關(guān)的參數(shù)拼接而來
      這里,我們需要解決兩個(gè)問題:
      1.這里的多個(gè)高級(jí)查詢的參數(shù)如何傳遞?
      對(duì)于這個(gè)問題,我們應(yīng)該能夠比較快的想到解決方案---數(shù)據(jù)封裝,如下:
      @Setter@Getterpublic class EmployeeQueryObject extends QueryObject {
      private String keyword; //按照員工名稱與郵箱模糊查詢
      private Long deptId = -1L; //按照部門id查詢

      //當(dāng)keyword為null或者空字符串的時(shí)候,都視為null處理
      public String getKeyword(){
          return StringUtils.isEmpty(keyword) ? null : keyword;
      }

      }
      2.參數(shù)拿到后,如何拼接到對(duì)應(yīng)的SQL中?
      使用mybatis中的動(dòng)態(tài)SQL中提供的標(biāo)簽,在mapper映射文件中進(jìn)行SQL的拼接



      AND( e.name LIKE concat('%',#{keyword} ,'%') OR e.email LIKE concat('%',#{keyword} ,'%'))


      AND e.dept_id = #{deptId}



      以上兩個(gè)問題解決后,我們就可以根據(jù)用戶傳遞過來的參數(shù),執(zhí)行對(duì)應(yīng)的過濾查詢的SQL
      最后,和分頁查詢的邏輯一樣,將數(shù)據(jù)封裝到PageResult中,和分頁相關(guān)的數(shù)據(jù)一同返回到頁面
      效果如[高級(jí)查詢效果圖]所示
      好了,基本功能是完成了,我們?cè)賮砜纯聪旅娴膯栴}:
      首先,在表單中輸入下面的參數(shù),然后查詢
      JavaWeb項(xiàng)目之多條件過濾

      然后點(diǎn)擊下一頁進(jìn)行翻頁

      JavaWeb項(xiàng)目之多條件過濾

      可以看到,在點(diǎn)擊翻頁之后,我們不是在上面的基礎(chǔ)上查詢下一頁的數(shù)據(jù),而是查詢到了所有的數(shù)據(jù),WHY?
      其實(shí)很簡(jiǎn)單,來看看我們的請(qǐng)求參數(shù),一切就清楚了
      在我們點(diǎn)擊翻頁的時(shí)候,傳遞的參數(shù)只有currentPage,并沒有將之前的高級(jí)查詢的參數(shù)一起傳遞到后臺(tái),所以執(zhí)行了下面的SQL查詢到上面的結(jié)果
      SELECT
      e.id, e.name, e.password, e.email, e.age, e.admin, e.dept_id, d.id d_id, d.name d_name, d.sn d_sn
      from
      employee e
      LEFT JOIN
      department d
      on
      e.dept_id = d.id limit ?, ?
      所以,要想在之前高級(jí)查詢的基礎(chǔ)上,繼續(xù)進(jìn)行分頁查詢,那么我們只有一個(gè)辦法,就是在翻頁的時(shí)候?qū)⒏呒?jí)查詢和分頁的參數(shù)一起提交到后臺(tái),拼接執(zhí)行相應(yīng)的SQL才行
      解決方案:
      使用JS來完成數(shù)據(jù)的提交(JS在目前階段還未進(jìn)行系統(tǒng)學(xué)習(xí),所以,這里大家重點(diǎn)應(yīng)該是放在我們要做的事情上,而不是怎么做)

      翻頁條
      首頁
      上一頁下一頁尾頁
      在點(diǎn)擊翻頁按鈕時(shí),調(diào)用定義好的goPage函數(shù),完成其中的兩件事即可
      此時(shí),我們可以看到問題已然解決
      最后,頁面跳轉(zhuǎn)和頁面大小的設(shè)置功能,我們不做要求,如果要實(shí)現(xiàn)也很簡(jiǎn)單,我這里就直接把相關(guān)代碼貼出來
      跳轉(zhuǎn)到第: type="number" min="1" max="${result.endPage}" value="${result.currentPage}"/> 頁
      每頁顯示:

      好了,高級(jí)查詢的功能實(shí)現(xiàn)到此結(jié)束,我們來做一個(gè)小結(jié)
      高級(jí)查詢和分頁的功能,我們應(yīng)該重點(diǎn)分析兩個(gè)點(diǎn)
      1.用戶需要看到什么數(shù)據(jù)?
      2.這些數(shù)據(jù)應(yīng)該執(zhí)行什么樣的SQL才能查詢到?
      如果將這兩個(gè)問題分析清楚了,那么大家就能夠知道這個(gè)過程中所封裝的幾個(gè)類的作用了
      QueryObject:封裝查詢對(duì)象中通用的屬性
      EmployeeQueryObject:封裝高級(jí)查詢相關(guān)的條件參數(shù)
      PageResult:封裝用戶需要使用到的數(shù)據(jù)
      所以實(shí)現(xiàn)步驟大致如下:
      1.獲取到用戶傳遞的高級(jí)查詢和分頁的參數(shù),封裝到對(duì)象的查詢對(duì)象中
      2.從查詢對(duì)象中取出數(shù)據(jù),然后拼接SQL
      3.將查詢之后得到的結(jié)果,封裝到PageResult對(duì)象中
      4.頁面獲取到PageResult中的數(shù)據(jù)進(jìn)行顯示

      看到這,想必你已經(jīng)清楚多條件過濾的相關(guān)內(nèi)容了,但是這只是眾多項(xiàng)目中小小的一環(huán),要想繼續(xù)提升自己的實(shí)戰(zhàn)能力,多了解相關(guān)信息是很有必要的,如果你對(duì)此感興趣的話,不妨關(guān)注我們,我們會(huì)發(fā)布更多的相關(guān)教程,希望能夠幫助你在java道路上越走越遠(yuǎn)。


      本文題目:JavaWeb項(xiàng)目之多條件過濾
      當(dāng)前URL:http://www.ef60e0e.cn/article/gjcojg.html
      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区
      1. <ul id="0c1fb"></ul>

        <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
        <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

        财经| 新竹县| 平湖市| 彩票| 西青区| 万宁市| 电白县| 大同县| 徐汇区| 颍上县| 东丰县| 临沂市| 松溪县| 贺州市| 林州市| 长寿区| 丹棱县| 岗巴县| 庄浪县| 汉阴县| 古蔺县| 信阳市| 建始县| 固原市| 自治县| 右玉县| 正阳县| 灵石县| 章丘市| 会昌县| 沙坪坝区| 普安县| 台北县| 井研县| 武强县| 巫山县| 图们市| 宝兴县| 沁源县| 五莲县| 乌什县|