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("<tr align='center'><td colspan="+this.colspan+">第"+pm.getPageNo()+"/"+pm.getPageTotal()+"页 ");
out.print("<a href='"+href+pm.getPageNo()+"'>首页</a> <a href='"+href+pm.getPagePre()+"'>上一页</a> <a href='"+href+pm.getPageNext()+"'>下一页</a> <a href='"+href+pm.getPageTotal()+"'>尾页</a></td></tr>");
} 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文件夹中)
<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>1.2</jsp-version>
<short-name>pt</short-name>
<uri>http://taozi@pageTag.com</uri><!--标签路径-->
<tag>
<name>pageTag</name><!-- 标签 冒号后面的名称 -->
<tag-class>taozi.tag.PageTag</tag-class><!-- 包名.类名 -->
<body-content>jsp</body-content><!-- 是否需要打印标签体:(empty)不需要打印,(JSP)需要打印 -->
<!-- 定义属性 -->
<!-- 当前页 -->
<attribute>
<name>pageNo</name><!-- 属性名 -->
<required>true</required><!-- 是否是必须有的属性:(true)必须有,(false)可以不用有 -->
<rtexprvalue>true</rtexprvalue>
</attribute>
<!-- 每页显示的条数 -->
<attribute>
<name>pageSize</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<!-- 分页模型属性名-->
<attribute>
<name>name</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<!-- 路径-->
<attribute>
<name>url</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<!-- 要跨的行数-->
<attribute>
<name>colspan</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<!-- 模型是从什么作用域中取出来的 -->
<attribute>
<name>scope</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<!-- 实体对象-->
<attribute>
<name>value</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
3、通用的分页模型:
public class PageModel<T> {
/**
* 定义属性
*/
//定义当前页数
int pageNo=1;
//定义当前页数显示的条数
int pageSize=5;
//定义总条数
int count;
//定义显示的集合
List<T> 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<UserInfo> selectStudentFenYe(int pageSize,int pageNo)
{
//创建分页模型对象
PageModel<UserInfo> pm = new PageModel<UserInfo>();
List<UserInfo> list = new ArrayList<UserInfo>();
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<UserInfo> 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="http://taozi@pageTag.com" prefix="taozi" %>
<body>
<h1 align="center">分页信息如下</h1>
<table align="center" border="1" width="70%">
<tr>
<th>编号</th>
<th>姓名</th>
<th>性别</th>
<th>年龄</th>
</tr>
<!-- 使用分页标签 :pageSize(每页显示的条数);pageNo(当前页对象,用于分页);url(分页跳转的路径,一般为servlet的路径);name(在路径中分页模型存放的作用域的属性名);scope(作用域);value(实体对象名,便于用EL表达式打印数据);colspan(要跨的行数,用于分页哪一行与数据行统一) -->
<taozi:pageTag pageSize="3" pageNo="pageNo" url="UserServlet" name="pm" scope="request" value="u" colspan="4">
<tr>
<td>${u.id }</td>
<td>${u.name }</td>
<td>${u.sex }</td>
<td>${u.age }</td>
</tr>
</taozi:pageTag>
</table>
(大多的代码就是上面的,有的很简单,我就没有写了,有什么问题我们可以一起讨论!)