JSP实现分页二:用threadlocal

      用上篇文章的分页方法,list方法要传参,但我们明显感觉到所传参数只是为了实现分页,和具体方法无关,即和业务逻辑无关,因此我们可以引入threadlocal这个概念,目前我们只需知道,它可以存放一些值,存在threadlocal的值在整个线程中有效,请求响应值有效。如果我们需要将公用数据从页面往下传,如传到DAO,可以考虑用threadloca。
1.创建类,可以设置和获取threadlocal的值
package com.yan.shop.model;

public class SystemContext {
	private static ThreadLocal<Integer> pageSize=new ThreadLocal<Integer>();
	private static ThreadLocal<Integer> pageIndex=new ThreadLocal<Integer>();
	public static void setPageSize(int _pageSize){
		pageSize.set(_pageSize);
	}
	public static int getPageSize(){
		return pageSize.get();
	}
	public static void removePageSize(){
		pageIndex.remove();
	}
	public static void setPageIndex(int _pageIndex){
		pageIndex.set(_pageIndex);
	}
	public static int getPageIndex() {
		return pageIndex.get();
	}
	public static void removePageIndex() {
		pageSize.remove();
	}
}

2.在界面层设置值,可以传到DAO层
<%@page import="com.yan.shop.model.SystemContext"%>
<%@page import="com.yan.shop.model.Pager"%>
<%@page import="com.yan.shop.model.User"%>
<%@page import="java.util.List"%>
<%@page import="com.yan.shop.dao.IUserDao"%>
<%@page import="com.yan.shop.dao.DAOFactory"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<%
IUserDao userDao=DAOFactory.getUserDao();
int pageIndex=1;
try{
pageIndex=Integer.parseInt(request.getParameter("pageIndex"));
}catch(NumberFormatException e){}
int pageSize=1;
SystemContext.setPageIndex(pageIndex);
SystemContext.setPageSize(pageSize);
Pager<User> pa=userDao.list();
List<User> users=pa.getDatas();
User loginUser=(User)session.getAttribute("loginUser");
%>
</head>
<body>
<jsp:include page="inc.jsp">
<jsp:param value="管理" name="op"/>
</jsp:include>
<table align="center" border="1" width="800">
<tr>
<td>用户标识</td>
<td>用户名</td>
<td>用户密码</td>
<td>用户昵称</td>
<td>用户类型</td>
<td>用户状态</td>
<th>操作</th>
</tr>
<%for(User u:users){
	%>
	<tr>
	<td><%=u.getId() %></td>
	<td><%=u.getUsername() %></td>
	<td><%=u.getPassword() %></td>
	<td><%=u.getNickname() %></td>
	<td>
	<%if(u.getType()==0){
		%>普通用户
		<%if(loginUser.getType()==1) {%>
		<a href="setType.jsp?id=<%=u.getId()%>">设置管理员</a><% }
	}else{
		%>管理员<%if(loginUser.getType()==1) {%><a href="setType.jsp?id=<%=u.getId()%>">取消管理员</a><%}
	} %>
	</td>
	<td>
	<%if(u.getStatus()==0){
		%>启用
		<%if(loginUser.getType()==1) {%><a href="setStatus.jsp?id=<%=u.getId()%>">停用</a> <%}
	}else{
	%><span style='color:red'>停用</span><%if(loginUser.getType()==1) {%><a href="setStatus.jsp?id=<%=u.getId()%>">启用</a><%}
	} %>
	</td>
	<td>
	<% if(loginUser.getType()==1){%>
	<a href="delete.jsp?id=<%=u.getId() %>">删除</a> <a href="updateInput.jsp?id=<%=u.getId()%>">更新</a></td>
	</tr>
<%} 	
} 
%>
<tr>

<td colspan="7" align="center">一个有<%=pa.getTotalPage() %>页,当前为第<%=pa.getPageIndex() %>页</td>

</tr>
<tr>
<td colspan="7" align="center">

<%if(pageIndex==1){%>[上一页]<% }else{%><a href="list.jsp?pageIndex=<%=pageIndex-1 %>">[上一页]</a><% }%>
<a href="list.jsp?pageIndex=<%=1 %>">[首页]</a>
<% int totalPage=pa.getTotalPage();
for(int i=1;i<=totalPage;i++) {
if(i==pageIndex){
	out.println(i);
}else{
%>
<a href="list.jsp?pageIndex=<%=i %>">[<%=i %>]</a>
<%} }%>
<a href="list.jsp?pageIndex=<%=totalPage %>">[尾页]</a>
<%if(pageIndex==totalPage){%>[下一页]<% }else{%><a href="list.jsp?pageIndex=<%=pageIndex+1 %>">[下一页]</a><% }%>
</tr>
</table>
</body>
</html>
3.DAO层可以获取从界面层设置的值
public Pager<User> list() {
		Connection con=null;
		int pageIndex=SystemContext.getPageIndex();
		int pageSize=SystemContext.getPageSize();
		PreparedStatement ps=null;
		ResultSet rs=null;
		Pager<User> page=new Pager<User>();
		List<User> users=new ArrayList<User>();
		User u=null;
		try{
			if(pageIndex<=0)
			{pageIndex=1;}
			int start=(pageIndex-1)*pageSize;
		con=DBUtil.getConnection();
		String sql="select * from t_user limit ?,?";
		String sqlCount="select count(*) from t_user";
		ps=con.prepareStatement(sql);
		ps.setInt(1, start);
		ps.setInt(2, pageSize );
		rs=ps.executeQuery();
		while(rs.next()){
			u=new User();
			u.setId(rs.getInt("id"));
			u.setNickname(rs.getString("nickname"));
			u.setPassword(rs.getString("password"));
			u.setUsername(rs.getString("username"));
			u.setStatus(rs.getInt("status"));
			u.setType(rs.getInt("type"));
			users.add(u);
		}
		ps=con.prepareStatement(sqlCount);
		rs=ps.executeQuery();
		int totalRecord=0;
		while(rs.next()){
			totalRecord=rs.getInt(1);
		}
		int totalPage=(totalRecord-1)/pageSize+1;
		page.setPageIndex(pageIndex);
		page.setPageSize(pageSize);
		page.setTotalPage(totalPage);
		page.setTotalRecord(totalRecord);
		}catch(SQLException e){
			e.printStackTrace();
		}finally{
			DBUtil.close(rs);
			DBUtil.close(ps);
			DBUtil.close(con);
		}
		
		page.setDatas(users);
		return page;
	}

如果多个页面都涉及到可以考虑用过滤器
package com.yan.shop.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

import com.yan.shop.model.SystemContext;

public class SystemContextFilter implements Filter {
	int pageSize;
	@Override
	public void destroy() {
		// TODO Auto-generated method stub

	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		try {
			int pageIndex=1;
			try{
			pageIndex=Integer.parseInt(request.getParameter("pageIndex"));
			}catch(NumberFormatException e){}
			int pageSize=1;
			SystemContext.setPageIndex(pageIndex);
			SystemContext.setPageSize(pageSize);
			chain.doFilter(request, response);
		} finally{
			SystemContext.removePageIndex();
			SystemContext.removePageSize();
		}

	}

	@Override
	public void init(FilterConfig cfg) throws ServletException {
		try {
			pageSize=Integer.parseInt(cfg.getInitParameter("pageSize"));
		} catch (NumberFormatException e) {
			
			pageSize=1;
		}

	}

}

web.xml配置
l
  <filter>
  <filter-name>SystemContextFilter</filter-name>
  <filter-class>com.yan.shop.filter.SystemContextFilter</filter-class>
  <init-param>
   <param-name>pageSize</param-name>
   <param-value>1</param-value>
  <init-param>
 </filter>
 <filter-mapping>
 <filter-name>SystemContextFilter</filter-name>
 <url-pattern>/*</url-pattern>
 </filter-mapping>
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值