JSP通用分页框架
写一个通用的分页框架,这样在项目里面如果想实现分页功能,只需要稍加改动参数就可以实现分页处理了。这样写了会节省很多时间。
一。分页类
既然要分页那么我们就要考虑建一个通用的分页类,里面需要的参数一般有:
总页数totalPage
总共记录数totalRecord
每页显示数页面大小
当前页页面索引
承载当前页数据的集合列表数据
完整代码:Page.java
导入Java。乌提尔。列表;公共类寻呼机{/***总共页数*/private int TotalPages;/*** 总共记录数*/private int TotalRecords;/*** 每页显示数量*/private int PageSize;/*** 当前页*/private int页索引;/*** 当前页数据集合*/私人列表数据;public void setTotalPages(int total pages){ this。总页数=总页数;} public void setTotalRecords(int total records){ this。记录总数=记录总数;} public void SetPageSize(int PageSize){ this。页面大小=页面大小;} public void SetPageIndex(int page index){ this。页面索引=页面索引;} public void setDatas(ListE datas){ this。数据=数据;} public int getTotalPages(){ return totalPages;} public int getTotalRecords(){ return totalRecords;} public int get page size(){ return page size;} public int get page index(){ return page index;} public ListE getDatas(){ return datas;}}二。用户类
这里以查询用户来做分页为例,所以就需要一个用户类
用户号使用者辩证码
用户姓名用户名
用户密码密码
注册时间注册日期
完整代码
导入Java。SQL。时间戳;公共类用户{ private int userId//用户idprivate字符串用户名;//用户名私有字符串密码;//密码私有时间戳注册日期;//注册时间public int getUserId(){ return userId;} public void setUserId(int userId){ this。userId=userId}公共字符串getUsername(){ 0返回用户名;} public void setUsername(String username){ this。用户名=用户名;}公共字符串getPassword(){ 0返回密码;}公共void set密码(String密码){ this。密码=密码;} public Timestamp getRegdate(){ return regdate;} public void setRegdate(Timestamp regdate){ this。regdate=regdate}}三threadLocal .提取公用参数
先说如果不提取公共参数,比如页面大小,页面索引,那么我们的查询方法应该是这样子:
公共void GetUsers(字符串名称,整数页大小,整数页索引)如果以后再增加参数,无疑这里的参数会变的很多,所以我们利用threadLocal把页面大小和页面索引提取出来。
先写这个类
公共类SystemContext {//页大小私有静态线程本地整数页面大小=新线程本地();//当前页私有静态线程本地整数页面索引=新线程本地();公共静态整数getpage size(){返回页面大小。get();} public static void removepageSize(){ page SiZe。移除();}公共静态void SetPageSize(int _ PageSize){ PageSize。set(_ PageSize);} public Integer getpage index(){返回页面索引。get();} public void SetPageIndex(int _ PageIndex){ PageIndex。set(_ page index);} public static void removePageIndex(){ page index。移除();}}对于threadLocal,这个变量会在线程中一直存在,那么我们就可以在向服务器发送请求的时候添加参数,服务器返回数据的时候移除参数,一来一回的话,自然而然可以用过滤器
那么过滤器如下:
导入com。刀。系统上下文;导入javax。servlet。*;导入Java。io。ioexception公共类系统过滤器实现了筛选器{ int pageSizeint页面索引=1;@覆盖公共void init(过滤器配置过滤器配置)引发ServletException { try { page size=integer。解析器(过滤器配置。getinitparameter('页面大小');} catch(NumberformatException e){ PageSize=15;} } @ override public void doFilter(servlet请求servlet请求,ServletResponse servletResponse,FilterChain filterChain)引发IOException,ServletException { try { page index=integer。parsent(servlet请求。getparameter('页面索引');} catch(NumberformatException e){//什么也不做,pageindex=1 }尝试{//开始请求的时候配置参数SystemContext.setPageSize(页面大小);systemcontext。setpageindex(页面索引);过滤链。dofilter(servlet请求,servlet响应);}最后{//请求返回的时候移除参数系统上下文。removepageindex();systemcontext。removepagesize();} } @覆盖public void destroy(){ } }用了过滤器,自然要在web.xml中配置过滤器
?可扩展标记语言版本='1.0 '编码='UTF-8 '?web-app xmlns=' http://xmlns。JCP。org/XML/ns/javaee ' xmlns : xsi=' http://www .w3。org/2001/XMLSchema-instance ' xsi 3360 schema location=' http://xmlns。JCP。org/XML/ns/javaee http://xmlns。JCP。org/XML/ns/javaee/web-app _ 3 _ 1。xs-配置没页大小-init-param-namepagesize/param-nameparam-value 15/param-value/init-param/filter filter-mapping filter-nameSystemFilter/filter-name!-这里配置需要分页的页面-网址-模式/索引。JSP/URL-模式/过滤器-映射/web-app这样的好处不言而喻,结构清晰,修改方便。接下来是分页代码
四。分页代码
分页代码应该写一个接口和实现类的,这里演示项目就写在了一起
导入com。乌提尔。寻呼机;导入com。乌提尔。用户;导入Java。SQL。*;导入Java。乌提尔。ArrayList导入Java。乌提尔。列表;公共类UserDAO {私有连接conn=null私有结果集rs=nullprivate prepared语句PS=null//public static void main(String[]args){//UserDAO Dao=new UserDAO();//刀. GetUsers(',15,1);//道。close();//} public UserDao(){ String driver name=' com。MySQL。JDBC。“驱动程序”;字符串URL=' JDBC : MySQL ://localhost :3306/fenyedemo ';字符串用户=' root字符串密码=' 123456 ';请尝试{类。对于名称(驱动程序名称);conn=Drivermanager。获取连接(网址、用户、密码);} catch(class notfoundexception e){ system。出去。println('没有发现驱动');e . print stack trace();} catch(SQLException e){ system。出去。println('获取连接失败');e . print stack trace();}}/*** 具体分页实现代码* @param名称查询条件* @返回*/公共寻呼机GetUsers(字符串名称){//获取分页参数int页面大小=SystemContext。getpage size();int page index=systemcontext。getpage index();//分页具体结构化查询语言语句字符串sql='从用户中选择* ';字符串' sqlCount='从用户中选择计数(*);如果(姓名!=null!name.trim().等于(" " { SQL=',其中用户名LIKE % '名称' %sqlCount='其中用户名LIKE % '名称为' % ';}sql=' LIMIT?';//存放当前页的集合列表用户数据=new ArrayList();//存放当前分页的集合寻呼机用户页面=新寻呼机();用户用户温度=空;请尝试{ PS=conn . PrepareStatement(SQL);if(页索引=0)页索引=1;//设置参数ps.setInt(1),(页面索引-1)*页面大小);ps.setInt(2,页面大小);RS=PS。execute query();//循环取出,添加到数据中而(RS。next()){用户临时=新用户();用户温度。SetUserID(RS。getStrIng(' id ');用户温度。setusername(RS。getString(' username ');用户温度。设置密码。GetString(')密码'));用户温度。setregdate(RS。gettimestamp(' regdate ');数据。add(UserTemp);}//最后设置页面垃圾。SetPageIndex(页面索引);pages.setPageSize(页面大小);PS=conn . prepare语句(SQLCount);RS=PS。execute query();而(RS。next()){ page。设置记录。GetInt(1));佩奇。settotalpages((RS。getint(1)-1)/页面大小1);}pages.setDatas(数据);} catch(SQLException e){ system。出去。println('获取出错');e . print stack trace();}返回页面;}public void close(){try {if (rs!=null)RS。close();rs=nullif (ps!=null)PS。close();ps=nullif (conn!=null)conn . close();conn=null } catch(SQLException e){ system。出去。println('关闭失败');e . print stack trace();}}}五jsp .测试页面
普通页面就是显示数据,这个很简单,代码如下
% @页面导入=' com。刀。userdo“% % @ page import=”com。乌提尔。寻呼机“% % @ page import=”com。乌提尔。用户“% % % @页面导入=”Java。乌提尔。迭代器“% @ page content type=”text/html;charset=UTF-8 " language=" Java " % % String条件=请求。GetParameter('条件')";UserDAO UserDAO=new UserDAO();PagerUser pages=nullif(条件!=null!condition.trim().等于(" "){pages=userDAO .GetUsers(条件);}else {pages=userDAO .GetUsers(null);} UserDao。close();%htmlheadtitle测试用例/title/head dyh 1 align=' center '分页测试/h1 table align=' center ' border=' 1 ' width=' 700 ' trtd colspan=' 100% ' form method=' get ' action=' index。JSP '输入类型='文本'名称='条件'输入类型='提交'值='查询/form/TD/trtrthID/ththussername/ththththpassword/thththdata/th/tr % for(Iterator it=page。getdatas().迭代器();它。hasnext();){用户用户温度=(用户)它。next();% trtd %=用户临时值。getuserid()%/tdtd %=用户临时。getusername()%/tdtd %=用户临时。getpassword()%/tdtd %=用户临时密码。getregdate()%/TD/tr % } %/表/正文/html此时已经有一些效果了
六JSP .页面添加控制选项
添加控制选项这里使用分页框架寻呼机-塔格里布,也是为了更好的支持通用性。
首先在index.jsp页面查询之后静态引入一个新的页面,作为底部控制页面
使用方法,就是去下载相应的罐子,然后引入到项目的解放运动中即可
trtd col span=' 100% ' JSP : include page=' fenye。JSP ' JSP : param name=' items ' value=' %=page。gettotalrecords()% '/JSP : param name=' maxPageItems ' value=' %=pages。getpagesize()% '/JSP 3360 param name=' maxIndexPages ' value=' 10 '/JSP : param name=' params ' value=' condition '/下面开始写fenye.jsp
"%@"页面内容类型=' text/html;charset=UTF-8 "语言="Java "页面编码="utf-8"% % int items=integer。parseint(请求。getparameter(' items ');int MaxPageItems=整数。Parseint(请求。GetParameter(' MaxPageItems ');int maxIndexPages=整数。parseint(请求。getparameter(' maxIndexPages ');字符串参数=请求。GetParameter(' params ');%% - 引入分页框架- %%@taglib前缀=' pg ' uri=' http://jspta GS。com/tags/导航/寻呼机“%-参数依次是项目总数每页显示数量下方菜单显示数当前页cur page-% pg :分页项目=' %=items % ' maxPageItems=' %=maxPageItems % ' maxIndexPages=' %=maxIndexPages % ' export=' cur page=页码' pg : param name=' %=params % '/pg : first a href=' %=page URL % '首页/a/pg :第一个pg : preva href=' %=PageURl % '上一页/a/pg : prev pg :页% if(CurPage==page number){ %[%=page number %]% } else { % a href=' %=page URl % ' %=page number %/a % } %/pg : page sspg : nest href=' %=page URl % '下一页/a/pg : ext pg : lasta href=' %=PageURl % '尾页/a/pg : last/pg :寻呼机分页设计基本就是上面框架,重点是参数传递,这里参数传递利用静态引入的时候,配置jsp:param参数,然后到fenye中再取出。其中寻呼机-塔格里布中有一个标签是"/,这个就是针对我的查询条件传递过来的参数,如果没传递,那么查询的话点击下一页也会出错,这里还有一个问题就是编码问题寻呼机-塔格里布默认编码是GB2312,你可以重新打包文件编译,也可以在雄猫的server.xml文件中配置urlEncording="utf-8 ",这样就会没问题了。
七。总结
这样的一个框架,如果其他需要实现分页的就可以直接套用了,建立相应的实体类,写好分页代码,直接套用Systemcontex.java和SystemFilter.java(记得在web.xml配置相应的过滤文件),再jsp中可以直接使用fenye.jsp,这样就会省下很多麻烦