JAVA网页编程之JSP分页手艺完成
关于第二点:俺问问你,如果是企业级项目的话,诸如RMI,EJB,等一些关键技术,这些难道都不需要学么?如果光是使用jsp,servlet,javabean的话。js|分页JSP分页手艺完成今朝对照普遍利用的分页体例是将查询了局缓存在HttpSession或有形态bean中,翻页的时分从缓存中掏出一页数据显现。这类办法有两个次要的弱点:一是用户大概看到的是过时数据;二是假如数据量十分年夜时第一次查询遍历了局会议泯灭很长工夫,而且缓存的数据也会占用大批内存,效力分明下落。
别的罕见的办法另有每次翻页都查询一次数据库,从ResultSet中只掏出一页数据(利用rs.last();rs.getRow()取得总计录条数,利用rs.absolute()定位到本页肇端纪录)。这类体例差未几也是必要遍历一切纪录,实行证实在纪录数很年夜时速率十分慢。
至于缓存了局集ResultSet的办法则完整是一种毛病的做法。由于ResultSet在Statement或Connection封闭时也会被封闭,假如要使ResultSet无效必将长工夫占用数据库毗连。
因而对照好的分页做法应当是每次翻页的时分只从数据库里检索页面巨细的块区的数据。如许固然每次翻页都必要查询数据库,但查询出的纪录数很少,收集传输数据量不年夜,假如利用毗连池更能够略过最耗时的创建数据库毗连历程。而在数据库端有各类成熟的优化手艺用于进步查询速率,比在使用服务器层做缓存无效多了。
在oracle数据库中查询了局的行号利用伪列ROWNUM暗示(从1入手下手)。比方select*fromemployeewhererownum<10前往前10笔记录。但由于rownum是在查询以后排序之前赋值的,以是查询employee按birthday排序的第100到120笔记录应当这么写:
select*from(selectmy_table.*,rownumasmy_rownumfrom(selectname,birthdayfromemployeeorderbybirthday)my_tablewhererownum<120)wheremy_rownum>=100
mySQL可使用LIMIT子句:
selectname,birthdayfromemployeeorderbybirthdayLIMIT99,20
DB2有rownumber()函数用于猎取以后行数。
SQLServer没研讨过,能够参考这篇文章:http://www.csdn.net/develop/article/18/18627.shtm
在Web程序平分页会被频仍利用,但分页的完成细节倒是编程过程当中对照贫苦的事变。年夜多分页显现的查询操纵都同时必要处置庞大的多重查询前提,sql语句必要静态拼接构成,再加上分页必要的纪录定位、总纪录条数查询和查询了局的遍历、封装和显现,程序会变得很庞大而且难以了解。因而必要一些工具类简化分页代码,使程序员专注于营业逻辑部分。上面是我计划的两个工具类:
PagedStatement封装了数据库毗连、总纪录数查询、分页查询、了局数据封装和封闭数据库毗连等操纵,并利用了PreparedStatement撑持静态设置参数。
RowSetPage参考PetStore的pagebypageiterator形式,计划RowSetPage用于封装查询了局(利用OracleCachedRowSet缓存查询出的一页数据,关于利用CachedRowSet封装数据库查询了局请参考JSP页面查询显现经常使用形式)和以后页码、总纪录条数、以后纪录数等信息,而且能够天生复杂的HTML分页代码。
PagedStatement查询的了局封装成RowsetPage。
上面是复杂的利用示例:
//DAO查询数据部分代码:…publicRowSetPagegetEmployee(Stringgender,intpageNo)throwsException{Stringsql="selectemp_id,emp_code,user_name,real_namefromemployeewheregender=?";//利用Oracle数据库的分页查询完成,每页显现5条PagedStatementpst=newPagedStatementOracleImpl(sql,pageNo,5);pst.setString(1,gender);returnpst.executeQuery();}//Servlet处置查询哀求部分代码:…intpageNo;try{//能够经由过程参数pageno取得用户选择的页码pageNo=Integer.parseInt(request.getParameter("pageno"));}catch(Exceptionex){//默许为第一页pageNo=1;}Stringgender=request.getParameter("gender");request.setAttribute("empPage",myBean.getEmployee(gender,pageNo));…//JSP显现部分代码<%@pageimport="page.RowSetPage"%>…<scriptlanguage="javascript">functiondoQuery(){form1.actionType.value="doQuery";form1.submit();}</script>…<formname=form1method=get><inputtype=hiddenname=actionType>性别:<inputtype=textname=gendersize=1value="<%=request.getParameter("gender")%>"><inputtype=buttonvalue="查询"onclick="doQuery()"></form><%RowSetPageempPage=(RowSetPage)request.getAttribute("empPage");if(empPage==null)empPage=RowSetPage.EMPTY_PAGE;%>…<tablecellspacing="0"width="90%"><tr><td>ID</td><td>代码</td><td>用户名</td><td>姓名</td></tr><%javax.sql.RowSetempRS=(javax.sql.RowSet)empPage.getRowSet();if(empRS!=null)while(empRS.next()){%><tr><td><%=empRS.getString("EMP_ID")%></td><td><%=empRS.getString("EMP_CODE")%></td><td><%=empRS.getString("USER_NAME")%></td><td><%=empRS.getString("REAL_NAME")%></td></tr><%}//endwhile%><tr><%//显现总页数和以后页数(pageno)和分页代码。//此处doQuery为页面上提交查询举措的javascript函数名,pageno为标识以后页码的参数名%><tdcolspan=4><%=empPage.getHTML("doQuery","pageno")%></td></tr></table>
效果如图:
由于分页显现一样平常城市伴随查询前提和查询举措,页面应已有校验查询前提和提交查询的javascript办法(如下面的doQuery),以是RowSetPage.getHTML()天生的分页代码在用户选择新页码时间接回调后面的处置提交查询的javascript办法。注重在显现查询了局的时分前次的查询前提也必要坚持,如<inputtype=textname=gendersize=1value="<%=request.getParameter("gender")%>">。同时因为页码的参数名能够指定,因而也撑持在统一页面中有多个分页区。
另外一种分页代码完成是天生每页的URL,将查询参数和页码作为QueryString附在URL前面。这类办法的缺点是在查询前提对照庞大时难以处置,而且必要指定处置查询举措的servlet,大概不合适某些定制的查询操纵。
假如对RowSetPage.getHTML()天生的默许分页代码不中意能够编写本人的分页处置代码,RowSetPage供应了良多getter办法用于猎取相干信息(如以后页码、总页数、总纪录数和以后纪录数等)。
在实践使用中能够将分页查询和显现做成jsptaglib,进一步简化JSP代码,屏障JavaCode。
附:分页工具类的源代码,有正文,应当很简单了解。
1.Page.java
2.RowSetPage.java(RowSetPage承继Page)
3.PagedStatement.java
4.PagedStatementOracleImpl.java(PagedStatementOracleImpl承继PagedStatement)
您能够恣意利用这些源代码,但必需保存authorevan_zhao@hotmail.com字样
///////////////////////////////////////Page.java//author:evan_zhao@hotmail.com/////////////////////////////////////packagepage;importjava.util.List;importjava.util.ArrayList;importjava.util.Collection;importjava.util.Collections;/***Title:分页对象<br>*Description:用于包括数据及分页信息的对象<br>*Page类完成了用于显现分页信息的基础办法,但未指定所含数据的范例,*可依据必要完成以特定体例构造数据的子类,<br>*如RowSetPage以RowSet封装数据,ListPage以List封装数据<br>*Copyright:Copyright(c)2002<br>*@authorevan_zhao@hotmail.com<br>*@version1.0*/publicclassPageimplementsjava.io.Serializable{publicstaticfinalPageEMPTY_PAGE=newPage();publicstaticfinalintDEFAULT_PAGE_SIZE=20;publicstaticfinalintMAX_PAGE_SIZE=9999;privateintmyPageSize=DEFAULT_PAGE_SIZE;privateintstart;privateintavaCount,totalSize;privateObjectdata;privateintcurrentPageno;privateinttotalPageCount;/***默许机关办法,只机关空页*/protectedPage(){this.init(0,0,0,DEFAULT_PAGE_SIZE,newObject());}/***分页数据初始办法,由子类挪用*@paramstart本页数据在数据库中的肇端地位*@paramavaCount本页包括的数据条数*@paramtotalSize数据库中总纪录条数*@parampageSize本页容量*@paramdata本页包括的数据*/protectedvoidinit(intstart,intavaCount,inttotalSize,intpageSize,Objectdata){this.avaCount=avaCount;this.myPageSize=pageSize;this.start=start;this.totalSize=totalSize;this.data=data;//System.out.println("avaCount:"+avaCount);//System.out.println("totalSize:"+totalSize);if(avaCount>totalSize){//thrownewRuntimeException("纪录条数年夜于总条数?!");}this.currentPageno=(start-1)/pageSize+1;this.totalPageCount=(totalSize+pageSize-1)/pageSize;if(totalSize==0&&avaCount==0){this.currentPageno=1;this.totalPageCount=1;}//System.out.println("StartIndextoPageNo:"+start+"-"+currentPageno);}publicObjectgetData(){returnthis.data;}/***取本页数据容量(本页能包括的纪录数)*@return本页能包括的纪录数*/publicintgetPageSize(){returnthis.myPageSize;}/***是不是有下一页*@return是不是有下一页*/publicbooleanhasNextPage(){/*if(avaCount==0&&totalSize==0){returnfalse;}return(start+avaCount-1)<totalSize;*/return(this.getCurrentPageNo()<this.getTotalPageCount());}/***是不是有上一页*@return是不是有上一页*/publicbooleanhasPreviousPage(){/*returnstart>1;*/return(this.getCurrentPageNo()>1);}/***猎取以后页第一条数据在数据库中的地位*@return*/publicintgetStart(){returnstart;}/***猎取以后页最初一条数据在数据库中的地位*@return*/publicintgetEnd(){intend=this.getStart()+this.getSize()-1;if(end<0){end=0;}returnend;}/***猎取上一页第一条数据在数据库中的地位*@return纪录对应的rownum*/publicintgetStartOfPreviousPage(){returnMath.max(start-myPageSize,1);}/***猎取下一页第一条数据在数据库中的地位*@return纪录对应的rownum*/publicintgetStartOfNextPage(){returnstart+avaCount;}/***猎取任一页第一条数据在数据库中的地位,每页条数利用默许值*@parampageNo页号*@return纪录对应的rownum*/publicstaticintgetStartOfAnyPage(intpageNo){returngetStartOfAnyPage(pageNo,DEFAULT_PAGE_SIZE);}/***猎取任一页第一条数据在数据库中的地位*@parampageNo页号*@parampageSize每页包括的纪录数*@return纪录对应的rownum*/publicstaticintgetStartOfAnyPage(intpageNo,intpageSize){intstartIndex=(pageNo-1)*pageSize+1;if(startIndex<1)startIndex=1;//System.out.println("PageNotoStartIndex:"+pageNo+"-"+startIndex);returnstartIndex;}/***取本页包括的纪录数*@return本页包括的纪录数*/publicintgetSize(){returnavaCount;}/***取数据库中包括的总纪录数*@return数据库中包括的总纪录数*/publicintgetTotalSize(){returnthis.totalSize;}/***取以后页码*@return以后页码*/publicintgetCurrentPageNo(){returnthis.currentPageno;}/***取总页码*@return总页码*/publicintgetTotalPageCount(){returnthis.totalPageCount;}/****@paramqueryJSFunctionName完成分页的JS剧本名字,页码变化时会主动回调该办法*@parampageNoParamName页码参数称号*@return*/publicStringgetHTML(StringqueryJSFunctionName,StringpageNoParamName){if(getTotalPageCount()<1){return"<inputtype=hiddenname="+pageNoParamName+"value=1>";}if(queryJSFunctionName==null||queryJSFunctionName.trim().length()<1){queryJSFunctionName="gotoPage";}if(pageNoParamName==null||pageNoParamName.trim().length()<1){pageNoParamName="pageno";}StringgotoPage="_"+queryJSFunctionName;StringBufferhtml=newStringBuffer("
");html.append("<scriptlanguage="javascript1.2">
").append("function").append(gotoPage).append("(pageNo){
").append("varcurPage=1;
").append("try{curPage=document.all["").append(pageNoParamName).append(""].value;
").append("document.all["").append(pageNoParamName).append(""].value=pageNo;
").append("").append(queryJSFunctionName).append("(pageNo);
").append("returntrue;
").append("}catch(e){
")//.append("try{
")//.append("document.forms.submit();
")//.append("}catch(e){
").append("alert(还没有界说查询办法:function").append(queryJSFunctionName).append("());
").append("document.all["").append(pageNoParamName).append(""].value=curPage;
").append("returnfalse;
")//.append("}
").append("}
").append("}").append("</script>
").append("");html.append("<tableborder=0cellspacing=0cellpadding=0align=centerwidth=80%>
").append("<tr>
").append("<tdalign=left><br>
");html.append("共").append(getTotalPageCount()).append("页").append("[").append(getStart()).append("..").append(getEnd()).append("/").append(this.getTotalSize()).append("]
").append("</td>
").append("<tdalign=right>
");if(hasPreviousPage()){html.append("[<ahref=javascript:").append(gotoPage).append("(").append(getCurrentPageNo()-1).append(")>上一页</a>]
");}html.append("第").append("<selectname=").append(pageNoParamName).append(">下一页</a>]
");}html.append("</td></tr></table>
");returnhtml.toString();}}///////////////////////////////////////RowSetPage.java//author:evan_zhao@hotmail.com/////////////////////////////////////packagepage;importjavax.sql.RowSet;/***<p>Title:RowSetPage</p>*<p>Description:利用RowSet封装数据的分页对象</p>*<p>Copyright:Copyright(c)2003</p>*@authorevan_zhao@hotmail.com*@version1.0*/publicclassRowSetPageextendsPage{privatejavax.sql.RowSetrs;/***空页*/publicstaticfinalRowSetPageEMPTY_PAGE=newRowSetPage();/***默许机关办法,创立空页*/publicRowSetPage(){this(null,0,0);}/***机关分页对象*@paramcrs包括一页数据的OracleCachedRowSet*@paramstart该页数据在数据库中的肇端地位*@paramtotalSize数据库中包括的纪录总数*/publicRowSetPage(RowSetcrs,intstart,inttotalSize){this(crs,start,totalSize,Page.DEFAULT_PAGE_SIZE);}/***机关分页对象*@paramcrs包括一页数据的OracleCachedRowSet*@paramstart该页数据在数据库中的肇端地位*@paramtotalSize数据库中包括的纪录总数*@pageSize本页能包容的纪录数*/publicRowSetPage(RowSetcrs,intstart,inttotalSize,intpageSize){try{intavaCount=0;if(crs!=null){crs.beforeFirst();if(crs.next()){crs.last();avaCount=crs.getRow();}crs.beforeFirst();}rs=crs;super.init(start,avaCount,totalSize,pageSize,rs);}catch(java.sql.SQLExceptionsqle){thrownewRuntimeException(sqle.toString());}}/***取分页对象中的纪录数据*/publicjavax.sql.RowSetgetRowSet(){returnrs;}}///////////////////////////////////////PagedStatement.java//author:evan_zhao@hotmail.com/////////////////////////////////////packagepage;importfoo.DBUtil;importjava.math.BigDecimal;importjava.util.List;importjava.util.Iterator;importjava.util.Collections;importjava.sql.Connection;importjava.sql.SQLException;importjava.sql.ResultSet;importjava.sql.Statement;importjava.sql.PreparedStatement;importjava.sql.Timestamp;importjavax.sql.RowSet;/***<p>Title:分页查询</p>*<p>Description:依据查询语句和页码查询出当页数据</p>*<p>Copyright:Copyright(c)2002</p>*@authorevan_zhao@hotmail.com*@version1.0*/publicabstractclassPagedStatement{publicfinalstaticintMAX_PAGE_SIZE=Page.MAX_PAGE_SIZE;protectedStringcountSQL,querySQL;protectedintpageNo,pageSize,startIndex,totalCount;protectedjavax.sql.RowSetrowSet;protectedRowSetPagerowSetPage;privateListboundParams;/***机关一查询出一切数据的PageStatement*@paramsqlquerysql*/publicPagedStatement(Stringsql){this(sql,1,MAX_PAGE_SIZE);}/***机关一查询出当页数据的PageStatement*@paramsqlquerysql*@parampageNo页码*/publicPagedStatement(Stringsql,intpageNo){this(sql,pageNo,Page.DEFAULT_PAGE_SIZE);}/***机关一查询出当页数据的PageStatement,并指定每页显现纪录条数*@paramsqlquerysql*@parampageNo页码*@parampageSize每页容量*/publicPagedStatement(Stringsql,intpageNo,intpageSize){this.pageNo=pageNo;this.pageSize=pageSize;this.startIndex=Page.getStartOfAnyPage(pageNo,pageSize);this.boundParams=Collections.synchronizedList(newjava.util.LinkedList());this.countSQL="selectcount(*)from("+sql+")";this.querySQL=intiQuerySQL(sql,this.startIndex,pageSize);}/***天生查询一页数据的sql语句*@paramsql原查询语句*@startIndex入手下手纪录地位*@size必要猎取的纪录数*/protectedabstractStringintiQuerySQL(Stringsql,intstartIndex,intsize);/***利用给出的对象设置指定参数的值*@paramindex第一个参数为1,第二个为2,。。。*@paramobj包括参数值的对象*/publicvoidsetObject(intindex,Objectobj)throwsSQLException{BoundParambp=newBoundParam(index,obj);boundParams.remove(bp);boundParams.add(bp);}/***利用给出的对象设置指定参数的值*@paramindex第一个参数为1,第二个为2,。。。*@paramobj包括参数值的对象*@paramtargetSqlType参数的数据库范例*/publicvoidsetObject(intindex,Objectobj,inttargetSqlType)throwsSQLException{BoundParambp=newBoundParam(index,obj,targetSqlType);boundParams.remove(bp);boundParams.add(bp);}/***利用给出的对象设置指定参数的值*@paramindex第一个参数为1,第二个为2,。。。*@paramobj包括参数值的对象*@paramtargetSqlType参数的数据库范例(常量界说在java.sql.Types中)*@paramscale精度,小数点后的位数*(只对targetSqlType是Types.NUMBER或Types.DECIMAL无效,别的范例则疏忽)*/publicvoidsetObject(intindex,Objectobj,inttargetSqlType,intscale)throwsSQLException{BoundParambp=newBoundParam(index,obj,targetSqlType,scale);boundParams.remove(bp);boundParams.add(bp);}/***利用给出的字符串设置指定参数的值*@paramindex第一个参数为1,第二个为2,。。。*@paramstr包括参数值的字符串*/publicvoidsetString(intindex,Stringstr)throwsSQLException{BoundParambp=newBoundParam(index,str);boundParams.remove(bp);boundParams.add(bp);}/***利用给出的字符串设置指定参数的值*@paramindex第一个参数为1,第二个为2,。。。*@paramtimestamp包括参数值的工夫戳*/publicvoidsetTimestamp(intindex,Timestamptimestamp)throwsSQLException{BoundParambp=newBoundParam(index,timestamp);boundParams.remove(bp);boundParams.add(bp);}/***利用给出的整数设置指定参数的值*@paramindex第一个参数为1,第二个为2,。。。*@paramvalue包括参数值的整数*/publicvoidsetInt(intindex,intvalue)throwsSQLException{BoundParambp=newBoundParam(index,newInteger(value));boundParams.remove(bp);boundParams.add(bp);}/***利用给出的长整数设置指定参数的值*@paramindex第一个参数为1,第二个为2,。。。*@paramvalue包括参数值的长整数*/publicvoidsetLong(intindex,longvalue)throwsSQLException{BoundParambp=newBoundParam(index,newLong(value));boundParams.remove(bp);boundParams.add(bp);}/***利用给出的双精度浮点数设置指定参数的值*@paramindex第一个参数为1,第二个为2,。。。*@paramvalue包括参数值的双精度浮点数*/publicvoidsetDouble(intindex,doublevalue)throwsSQLException{BoundParambp=newBoundParam(index,newDouble(value));boundParams.remove(bp);boundParams.add(bp);}/***利用给出的BigDecimal设置指定参数的值*@paramindex第一个参数为1,第二个为2,。。。*@parambd包括参数值的BigDecimal*/publicvoidsetBigDecimal(intindex,BigDecimalbd)throwsSQLException{BoundParambp=newBoundParam(index,bd);boundParams.remove(bp);boundParams.add(bp);}privatevoidsetParams(PreparedStatementpst)throwsSQLException{if(pst==null||this.boundParams==null||this.boundParams.size()==0)return;BoundParamparam;for(Iteratoritr=this.boundParams.iterator();itr.hasNext();){param=(BoundParam)itr.next();if(param==null)continue;if(param.sqlType==java.sql.Types.OTHER){pst.setObject(param.index,param.value);}else{pst.setObject(param.index,param.value,param.sqlType,param.scale);}}}/***实行查询获得一页数据,实行停止后封闭数据库毗连*@returnRowSetPage*@throwsSQLException*/publicRowSetPageexecuteQuery()throwsSQLException{System.out.println("executeQueryUsingPreparedStatement");Connectionconn=DBUtil.getConnection();PreparedStatementpst=null;ResultSetrs=null;try{pst=conn.prepareStatement(this.countSQL);setParams(pst);rs=pst.executeQuery();if(rs.next()){totalCount=rs.getInt(1);}else{totalCount=0;}rs.close();pst.close();if(totalCount<1)returnRowSetPage.EMPTY_PAGE;pst=conn.prepareStatement(this.querySQL);System.out.println(querySQL);pst.setFetchSize(this.pageSize);setParams(pst);rs=pst.executeQuery();//rs.setFetchSize(pageSize);this.rowSet=populate(rs);rs.close();rs=null;pst.close();pst=null;this.rowSetPage=newRowSetPage(this.rowSet,startIndex,totalCount,pageSize);returnthis.rowSetPage;}catch(SQLExceptionsqle){//System.out.println("executeQuerySQLException");sqle.printStackTrace();throwsqle;}catch(Exceptione){e.printStackTrace();thrownewRuntimeException(e.toString());}finally{//System.out.println("executeQueryfinally");DBUtil.close(rs,pst,conn);}}/***将ResultSet数据添补进CachedRowSet*/protectedabstractRowSetpopulate(ResultSetrs)throwsSQLException;/***取封装成RowSet查询了局*@returnRowSet*/publicjavax.sql.RowSetgetRowSet(){returnthis.rowSet;}/***取封装成RowSetPage的查询了局*@returnRowSetPage*/publicRowSetPagegetRowSetPage(){returnthis.rowSetPage;}/***封闭数据库毗连*/publicvoidclose(){//由于数据库毗连在查询停止或产生非常时即封闭,此处不做任何事变//留待扩大。}privateclassBoundParam{intindex;Objectvalue;intsqlType;intscale;publicBoundParam(intindex,Objectvalue){this(index,value,java.sql.Types.OTHER);}publicBoundParam(intindex,Objectvalue,intsqlType){this(index,value,sqlType,0);}publicBoundParam(intindex,Objectvalue,intsqlType,intscale){this.index=index;this.value=value;this.sqlType=sqlType;this.scale=scale;}publicbooleanequals(Objectobj){if(obj!=null&&this.getClass().isInstance(obj)){BoundParambp=(BoundParam)obj;if(this.index==bp.index)returntrue;}returnfalse;}}}///////////////////////////////////////PagedStatementOracleImpl.java//author:evan_zhao@hotmail.com/////////////////////////////////////packagepage;importjava.sql.ResultSet;importjava.sql.SQLException;importjavax.sql.RowSet;importoracle.jdbc.rowset.OracleCachedRowSet;/***<p>Title:分页查询Oracle数据库完成</p>*<p>Copyright:Copyright(c)2002</p>*@authorevan_zhao@hotmail.com*@version1.0*/publicclassPagedStatementOracleImplextendsPagedStatement{/***机关一查询出一切数据的PageStatement*@paramsqlquerysql*/publicPagedStatementOracleImpl(Stringsql){super(sql);}/***机关一查询出当页数据的PageStatement*@paramsqlquerysql*@parampageNo页码*/publicPagedStatementOracleImpl(Stringsql,intpageNo){super(sql,pageNo);}/***机关一查询出当页数据的PageStatement,并指定每页显现纪录条数*@paramsqlquerysql*@parampageNo页码*@parampageSize每页容量*/publicPagedStatementOracleImpl(Stringsql,intpageNo,intpageSize){super(sql,pageNo,pageSize);}/***天生查询一页数据的sql语句*@paramsql原查询语句*@startIndex入手下手纪录地位*@size必要猎取的纪录数*/protectedStringintiQuerySQL(Stringsql,intstartIndex,intsize){StringBufferquerySQL=newStringBuffer();if(size!=super.MAX_PAGE_SIZE){querySQL.append("select*from(selectmy_table.*,rownumasmy_rownumfrom(").append(sql).append(")my_tablewhererownum<").append(startIndex+size).append(")wheremy_rownum>=").append(startIndex);}else{querySQL.append("select*from(selectmy_table.*,rownumasmy_rownumfrom(").append(sql).append(")my_table").append(")wheremy_rownum>=").append(startIndex);}returnquerySQL.toString();}/***将ResultSet数据添补进CachedRowSet*/protectedRowSetpopulate(ResultSetrs)throwsSQLException{OracleCachedRowSetocrs=newOracleCachedRowSet();ocrs.populate(rs);returnocrs;}}
JAVA学习必须明确这是一项投资,对于大多数的人来说,学习JAVA是为了就业,还有就是刚走向工作位置的朋友想尽快赶上工作的节奏。 还好,SUN提供了Javabean可以把你的JSP中的 Java代码封装起来,便于调用也便于重用。 关于设计模式的资料,还是向大家推荐banq的网站 http://www.jdon.com/,他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。 Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站 是一种使网页(Web Page)产生生动活泼画面的语言 所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。 Pet Store.(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要 错过了。 是一种突破用户端机器环境和CPU 设计模式是高级程序员真正掌握面向对象核心思想的必修课。设计模式并不是一种具体"技术",它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧 你现在最缺的是实际的工作经验,而不是书本上那些凭空想出来的程序。 J2SE开发桌面应用软件比起 VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。 设计模式是高级程序员真正掌握面向对象核心思想的必修课。设计模式并不是一种具体"技术",它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧 是一种使网页(Web Page)产生生动活泼画面的语言 是一种由美国SUN计算机公司(Sun Microsystems, Inc.)所研究而成的语言 Java自面世后就非常流行,发展迅速,对C++语言形成了有力冲击。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台 你可以去承接一些项目做了,一开始可能有些困难,可是你有技术积累,又考虑周全,接下项目来可以迅速作完,相信大家以后都会来找你的,所以Money就哗啦啦的。。。。。。 http://www.jdon.com/去下载,或到同济技术论坛的服务器ftp://nro.shtdu.edu.cn去下,安装上有什么问题,可以到论坛上去提问。 自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。 是一种为 Internet发展的计算机语言
页:
[1]