学习内容
今天的学习内容,是在昨天的基础上继续进行。今天主要是分页得学习、根据名字搜索用户、登录事件得拦截。
分页
点击用户管理的时候,页面上显示所有的用户。现在实现分页功能,使得每一页只显示五个用户信息。要实现分页,则需要知道:数据库中信息总数量、总页数、当前页、每一页显示的数目、每一页显示的信息集合。
首先,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>
总结
上午实现了分页功能、搜索功能之后,整个用户管理系统就又更完善了一步。下午开始着手小组项目,这几天学的东西都能运用到自己的项目中,也遇到了一些问题,就尽可能地自己解决。今天学的东西还挺多地,主要是再函数里进行修改,修改的多了就会感觉比较乱,改着改着就忘记刚才改的哪里了。所以在日后的学习中要细心认真。