ssm专题学习-spring的使用与相关项目的实现(3)分页功能与Filter

ssm专题学习-spring的使用与相关项目的实现(3)

前言

暑期线上实训的第六节课。对前天项目的完善、扩展以及springmvc方面的学习。
完善之前遗留的bug、实现新的项目功能。
本篇实际完成时间为7月2日。
第二篇的链接点这里

完善

上次项目的最后“更新”功能没有完全实现。虽然可以进入基本的更新界面,但是更新操作会出现报错。
循着报错的源头追查代码,发现更新界面虽然可以进入,但是更新功能的代码实际上是没有完成的,于是乎这里照搬之前“新增”、“删除”的部分,补充之前缺少的“更新”方法。

update方法

在user-update.jsp的form表单将信息的请求路径补充完整

<form action="${pageContext.request.contextPath}/user/update.do"
</form>

与之前类似,先回到Controller层补充方法
UserController.java

    @RequestMapping("/update.do")
    public String update(User user){
        userService.update(user);
        return "redirect:findAll.do";
    }

alt+enter创建update方法
进入UserService.java用同样的方式创建方法,解决报红问题,
并补充完整

    @Override
    public void update(User user) {
        userDao.update(user);
    }

同理,再一次alt+enter创建update方法解决报红。

回到Usermapper.xml映射文件,写方法的逻辑语句。

    <update id="update" parameterType="user">
        update tb_user set username=#{username}.password=#{password} where id=#{id}
    </update>

方法实现

在这里插入图片描述
在这里插入图片描述
新建一条用来测试的数据。
将用户名从“修改前”改成“修改后”,将密码从123,改成456
在这里插入图片描述
回到sql中验证功能实现
在这里插入图片描述

扩展

分页

除了补充之前没有完成的“更新”功能,今天新扩展“分页”功能,将仅仅装饰功能的分页栏的功能实现。

在展示出列表信息的时候,或许并不需要一口气将信息全部都罗列出来,甚至会在当前页过多的展示造成无意义的运算,所以将展示的信息设定在合理的数目内是一件很有意义的事
在这里插入图片描述
新建PageInfo.java
初步定义list、totalPage、size、totalCount、currentPage来存放分页用到的数据
右键Generate,全选Getters and Setters方法
继续右键Generate,全选toString()
在这里插入图片描述

package com.zhongruan.bean;

import java.util.List;

public class PageInfo<T> {
    private List<T> list;//页面上展示的数据
    private int totalPage;//总页数
    private int size;//每页数据条数
    private int totalCount;//由totalPage和size得到的数据总数
    private int currentPage;//当前页数

    public List<T> getList() {
        return list;
    }

    public void setList(List<T> list) {
        this.list = list;
    }

    public int getTotalPage() {
        return totalPage;
    }

    public void setTotalPage(int totalPage) {
        this.totalPage = totalPage;
    }

    public int getSize() {
        return size;
    }

    public void setSize(int size) {
        this.size = size;
    }

    public int getTotalCount() {
        return totalCount;
    }


    public void setTotalCount(int totalCount) {
        this.totalCount = totalCount;
    }

    public int getCurrentPage() {
        return currentPage;
    }

    public void setCurrentPage(int currentPage) {
        this.currentPage = currentPage;
    }

    @Override
    public String toString() {
        return "PageInfo{" +
                "list=" + list +
                ", totalPage=" + totalPage +
                ", size=" + size +
                ", totalCount=" + totalCount +
                ", currentPage=" + currentPage +
                '}';
    }
}

回到UserController.java中修改findAll所传的List
将List改成PageInfo
同理一步步跳转改写int currentPage,Controller层也对参数进行相应修改。

    @RequestMapping("/findAll.do")
    public ModelAndView findAll(int currentPage){
        PageInfo<User> pageInfo=userService.findAll(currentPage);
        ModelAndView modelAndView=new ModelAndView();
        modelAndView.addObject("pageInfo",pageInfo);
        modelAndView.setViewName("user-list");
        return modelAndView;
    }

回到报错的UserService,注销掉已经被修改的findall()
重新生成方法。

因为是将原本的findAll进行直接修改,所以要往回修改所有findAll所传输的值,并且在UserMapper.xml中,findAll参数也具有了int属性

    <select id="findAll" resultType="user" parameterType="int">
        select * from tb_user limit #{start},5
    </select>

在UserService.java中新增传送的信息总条数和总页数,即TotalCount方法和TotalPage方法。
其中,TotalPage的计算方法为 信息总条数/每页信息条数→向上取整

    @Override
    public PageInfo<User> findAll(int currentPage) {
        PageInfo<User> pageInfo=new PageInfo<>();
        pageInfo.setSize(5);//每页默认5条信息
        pageInfo.setCurrentPage(currentPage);
        //0,5,10
        int start=(currentPage-1)*5;
        List<User> userList = userDao.findAll(start);
        pageInfo.setList(userList);
        int tc=userDao.getTotalCount();
        pageInfo.setTotalCount(tc);//信息总条数→tc
        int tp=(int)Math.ceil(tc/5.0);
        pageInfo.setTotalPage(tp);//总页数→tp
        return pageInfo;
    }

添加首页、尾页、上一页等按钮的逻辑

						<div class="box-tools pull-right">
							<ul class="pagination">
								<li><a href="${pageContext.request.contextPath}/user/findAll.do" aria-label="Previous">首页</a></li>
								<li><a href="${pageContext.request.contextPath}/user/findAll.do?currentPage=${pageInfo.currentPage-1}">上一页</a></li>
								<c:forEach begin="1" end="${pageInfo.totalPage}" var="pageNum">
									<li><a href="${pageContext.request.contextPath}/user/findAll.do?currentPage=${pageNum}">${pageNum}</a></li>
								</c:forEach>

								<li><a href="${pageContext.request.contextPath}/user/findAll.do?currentPage=${pageInfo.currentPage+1}">下一页</a></li>
								<li><a href="${pageContext.request.contextPath}/user/findAll.do?currentPage=${pageInfo.totalPage}" aria-label="Next">尾页</a></li>
							</ul>
						</div>

修改在第一页点上一页和在最后一页点下一页时发生的bug,添加逻辑

    @Override
    public PageInfo<User> findAll(int currentPage) {
        PageInfo<User> pageInfo=new PageInfo<>();
        pageInfo.setSize(5);//每页默认5条信息

        int tc=userDao.getTotalCount();
        pageInfo.setTotalCount(tc);//信息总条数→tc
        int tp=(int)Math.ceil(tc/5.0);
        pageInfo.setTotalPage(tp);//总页数→tp
        if(currentPage<1){
            pageInfo.setCurrentPage(1);
        }else if(currentPage>tp){
            pageInfo.setCurrentPage(tp);
        }else {
            pageInfo.setCurrentPage(currentPage);
        }
        //0,5,10
        int start=(pageInfo.getCurrentPage()-1)*5;
        List<User> userList = userDao.findAll(start);
        pageInfo.setList(userList);
        return pageInfo;
    }

将数据表适当增多数据,测试一下效果
在这里插入图片描述
默认每页5条数据,根据总数据/5向上取整得出总页数并显示。
在这里插入图片描述
在这里插入图片描述

Filter过滤器

为了让登陆系统不显得是个摆设,用Filter过滤器拦截登陆界面的地址请求,添加逻辑判断,拦截下所有非登陆的请求以达到“登陆”功能的完善。

在web.xml中添加行的Filter

  <filter>
    <filter-name>loginFilter</filter-name>
    <filter-class>com.zhongruan.filter.LoginFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>loginFilter</filter-name>
    <url-pattern>*.do</url-pattern>
  </filter-mapping>

新建LoginFilter类
因为是第一次写Filter完全的不熟悉,所以报错与bug频繁,故略过繁琐的bug修改和调试的步骤,这里直接给出成果代码。

package com.zhongruan.filter;

import com.zhongruan.bean.User;

import javax.servlet.*;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

public class LoginFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request= (HttpServletRequest) servletRequest;
        HttpServletResponse response= (HttpServletResponse) servletResponse;
        HttpSession session = request.getSession();
        User user= (User) session.getAttribute("user");
        String uri=request.getRequestURI();//获得当前请求路径
        if(user==null&&uri.indexOf("login.do")==-1){//如果收到的请求不为login。do则执行拦截,否则放任通过
            response.sendRedirect(request.getContextPath()+"login.jsp");
        }else {
            filterChain.doFilter(request,response);
        }
    }

    @Override
    public void destroy() {

    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值