本项目基于我的上一个博客,实现分页功能由于要展示一张用户表,定义了一个类命名为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;
}
下面是用户管理列表的图形界面,
考虑到进入界面时,需要利用所有用户的信息生成页面列表,搜索时也是以页面列表的形式呈现,这一块代码大致相同,将代码进行复用,在方法中设置一个参数,用来标识查找用户的请求,是进入管理界面的默认请求还是搜索时的请求。进入新的页面时,默认设置当前页为1,用户进入的默认的管理页面即type==1,当用户进入到默认的管理页面时,利用HttpSession设置参数searchname,用于在进行搜索功能时,传递搜索的值。
下面是用户进入管理页面的默认请求。
调用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