7.23 zr实习日记

学习内容

今天的学习内容,是在昨天的基础上继续进行。今天主要是分页得学习、根据名字搜索用户、登录事件得拦截。

分页

点击用户管理的时候,页面上显示所有的用户。现在实现分页功能,使得每一页只显示五个用户信息。要实现分页,则需要知道:数据库中信息总数量、总页数、当前页、每一页显示的数目、每一页显示的信息集合。
首先,bean层建一个PageInfo类,该类五个属性:size(每一页显示的数目)、totalCount(总数目)、totalPage(总页数)、currentPage(当前页)、List集合用来存储每一页显示的对象。

package com.zr.bean;

import java.util.List;

//保存分页信息的实体类
public class PageInfo<T> {
    private List<T> list; //分页的用户
    private int totalCount;//总数量
    private int size;//每一页的数量
    private int totalPage;//总页数
    private int currentPage;//当前页

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

    public int getTotalCount() {
        return totalCount;
    }

    public int getSize() {
        return size;
    }

    public int getTotalPage() {
        return totalPage;
    }

    public int getCurrentPage() {
        return currentPage;
    }

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

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

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

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

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

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

这个类写完之后,进入controller层,修改findAll()方法,传入整型参数currentPage。同时修改service层的UsreServiceImpl类中的findAll(),在该函数中计算size、totalCount、totalPage、currentPage、List集合。

    public PageInfo<User> findAll(int currentPage) {

        PageInfo pageInfo = new PageInfo();
        pageInfo.setSize(5);
        //得到总数
        int totalCount=userDao.getTotalCount();
        pageInfo.setTotalCount(totalCount);
        //计算总页数
        double totalPage=totalCount/5.0;
        int tp= (int )Math.ceil(totalPage);//总页数强转为整数
        pageInfo.setTotalPage(tp);
        if(currentPage<1){
            pageInfo.setCurrentPage(1);
        }else if(currentPage>tp){
            pageInfo.setCurrentPage(tp);
        }else{
            pageInfo.setCurrentPage(currentPage);
        }
        //计算每页开始
        int start=(pageInfo.getCurrentPage()-1)*5;
        List<User> userList = userDao.findAll(start, 5);
        pageInfo.setList(userList);//要显示出来的数据
        return pageInfo;
    }

在dao层,修改findAll()为findAll(@Param(“start”)int start, @Param(“size”)int size),同时在dao层得到数据库中的总数量,同时在UserMapper.xml写SQL语句

    <select id="getTotalCount" resultType="int">
        select count(*) from tb_user
    </select>

最后修改前端页面这一部分的代码:

		</div>
					<!-- /.box-body -->
						<div class="box-tools pull-right">
							<ul class="pagination">
								<li><a href="/user/findAll.do" aria-label="Previous">首页</a></li>
								<li><a href="/user/findAll.do?currentPage=${pageInfo.currentPage-1}">上一页</a></li>

								<c:forEach begin="1" end="${pageInfo.totalPage}" var="pageNum">
									<li><a href="/user/findAll.do?currentPage=${pageNum}">${pageNum}</a></li>
								</c:forEach>

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

					</div>

结果:
在这里插入图片描述
在这里插入图片描述
点击下边的页码也会跳转到相应的页面。

搜索

搜索实际上是一个模糊查询,还是属于查询,所以这次继续在findAll()上进行修改。(在分页管理上进行修改)
首先dao层的findAll方法添加一个参数:username,同时将对应的SQL语句进行修改。

    <select id="findAll"  resultType="user">
        select * from tb_user
        <if test="username!=null and username!='' ">
            where username like concat("%",#{username},"%")
        </if>
        limit #{start},#{size}
    </select>

dao层的getTotalCount()也添加一个参数:String:username,其他的findAll()也添加上该参数。
这个时候运行,会发现发现搜索用户可以显示出搜索的结果,但是点击下一页的时候会显示所有的用户。所以,这个时候需要在controller层的findAll()添加一个会话对象session,和一个int型的参数type.当type=1的时候表示进行查询,则把传进来的username放入session中,type=2表示查询所有的用户,此时将username从session中remove出去。

    @RequestMapping("findAll.do")
    public ModelAndView findAll(@RequestParam(defaultValue = "1") int currentPage, String username,
                                @RequestParam(defaultValue = "0") int type,
                                HttpSession session){//当前页可以通过页面传进来
        //type=1表示传进来了username,表示查询,  =2表示查询所有
       if(type==1){
           session.setAttribute("searchname",username);
       }else if(type==0){
           username=(String) session.getAttribute("searchname");
        }else if(type==2){
           //点击用户管理的时候,重新查询所有的用户
            session.removeAttribute("searchname");
       }
        PageInfo<User> pageInfo = userService.findAll(currentPage,username);//查到所有的用户
        //视图解析器
        ModelAndView modelAndView = new ModelAndView();
        //跳转界面,跳转到用户管理,在pages文件夹下,这里直接写文件名
        modelAndView.setViewName("user-list");
        //把查询到的对象添加进去
        modelAndView.addObject("pageInfo",pageInfo);
        return modelAndView;
    }

此时查询用户名称中有1的所有用户,两页结果都能正常显示
在这里插入图片描述
在这里插入图片描述

过滤器

在url中输入localhost:8081/user/findAll.do发现也能跳转到用户管理页面,但是这个时候用户并没有登录,所以这个时候需要设置过滤器对登陆事件进行拦截。
首先新建包filter,该层下新建类LoginFilter,该类实现Filter接口,doFilter方法如下:

 @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

        //判断用户是否登录,如果登录则继续执行,没有登陆跳转到登陆界面
        //放到session里边,有用户则登录,没有则跳转到登陆姐买你需要登录
        HttpServletRequest request=(HttpServletRequest) servletRequest;
        HttpServletResponse response=( HttpServletResponse) servletResponse;
        HttpSession session = request.getSession();
        User user=(User) session.getAttribute("user");
        //获得请求路径
        String url=request.getRequestURL().toString();
        //路径里没有login.do则跳转到登陆界面,这样不会死循环
        if(user==null && url.indexOf("login.do")==-1){
            //跳转到登陆
            response.sendRedirect("../login.jsp");
        }
        else{
            filterChain.doFilter(request,response);
        }
    }

然后到web,xml文件中写映射,和之前写的类似。这样写完之后再运行项目,这次就只能先登录才能查看用户列表,如果不登陆的话则会跳转到登录页面。

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

总结

上午实现了分页功能、搜索功能之后,整个用户管理系统就又更完善了一步。下午开始着手小组项目,这几天学的东西都能运用到自己的项目中,也遇到了一些问题,就尽可能地自己解决。今天学的东西还挺多地,主要是再函数里进行修改,修改的多了就会感觉比较乱,改着改着就忘记刚才改的哪里了。所以在日后的学习中要细心认真。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值