本项目基于我的上一个博客,实现分页功能由于要展示一张用户表,定义了一个类命名为PageInfo用来实现分页功能,由于表单中包含多个User对象信息,所以使用List集合,为了满足程序的可扩展性,使用了List泛型,在使用时,才声明传入的类。分页实现需要知道总页数,用户记录总条数,每页显示的用户记录数量以及当前页码。

package com.zr.bean;

import java.util.List;
//get set 构造方法都省略了
public class PageInfo<T> {
    private List<T> list;
    private int totalCount;
    private int size;
    private int totalPage;
    private int currentPage;
}

下面是用户管理列表的图形界面,

java 网址 分割_java

考虑到进入界面时,需要利用所有用户的信息生成页面列表,搜索时也是以页面列表的形式呈现,这一块代码大致相同,将代码进行复用,在方法中设置一个参数,用来标识查找用户的请求,是进入管理界面的默认请求还是搜索时的请求。进入新的页面时,默认设置当前页为1,用户进入的默认的管理页面即type==1,当用户进入到默认的管理页面时,利用HttpSession设置参数searchname,用于在进行搜索功能时,传递搜索的值。

下面是用户进入管理页面的默认请求。

java 网址 分割_java 网址 分割_02

调用Service层的findAll接口,根据当前页和用户名查询当前页的用户,然后指定跳转视图为user-list,并用addObject方法将数据传入到user-list页面中。

代码实现

@RequestMapping("findAll.do")
    public ModelAndView findAll(@RequestParam(defaultValue = "1") int currentPage, String username,
             @RequestParam(defaultValue = "0") int type,
             HttpSession session){
        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 mv = new ModelAndView();
        mv.setViewName("user-list");
        mv.addObject("pageInfo",pageInfo);
        return mv;
    }

业务层接口实例化类UserServiceImpl中包含findAll方法。在方法中,首先要根据用户名调用Dao层UserDao的getToltalCount方法,到数据库中进行模糊查询,如果是默认请求进入管理页面获取的用户数据,由于username为空,就相当于查询了所有的用户。然后需要根据用户的条数,计算用户的总页数,同时设置默认每页的用户数据记录为5条,由于需要显示所有的用户,这里进行了向上取整得到总的页数。然后设置将要跳转的页号,这里需要进行判断,使查询的页号在数据库的范围中,如果当前页小于1,则设置当前页号为1,如果当前页号大于总页数,则设置当前页为总的页数,即最后一页。由于页面上是从第一页开始的,而数据库是从第0条开始查询的,在查询数据库一个范围的用户记录时,需要将当前页减一然后乘以每一页的用户条数即5条,得到查询开始的索引值。调用Dao层userDao的findAll方法,查询从索引值开始的5条记录,将返回存入到userList集合中,再用set方法,将数据存入到pageInfo对象中,然后将对象返回,供其他层调用。

@Override
    public PageInfo<User> findAll(int currentPage,String username) {
        PageInfo pageInfo = new PageInfo();
        int totalCount = userDao.getTotalCount(username);
        pageInfo.setTotalCount(totalCount);
        double d = totalCount/5.0;
        int tp = (int) Math.ceil(d);
        pageInfo.setTotalPage(tp);
        pageInfo.setSize(5);
        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,username);
        pageInfo.setList(userList);
        return pageInfo;
    }

然后需要修改mapper中的select指令,需要修改的是查询用户记录数和根据开始索引值,查询条数以及用户信息查询的在某一个范围的用户记录。

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

此时前端页面也需要改动,用于最后一页的用户记录是不确定的,所以需要根据遍历pageInfo list属性中的所有对象,遍历完成了也就将list中所有的用户信息显示出来了。

<c:forEach items="${pageInfo.list}" var = "user">
 	<tr>
 	<td><input id="ids" name="ids" type="checkbox" value="${user.id}"></td>
 	<td>${user.id}</td>
 	<td>${user.username}</td>
 	<td>${user.password}</td>
 	<td class="text-center">
 	<a href="/user/toUpdate.do?id=${user.id}" class="btn bg-olive btn-xs">更新</a>
 	<a href="/user/deleteByID.do?id=${user.id}" class="btn bg-olive btn-xs">删除</a>
 	<a href="/user/toAddRole.do?id=${user.id}" class="btn bg-olive btn-xs">添加角色</a></td>
 	</tr>
 </c:forEach>

限制未登录用户管理系统功能可利用过滤器实现 , 通过过滤器拦截请求。在filter目录下,新建LoginFilter类,该类继承于Filter类,Filter引用的是javax.servlet包中的类。当用户发出一个请求时,可利用session获取user属性,如果user属性为空说明用户未登录,但这样用户将永远无法进入系统,因为只有用户的账号信息匹配,才设置user属性。所为了防止用户无法登陆,所以需要判断用户是不是在进行登入的请求,即判断url中是否包含login.do的字段。

package com.zr.filter;


import com.zr.bean.User;

import javax.servlet.*;
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 url=request.getRequestURL().toString();
        if(user==null && url.indexOf("login.do")==-1){
            response.sendRedirect("../login.jsp");
        }else {
            filterChain.doFilter(request,response);
        }
    }

    @Override
    public void destroy() {

    }
}

用户登录时,需要注意要给session对象设置user属性。

public ModelAndView login(User user,HttpSession session){
      int id = userService.login(user.getUsername(), user.getPassword());
      ModelAndView modelAndView = new ModelAndView();
      if(id !=-1){
          List<Integer> roleIds = roleServive.findRoleByUserId(id);
          session.setAttribute("roleIds",roleIds);
          session.setAttribute("user",user);
          modelAndView.setViewName("main");
      }else {
          modelAndView.setViewName("../failer");
      }
      return modelAndView;
  }

最后还需要配置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>

代码已上传GitHub