一、完成列表查询功能

要求

数据库里面存有用户的信息,
现在要你点击浏览器“查询所有用户信息”就能查出所有用户的信息

在这里插入图片描述
实现方法

为了满足三层架构模型:

Dao层负责查询所有用户数据,返回users
service层负责操作Dao层,返回users

index.jsp前端任务是写有“查询所有用户信息"的超链接,后端任务是点击超链接转到userListServlet
UserListServlet负责操作service,将users存入request域转发到list.jsp
list.jsp前端任务是表格展示用户信息,后端任务是收到users遍历users,输出

在这里插入图片描述
建数据库
在这里插入图片描述
编写User类

人家包的命名很有讲究的:
User在src下的cn.itcast.domain包里面
Userdao是dao层的,所以在src下的cn.itcast.dao包里面
UserService是service层的,所以在src下的cn.itcast.service包里面
JDBCUtils工具类在src下的cn.itcast.util包里面
控制器servlet在src下的cn.itcast.web.servlet包里面

在这里插入图片描述
JDBC工具类
在这里插入图片描述
dao层和service层的代码编写
在这里插入图片描述
在这里插入图片描述
编写index.jsp
在这里插入图片描述
编写UserListServlet
在这里插入图片描述
编写list.jsp
在这里插入图片描述
代码运行
在这里插入图片描述
在这里插入图片描述

二、完成登录功能

需求
在这里插入图片描述
在这里插入图片描述
分析

Dao层负责根据用户名和密码查询用户,返回user
service层负责操作Dao层,返回user

login.jsp的前端任务是做好登录页面;后端任务是从CheckCodeServlet获取到验证码,从LoginServlet获取到出错信息

CheckCodeServlet生成验证码,把生成的验证码存入session

LoginServlet的任务是做比较:
①比较验证码正确与否:从session里面获取到生成的验证码,从request域里面获取到用户填写的验证码,比较验证码,
②比较用户名和密码是否正确:操作service层负责查询该用户的username和password是否在数据库中,要是一切通过就调用index.jsp

index.jsp的前端任务是做好”xxx,欢迎你“

编码

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

@WebServlet("/loginServlet")
public class LoginServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        request.setCharacterEncoding("utf-8");

        String verifycode = request.getParameter("verifycode");//获取用户填写验证码

        HttpSession session = request.getSession();
        String checkcode_server = (String) session.getAttribute("CHECKCODE_SERVER");//获取动态生成的验证码

        //验证码校验(忽略大小写比较)
        if(!checkcode_server.equalsIgnoreCase(verifycode)){
            request.setAttribute("login_msg","验证码错误!");
            request.getRequestDispatcher("/login.jsp").forward(request,response);//跳转登录页面
            return;
        }

        //封装User对象
        Map<String, String[]> map = request.getParameterMap();
        User user = new User();
        try {
            BeanUtils.populate(user,map);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        
        //调用Service查询
        UserService service = new UserServiceImpl();
        User loginUser = service.login(user);
        //6.判断是否登录成功
        if(loginUser != null){
            //登录成功,由于request域没有共享数据所以存入session并且重定向跳转页面
            session.setAttribute("user",loginUser);
            response.sendRedirect(request.getContextPath()+"/index.jsp");
        }else{
            //登录失败
            request.setAttribute("login_msg","用户名或密码错误!");
            request.getRequestDispatcher("/login.jsp").forward(request,response);//跳转登录页面

        }
        
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、完成添加联系人功能

在这里插入图片描述

Dao层finAll()方法是获取所有用户的信息,返回users ;add(user)方法是插入信息,无返回值
service层负责调用finAll()方法 和 add(user)方法

list.jsp的前端任务是表格展示数据,后端任务是点击”添加联系人“跳转到add.jsp页面

add.jsp的后端任务是带着用户填的数据跳转到”addUserServlet“

AddUserServlet获取到刚刚添加的数据,调用service层保存 ; 不带任何参数地转发到userListServlet

UserListServlet调用service层的findAll()方法查询所有用户信息,携带users转发到list.jsp,以供list.jsp遍历users展示数据

list.jsp的第二个后端功能就是拿到users数据后遍历users展示数据

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、完成删除功能

在这里插入图片描述

Dao层有个delete(id)方法,没有返回值
service层调用Dao层的delete(id)方法,没有返回值

list.jsp的前端任务是展示列表数据,后端任务是点击”删除“跳转到delUserServlet

delUserServlet调用service层的deleteUser(id)方法,重定向到UserListServlet页面

UserListServlet调用service层的findAll()方法查询所有用户信息,携带users转发到list.jsp,以供list.jsp遍历users展示数据 

list.jsp的第二个后端功能就是拿到users数据后遍历users展示数据

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

五、完成修改功能

Dao层的findById(id)返回值为user
service层调用findById(id)方法,返回值为user

启动服务器默认进入index.jsp页面,点击”查询所有用户信息“后进入UserListServlet页面,UserListServlet负责操作service层的findAll()得到users,将users转发到list.jsp(这些都是之前学的)

list.jsp的前端功能是显示列表数据;后端功能是点击”修改“就带着id跳转到FindUserServlet

FindUserServlet调用service层的findUserById(id)方法,将user转发到update.jsp页面

update.jsp拿到user回显信息 ;

update.jsp 假如你做了信息修改,点击提交,它会带着信息跳转到updateUserServlet ;

updateUserServlet调用service层的updateUser(user)方法,重定向到userListServlet

UserListServlet调用service层的findAll()方法查询所有用户信息,携带users转发到list.jsp,以供list.jsp遍历users展示数据 

list.jsp的第二个后端功能就是拿到users数据后遍历

在这里插入图片描述

1.用户信息的回显

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.用户修改

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

六、完成删除选中

在这里插入图片描述
在这里插入图片描述

Dao层的delete(id),无返回值
service层的delSelectedUser(ids)方法来遍历调用Dao层的delete(id),无返回值

list.jsp点击"删除选中"就判断(是否有条目被选中)和(是否确定删除),如果判断通过就提交表单,跳转到delSelectedServlet页面

delSelectedServlet获取到要删除条目的uid号,调用service层的delSelectedUser(ids)方法,然后不带任何参数的重定向到userListServlet页面

userListServlet就是拿到那些users转发到list.jsp

list.jsp的第二个后端功能就是拿到users数据后遍历

改动list.jsp(仅作了解)
在这里插入图片描述
在这里插入图片描述
后端代码编写
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

七、完成分页查询功能

客户端浏览器把每页能显示的条数rows传给服务器
客户端浏览器把当前页码currentPage也要传给服务器

服务器收到了rows(每页能显示的条数)和currentPage(当前页码)就可以计算开始记录的索引start
(假如一页显示5条,那么第一页是[0,5),第二页是[5,10),第三页就是[10,15),所以开始索引就是(当前页码-1)x每页显示的条数)

服务器查询数据库得到总记录数totalCount

现在dao层就可以根据(开始索引 和 每页能显示的条数)调用findByPage(start,rows,condition)方法,把每一页的数据封装到list集合里面

在这里插入图片描述

Dao层的findTotalCount()方法返回总记录数totalCount,findByPage(start,rows)返回List<User>
service层的findUserByPage(currentPage,rows)方法返回存有数据的PageBean

list.jsp点击“页码”可以带着参数currentPage和rows跳转到findUserByPageServlet,点击“上一页”/“下一页”也可以带着参数currentPage和rows跳转到findUserByPageServlet

index.jsp点击“查询所有用户信息”会不带任何参数地跳转到findUserByPageServlet

findUserByPageServlet可以获取到参数currentPage和rows,如果是从index.jsp跳转过来的那么参数为空,会默认设置当前页为第一页、每页显示5条数据;
如果是从list.jsp跳转过来的,参数currentPage和rows就不为空。它接着会调用service查询,将查到的数据存入request域并转发到list.jsp

list.jsp的第二个后端功能就是拿到PageBean数据后遍历

PageBean
PageBean目的是封装每页的数据
在这里插入图片描述

list.jsp
在这里插入图片描述
在这里插入图片描述
index.jsp
在这里插入图片描述
findUserByPageServlet
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
list.jsp遍历
在这里插入图片描述
运行结果
在这里插入图片描述
在这里插入图片描述

八、完成复杂查询

分析
在这里插入图片描述

在这里插入图片描述

客户端输入给服务器的就是一个一个的键值对,如果用户查询籍贯为北京的姓李的人,客户端输入给服务器的就是"name=李" "address=北京" "email=null"

服务器输出给客户端的数据包括 总人数totalCount 和 用户信息表list
totalCount要通过select count(*) from user where name like ? and adress like ? and email like ?这种语句查询
list要通过select * from from user where name like ? and adress like ? and email like ? limit ? ,?这种语句查询

用户要想查姓"李"的人,那么adress和eami就是空,该怎么定义查询语句呢?
你可以这样:String sql = "select count(*) from user where 1 = 1 ";如果有一个查询条件那就把它append到sql语句后面不久好了嘛,append(" and "+key+" like ? ");这样key可以是“name\adress\emai”
where 1 = 1干嘛用的?String sql = "select count(*) from user where"这肯定不行吧,因为“name\adress\emai”这三个参数可能都为空,所以即使where 1 = 1就可以保证即使参数都为空也可以执行sql

代码逻辑

Dao层的findTotalCount(condition)方法可以根据查询条件condition返回查询总记录数totalCount,findByPage(start,rows,condition)方法可以返回List<User>
service层的findUserByPage(currentPage,rows,condtion)方法调用了Dao层的两个方法并返回存有数据的PageBean<User>

list.jsp键入查询条件后点击"查询",可以带着参数name、address、email以及currentPage和rows跳转到findUserByPageServlet

findUserByPageServlet可以获取到参数[name , address , email , currentPage , rows]。它接着会调用service查询,将查到的数据存入request域并带着查询条件condition转发到list.jsp

list.jsp的第二个后端功能就是拿到PageBean数据后遍历,而且可以根据condition将查询条件回写

list.jsp的设置
在这里插入图片描述

findByPageServlet
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

UserDaoImpl.class添加如下代码:

    @Override
    public int findTotalCount(Map<String, String[]> condition) {

        String sql = "select count(*) from user where 1 = 1 ";
        StringBuilder sb = new StringBuilder(sql);//因为后期要拼接sql所以用StringBuilder的方法


        Set<String> keySet = condition.keySet();//keySet为[name,adress,emai,currentPage,rowsl]

        List<Object> params = new ArrayList<Object>();//

        for (String key : keySet) {

            //如果是currentPage和rows那就跳出循环不执行下面的语句
            if("currentPage".equals(key) || "rows".equals(key)){
                continue;
            }

            //获取value
            String value = condition.get(key)[0];
            //因为condition是Map<String, String[]>的,所以condition.get(key)得到的是String[],但我们知道其实这个String数组里面只有一个值

            //判断value是否有值
            if(value != null && !"".equals(value)){
                //有值
                sb.append(" and "+key+" like ? ");//value有值那就得拼接sql,注意and前面要有空格,否则就成了where 1 = 1and "+key+" like ?
                params.add("%"+value+"%");
                //params里面存放那些value的值,那么为什么要加两个百分号%,因为where name like "%李%"才是查询name里面带有"李"的
            }
        }
        System.out.println(sb.toString());//假如你查询姓李的陕西人,那么获取到的sb.toString()就是"select count(*) from user where 1 = 1 and name like ? and dress like ?"
        System.out.println(params);//假如你查询姓李的陕西人,那么获取到的params就是[%李% , %陕西%]

        return template.queryForObject(sb.toString() , Integer.class , params.toArray());//params数组里面的值对应着sql语句的?
        // Integer.class是说将结果封装为Integer类型
    }

    @Override
    public List<User> findByPage(int start, int rows, Map<String, String[]> condition) {

        String sql = "select * from user  where 1 = 1 ";
        StringBuilder sb = new StringBuilder(sql);

        Set<String> keySet = condition.keySet();

        List<Object> params = new ArrayList<Object>();

        for (String key : keySet) {

            if("currentPage".equals(key) || "rows".equals(key)){
                continue;
            }

            String value = condition.get(key)[0];

            if(value != null && !"".equals(value)){
                //有值
                sb.append(" and "+key+" like ? ");
                params.add("%"+value+"%");//?条件的值
            }
        }


        sb.append(" limit ?,? ");//添加分页查询

        //添加分页查询参数值start,rows
        params.add(start);
        params.add(rows);

        sql = sb.toString();
        System.out.println(sql);//假如你查询姓李的陕西人,那么获取到的sb.toString()就是"select count(*) from user where 1 = 1 and name like ? and dress like ? limit ?,? "
        System.out.println(params);//假如你查询姓李的陕西人,那么获取到的params就是[%李% , %陕西% ,0 ,5]

        return template.query(sql,new BeanPropertyRowMapper<User>(User.class),params.toArray());
        //new BeanPropertyRowMapper<User>(User.class)是说将结果封装到User.class里面
    }

list.jsp遍历和查询条件回写
在这里插入图片描述
在这里插入图片描述
运行结果
在这里插入图片描述

最后list的设置
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

感谢浏览和收藏

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐