3.3.7、如果现在要有查询?
list_08.jsp:
<%@ page contentType="text/html;charset=GBK"%>
<%@ page import="java.sql.*"%>
<%--
查询出EMP表中的全部数据,使用假分页
--%>
<%!
public static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver" ;
public static final String DBURL = "jdbc:oracle:thin:@localhost:1521:MLDN" ;
public static final String DBUSER = "scott" ;
public static final String DBPASS = "tiger" ;
%>
<%!
public static final String URL = "list_08.jsp" ;
%>
<%
Connection conn = null ;
PreparedStatement pstmt = null ;
ResultSet rs = null ;
%>
<%
// 当前所在的页数
int currentPage = 1 ;
// 每页显示的记录数
int lineSize = 3 ;
// 总记录数
int allRecorders = 0 ;
// 总页数
int allPages = 0 ;
// 定义一个页数的选择范围
int pageScope[] = {3,5,10,15,20,25,30,50,100} ;
// 查询关键字
String keyWord = null ;
%>
<center>
<%
try{
currentPage = Integer.parseInt(request.getParameter("cp")) ;
}catch(Exception e){}
try{
lineSize = Integer.parseInt(request.getParameter("ls")) ;
}catch(Exception e){}
%>
<%
try{
%>
<%
// 关键字可有可无
keyWord = request.getParameter("kw") ;
if(keyWord==null){
keyWord = "" ;
}
Class.forName(DBDRIVER) ;
conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS) ;
String sql = "SELECT COUNT(empno) FROM emp WHERE empno LIKE ? OR ename LIKE ? OR job LIKE ? OR sal LIKE ? OR comm LIKE ? OR hiredate LIKE ?" ;
pstmt = conn.prepareStatement(sql) ;
pstmt.setString(1,"%"+keyWord+"%") ;
pstmt.setString(2,"%"+keyWord+"%") ;
pstmt.setString(3,"%"+keyWord+"%") ;
pstmt.setString(4,"%"+keyWord+"%") ;
pstmt.setString(5,"%"+keyWord+"%") ;
pstmt.setString(6,"%"+keyWord+"%") ;
rs = pstmt.executeQuery() ;
if(rs.next()){
allRecorders = rs.getInt(1) ;
}
%>
<%
// 总页数应该是计算出来的
allPages = (allRecorders + lineSize -1) / lineSize ;
%>
<script language="javaScript">
function go(temp){
document.spform.cp.value = temp ;
document.spform.ls.value = document.spform.sells.value ;
// 表单提交
document.spform.submit() ;
}
function goSel(){
document.spform.ls.value = document.spform.sells.value ;
go(document.spform.selcp.value) ;
}
function goSel2(){
document.spform.ls.value = document.spform.sells.value ;
go(1) ;
}
</script>
<form action="<%=URL%>" method="post" name="spform">
请输入查询关键字:<input type="text" name="kw" value="<%=keyWord%>">
<input type="submit" value="查询"><br>
<input type="button" value="首页" onClick="go(1)" <%=currentPage==1?"disabled":""%>>
<input type="button" value="上一页" onClick="go(<%=currentPage-1%>)" <%=currentPage==1?"disabled":""%>>
<input type="button" value="下一页" onClick="go(<%=currentPage+1%>)" <%=currentPage==allPages?"disabled":""%>>
<input type="button" value="尾页" onClick="go(<%=allPages%>)" <%=currentPage==allPages?"disabled":""%>>
跳到第
<SELECT name="selcp" onChange="goSel()">
<%
for(int x=1;x<=allPages;x++){
%>
<OPTION VALUE="<%=x%>" <%=currentPage==x?"SELECTED":""%>><%=x%></OPTION>
<%
}
%>
</SELECT>
页
每页显示
<SELECT name="sells" onChange="goSel2()">
<%
for(int x=0;x<pageScope.length;x++){
%>
<OPTION VALUE="<%=pageScope[x]%>" <%=lineSize==pageScope[x]?"SELECTED":""%>><%=pageScope[x]%></OPTION>
<%
}
%>
</SELECT>
条记录
<input type="hidden" name="cp" value="">
<input type="hidden" name="ls" value="">
</form>
<%
sql = "SELECT empno,ename,job,sal,comm,hiredate FROM emp WHERE empno LIKE ? OR ename LIKE ? OR job LIKE ? OR sal LIKE ? OR comm LIKE ? OR hiredate LIKE ?" ;
pstmt = conn.prepareStatement(sql) ;
pstmt = conn.prepareStatement(sql) ;
pstmt.setString(1,"%"+keyWord+"%") ;
pstmt.setString(2,"%"+keyWord+"%") ;
pstmt.setString(3,"%"+keyWord+"%") ;
pstmt.setString(4,"%"+keyWord+"%") ;
pstmt.setString(5,"%"+keyWord+"%") ;
pstmt.setString(6,"%"+keyWord+"%") ;
rs = pstmt.executeQuery() ;
// 之前应该先把不需要的数据空出去
for(int i=0;i<(currentPage-1)*lineSize;i++){
rs.next() ;
}
%>
<table border="1" width="80%">
<tr>
<td>雇员编号</td>
<td>雇员姓名</td>
<td>雇员工作</td>
<td>雇员工资</td>
<td>雇员佣金</td>
<td>雇佣日期</td>
</tr>
<%
for(int i=0;i<lineSize;i++){
if(rs.next()){
int empno = rs.getInt(1) ;
String ename = rs.getString(2) ;
String job = rs.getString(3) ;
float sal = rs.getFloat(4) ;
float comm = rs.getFloat(5) ;
java.util.Date date = rs.getDate(6) ;
%>
<tr>
<td><%=empno%></td>
<td><%=ename%></td>
<td><%=job%></td>
<td><%=sal%></td>
<td><%=comm%></td>
<td><%=date%></td>
</tr>
<%
}
}
%>
</table>
</center>
<%
}catch(Exception e){
// 向tomcat中进行打印
System.out.println(e) ;
}finally{
%>
<%
rs.close() ;
pstmt.close() ;
conn.close() ;
%>
<%
}
%>
以上已经完成了一个简单的假分页操作,也可以进行关键字查询了,但是如果按照此种做法,如果数据库的数据过多的时候,则肯定性能极其低效。
3.3、真分页
基于数据库的SQL语句完成。
之前讲解的全部分页程序是基于算法的分页,但是把所有的数据全部取到内存之中,这样明显性能很低,最好的做法是,从数据库中部分读取,只读取需要的信息,所以此时需要使用数据库中的伪字段——ROWNUM,表示记录的编号。
例如:观察以下的SQL语句:
SELECT empno,ename,job,sal,comm,hiredate,rownum FROM emp WHERE rownum<=5 ;
可以查询出前五条记录,如果要是查询出中间五条呢?
list_10.jsp:
<%@ page contentType="text/html;charset=GBK"%>
<%@ page import="java.sql.*"%>
<%--
查询出EMP表中的全部数据,使用假分页
--%>
<%!
public static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver" ;
public static final String DBURL = "jdbc:oracle:thin:@localhost:1521:MLDN" ;
public static final String DBUSER = "scott" ;
public static final String DBPASS = "tiger" ;
%>
<%!
public static final String URL = "list_10.jsp" ;
%>
<%
Connection conn = null ;
PreparedStatement pstmt = null ;
ResultSet rs = null ;
%>
<%
// 当前所在的页数
int currentPage = 1 ;
// 每页显示的记录数
int lineSize = 3 ;
// 总记录数
int allRecorders = 0 ;
// 总页数
int allPages = 0 ;
// 定义一个页数的选择范围
int pageScope[] = {3,5,10,15,20,25,30,50,100} ;
// 查询关键字
String keyWord = null ;
%>
<center>
<%
try{
currentPage = Integer.parseInt(request.getParameter("cp")) ;
}catch(Exception e){}
try{
lineSize = Integer.parseInt(request.getParameter("ls")) ;
}catch(Exception e){}
%>
<%
try{
%>
<%
// 关键字可有可无
keyWord = request.getParameter("kw") ;
if(keyWord==null){
keyWord = "" ;
}
Class.forName(DBDRIVER) ;
conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS) ;
String sql = "SELECT COUNT(empno) FROM emp WHERE empno LIKE ? OR ename LIKE ? OR job LIKE ? OR sal LIKE ? OR comm LIKE ? OR hiredate LIKE ?" ;
pstmt = conn.prepareStatement(sql) ;
pstmt.setString(1,"%"+keyWord+"%") ;
pstmt.setString(2,"%"+keyWord+"%") ;
pstmt.setString(3,"%"+keyWord+"%") ;
pstmt.setString(4,"%"+keyWord+"%") ;
pstmt.setString(5,"%"+keyWord+"%") ;
pstmt.setString(6,"%"+keyWord+"%") ;
rs = pstmt.executeQuery() ;
if(rs.next()){
allRecorders = rs.getInt(1) ;
}
%>
<%
// 总页数应该是计算出来的
if(allRecorders>0){
allPages = (allRecorders + lineSize -1) / lineSize ;
}else{
// 如果一条记录都没有,则默认allPages为1
allPages = 1 ;
}
%>
<script language="javaScript">
function go(temp){
document.spform.cp.value = temp ;
document.spform.ls.value = document.spform.sells.value ;
// 表单提交
document.spform.submit() ;
}
function goSel(){
document.spform.ls.value = document.spform.sells.value ;
go(document.spform.selcp.value) ;
}
function goSel2(){
document.spform.ls.value = document.spform.sells.value ;
go(1) ;
}
</script>
<form action="<%=URL%>" method="post" name="spform">
请输入查询关键字:<input type="text" name="kw" value="<%=keyWord%>">
<input type="submit" value="查询"><br>
<input type="button" value="首页" onClick="go(1)" <%=currentPage==1?"disabled":""%>>
<input type="button" value="上一页" onClick="go(<%=currentPage-1%>)" <%=currentPage==1?"disabled":""%>>
<input type="button" value="下一页" onClick="go(<%=currentPage+1%>)" <%=currentPage==allPages?"disabled":""%>>
<input type="button" value="尾页" onClick="go(<%=allPages%>)" <%=currentPage==allPages?"disabled":""%>>
跳到第
<SELECT name="selcp" onChange="goSel()">
<%
for(int x=1;x<=allPages;x++){
%>
<OPTION VALUE="<%=x%>" <%=currentPage==x?"SELECTED":""%>><%=x%></OPTION>
<%
}
%>
</SELECT>
页
每页显示
<SELECT name="sells" onChange="goSel2()">
<%
for(int x=0;x<pageScope.length;x++){
%>
<OPTION VALUE="<%=pageScope[x]%>" <%=lineSize==pageScope[x]?"SELECTED":""%>><%=pageScope[x]%></OPTION>
<%
}
%>
</SELECT>
条记录
<input type="hidden" name="cp" value="">
<input type="hidden" name="ls" value="">
</form>
<%
sql = "SELECT A.* FROM " +
"(SELECT empno,ename,job,sal,comm,hiredate,rownum rn FROM emp WHERE rownum<=" +currentPage*lineSize +
" AND (empno LIKE ? OR ename LIKE ? OR job LIKE ? OR sal LIKE ? OR comm LIKE ? OR hiredate LIKE ?)) A "+
" WHERE A.rn>"+(currentPage-1)*lineSize ;
pstmt = conn.prepareStatement(sql) ;
pstmt = conn.prepareStatement(sql) ;
pstmt.setString(1,"%"+keyWord+"%") ;
pstmt.setString(2,"%"+keyWord+"%") ;
pstmt.setString(3,"%"+keyWord+"%") ;
pstmt.setString(4,"%"+keyWord+"%") ;
pstmt.setString(5,"%"+keyWord+"%") ;
pstmt.setString(6,"%"+keyWord+"%") ;
rs = pstmt.executeQuery() ;
%>
<table border="1" width="80%">
<tr>
<td>雇员编号</td>
<td>雇员姓名</td>
<td>雇员工作</td>
<td>雇员工资</td>
<td>雇员佣金</td>
<td>雇佣日期</td>
</tr>
<%
int count = 0 ;
while(rs.next()){
count++ ;
int empno = rs.getInt(1) ;
String ename = rs.getString(2) ;
String job = rs.getString(3) ;
float sal = rs.getFloat(4) ;
float comm = rs.getFloat(5) ;
java.util.Date date = rs.getDate(6) ;
%>
<tr>
<td><%=empno%></td>
<td><%=ename%></td>
<td><%=job%></td>
<td><%=sal%></td>
<td><%=comm%></td>
<td><%=date%></td>
</tr>
<%
}
%>
<%
if(count==0){
// 没有数据,显示一条记录即可
%>
<tr>
<td colspan="6">没有任何记录!</td>
</tr>
<%
}
%>
</table>
</center>
<%
}catch(Exception e){
// 向tomcat中进行打印
System.out.println(e) ;
}finally{
%>
<%
rs.close() ;
pstmt.close() ;
conn.close() ;
%>
<%
}
%>
3.4、分页组件
大部分的页面基本上都会面临分页问题。那么这些分页代码肯定要到处进行COPY,明显不可能,仔细观察分页,由两部分组成:
• 具体的数据显示
• 分页的数据控制端
• 大部分的页面对于分页的控制端是一样的,所以此时可以将分页的控制端单独提取出来,形成一个单独的组件,但是此组件由必须依赖于数据的显示端传递数据过去。
<%@ page contentType="text/html;charset=GBK"%>
<%--
此页面只关心于分页的控制端组件,所以,所有的具体查询操作,本页面概不负责
--%>
<%--
<jsp:include page="splitpage.jsp">
<jsp:param name="currentPage" value="<%=currentPage%>"/>
<jsp:param name="lineSize" value="<%=lineSize%>"/>
<jsp:param name="allRecorders" value="<%=allRecorders%>"/>
<jsp:param name="keyWord" value="<%=keyWord%>"/>
<jsp:param name="isSearch" value="FALSE"/>
<jsp:param name="isChangeLineSize" value="FALSE"/>
<jsp:param name="URL" value="list_11.jsp"/>
</jsp:include>
--%>
<%
// 当前所在的页数
int currentPage = 1 ;
// 每页显示的记录数
int lineSize = 3 ;
// 总记录数
int allRecorders = 0 ;
// 总页数
int allPages = 0 ;
// 定义一个页数的选择范围
int pageScope[] = {3,5,10,15,20,25,30,50,100} ;
// 查询关键字
String keyWord = null ;
// 接收连接的地址
String URL = null ;
// 做一个查询标记
String isSearch = "FALSE" ;
// 做一个可以更改显示行数的标记
String isChangeLineSize = "FALSE" ;
%>
<%
// 接收一系列的控制参数
try{
// 接收当前页
currentPage = Integer.parseInt(request.getParameter("currentPage")) ;
}catch(Exception e){}
try{
// 每页显示的记录数
lineSize = Integer.parseInt(request.getParameter("lineSize")) ;
}catch(Exception e){}
try{
// 每页显示的记录数
allRecorders = Integer.parseInt(request.getParameter("allRecorders")) ;
}catch(Exception e){}
// 接收操作的地址
URL = request.getParameter("URL") ;
isSearch = request.getParameter("isSearch") ;
isChangeLineSize = request.getParameter("isChangeLineSize") ;
%>
<%
// 关键字可有可无,接收关键字
keyWord = request.getParameter("keyWord") ;
if(keyWord==null||"null".equals(keyWord)){
keyWord = "" ;
}
%>
<%
// 总页数应该是计算出来的
if(allRecorders>0){
allPages = (allRecorders + lineSize -1) / lineSize ;
}else{
// 如果一条记录都没有,则默认allPages为1
allPages = 1 ;
}
%>
<script language="javaScript">
function go(temp){
document.spform.cp.value = temp ;
<%
if("TRUE".equals(isChangeLineSize)){
%>
document.spform.ls.value = document.spform.sells.value ;
<%
}
%>
// 表单提交
document.spform.submit() ;
}
function goSel(){
<%
if("TRUE".equals(isChangeLineSize)){
%>
document.spform.ls.value = document.spform.sells.value ;
<%
}
%>
go(document.spform.selcp.value) ;
}
<%
if("TRUE".equals(isChangeLineSize)){
%>
function goSel2(){
document.spform.ls.value = document.spform.sells.value ;
go(1) ;
}
<%
}
%>
</script>
<form action="<%=URL%>" method="post" name="spform">
<%
if("TRUE".equals(isSearch)){
%>
请输入查询关键字:<input type="text" name="kw" value="<%=keyWord%>">
<input type="submit" value="查询"><br>
<%
}
%>
<input type="button" value="首页" onClick="go(1)" <%=currentPage==1?"disabled":""%>>
<input type="button" value="上一页" onClick="go(<%=currentPage-1%>)" <%=currentPage==1?"disabled":""%>>
<input type="button" value="下一页" onClick="go(<%=currentPage+1%>)" <%=currentPage==allPages?"disabled":""%>>
<input type="button" value="尾页" onClick="go(<%=allPages%>)" <%=currentPage==allPages?"disabled":""%>>
跳到第
<SELECT name="selcp" onChange="goSel()">
<%
for(int x=1;x<=allPages;x++){
%>
<OPTION VALUE="<%=x%>" <%=currentPage==x?"SELECTED":""%>><%=x%></OPTION>
<%
}
%>
</SELECT>
页
<%
if("TRUE".equals(isChangeLineSize)){
%>
每页显示
<SELECT name="sells" onChange="goSel2()">
<%
for(int x=0;x<pageScope.length;x++){
%>
<OPTION VALUE="<%=pageScope[x]%>" <%=lineSize==pageScope[x]?"SELECTED":""%>><%=pageScope[x]%></OPTION>
<%
}
%>
</SELECT>
条记录
<%
}
%>
<input type="hidden" name="cp" value="">
<input type="hidden" name="ls" value="">
</form>
4、总结
希望可以自己独立编写,但是似乎不太可能,把组件使用熟练即可。





