• S1_servlet与数据库连接、filter过滤器、分页 实操的叙述


    知识点的叙述:

    Servlet的初始

    servlet中的doGet和doPost方法:所有请求默认get(速度快,不安全)

    三个页面login.jsp、dologin.jsp、index.jsp

    在login.jsp中是form表单制作的登录界面

    在dologin.jsp中是进行了获取数据和结果处理(是否登录成功、页面的跳转)

    在index.jsp中-------登录成功进入首页(xxx欢迎!)

    Servlet的作用:就是将接收参数、调用业务、返回结果操作java代码不在jsp中使用,直接写在java类中。因此拥有了servlet包中的servlet类,它继承HttpServlet,当中有很多方法。(右键Servlet文件)

    此时只需将dologin中java代码放入selvlet中,通过注解连接form表单

    <form action="LoginServlet" method="get">
    

    注解的地方:

    @WebServlet(“/名字”):/名字====com.wxy.servlet.LoginServlet


    servlet与数据库的连接使用

    与数据库的数据相连接:就需要Dao层与数据库连接,用数据库的用户与之相连接

    建立Dao包中的接口和实现类:接口中写登录方法,实现中写jdbc(已经用工具类封装了数据库连接的方法getConnection()和executeSQL()等方法直接调用。new对象放数据)


    service

    在这里插入图片描述

    因为有了业务类,Service要调dao层,在servlet就不可以直接调用dao层 UserDao userDao = new UserDaoImpl(); 就需要放在service的实现类中。

    在servlet中要调service层,UserService userService = new UserServiceImpl();

    过程——jsp发起请求通过注解调用Servlet——servlet去调service——service在去调dao——dao再去连接数据库。

    return找到数据在原理返回显示在jsp


    当登录成功首页需要显示provider信息。此时loginServlet页面跳转就不能直接去index(首页),而是进入ProviderServlet,一个Servlet干一件事。

    并且注意在loginServlet到ProviderServlet的跳转时,要重定向而不是转发,

    转发路径的地址仍是loginServlet。


    Filter过滤器

    编码过滤器:
    //转码 post请求解决乱码问题
    request.setCharacterEncoding("utf-8");
    

    每个页面为了防止乱码问题,需要此语句,但是每次使用都要单独在写,繁琐重复,所以使用过滤器运行此代码后放行再继续运行其他代码。

    在Filter中,注解@WebFilter(“/*”) 是过滤路径不是实际的路径:

    	完全匹配:/index.jsp  匹配到这个文件
        目录匹配:/admin/*	 匹配到admin文件下的所有文件
        扩展名匹配:*.do		以do为结尾的文件
        全部匹配:/*			 全部
    

    在doFilter中访问请求:

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        //转码 post请求解决乱码问题
        request.setCharacterEncoding("utf-8");
        chain.doFilter(request, response);//放行
        //System.out.println("执行完成doFilter");
    }
    
    登录过滤器:

    在登录login.jsp中传递user对象到首页index.jsp,在这里用session保存user对象,登录了才可以访问login.jsp之后的类(有数据)和页面,但是此时服务器重新启动,直接访问ProviderServle,但是并没有登录,session中的user为空,会报错500。我们使用过滤器让他不报错,直接返回登录页面重新登陆

    拦截器判断是否登录:

    除了登录页面之外都揽,/web/ProviderServlet加前缀

    • HttpServletRequest作为ServletRequest的子类要强转
    • req.getSession().getAttribute(“user11”)拿值,不用遍历
    • 登录失败重定向
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest)request;//HttpServletRequest作为ServletRequest的子类要强转
        HttpServletResponse res = (HttpServletResponse)response;
        //req.getSession().getAttribute("user11")拿值,不用遍历
        if(req.getSession().getAttribute("user11")!=null) {  
            chain.doFilter(request, response);		
        }else { //登录失败重定向
            res.sendRedirect(req.getContextPath()+"/login.jsp"); //绝对路径
        }
    }
    

    分页分析

    上、下一页:

    重要参数:

    每页显示条数pageSize-----自定义已知

    当前第几页:currentPage

    偏移量pyl:(当前页数-1)×每页显示条数

    总共数据条数totalCount:【select count(1) from 表名】获得

    总共页数:sumPage = 总条数/每页显示条数

    • 整除:sumPage = 总条数/每页显示条数
    • 非整除:sumPage =( 总条数/每页显示条数)+1
    • 所以:总页数 = 总条数%每页显示条数==0?(总条数/每页显示条数):(总条数/每页显示条数)+1

    过程叙述:

    1、在service接口中传递参数:当前页currentPage和页面容量pageSize

    2、在service的实现中计算好偏移量,方便dao层的实现用偏移量(因为limit()的两个参数是偏移量和每页显示的条数)

    3、dao层总查询中传递参数:偏移量pyl和pageSize

    4、dao实现中:

    List<Provider> listpro = proService.findAllProvider(5,currentPage);	
    

    5、此时currentPage需要通过传递过来进行上下页的跳转。因为当前的servlet(ProviderServlet.java)是从login重定向过来的不能传参数,且没有参数可传,所以首次进入servlet中currentPage为空,所以我们要登录进入后就显示第一页数据,就添加定义参数—int currentPage = 1,加判断。

    注意:传参的时候,字符类型转为数字类型 parseInt() 方法。

    int currentPage = 1;
    if(request.getParameter("currentPage")!=null) {
    			currentPage = Integer.parseInt(request.getParameter("currentPage"));
    		}
    

    6、接下来就在首页编写前端的动态的上一页下一页,并且控制上一页到第一页不能在上一页,下一页到最后一页也不能在继续。注意标签套进去的作用

    首页、上一页:

    
    	首页
    	 
      	href="ProviderServlet?currentPage=${currentPage-1 }"
      	
      	>上一页
    

    7、最后一页跳转的时候,判断当前页<总页数 会用到总页数=总条数/页面容量

    所以要有一个新的查询,获得总条数,从dao层正向开始。下面只展现了daoImpl的sql代码:

    //dao 实现层
    //获得总记录数
    @Override
    public int findStudentCount() {
        int totalCount = 0;
        try {
            if(getConnection()) {
                String sql = "select count(1) as totalCount from smbms_user";
                ResultSet rs = executeSQL(sql,null);			
                while(rs.next()) {
                    totalCount = rs.getInt("totalCount");
                }
            }
        }catch (Exception e) {
            e.printStackTrace();
        }
        return totalCount;
    }
    

    获得总条数是为了计算总页数,在service实现返回的应该有总页数sumPage,计算的时候需要pageSize参数,service的接口中传参。下面只展现serviceImpl的代码:

    也可以在此处不计算,根据自己在前端页面是否需要totalCount总条数等参数,若需要则将计算写在servlet中并获取,在jsp页面${}获取。

    @Override
    public int findStudentCount(int pageSize) {
        //总条数
        int totalCount = proDao.findStudentCount();
        //总页数====(总记录数%5==0?(总记录数/5):(总记录数/5+1))
        int sumPage = (totalCount%5==0?(totalCount/5):(totalCount/5+1));
        return sumPage;
    }
    

    在Servlet中获得总页数,并传数据,在首页中实现下一页和尾页的前端

    下一页、尾页

    //获得总页数:
    int sumPage = proService.findStudentCount(5);
    request.setAttribute("sumPage", sumPage);  //总页数
    
    //index.jsp
    
     
    href="ProviderServlet?currentPage=${currentPage+1 }"
    
    >下一页
    尾页
    

    还有一种是go__,明确跳转到第几页,注意设置跳转页数大于总页数定格到最后一页就好了。

    //currentPage当前页;sumPage:总页数
    if(currentPage<sumPage) {
    	currentPage = sumPage
    }		
    

    根据输入的页面容量分页:

    输入想让这一页显示多少条数据的不同选择。前端jsp页面使用下拉框来实现。使用js实现:

    每页显示
    
    
    
    
    

    在servlet中获取页面容量:判断,刚进入的时候默每页5条数据,点击下拉框条数根据选择而变

    //页面容量:
    int pageSize = request.getParameter("pageSize")==null?
        5:Integer.parseInt(request.getParameter("pageSize"));
    

    注意:此时根据选择分页已经完成,但是当你点击下一页的时候,又变成了默认的5条,就需要将pageSize在每个路径后面都加上此参数,即首页、上下一页、尾页跳转跟参数pageSize,辨识分页。

    //示例:
    首页
    										多个参数用&号连接,
    

    复合查询

    arseInt(request.getParameter(“pageSize”));

    
    注意:此时根据选择分页已经完成,但是当你点击下一页的时候,又变成了默认的5条,就需要将pageSize在每个路径后面都加上此参数,即首页、上下一页、尾页跳转跟参数pageSize,辨识分页。
    
    ```jsp
    //示例:
    首页
    										多个参数用&号连接,
    

    复合查询

  • 相关阅读:
    接口测试vs功能测试
    Bootstrap5 容器
    当添加一个键值对元素时,HashMap发生了什么?
    ES-OAS-ERP-电子政务-企业信息化
    JVM相关概念
    力扣:151. 反转字符串中的单词(Python3)
    JavaScript数据结构之链表
    2022-7月报
    【JavaEE重点知识归纳】第5节:方法
    苹果加大对印度的扶持,提高在其生产iphone的比重
  • 原文地址:https://blog.csdn.net/m0_70083523/article/details/127090825