|
引子: 我們以兩個(gè)大型網(wǎng)站為例作比較: 51job和智聯(lián)招聘(先聲明我不是為他們作廣告,僅以他們?yōu)槔骷夹g(shù)上的比較) 51job采用的是比較“先進(jìn)”的php技術(shù),而智聯(lián)用的是比較落后的asp.但我們可能會(huì)明顯的感覺(jué)到51job的反應(yīng)速度相比智聯(lián)招聘實(shí)在是太慢了,為什么會(huì)這樣?細(xì)心的人可能會(huì)察覺(jué)到了。智聯(lián)雖然用的是asp,但他采用了另一種更巧妙的技術(shù)--asp生成靜態(tài)頁(yè)技術(shù)。所有的動(dòng)態(tài)頁(yè)基本上都轉(zhuǎn)換成了html靜態(tài)頁(yè),不用訪問(wèn)數(shù)據(jù)庫(kù),當(dāng)然反應(yīng)快了。 下面我們討論一下jsp怎么轉(zhuǎn)換成html?? 首先要做一個(gè)模板。后綴不限,但一般都用*.template例子 <html> <head> <title>#title#</title> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <LINK href="../css.css" rel=stylesheet type=text/css> </head> <body> <P align="center"> #title#<BR><BR><BR> 作者:#author#<BR><BR> <BR> #content#<BR><BR><BR><BR> </P> </body> </html> 做一個(gè)處理模板的類或者jsp文件、(為說(shuō)明問(wèn)題我們從簡(jiǎn)單入手以一個(gè)jsp文件為例) filePath = request.getRealPath("/")+"WEB-INF/templates/template.htm"; out.print(filePath); String templateContent=""; FileInputStream fileinputstream = new FileInputStream(filePath);//讀取模塊文件 int lenght = fileinputstream.available(); byte bytes[] = new byte[lenght]; fileinputstream.read(bytes); fileinputstream.close(); templateContent = new String(bytes); out.print("以下是模板內(nèi)容:<br>"+templateContent+"<br> 以下是置換以后的html內(nèi)容<br><hr>"); templateContent=templateContent.replaceAll("#title#",title); templateContent=templateContent.replaceAll("#author#",editer);//替換掉模塊中相應(yīng)的地方 templateContent=templateContent.replaceAll("#content#",content); // 根據(jù)時(shí)間得文件名 Calendar calendar = Calendar.getInstance(); String fileame = String.valueOf(calendar.getTimeInMillis()) +".html"; fileame = request.getRealPath("/")+fileame;//生成的html文件保存路徑 out.print(templateContent); FileOutputStream fileoutputstream = new FileOutputStream(fileame);//建立文件輸出流 byte tag_bytes[] = templateContent.getBytes(); fileoutputstream.write(tag_bytes); fileoutputstream.close(); 嗯,核心技術(shù)就是這樣了,如果大家要求的性能更高,可以改用freemarker做模板。 經(jīng)過(guò)一翻調(diào)試,成功了。。呵 附上源碼。。 JDK 1.5 +ECLIPSE +TOMCAT 5.0.28 + MYSQL 5.0 數(shù)據(jù)庫(kù)TEST ,表名news 字段: id int 自動(dòng)增長(zhǎng) , Title varchar(20) , Content varchar(200) , Author varchar(10) makeFile.jsp <% Connection conn = DBconn.getConnection(); Statement stmt = conn.createStatement(); ResultSet Rs = stmt.executeQuery("select * from news"); System.out.println("success"); %> <% String filePath = request.getRealPath("/")+"template.htm"; System.out.println(filePath); String templateContent; FileInputStream fileinputstream = new FileInputStream(filePath); int lenght = fileinputstream.available(); //available() 返回可以不受阻塞地從此文件輸入流中讀取的字節(jié)數(shù)。 byte bytes[] = new byte[lenght]; fileinputstream.read(bytes); //read(byte[] b) 從此輸入流中將最多 b.length 個(gè)字節(jié)的數(shù)據(jù)讀入一個(gè)字節(jié)數(shù)組中。 fileinputstream.close(); //templateContent = new String(bytes); String title; String content; String author; while(Rs.next()) { templateContent = new String(bytes);//如果不用這句,則替換一次之后,templateContent中就沒(méi)有#**#標(biāo)志了。所以要重新生成 title = Rs.getString("Title"); content = Rs.getString("Content"); author = Rs.getString("Author"); out.println(title+"********"+content+"****"+author); out.print("以下是模板內(nèi)容:<br>"+templateContent+"<br> 以下是置換以后的html內(nèi)容<br><hr>"); templateContent=templateContent.replaceAll("#title#",title); templateContent=templateContent.replaceAll("#author#",author);//替換掉模塊中相應(yīng)的地方 templateContent=templateContent.replaceAll("#content#",content); // 根據(jù)時(shí)間得文件名 Calendar calendar = Calendar.getInstance(); String fileame = String.valueOf(calendar.getTimeInMillis()) +".html"; fileame = request.getRealPath("/")+"Html/"+fileame;//生成的html文件保存路徑 out.print(templateContent); FileOutputStream fileoutputstream = new FileOutputStream(fileame);//建立文件輸出流 byte tag_bytes[] = templateContent.getBytes(); fileoutputstream.write(tag_bytes); fileoutputstream.close(); } if(conn!=null) { conn.close(); } if(stmt!=null) { stmt.close(); } %> //數(shù)據(jù)庫(kù)連接文件 import java.sql.*; public class DBconn { public DBconn() { // TODO Auto-generated constructor stub } public static Connection getConnection() { Connection conn = null; try { Class.forName("org.gjt.mm.mysql.Driver"); conn = DriverManager.getConnection("jdbc:mysql://" + "localhost" + "/" + "test" + "?useUnicode=true&characterEncoding=GB2312","root","111111"); } catch(Exception e) { e.printStackTrace(); } return conn; } /*public static void main(String[] args) throws Exception { Connection con=getConnection(); System.out.println(con.isClosed()); } */ } // 模板文件 template.htm <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www./TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www./1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>#title#</title> </head> <body> <table width="380" height="107" border="0" cellpadding="0" cellspacing="1" bgcolor="#FFCC99"> <tr> <td height="16" bgcolor="#FFCC99"><div align="center">#title#</div></td> </tr> <tr> <td bgcolor="#FFFFFF">#content#</td> </tr> <tr> <td height="13" align="right" bgcolor="#FFFFFF">#author#</td> </tr> </table> </body> </html> |
|
|
來(lái)自: ankle > 《我的圖書(shū)館》