JAVA语言实现大量信息的分页显示功能及对象反射(通过参数找到对应的函数)

1.对象的反射:通过对象找出该类中所有的方法

    Class cla=this.getClass();
    Method method=cla.getDeclaredMethod(methodName,HttpServletRequest.class,HttpServletResponse.class );
   

   例子:通过参数能调用该类中参数所对应的方法

     超链接请求,参数method对应的是要调用的方法,pageNo对应的是分页显示的要显示第几页

   <h3><a href="${pageContext.request.contextPath}/FunctionServlet?method=getUserList&pageNo=1">
       查询所有用户信息。</a></h3>
    反射处理:

     1.首先建立一个父类BaseServlet

@WebServlet("/BaseServlet")
public class BaseServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	protected static int pageNo=1;//设置默认显示的页码
	protected static int pageSize = 1;//每页有多少条记录      
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		try{
			pageNo=Integer.parseInt(request.getParameter("pageNo"));
		}catch(Exception e){
			e.getMessage();
		}
		//获取用户传递的请求参数
		String methodName = request.getParameter("method");		
		//通过方法名获取到方法的对象
		//获取当前类的Class对象
		Class cla = this.getClass();
		//获取cla的的方法(Method对象)
		//getDeclaredMethod需要两个参数,方法名和参数名
		//因为在java需要通过方法名和参数列表来确定一个方法
		try {
			//获取方法对象
			Method method = cla.getDeclaredMethod(methodName, HttpServletRequest.class , HttpServletResponse.class);
			//设置方法的访问权限
			method.setAccessible(true);
			//调用方法
			//invoke用于调用一个方法,第一个参数时要调用方法的对象,剩下是调用方法需要的参数
			method.invoke(this, request , response);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf8");
		doGet(request, response);
	}

}
            
                  2.    建立一个子类继承BaseServlet父类,定义每个参数对应的要调用的方法
@WebServlet("/FunctionServlet")
public class FunctionServlet extends BaseServlet {
	private static final long serialVersionUID = 1L;
     private Userservice userservice=new UserserviceImp();  
   public void loginByNameAndPwd(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
	   String username=request.getParameter("username");
	   String password=request.getParameter("password");
	   request.setAttribute("username", username);
	   int resule=userservice.findByNameAndPwd(username, password);
	   if(resule==1){
		 response.sendRedirect(request.getContextPath()+"/login-success.jsp?username="+username+"");
		   //request.getRequestDispatcher("/login-success.jsp").forward(request, response);
	   }else{
		   response.sendRedirect(request.getContextPath()+"/login-error.html");
	   }
   }
   
   public void getUserList(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
	   String url=WEBUtils.getPath(request);
	   Page<User> page=userservice.getUserList(pageNo, pageSize);
	   page.setPath(url);
	  request.setAttribute("page", page);
	  request.getRequestDispatcher("/WEB-INF/pages/list.jsp").forward(request, response);
   }
}

以后在参数中写上要调用的方法名即可调用


二、信息分页处理

1.建立page实体类,用到泛型

public class Page<T> {
	private List<T> data;   //后台数据库查询出来
	private int totalRecord; //表示总共有多少记录,从数据库中查询出来	
//	private int totalPage;  // 表示总共有多少页,计算得到!
//	private int index;   //表示当前索引值,计算出来的!	
	private int pageNumber; //表示的是当前页码,这个参数是从页面传递过来的!
	private int pageSize;  //表示的是每页显示多少条数据 ,在servlet中设置的!
	private String path;//表示超链接地址URL
	
	public Page() {
		super();
	}
	public Page(int totalRecord, int pageNumber, int pageSize) {
		super();
		this.totalRecord = totalRecord;
		this.pageNumber = pageNumber;
		this.pageSize = pageSize;
	}
	public String getPath() {
		return path;
	}
	public void setPath(String path) {
		this.path = path;
	}
	public List<T> getData() {
		return data;
	}
	public void setData(List<T> data) {
		this.data = data;
	}
	public int getTotalRecord() {
		return totalRecord;
	}
	public void setTotalRecord(int totalRecord) {
		this.totalRecord = totalRecord;
	}
	public int getTotalPage() {
		/**
		 * totalPage:表示总共有几页!
		 * 
		 *					 总页数          totalRecord[总记录数]    pageSize
		 *                     5        10                     2
		 *                     5         9                     2
		 *                     4         8                     2
		 */
		if(totalRecord % pageSize ==0){
			return totalRecord / pageSize;
		}	
		return (totalRecord / pageSize + 1);
	}
	public int getIndex() {
		/**
		 * index表示的是当前索引值,是计算得到的!
		 *             当前索引值           每页显示几条数据               当前页是第几页
		 *                0           3                 1
		 *                3           3                 2
		 *        
				index  = (pageNumber -1)*pageSize;
		 */
		return (getPageNumber() -1)*pageSize;
	}	
	public int getPageNumber() {
		if(pageNumber < 1){
			return 1;
		}else if(pageNumber > getTotalPage()){
			return getTotalPage();
		}
		return pageNumber;
	}	
	public int getPageSize() {
		return pageSize;
	}

	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
	}
}

2.怎么获取URL?

 String url=WEBUtils.getPath(request);
  WEBUtils类中的getPath方法

public static String getPath(HttpServletRequest request){
		String requestURI = request.getRequestURI();
		String queryString = request.getQueryString();
		String url = requestURI+"?"+queryString;
		if(url.contains("&pageNo")){
			url = url.substring(0, url.indexOf("&pageNo"));
		}
		return url;
	}

3.显示列表的Servlet中的方法

protected void getStuList(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String url = WEBUtils.getPath(request);
		Page<Student> page=stuService.getStudentList(pageNo,pageSize);
		page.setPath(url);
		request.setAttribute("page",page );
		request.getRequestDispatcher("/WEB-INF/view/list.jsp").forward(request, response);
	}

业务层Service中的函数

public Page<Student> getStudentList(int pageNo, int pageSize){
		//第一步:查询当前表的所有记录数
		int totalRecord=  stuDao.getTotalRecord();
		//第二步:创建page对象
		Page<Student> page = new Page<Student>(totalRecord,pageNo,pageSize);
		//第三步:查询分页列表数据并设置到page对象中!
		List<Student> list = stuDao.getLimitStuList(page.getIndex(),page.getPageSize());
		page.setData(list);	
		return page;
	}

持有层Dao中要有1.获取所有记录的方法2.分页显示的方法

视图层页面显示代码:将页表显示分离到另一个页面,通过静态引入

   总体显示页面  list.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!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>
</head>
<body>
<c:choose>
		<c:when test="${empty page.data }">
			<h1 align="center">没有学生数据</h1>
		</c:when>
		<c:otherwise>	
			<h1 align="center">学生列表</h1>
			<table border="1" align="center" width="50%">
				<tr>
					<th>姓名</th>
					<th>密码</th>
					<th>邮箱</th>
					<th colspan="2">操作</th>
				</tr>
				<c:forEach items="${page.data}" var="stu">
					<tr>
						<td>${stu.username }</td>
						<td>${stu.password }</td>
						<td>${stu.mail }</td>
						<td><a href="${pageContext.request.contextPath}/StudentServlet?method=toUpdatePage&id=${stu.id}" >修改</a></td>
						<td><a href="#?${stu.id}">删除</a></td>
					</tr>
				</c:forEach>
				<tr><td colspan="5" align="center"><a href="#">添加</a></td></tr>
			</table>
			<br/>
		<%@ include file="/WEB-INF/pages/paging.jsp" %>
		</c:otherwise>
	</c:choose>
</body>
</html>
页表显示页面  paging.jsp       显示5页的数据

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<div id="page_nav" align="center">
	<a href="${page.path}&pageNo=1">首页</a>
	<a href="${page.path}&pageNo=${page.pageNumber -1 }">上一页</a>
		<c:choose>
			<c:when test="${page.totalPage <= 5 }" >
				<c:set var="begin" value="1"></c:set>
				<c:set var="end" value="${page.totalPage}"></c:set>
			</c:when>
			<c:when test="${page.pageNumber <= 3 }">
				<c:set var="begin" value="1"></c:set>
				<c:set var="end" value="5"></c:set>
			</c:when>
			<c:otherwise>
				<c:set var="begin" value="${page.pageNumber-2}"></c:set>
				<c:set var="end" value="${page.pageNumber+2}"></c:set>
				<c:if test="${end > page.totalPage }">
					<c:set var="begin" value="${page.totalPage-4}"></c:set>
					<c:set var="end" value="${page.totalPage}"></c:set>
				</c:if>
			</c:otherwise>
		</c:choose>
		<c:forEach begin="${begin }" end="${end}" var="num">
			<c:if test="${page.pageNumber == num }">
				【${num}】
			</c:if>
			<c:if test="${page.pageNumber != num }">
				<a href="${page.path}&pageNo=${num}">${num }</a>
			</c:if>
		</c:forEach>
	<a href="${page.path}&pageNo=${page.pageNumber +1}">下一页</a>
	<a href="${page.path}&pageNo=${page.totalPage}">末页</a>
	共${page.totalPage }页,${page.totalRecord }条记录到,去第<input value="${page.totalPage }" name = "pn" id ="pn_input"/>页
	<input type="button" value="确定" id="btn_id"/>
	<script type="text/javascript">
		$("#btn_id").click(function(){
			var value= $("#pn_input").val();
			window.location="${page.path}&pageNo="+value;
		});
	</script>
</div>


posted @ 2017-08-15 22:11  Mazhitaoooo  阅读(324)  评论(0编辑  收藏  举报