一、 javabean 是什么?
Bean的中文含义是“豆子”,顾名思义,JavaBean是指一段特殊的Java类,只有有默然构造方法,只有get,set的方法的java类的对象。
JavaBean 是一种JAVA语言写成的可重用组件。为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器。JavaBean 通过提供符合一致性设计模式的公共方法将内部域暴露成员属性。众所周知,属性名称符合这种模式,其他Java 类可以通过自身机制发现和操作这些JavaBean 属性。
JavaBean可分为两种:一种是有用户界面(UI,User Interface)的JavaBean;还有一种是没有用户界面,主要负责处理事务(如数据运算,操纵数据库)的JavaBean。JSP通常访问的是后一种JavaBean。
二、Javabean含义?
事实上有三层含义。首先,JavaBean是一种规范,一种在Java(包括JSP)中使用可重复使用的Java组件的技术规范。其次,JavaBean是一个Java的类,一般来说,这样的Java类将对应于一个独立的.java文件,在绝大多数情况下,这应该是一个public类型的类。最后,当JavaBean这样的一个Java类在我们的具体的Java程序中被实例之后,我们有时也会将这样的一个JavaBean的实例称之为JavaBean。
最初,JavaBean的目的是为了将可以重复使用的软件代码打包标准。特别是用于帮助厂家开发在综合开发环境(IDE)下使用的java软件部件。这些包括如Grid控件,用户可以将该部件拖放到开发环境中。从此,JavaBean就可以扩展为一个java web 应用的标准部件,并且JavaBean部件框架已经扩展为企业版的 Bean(EJB)。
三、javabean特性
易于维护、使用、编写。
可实现代码的重用性。
可移植性强,但仅限于Java工作平台。
便于传输,不限于本地还是网络。
可以以其他部件的模式进行工作。
对于有过其他语言编程经验的读者,可以将其看作类似微软的ActiveX的编程组件。但是区别在于JavaBean是跨平台的,而ActiveX组件则仅局限于Windows系统。总之,JavaBean比较适合于那些需要跨平台的、并具有可视化操作和定制特性的软件组件。
四、Javabean的应用原因
程序中往往有重复使用的段落,JavaBean就是为了能够重复使用而设计的程序段落,而且这些段落并不只服务于某一个程序,而且每个JavaBean都具有特定功能,当需要这个功能的时候就可以调用相应的JavaBean。从这个意义上来讲,JavaBean大大简化了程序的设计过程,也方便了其他程序的重复使用。
JavaBean传统应用于可视化领域,如AWT(窗口工具集)下的应用。而现在,JavaBean更多地应用于非可视化领域,同时,JavaBean在服务器端的应用也表现出强大的优势。非可视化的JavaBean可以很好地实现业务逻辑、控制逻辑和显示页面的分离,现在多用于后台处理,使得系统具有更好的健壮性和灵活性。JSP + JavaBean和JSP + JavaBean + Servlet成为当前开发Web应用的主流模式。
五、JSP中Javabean的实质
一个引入JavaBeans的语句,其结构应该是,在这当中,我们必须对三个方面的内容进行定义。首先是一个id,这将对应于一个类的实例,如果这个实例已经存在,将直接引用这个实例;如果这个实例尚未存在,将通过我们在class中的定义从这个class中进行示例。这也就是我们要定义的第二个内容。最后,我们还应该在scope中定义id这个实例存在的范围,事实上这定义了这个实例所绑定的区域及其有效范围。
在JSP中调用JavaBean有三个标准的标签,那就是<jsp:useBean>, <jsp:setProperty>,以及<jsp:getProperty>。
a、<jsp:useBean>标签 :可以定义一个具有一定生存范围以及一个唯一id的JavaBean的实例,这样JavaServer Pages通过id来识别JavaBean,也可以通过id.method类似的语句来操作JavaBean。 在执行过程中,<jsp:useBean>首先会尝试寻找已经存在的具有相同id和scope值的JavaBean实例,如果没有就会自动创建一个新的实例。其具体语法如下
<jsp:useBean id=“name” scope=“page|request|session|application” typeSpec> body
</jsp:useBean>
其中,typeSpec定义如下
typeSpec ::=class=“className”
| class=“className” type=“typeName”
| type=“typeName” class=“className”
| beanName=“beanName” type=“typeName”
| type=“typeName” beanName=“beanName”
| type=“typeName”
下面的表格是<jsp:useBean>标签中相关属性的含义:
id |
id属性是JavaBean对象的唯一标志,代表了一个JavaBean对象的实例。它具有特定的存在范围(page|request|session|application)。在JavaServer Pages中通过id来识别JavaBean。 |
Scope |
Scope属性代表了Javabean对象的生存时间,可以是page, request, session, 和 application中的一种。 |
Class |
代表了JavaBean对象的class名字,特别注意大小写要完全一致。 |
Type |
Type属性指定了脚本变量定义的类型,默认为脚本变量定义和class中的属性一致,一般我们都采用默认值 |
b、<jsp:setProperty>标签:它主要用于设置bean的属性值。JavaServer Pages中调用的语法如下: <jsp:setProperty name=“beanName” last_syntax />
其中,name属性代表了已经存在的并且具有一定生存范围(scope)的JavaBean实例。last_syntax代表的语法如下:
property=“*” |
property=“propertyName” |
property=“propertyName” param=“parameterName” |
property=“propertyName” value=“propertyValue”
下面是<jsp:setProperty>标签的基本属性以及含义 :
Name |
Name代表通过<jsp:useBean> 标签定义的JavaBean对象实例。 |
Property |
代表了你想设置值的属性property名字。如果使用property=”*”,程序就会反复的查找当前的ServletRequest所有参数,并且匹配JavaBean中相同名字的属性property,并通过JavaBean中属性的set方法赋值value给这个属性。如果value属性为空,则不会修改Javabean中的属性值。 |
Param |
Param属性代表了页面请求的参数名字,<jsp:setProperty>标签不能同时使用param和value。 |
Value |
Value属性代表了赋给Bean的属性property的具体值。 |
c、<jsp:getProperty>标签 :它可以得到JavaBean实例的属性值,并将他们转换为 java.lang.String, 最后放置在隐含的Out对象中. JavaBean的实例必须在<jsp:getProperty>前面定义. <jsp:getProperty>标签的语法如下:
<jsp:getProperty name=“name” property=“propertyName” />
下面是<jsp:getProperty>标签的基本属性以及含义
Name |
Name属性代表了想要获得属性值的Bean的实例,Bean实例必须在前面用<jsp:useBean>标签定义. |
Property |
Property属性代表了想要获得值的那个property的名字。 |
在程序设计的过程中,JavaBean不是独立的。为了能够更好地封装事务逻辑、数据库操作而便于实现业务逻辑和前台程序的分离,操作的过程往往是先开发需要的JavaBean,再在适当的时候进行调用。但一个完整有效的JavaBean必然会包含一个属性,伴随若干个get/set(只读/只写)函数的变量来设计和运行的。JavaBean作为一个特殊的类,具有自己独有的特性。应该注意以下4个方面。
1. 如果类的成员变量的名字是xxx,那么为了更改或获取成员变量的值,即更改或获取属性,在类中可以使用两个方法:
JavaBean--counter.java文件,counter.jsp文件, counter1.jsp文件其中,counter.java主要用来进行计数器的计数操作,counter.jsp和counter1.jsp文件主要用来显示网页的计数。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package count; 2 /** * Title: test * Description: counter Bean * @version 1.0 */ 3 public class counter { 4 //初始化JavaBean的成员变量 5 int count = 0; 6 // Class构造器 7 public counter() { } 8 // 属性Count的Get方法 9 public int getCount(){ 10 //计数操作,每一次请求都进行计数器加一 11 count++; 12 return this.count; 13 } 14 //属性Count的Set方法 15 public void setCount(int count) 16 { 17 this.count = count; 18 } 19 }
counter.jsp:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 3 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 4 <HTML> 5 <HEAD> 6 <TITLE>counter</TITLE> 7 </HEAD> 8 <BODY> 9 <H1> 10 JBuilder Generated JSP 11 </H1> 12 <!-- 初始化counter这个Bean,实例为bean0--> 13 <jsp:useBean id="bean0" scope="application" class="count.counter" /> 14 <% 15 //显示当前的属性count的值,也就是计数器的值,这里我们使用out.println方法,下面的counter1.jsp将使用另一种方法 16 out.println("The Counter is : " + bean0.getCount() + "<BR>"); 17 %> 18 </BODY> 19 </HTML>
counter1.jsp:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 3 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 4 <HTML> 5 <HEAD> 6 <TITLE>counter</TITLE> 7 </HEAD> 8 <BODY> 9 <H1> 10 JBuilder Generated JSP 11 </H1> 12 <!--初始化counter这个Bean,实例为bean0--> 13 <jsp:useBean id="bean0" scope="application" class="count.counter" /> 14 <!-- 使用jsp:getProperty 标签得到count属性的值,也就是计数器的值--> 15 The Counter is : 16 <jsp:getProperty name="bean0" property="count" /><BR> 17 </BODY> 18 </HTML>
首先在Jsp页面中要声明并初始化JavaBean,这个JavaBean有一个唯一的id标志,还有一个生存范围scope(设置为application是为了实现多个用户共享一个计数器的功能,如果要实现单个用户的计数功能,可以修改scope为session),最后还要制定JavaBean的class来源count.counter:
<jsp:useBean id="bean0" scope="application" class="count.counter" />
接着我们就可以使用JavaBean提供的public方法或者直接使用<jsp:getProperty>标签来得到JavaBean中属性的值: out.println("The Counter is : " + bean0.getCount() + "<BR>");
或者 <jsp:getProperty name="bean0" property="count" />
OK,现在运行一下程序看看,然后多刷新几次,注意看计数器的变化。
建立一个数据库demodb,其字段如下面所示:
username VARCHAR2(20) 用户名
password VARCHAR2(20) 密码
email VARCHAR2(30) Email地址
homepage VARCHAR2(50) 主页
signs VARCHAR2(200) 签名
regtime DATE 注册时间
接着建立几个JavaBeans和JavaServer Pages文件:
db.java文件(封装数据库连接及一些底层操作)
adduser.java文件(进行用户数据的读取以及添加操作)
newuser.jsp文件(用户新增页面,用于输入用户注册信息)
donewuser.jsp文件(进行用户注册信息添加)
listuser.jsp文件(所有的注册用户信息列表)
1.db.java文件:这个JavaBean封装数据库连接及一些底层操作,派生出的类可以直接调用这些方法,另外提供了一个toChinese方法,主要用来进行中文数据的处理。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 //声明类库文件 2 package lyf; 3 4 import oracle.jdbc.driver.*; 5 import java.net.*; 6 import java.sql.*; 7 import java.lang.*; 8 import java.io.*; 9 import java.util.*; 10 11 public class db { 12 // 成员变量初始化 13 Connection conn = null; // 数据库连接 14 ResultSet rs = null; // 记录集 15 String Username = ""; // 用户名 16 String Password = ""; // 密码 17 String Email = ""; // email 18 String Homepage = ""; // 主页 19 String Signs = ""; // 签名 20 21 // db的构建器 22 public db() { 23 try { 24 // 注册数据库驱动程序为Oracle驱动 25 Class.forName("oracle.jdbc.driver.OracleDriver"); 26 } catch (java.lang.ClassNotFoundException e) { 27 // 这样写是为了方便调试程序,出错打印mydb()就知道在什么地方出错了 28 System.err.println("mydb(): " + e.getMessage()); 29 } 30 } 31 32 // executeQuery方法用于进行记录的查询操作 33 // 入口参数为sql语句,返回ResultSet对象 34 35 public ResultSet executeQuery(String sql) { 36 rs = null; 37 try { 38 // 建立数据库连接,使用Oracle的一种thin连接方式,localhost为主机名字,demodb为数据库,后面的两个 39 // demo为用户名和密码 40 conn = DriverManager.getConnection( 41 "jdbc:oracle:thin:@localhost:1521:orcl", "SYS as SYSDBA", "admin"); 42 Statement stmt = conn.createStatement(); 43 // 执行数据库查询操作 44 rs = stmt.executeQuery(sql); 45 } catch (SQLException ex) { 46 System.err.println("db.executeQuery: " + ex.getMessage()); 47 //ex.printStackTrace(); 48 } 49 return rs; 50 } 51 52 // executeUpdate方法用于进行add或者update记录的操作 53 54 // 入口参数为sql语句,成功返回true,否则为false 55 public boolean executeUpdate(String sql) { 56 boolean bupdate = false; 57 rs = null; 58 try { 59 // 建立数据库连接,其它参数说明同上面的一样 60 conn = DriverManager.getConnection( 61 "jdbc:oracle:thin:@localhost:1521:orcl", "SYS as SYSDBA", "admin"); 62 Statement stmt = conn.createStatement(); 63 int rowCount = stmt.executeUpdate(sql); 64 // 如果不成功,bupdate就会返回0 65 if (rowCount != 0) 66 bupdate = true; 67 } catch (SQLException ex) { 68 // 打印出错信息 69 System.err.println("db.executeUpdate: " + ex.getMessage()); 70 //ex.printStackTrace(); 71 } 72 return bupdate; 73 } 74 75 // toChinese方法用于将一个字符串进行中文处理 76 // 否则将会是???这样的字符串 77 78 public static String toChinese(String strvalue) { 79 try { 80 if (strvalue == null) { 81 return null; 82 } else { 83 strvalue = new String(strvalue.getBytes("ISO8859_1"), "GBK"); 84 return strvalue; 85 } 86 } catch (Exception e) { 87 return null; 88 } 89 } 90 91 92 //testing 93 public static void main(String[] args){ 94 db a = new db(); 95 a.executeQuery(""); 96 } 97 98 }
2.adduser.java文件:主要进行用户数据的读取以及添加操作,从db派生出来,addNewUser方法用来进行用户数据的添加,checkUser()方法用来检查用户名是否重复,另外还有一些set/get方法用来对属性进行处理,dousernew.jsp文件将进行调用。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package lyf; 2 3 //导入java类库 4 import java.sql.*; 5 import java.lang.*; 6 import oracle.jdbc.driver.*; 7 8 //adduser由db派生出来,拥有db的成员变量和方法 9 public class adduser extends db { 10 // 构建器 11 public boolean addNewUser() { 12 boolean boadduser = false; 13 try { 14 // 进行用户注册的记录添加操作,生成sql语句 15 String sSql = new String( 16 "insert into demodb(regtime,username,password,email,homepage,signs)"); 17 sSql=sSql+ " values(SYSDATE,'"+Username+"','"+Password+"','"+Email+"','"+Homepage+"','"+Signs+"')"; 18 // 一种调试的方法,可以打印出sql语句,以便于查看错误 19 System.out.println(sSql); 20 // 调用父类的executeUpdate方法,并根据成功以否来设置返回值 21 if (super.executeUpdate(sSql)) 22 boadduser = true; 23 } catch (Exception ex) { 24 // 出错处理 25 System.err.println("adduser.addNewUser: " + ex.getMessage()); 26 } finally { 27 // 无论是否出错,都要返回值 28 return boadduser; 29 } 30 } 31 32 public String showParamer(){ 33 return this.Username+this.Password + this.Homepage; 34 } 35 36 // checkUser()方法用来检查用户名是否重复 37 // 如果重复返回一个false 38 public boolean checkUser() { 39 boolean boadduser = false; 40 try { 41 // 构建sql查询语句 42 String sSql = "select * from demodb where username='" + Username 43 + "'"; 44 // 调用父类的executeQuery方法 45 if ((super.executeQuery(sSql)).next()) { 46 // 查询出来的记录集为空 47 boadduser = false; 48 } else { 49 boadduser = true; 50 } 51 } catch (Exception ex) { 52 // 出错处理 53 System.err.println("adduser.addNewUser: " + ex.getMessage()); 54 } finally { 55 // 返回值 56 return boadduser; 57 } 58 } 59 60 // 属性的set/get方法,同请求的参数一致 61 // 属性用户名Username的get/set方法 62 public String getUsername() { 63 return Username; 64 } 65 66 public void setUsername(String newUsername) { 67 // 用户名有可能是中文,需要进行转换 68 Username = db.toChinese(newUsername); 69 } 70 71 // 属性密码Password的get/set方法 72 public String getPassword() { 73 return Password; 74 } 75 76 public void setPassword(String newPassword) { 77 Password = newPassword; 78 } 79 80 // 属性Email的get/set方法 81 public String getEmail() { 82 return Email; 83 } 84 85 public void setEmail(String newEmail) { 86 Email = newEmail; 87 } 88 89 // 属性主页Homepage的get/set方法 90 public String getHomepage() { 91 return Homepage; 92 } 93 94 public void setHomepage(String newHomepage) { 95 Homepage = newHomepage; 96 } 97 98 // 属性主页Signs的get/set方法 99 public String getSigns() { 100 return Signs; 101 } 102 103 public void setSigns(String newSigns) { 104 // 签名有可能是中文,需要进行转换 105 Signs = db.toChinese(newSigns); 106 } 107 108 }
3.newuser.jsp文件:用户注册页面,有用户名、密码、主页、Email、个人签名等信息,主要用于提供用户输入注册信息,提交Action后的处理页面为donewuse.jsp文件,所有参数将会传递到donewuser.jsp文件进行处理。文件开头< %@ page contentType="text/html;charset=gb2312"%>语句表明这个页面使用gb2312中文字符集,如果不声明的的话在中文显示上就出现乱码。< % response.setHeader("Expires","0"); %>语句是为了让页面能够自动刷新,这句话不要也没有太大影响。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 <%@ page contentType="text/html;charset=gb2312"%> 2 <% //response.setHeader("Expires","0"); %> 3 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> 7 8 <title>新用户注册</title> 9 </head> 10 11 <body bgcolor="#FFFAD9"> 12 <p align="center"><font color="#8484FF"><span ><strong><big>新个人用户注册</big></strong></span></font></p> 13 <form method="POST" action="donewuser.jsp"> 14 <div align="center"> 15 <center> 16 <table border="1" width="50%" borderColorDark="#FFFFFF" 17 borderColorLight="#000000" cellspacing="0"> 18 <tr> 19 <td width="27%" bgcolor="#DDDDFF" align="center"> 20 <span>用户名: 21 <td width="73%" bgcolor="#DDDDFF"> 22 <span><input type="text" name="username" size="20" 23 tabindex="2"><font color="#FF0000"><b>* 24 </tr> 25 <tr> 26 <td width="27%" bgcolor="#DDDDFF" align="center"> 27 输入密码: 28 <td width="73%" bgcolor="#DDDDFF"> 29 <input type="password" size="20" tabindex="2"> 30 <font color="#FF0000"><b>* 31 </tr> 32 33 <tr> 34 <td width="27%" bgcolor="#DDDDFF" align="center"> 35 校验密码: 36 <td width="73%" bgcolor="#DDDDFF"> 37 <input type="password" size="20" tabindex="3"> 38 <font color="#FF0000"><b>*</b> 39 </font> 40 </tr> 41 42 <tr> 43 <td width="27%" bgcolor="#DDDDFF" align="center"> 44 E-mail 45 <td width="73%" bgcolor="#DDDDFF"> 46 <input type="text" size="20" tabindex="4"> 47 <font color="#FF0000">*</font> 48 </tr> 49 50 <tr> 51 <td width="27%" bgcolor="#DDDDFF" align="center"> 52 主页地址: 53 <td width="73%" bgcolor="#DDDDFF"> 54 <input type="text" size="20" tabindex="6" value="http://"> 55 </tr> 56 <tr> 57 <td width="100%" bgcolor="#DDDDFF" colspan="2"> 58 <BR> 59 <center> 60 <span><Font color="red"><B>介绍自己:</B> <span>(介绍自己,不能超过120字)</span> 61 </Font> 62 </span> 63 </center> 64 </tr> 65 <tr> 66 <td width="100%" bgcolor="#DDDDFF" colspan="2"> 67 <textarea rows="6" name="signs" cols="66" tabindex="9"> 68 </textarea> 69 </tr> 70 <tr> 71 <td width="30%" bgcolor="#DDDDFF" colspan="2"> 72 <center> 73 <p> 74 <input type="submit" value="递交" onclick="checkmsg();" 75 tabindex="10"> 76 </p> 77 <input type="reset" value="清除" tabindex="11"> 78 </center> 79 </tr> 80 </table> 81 </center> 82 </div> 83 </form> 84 85 </body> 86 </html>
4.donewuser.jsp文件:用户注册操作页面,并根据用户注册成功否显示相应的反馈信息,这个页面主要的特点就是使用了
lyf.adduser这个JavaBean的addNewUser()方法来进行记录的添加。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 <%@ page contentType="text/html;charset=gb2312"%> 2 <% 3 response.setHeader("Expires", "0"); 4 %> 5 <!--生成一个JavaBean:lyf.adduser的实例,id为adduser,生存范围为page--> 6 <jsp:useBean id="adduser" class="lyf.adduser" scope="page" /> 7 <!--设置JavaBean中各个属性的值,这会调用JavaBean中各个属性的set方法,以便JavaBean得到正确的属性值,”*”代表进行所有属性的匹配--> 8 <jsp:setProperty name="adduser" property="*" /> 9 <html> 10 <head> 11 <meta http-equiv="Content-Language" content="zh-cn"> 12 <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> 13 <meta name="GENERATOR" content="Microsoft FrontPage 3.0"> 14 <meta name="ProgId" content="FrontPage.Editor.Document"> 15 <title>用户添加</title> 16 </head> 17 <body bgcolor="#FFEBBD"> 18 <div align="center"> 19 <center> 20 <% 21 out.println(adduser.showParamer()+"<br/>"); 22 23 //调用lyf.adduser的checkUser()方法检查是否有重复的用户名 24 //如果有重复就显示对应的信息 25 if (!adduser.checkUser()) {//页面文字输出信息,使用jsp内置对象out的println方法,相当于asp中的response.write方法 26 out.println("对不起,这个用户名" + adduser.getUsername() 27 + "已经被申请了,请重新选择!"); 28 //return代表返回,运行时候碰到return就不会进行下面的处理了,功能相当于asp中的response.end 29 return; 30 } 31 %> 32 <% 33 //如果没有用户名重复的问题,调用lyf.adduser的addNewUser()方法来将用户数据添加到数据库中,并根据数据添加成功否来显示对应的信息 34 if (adduser.addNewUser()) { 35 %> 36 37 <H2> 38 添加用户成功! 39 </H2> 40 </P> 41 <% 42 } else { 43 %> 44 <H2> 45 添加用户失败,请和管理员联系! 46 </H2> 47 </P> 48 <% 49 } 50 %> 51 </center></BODY> 52 </HTML>
5.listuser.jsp文件:用户信息列表页面,用于显示注册的所有用户信息,对数据进行了分页显示。为了方便大家使用,采用了通用的分页代码,如果是JDBC2.0以上或者其他支持TYPE_SCROLL_INSENSITIVE游标的数据库驱动程序,可以有更简洁的分页方法。这个页面中导入java.sql.ResultSet的这个类库,因为Jsp页面中间要声明ResultSet;oracle.jdbc.driver.*类库是Oracle专用的Jdbc驱动程序,让Jsp页面可以用来进行Oracle的数据库操作。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 <%@ page contentType="text/html;charset=gb2312"%> 2 <% response.setHeader("Expires","0"); %> 3 <%@ page import="java.sql.ResultSet"%> 4 <%@ page import="oracle.jdbc.driver.*"%> 5 <!--生成一个JavaBean:lyf.db的实例--> 6 7 <jsp:useBean id="db" class="lyf.db" scope="request" /> 8 <jsp:setProperty name="db" property="*" /> 9 10 <% java.lang.String strSQL; //SQL语句 11 int intPageSize; //一页显示的记录数 12 int intRowCount; //记录总数 13 int intPageCount; //总页数 14 int intPage; //待显示页码 15 java.lang.String strPage; 16 int i,j,k; 17 intPageSize = 15; //设置一页显示的记录数 18 strPage = request.getParameter("page"); //取得待显示页码 19 if(strPage==null){//表明在QueryString中没有page这一个参数,此时显示第一页数据 20 intPage = 1; 21 } 22 else{ 23 24 intPage = java.lang.Integer.parseInt(strPage); //将字符串转换成整型 25 if(intPage<1) 26 intPage = 1; 27 } //获取记录总数 28 29 strSQL = "select count(*) from demodb"; 30 ResultSet result = db.executeQuery(strSQL); //执行SQL语句并取得结果集 31 result.next(); //记录集刚打开的时候,指针位于第一条记录之前 32 intRowCount = result.getInt(1); 33 result.close(); //关闭结果集 34 35 //记算总页数 36 intPageCount = (intRowCount+intPageSize-1) / intPageSize; //调整待显示的页码 37 if(intPage>intPageCount) 38 intPage = intPageCount; 39 40 strSQL="select * from demodb";//执行SQL语句并取得结果集 41 result = db.executeQuery(strSQL); //将记录指针定位到待显示页的第一条记录上 42 i = (intPage-1) * intPageSize; 43 for(j=0;j<i;j++) 44 result.next(); %> 45 <html> 46 <head> 47 <meta http-equiv="Content-Language" content="zh-cn"> 48 <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> 49 <meta name="GENERATOR" content="Microsoft FrontPage 3.0"> 50 <meta name="ProgId" content="FrontPage.Editor.Document"> 51 <title>用户列表</title> 52 </head> 53 <body bgcolor="#FFEBBD"> 54 <div align="center"> 55 <center> 56 <table border="1" borderColorDark="#FFFFFF" 57 borderColorLight="#000000" cellspacing="0" height="22" width="100%"> 58 <tr bgcolor="#FFEBAD"> 59 <td height="1" width="691" class="main"> 60 第<%=intPage%>页 共<%=intPageCount%>页 61 <a href="listuser.jsp?page=0">首页</a> 62 <%if(intPage>1){%><a href="listuser.jsp?page=<%=intPage-1%>">上一页</a> 63 <%}%> 64 <%if(intPage<=1){%>上一页<%}%> 65 <%if(intPage<intPageCount){%><a 66 href="listuser.jsp?page=<%=intPage+1%>">下一页</a> 67 <%}%> 68 <%if(intPage>=intPageCount){%>下一页<%}%> 69 <a href="listuser.jsp?page=<%=intPageCount%>">尾页</a> 第 70 <input type="text" class="main" name="page" size="3" 71 value="<%=intPage%>" tabindex="1"> 72 页 73 <input type="submit" class="main" value="go" name="B1" 74 tabindex="2"> 75 <class="main"> 76 </td> 77 </tr> 78 </table> 79 </form> 80 <table border="1" width="100%" cellspacing="0" 81 bordercolorlight="#000000" bordercolordark="#FFFFFF" class="main"> 82 <tr bgcolor="#FFEBAD"> 83 <td> 84 <div align="left"> 85 用户名 86 </div> 87 </td> 88 <td> 89 <p align="center"> 90 Email 91 </td> 92 <td> 93 <p align="center"> 94 主页 95 </td> 96 <td> 97 <p align="center"> 98 登记时间 99 </td> 100 <td> 101 <p align="center"> 102 说明 103 </td> 104 </tr> 105 <% //显示数据 106 i = 0; 107 while(i< intPageSize && result.next()){ 108 %> 109 <tr bgcolor="#FFEBAD"> 110 <td> 111 <div align="left"><%=result.getString("username") %></div> 112 </td> 113 <td> 114 <div align="center"><%=result.getString("email") %></a> 115 </div> 116 </td> 117 <td> 118 <div align="center"> 119 <font color="#0000CC"><%=result.getString("homepage") %></font> 120 </div> 121 </td> 122 <td> 123 <div align="center"> 124 <font color="#FF6666"><%=result.getDate("regtime") %></font> 125 </div> 126 </td> 127 <td> 128 <div align="center"> 129 <font color="#0000FF"><%=result.getString("signs") %></font> 130 </div> 131 </td> 132 </tr> 133 <% 134 i++; 135 } 136 %> 137 </table> 138 <% 139 result.close(); //关闭结果集 140 %> 141 142 </body> 143 </html>