servlet和jsp的一個重大的區(qū)別即是servlet可以通過web.xml文件的配置讓servlet在web容器啟動時就自動啟動servlet。可以利用servlet的這個特性不變化的數(shù)據(jù)事先加載到web應(yīng)用服務(wù)器中以便緩存使用。
假設(shè),我們系統(tǒng)的用戶在系統(tǒng)部署前就已經(jīng)創(chuàng)建好,以后不常發(fā)生變化,那么我們可以在web應(yīng)用程序啟動時就將其下載緩存到web應(yīng)用服務(wù)器內(nèi)存中,如果用戶發(fā)生變化可以手工調(diào)用這個servlet進行刷新。下面我們就通過servlet向?qū)?chuàng)建這個usercacheservlet,它在web容器啟動時自動下載并緩存系統(tǒng)所有用戶id和用戶名:
1.啟動創(chuàng)建servlet向?qū)В顚憇ervlet名字
通過file->new...->web->雙擊standard servlet圖標(biāo)啟動創(chuàng)建servlet向?qū)У牡谝徊剑缦聢D所示:
|  圖 2填寫servlet名字 | 
在class name中填入servlet的名字:usercacheservlet,在package中填入bookstore.servlet作為包名。按next到下一步。
2.選擇servlet所要實現(xiàn)的方法。
我們在前面已經(jīng)介紹了servlet通過不同的doxxx()方法的響應(yīng)http請求方式,你可以在向?qū)У牡?步選擇需要定義哪些doxxx()方法。默認情況下doget()方法被勾選,即通過http get請求方式訪問servlet。通過帶參的url訪問servlet時,servlet就用doget()方法響應(yīng)這個請求。由于我們只是假設(shè)用戶數(shù)據(jù)不常變動,并不是說永遠不變動,所以我們在web容器初始化時,希望通過usercacheservlet自動加載用戶數(shù)據(jù)到緩存中,當(dāng)數(shù)據(jù)庫表t_user的用戶數(shù)據(jù)發(fā)生變動時,我們可以手工調(diào)用usercacheservlet,讓其刷新緩存中的用戶數(shù)據(jù)。
web容器啟動時自動初始化usercacheservlet,此時init()方法被調(diào)用,我們可以通過init()方法加載用戶數(shù)據(jù),當(dāng)用戶通過url請求刷新用戶數(shù)據(jù)時,usercacheservlet通過doget()方法響應(yīng)這個http get請求。也就是說,我們需要實現(xiàn)doget()方法,所以我們接受向?qū)У哪J設(shè)置,如下圖所示:
|  圖 3 選擇需要覆蓋的servlet響應(yīng)方法 | 
  按next跳過第3步到向?qū)У牡?步。
  3.指定訪問servlet的路徑
|  圖 4 指定servlet訪問路徑 | 
  ·name:usercacheservlet,servlet在web.xml配置文件中所取的名字
  ·url pattern:/usercacheservlet,訪問這個servlet的匹配路徑。指定這個訪問路徑后,假設(shè)web應(yīng)用程序部署在http://localhost:8080/webmodule下,則通過http://localhost:8080/webmodule/usercacheservlet訪問servlet。
  直接按finish創(chuàng)建servlet。
  打開web.xml文件,你可以找到關(guān)于usercacheservlet聲明和訪問的部署描述信息: 
  ·<servlet>節(jié)點:描述servlet的名字及類名。
  ·<servlet-mapping>節(jié)點:描述servlet訪問匹配路徑。
  雙擊工程窗格資源樹的webmodule節(jié)點,jbuider在內(nèi)容窗格中打開用于編輯web.xml文件的web模塊dd編輯器(web module dd editor),此時結(jié)構(gòu)窗格顯示出web.xml文件的結(jié)構(gòu),如下圖所示:
|  圖 5 結(jié)構(gòu)窗格的web.xml文件結(jié)構(gòu)樹 | 
  帶 圖標(biāo)的節(jié)點表示已經(jīng)有配置內(nèi)容,而未帶
 圖標(biāo)的節(jié)點表示已經(jīng)有配置內(nèi)容,而未帶  圖標(biāo)的節(jié)點表示暫時還沒有對應(yīng)的配置內(nèi)容。我們展開servlets節(jié)點,定位到usercacheservlet并雙擊這個節(jié)點,dd編輯器調(diào)整界面對usercacheservlet這個servlet進行配置,如下圖所示:
圖標(biāo)的節(jié)點表示暫時還沒有對應(yīng)的配置內(nèi)容。我們展開servlets節(jié)點,定位到usercacheservlet并雙擊這個節(jié)點,dd編輯器調(diào)整界面對usercacheservlet這個servlet進行配置,如下圖所示:
|  圖 6 dd編輯器 | 
  servlet可以在web容器啟動時,自動初始化。假設(shè)有多個servlet都需要自動初始化,則可以通過web.xml的<load-on-startup>設(shè)置啟動的次序。我們在dd編輯器將load on startup值設(shè)為2, 這樣usercacheservlet將在web容器啟動后,排在順序2初始化。
  一些系統(tǒng)所用的servlet,由于是web開始服務(wù)的基礎(chǔ)必須在順序1初化,所以我們開發(fā)的servlet最好在順序2或順序3初始化。servlet初始化時,init()方法被調(diào)用。在進行這樣的設(shè)置后web.xml將包含以下粗體所示的配置信息。
  代碼清單 1 web.xml有關(guān)usercacheservlet的描述信息
| 1. <web-app> 2. … 3. <servlet> 4. <servlet-name>usercacheservlet</servlet-name> 5. <servlet-class>bookstore.servlet.usercacheservlet</servlet-class> 6. <load-on-startup>2</load-on-startup> 7. </servlet> 8. <servlet-mapping> 9. <servlet-name>usercacheservlet</servlet-name> 10. <url-pattern>/usercacheservlet</url-pattern> 11. </servlet-mapping> 12. … 13. </web-app> | 
  注意:
  當(dāng)刪除usercacheservlet后,servlet在web.xml所對應(yīng)的部署描述信息并不會一起刪除,你必須手工刪除。
  在init()初始化方法中利用userlist.filluser()方法從數(shù)據(jù)庫中下載并緩存用戶記錄信息,在doget()方法中也引用了userlist.filluser(),用戶通過url訪問usercacheservlet時,doget()方法被調(diào)用,刷新緩存用戶數(shù)據(jù),并顯示"刷新成功"提示,其代碼如下所示:
  代碼清單 2 usercacheservlet.java
| 1. package bookstore.servlet; 2. 3. import javax.servlet.*; 4. import javax.servlet.http.*; 5. import java.io.*; 6. import bookstore.userlist; 7. 8. public class usercacheservlet 9. extends httpservlet 10. { 11. private static final string content_type = "text/html; charset=gbk"; 12. 13. //initialize global variables 14. public void init() 15. throws servletexception 16. { 17. userlist.filluser();//web容器啟動后調(diào)用 18. } 19. 20. //process the http get request 21. public void doget(httpservletrequest request, httpservletresponse response) 22. throws servletexception, ioexception 23. { 24. userlist.filluser();//刷新用戶數(shù)據(jù) 25. response.setcontenttype(content_type); 26. printwriter out = response.getwriter(); 27. out.println("<html>"); 28. out.println("<head><title>usercacheservlet</title></head>"); 29. out.println("<body bgcolor=/"#ffffff/">"); 30. out.println("刷新成功!"); 31. out.println("</body>"); 32. out.println("</html>"); 33. out.close(); 34. } | 
| 2. package bookstore; 3. 4. import java.sql.*; 5. import java.util.*; 6. 7. public class userlist 8. { 9. private static map usermap;//用戶id和用戶名的map 10. //將用戶數(shù)據(jù)緩存到map中 11. public static void filluser() 12. { 13. if (usermap == null) 14. { 15. usermap = new hashmap(); 16. } else 17. { 18. usermap.clear(); 19. } 20. connection conn = null; 21. stringbuffer sbuf = new stringbuffer(); 22. try 23. { 24. conn = dbconnection.getconnection(); 25. preparedstatement pstat = conn.preparestatement( 26. "select user_id,user_name from t_user"); 27. resultset rs = pstat.executequery(); 28. while (rs.next()) 29. { 30. usermap.put(rs.getstring(1), rs.getstring(2)); 31. } 32. } catch (sqlexception ex) 33. { 34. ex.printstacktrace(); 35. } finally 36. { 37. try 38. { 39. if (conn != null) 40. { 41. conn.close(); 42. conn = null; 43. } 44. } catch (sqlexception ex1) 45. { 46. ex1.printstacktrace(); 47. } 48. } 49. } 50. 51. //獲取html下拉框的用戶列表代碼 52. public static string getuserlisthtml() 53. { 54. stringbuffer sbuf = new stringbuffer(); 55. set set = usermap.keyset(); 56. iterator iter = set.iterator(); 57. while (iter.hasnext()) 58. { 59. object item = (object) iter.next(); 60. sbuf.append("<o(jì)ption value=’" + item + "’>" + 61. usermap.get(item) + "</option>/n"); 62. } 63. return sbuf.tostring(); 64. } 65. } | 
| 使用緩存保存不常變動而頻繁訪問的數(shù)據(jù)是提高系統(tǒng)性能一個很重要的途徑。如果你的web服務(wù)器沒有實現(xiàn)集群,刷新緩存數(shù)據(jù)非常簡單,只需通過一個servlet在發(fā)生數(shù)據(jù)變動時刷新就可以了。如果web服務(wù)器使用了集群,問題就變得復(fù)雜了,因為每一臺web服務(wù)器的jvm是獨立的,所以每臺web服務(wù)器都有一份獨立的緩存數(shù)據(jù),當(dāng)數(shù)據(jù)發(fā)生變動時,必須對每臺web服務(wù)器中對緩存進行刷新。這里有兩種解決方案,其一是使用獨立于web服務(wù)器的專用共享資源機器緩存數(shù)據(jù),集群中所有的web服務(wù)器通過jndi等方式訪問緩存數(shù)據(jù)。另外的一種方法則是通過同步機制在任意一臺服務(wù)器緩存數(shù)據(jù)發(fā)生變動時同步到集群中的其他機器上。apache的turbine項目的jcs子項目專門為解決這一企業(yè)級的問題而開發(fā),你可以通過http://jakarta.apache.org/jcs/index.html了解jcs的更多內(nèi)容。 | 
商業(yè)源碼熱門下載www.html.org.cn
新聞熱點
疑難解答
圖片精選