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

需求:

  • 根据两个条件查询。

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

大体流程是这样的:

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

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

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

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

  • 写前台展示页面。

<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>

JSP Servlet 实现模糊动态查询并分页(拼接Sql)_第1张图片

  • 刚进入项目要显示所有,所以可以写个带参数的欢迎页面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后。还有最好是写一个框架来做这些事,不过对接口,反射的理解还不是太深。加油吧!

你可能感兴趣的:(一个需求的升级之路)