/** 有关该方法的简介
* PageModel 类,分页的一个实体类
* StudentInfo 类,该方法中已studentinfo表作为操作表,该类为表的字段属性
* UtilDB 类,数据库的连接与关闭
* StudentDao 类,表的查询类(分页查询)
* tag类,要继承TagSupport,继承后该类下有三个常用的方法(doStartTag,doAfterBody,doEndTag)
* tld类,相当于一个配置文件
*
*/
//PageModel 类
import java.util.List;
public class PageModel<T> {
// 定义当前页
private int pageNo;
// 每页显示的记录数
private int pageSize;
// 总记录数
private int count;
// 数据集合
private List<T> all;
public List<T> getAll() {
return all;
}
public void setAll(List<T> all) {
this.all = all;
}
/**
* 首页
*
* @return
*/
public int getIndex() {
return 1;
}
/**
* 尾页
*
* @return
*/
public int getLastPage() {
if (this.getCount() % this.getPageSize() == 0) {
return this.getCount() / this.getPageSize();
} else {
return this.getCount() / this.getPageSize() + 1;
}
}
/**
* 上一页
*
* @return
*/
public int getPagePerv() {
if (this.getPageNo() - 1 < 1) {
return 1;
} else {
return this.getPageNo() - 1;
}
}
/**
* 下一页
*
* @return
*/
public int getPageNext() {
if (this.getPageNo() + 1 > this.getLastPage()) {
return this.getLastPage();
} else {
return this.getPageNo() + 1;
}
}
/**
* 各属性的 get/set 方法
*
* @return
*/
public int getPageNo() {
return pageNo;
}
public void setPageNo(int pageNo) {
this.pageNo = pageNo;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
}
//StudentInfo 类
public class StudentInfo {
private int stuNo;
private String name;
private String sex;
private int age;
public int getStuNo() {
return stuNo;
}
public void setStuNo(int stuNo) {
this.stuNo = stuNo;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public StudentInfo(int stuNo, String name, String sex, int age) {
super();
this.stuNo = stuNo;
this.name = name;
this.sex = sex;
this.age = age;
}
}
//UtilDB 类
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class UtilDB {
/**
* 得到数据库操作对象
*/
private static Connection con=null;
/**
* 链接数据库
* @return
*/
public static Connection getCon(){
try {
//加载驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
//该连接方式为oracle的连接方式
con=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "scott", "tiger");
} catch (Exception e) {
e.printStackTrace();
}
return con;
}
/**
* 关闭数据库
* @param pst
* @param rs
* @param con
* @throws SQLException
*/
public static void closeDB(PreparedStatement pst,ResultSet rs,Connection con) throws SQLException{
if(pst!=null){
pst.close();
}
if(rs!=null){
rs.close();
}
if(con!=null){
con.close();
}
}
}
//StudentDao 类
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import util.UtilDB;
import entity.PageModel;
import entity.StudentInfo;
public class StudentDao {
/**
* 得到数据库操作对象
*/
private static PreparedStatement pst=null;
private static ResultSet rs=null;
private static Connection con=null;
public PageModel<StudentInfo> selectAll(int pageNo,int pageSize){
//创建 pagemodel 对象
PageModel<StudentInfo> pm=new PageModel<StudentInfo>();
//创建集合,用于封装 student 信息
List<StudentInfo> slist=new ArrayList<StudentInfo>();
try {
//链接数据库
con=UtilDB.getCon();
pst=con.prepareStatement("select * from (select rownum r ,s.* from studentinfo s) where r between ("+pageNo+"-1)*10+1 and "+pageNo+"*"+pageSize+"");
//执行 sql 语句
rs=pst.executeQuery();
while(rs.next()){
//下标从 2 开始,因为 下标为 1 的是 rownum,如果从1开始会报错
StudentInfo s=new StudentInfo(rs.getInt(2), rs.getString(3), rs.getString(4), rs.getInt(5));
slist.add(s);
}
//为 pagemodel 类设置值
pm.setAll(slist);
pm.setPageNo(pageNo);
pm.setPageSize(pageSize);
pm.setCount(this.count());
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
//关闭数据库
UtilDB.closeDB(pst, rs, con);
} catch (Exception e) {
e.printStackTrace();
}
}
return pm;
}
/**
* 得到总共有多少条数据
* @return
*/
public int count(){
int count=0;
try {
//链接数据库
con=UtilDB.getCon();
pst=con.prepareStatement("select count(*) from studentinfo");
//执行sql
rs=pst.executeQuery();
if(rs.next()){
count=rs.getInt(1);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
//关闭数据库
UtilDB.closeDB(pst, rs, con);
} catch (SQLException e) {
e.printStackTrace();
}
}
return count;
}
}
//创建一个tag类(PageModelTag )
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;
import entity.PageModel;
public class PageModelTag extends TagSupport {
//标签各属性
private String scope;
private String name;
private String var;
private String url;
private String colspan;
//定义分页对象
PageModel<?> pm=null;
//迭代器
Iterator iter=null;
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);
}
// 将 obj 转化成 pm
pm=(PageModel<?>) obj;
List all=pm.getAll();
iter=all.iterator();
if(iter.hasNext()){
pageContext.setAttribute(var, iter.next());
//执行doAfterBody()方法
return EVAL_BODY_INCLUDE;
}else{
return super.doStartTag();
}
}
public int doAfterBody() throws JspException {
if(iter.hasNext()){
pageContext.setAttribute(var, iter.next());
//再一次执行doStartTag(),doStartTag与doAfterBody这样就相当于一个循环
return EVAL_BODY_AGAIN;
}else{
return super.doAfterBody();
}
}
public int doEndTag() throws JspException {
//创建输出流对象
JspWriter out=pageContext.getOut();
String href=url+"?pageNo=";
try {
out.print("<tr align='center'>");
out.print("<td colspan="+colspan+">");
out.print("共"+pm.getCount()+"条记录,当前 "+pm.getPageNo()+" / "+pm.getLastPage()+" ");
out.print("<a href="http://zxs71717.blog.163.com/blog/+href+1+">首页</a>");
out.print("<a href="http://zxs71717.blog.163.com/blog/+href+pm.getPagePerv()+">上一页</a>");
out.print("<a href="http://zxs71717.blog.163.com/blog/+href+pm.getPageNext()+">下一页</a>");
out.print("<a href="http://zxs71717.blog.163.com/blog/+href+pm.getLastPage()+">尾页</a>");
out.print("</td>");
out.print("</tr>");
} catch (IOException e) {
e.printStackTrace();
}
return super.doEndTag();
}
public String getScope() {
return scope;
}
public void setScope(String scope) {
this.scope = scope;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getVar() {
return var;
}
public void setVar(String var) {
this.var = var;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getColspan() {
return colspan;
}
public void setColspan(String colspan) {
this.colspan = colspan;
}
//创建一个tld
<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>1.2</jsp-version>
<short-name>fenye</short-name>
<uri>www.fenyeo2</uri>
<tag>
//下面的红色代码很重要
<name>fenye</name>
<tag-class>tag.PageModelTag</tag-class>
//设置标签中的属性,各属性的name要与tag类中的属性对应,如果不对应,在映射的时候会出现问题
<attribute>
<name>scope</name>
//设置该属性是否是该标签的必须属性以及在该标签中是否可以使用EL表达式
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>name</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>var</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>
</tag>
//创建一个index.jsp页面,通过超链接跳转的下面的servlet
public class StudentServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//此处最好用一下 doPost 方法,表单的默认提交方式为get
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//创建StudentDao类的一个对象
StudentDao dao=new StudentDao();
//当前页
int pageNo=1;
//每页显示的条数
int pageSize=10;
//获取页面传过来的当前的页码
String pageNos=request.getParameter("pageNo");
//判断pageNos,并设置pageNo
if(pageNos!=null && !"".equals(pageNos)){
pageNo=Integer.parseInt(pageNos);
}
//调用分页查询的方法
PageModel<StudentInfo> pm=dao.selectAll(pageNo, pageSize);
//把分页查询出来的数据保存的request
request.setAttribute("pm", pm);
//跳转
request.getRequestDispatcher("../list.jsp").forward(request, response);
}
}
//list.jsp页面的主要代码
//要想使用自定义标签,必须有如下的一个步骤,uri为该标签的tld文件中的uri,prefix的值可以自定义
<%@ taglib uri="www.fenyeo2" prefix="my" %>
<table border="1" cellpadding="0" cellspacing="0" align="center" width="60%" height="50%">
<tr align="center">
<td>学号</td>
<td>姓名</td>
<td>性别</td>
<td>年龄</td>
</tr>
//my 是prefix的值,fenye是tld中的name
<my:fenye url="servlet/StudentServlet" var="s" name="pm" scope="request" colspan="4">
//使用的EL表达式(${ }),也可以用java代码(< % = % >)
<tr align="center">
<td>${s.stuNo }</td>
<td>${s.name }</td>
<td>${s.sex }</td>
<td>${s.age }</td>
</tr>
</my:fenye>
</table>
java中自定义分页标签
最新推荐文章于 2023-07-18 09:40:08 发布