Java_自定义标签_分页标签
此分页标签总共有7个属性,都是必有的属性,
1、pageSize(每页显示的条数);
2、pageNo(当前页对象,用于分页);
3、url(分页跳转的路径,一般为servlet的路径);
4、name(在路径中分页模型存放的作用域的属性名);
5、scope(作用域);
6.value(实体对象名,便于用EL表达式打印数据);
7、colspan(要跨的行数,用于分页哪一行与数据行统一)
(注:使用时一定要导入标签的路径,会写自定义标签的应该知道,此标签写着玩的,没什么商业价值,有什么问题可以一起讨论哈!奋斗)
代码如下:
1、标签处理类:(要继承TagSupport或BodyTagSupport,还需要重写父类中的方法)
public class PageTag extends TagSupport{
//定义标签的属性
private String pageNo;//当前页
private int pageSize;//每页显示的条数
private String name;//分页模型属性名
private String url;//路径
private String colspan;//要跨的行数
private String scope;//模型是从什么作用域中取出来的
private String value;//实体对象
//创建分页模型对象
PageModel> pm = null;
//创建迭代器对象
Iterator> iter =null;
@Override
public int doStartTag() throws JspException {
//判断模型是放在什么作用域中,并取出
Object obj = null;
if("page".equals(scope))
{
obj = pageContext.getAttribute(name,pageContext.PAGE_SCOPE);
}
if("request".equals(scope))
{
obj = pageContext.getAttribute(name,pageContext.REQUEST_SCOPE);
}
if("session".equals(scope))
{
obj = pageContext.getAttribute(name,pageContext.SESSION_SCOPE);
}
if("application".equals(scope))
{
obj = pageContext.getAttribute(name,pageContext.APPLICATION_SCOPE);
}
//将取出的值付给分页模型
pm = (PageModel>)obj;
//从分页模型中取出集合
List> list = pm.getList();
//使用迭代器把值取出来
iter= list.iterator();
if(iter.hasNext())
{
//把值放到实体对象中
pageContext.setAttribute(value, iter.next());
return EVAL_BODY_INCLUDE;
}else{
return SKIP_BODY;
}
}
@Override
public int doAfterBody() throws JspException {
if(iter.hasNext())
{
pageContext.setAttribute(value, iter.next());
return EVAL_BODY_AGAIN;
}else{
return SKIP_BODY;
}
}
@Override
public int doEndTag() throws JspException {
// 进行分页
//创建输出流对象
JspWriter out = pageContext.getOut();
try {
String href = url+"?pageSize="+this.pageSize+"&"+this.pageNo+"=";
out.print("
第"+pm.getPageNo()+"/"+pm.getPageTotal()+"页 ");
out.print("首页 上一页 下一页 尾页 |
");
} catch (IOException e) {
e.printStackTrace();
}
return SKIP_BODY;
}
//标签属性的封装(生成每个属性的get和set方法,我就不一一写了)
如:
public String getPageNo() {
return pageNo;
}
public void setPageNo(String pageNo) {
this.pageNo = pageNo;
}
}
2、标签库描述文件:(此文件必须放在WEB-INF文件夹中)
1.0
1.2
pt
!--标签路径-->
pageTag
taozi.tag.PageTag
jsp
pageNo
true
true
pageSize
true
true
name
true
true
url
true
true
colspan
true
true
scope
true
true
value
true
true
3、通用的分页模型:
public class PageModel
{
/**
* 定义属性
*/
//定义当前页数
int pageNo=1;
//定义当前页数显示的条数
int pageSize=5;
//定义总条数
int count;
//定义显示的集合
List list;
String keyWords;//定义要查询的内容
/**
* 定义方法(首页,上一页,下一页,尾页)
* @return
*/
//首页
public int getPageIndex()
{
return 1;
}
//尾页
public int getPageTotal()
{
int pageTotal=this.count%this.pageSize;
if(pageTotal==0)
{
pageTotal=this.count/this.pageSize;
}
else
{
pageTotal=this.count/this.pageSize+1;
}
return pageTotal;
}
//上一页
public int getPagePre()
{
int pagePre=this.pageNo-1;
if(pagePre<1)
{
pagePre=1;
}
return pagePre;
}
//下一页
public int getPageNext()
{
int pageNext=this.pageNo+1;
if(pageNext>this.getPageTotal())
{
pageNext=this.getPageTotal();
}
return pageNext;
}
//属性的封装(生成每个属性的get和set方法,我就不一一写了)
如:
public int getPageNo() {
return pageNo;
}
public void setPageNo(int pageNo) {
this.pageNo = pageNo;
}
}
4、Dao类中:
public class UserInfoDao {
static Connection conn=null;
static PreparedStatement pstmt=null;
static ResultSet rs=null;
/**
* 查询数据
* @param pageSize每页显示的条数
* @param pageNo当前页
* @return
*/
public PageModel selectStudentFenYe(int pageSize,int pageNo)
{
//创建分页模型对象
PageModel pm = new PageModel();
List list = new ArrayList();
try {
//打开连接
conn=DB.getConn();
//创建操作对象
String sql="select top "+pageSize+" * from UserInfo where id not in(select top (("+pageNo+"-1)*"+pageSize+") id from UserInfo)";
pstmt = conn.prepareStatement(sql);
//执行
rs=pstmt.executeQuery();
//循环遍历
while(rs.next())
{
UserInfo u = new UserInfo(rs.getInt(1),rs.getString(2),rs.getString(3),rs.getInt(4));
list.add(u);
}
//将查询出来的信息保存早分页模型中
pm.setCount(this.selectStudentcount());
pm.setList(list);
pm.setPageNo(pageNo);
pm.setPageSize(pageSize);
pm.setKeyWords(null);
} catch (Exception e) {
e.printStackTrace();
}finally{
//关闭连接
DB.close(rs, pstmt, conn);
}
return pm;
}
/**
* 查询总条数
* @return
*/
public int selectStudentcount()
{
String sql="select COUNT(*) from UserInfo";
return SelectCount.selectCount(sql);
}
}
5、Servlet中:
public class UserServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//处理中文乱码
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
//定义每页显示的条数和当前页
int pageSize = 3;
int pageNo = 1;
//接收每页显示的条数
String pageSizes = request.getParameter("pageSize");
if(pageSizes!=null && !"".equals(pageSizes))
{
pageSize = Integer.parseInt(pageSizes);
}
//接收当前页
String pageNos = request.getParameter("pageNo");
if(pageNos!=null && !"".equals(pageNos))
{
pageNo = Integer.parseInt(pageNos);
}
//创建dao类对象
UserInfoDao udao = new UserInfoDao();
//创建分页模型对象,并从dao类中取出模型值
PageModel pm = udao.selectStudentFenYe(pageSize, pageNo);
//将分页模型存放到request中
request.setAttribute("pm", pm);
//内部跳转到分页页面
request.getRequestDispatcher("paging.jsp").forward(request, response);
}
}
6、适用标签(在使用时一定要导入标签路径)
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="" prefix="taozi" %>
分页信息如下
编号 |
姓名 |
性别 |
年龄 |
---|
${u.id } |
${u.name } |
${u.sex } |
${u.age } |
阅读(1322) | 评论(0) | 转发(0) |