JSP Servlet 实现模糊动态查询并分页(拼接Sql)

来源:互联网 发布:日语网络 编辑:程序博客网 时间:2024/06/05 22:31

需求:

  • 根据两个条件查询。

  • 根据查询的结果分页,并记住查询条件。

大体流程是这样的:

  • 第一次打开时,默认分页显示所有信息,这时候点击末页会取到最后一页数据。

  • 当填写或选择了查询条件时,根据条件取出符合条件的所有数据并分页。这时候点击翻页应该都是这一次查询条件后的数据。

    我写的时候思绪挺乱的,来这里写一写,再理一下思路。

  • 建表,只需要一张,还有对应的实体类。

  • 写前台展示页面。

<body>        <form action="" method="post">            姓名:<input type="text" name="name"/>            性别:             <select name="sex" >                <option value="-1">全部</option>                <option value="0"></option>                <option value="1"></option>                     </select>             <input type="submit" value="搜索"/>            <table>                <tr>                    <td>序号</td>                    <td>姓名</td>                    <td>性别</td>                    <td>头像</td>                    <td>职业</td>                </tr>            <c:forEach items="" var="">                ...             </c:forEach>            </table>        </form>            <a href="">首页</a>            <a href="">上一页</a>            当前页:            <a href="">下一页</a>            <a href="">末页</a>   </body>

开始差不多是这个样子

  • 刚进入项目要显示所有,所以可以写个带参数的欢迎页面index.jsp,
    response.sendRedirect("person?action=getMaxPage&name=&sex=0");
    (name=&sex=-1相当于name=空字符串)。把name和sex传到相应的servlet。

  • 现在来写servlet

public String getMaxPage(HttpServletRequest req,HttpServletResponse resp){        resp.setCharacterEncoding("UTF-8");        /* 刚进入项目时index.jsp传来name="" 为空,sex=-1*/        String name = req.getParameter("name");        Integer sex =  Integer.valueOf(req.getParameter("sex"));        /*第一步,通过条件得到最大页数。要写一个数据访问的Dao,虚线内是该Dao里获取最大页的方法*/        PersonDao pd = new PersonDao();        Integer maxPage =  pd.getCount(name, sex, rowPerPage);        //rowPerPage是每页要显示的记录条数,可以定义一个全局变量--------------------------------------------------------------------------------------        public Integer getCount(String name,Integer sex,Integer size){        StringBuffer sb = new StringBuffer("select count(*) from person where 1=1 ");        ...        if(!(name.equals(null)) && !(name.equals("")) ){            sb.append(" and name like '%"+name+"%' ");        }        if(sex != 0){            sb.append(" and sex = "+sex+" ");        }        ...    }------------------------------------------------------------------------------------------  /*因为还没学Ajax就用session存放条件以记住查询条件*/        HttpSession session = req.getSession();        session.setAttribute("name", name);        session.setAttribute("sex", sex);        session.setAttribute("maxPage", maxPage);        return "person?action=getPerson";    }
  • 得到最大页后,再根据条件获取记录
public String getPerson(HttpServletRequest req,HttpServletResponse resp){        PersonDao pd = new PersonDao();        HttpSession session = req.getSession();        //得到选择条件后的最大页,姓名,性别。会根据每次选择条件的不同而改变。        Integer maxPage = (Integer)session.getAttribute("maxPage");        String name = (String)session.getAttribute("name");        Integer sex = (Integer)session.getAttribute("sex");        Integer currPage = 0;        //从项目进来后,没有从前台获得currPage,默认为1        if (req.getParameter("currPage") == null) {             currPage =1;        }else{        //点击上下页的时候找到此servlet,得到页数。------------------------------------------------------------ <a href="person?action=getPerson&currPage=${currPage+1 }">下一页</a>------------------------------------------------------------        currPage = Integer.valueOf(req.getParameter("currPage"));         }            if(currPage < 1 ){                currPage = 1;            } else if(currPage > maxPage){                currPage = maxPage;            }        //通过name,sex,当前页,每页显示的条数导数据库获取数据。        List<Person> list =  pd.getPerson(name, sex, currPage, rowPerPage);--------------------------------------------------------------------------------public List<Person> getPerson(String name, Integer sex,Integer currPage,Integer size){        StringBuffer sb = new StringBuffer("select * from person where 1=1 ");        ...        //在这里,我们把参数直接传到Dao里面来判断。在我早先写的那篇文章里,是先在servlet判断一次,又到Dao里面判断,实在是多余了。不过"重构代码"不也是一项必须的技能吗。        if(!(name.equals(null)) && !(name.equals("")) ){            sb.append(" and name like '%"+name+"%' ");        }        if(sex != 0){            sb.append(" and sex = "+sex+" ");        }        sb.append("  limit ?,? ");        String sql = sb.toString();//要注意把sql语句转为String类型。        try {            conn = DataBaseUtil.getConnection();            ps = conn.prepareStatement(sql);            //这里就只有两个 ‘?’,不用再判断有几个 ‘?’了。            ps.setInt(1, (currPage-1)*size);            ps.setInt(2, size);            rs = ps.executeQuery();            while(rs.next()){                ...    }--------------------------------------------------------------------------------    //把得到的数据,送到前台显示。            if(list.size() > 0){            req.setAttribute("pList", list);            req.setAttribute("currPage", currPage);            return "showPerson.jsp";    }

早先写的拼接Sql的文章(点我)

Ps:写这篇文章的时候,被打断了了好几次,思路也是断断续续的。不过我会一直更新下去的,在学了Ajax,Jquery后。还有最好是写一个框架来做这些事,不过对接口,反射的理解还不是太深。加油吧!

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 白鞋子低帮发黄怎么办 跳伞的时候降落伞打不开怎么办 收腹裤穿着总是往下卷怎么办? 结婚打了黑伞怎么办 酷派x7开不了机怎么办 脸书账号被禁用怎么办 文档变成了d盘怎么办? 派派背包满了怎么办 黑裤子掉颜色了怎么办 快递被别人领走怎么办 绒面靴子长霉了怎么办 新买的鞋子开胶怎么办 白色的皮鞋边发黄怎么办 新鞋大拇指顶脚怎么办 耐克标志开胶了怎么办 鞋开胶了怎么办不用胶 gta按home没反应怎么办 gta5线上车没了怎么办 吃了粘壳的鸡蛋怎么办 gta5短信删错了怎么办 电风扇2档3档开好关不管用怎么办 gta5把车替换了怎么办 gta5任务完成后卡了怎么办 gta5车被扣押了怎么办 侠盗猎车手5卡怎么办 英雄联盟转区后没法快捷施法怎么办 欠太多人的钱怎么办 我欠了很多钱怎么办 输了那么多钱我该怎么办 家里欠了钱我该怎么办 欠了好多钱我该怎么办 赌球输了好几千怎么办 欠信用卡的人死了怎么办 欠别人钱人死了怎么办 别人欠我钱人死了怎么办 美国生娃孩子怎么办医保 黑在美国病了怎么办 在外打工房租太贵怎么办 在外面打工房租租不起怎么办 买车型号错了怎么办 沃出行不退押金怎么办