Java_自定义标签_分页标签


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>

(大多的代码就是上面的,有的很简单,我就没有写了,有什么问题我们可以一起讨论!微笑

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值