国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > 綜合 > 正文

JBuilder2005 Servlet開發(fā)之自啟動

2024-07-21 02:15:18
字體:
供稿:網(wǎng)友

  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é)點表示暫時還沒有對應(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. }

  當(dāng)然,我們要對《jbuilder 2005實戰(zhàn)jsp開發(fā)》專題中創(chuàng)建的userlist.java代碼進行更改,定義filluser()方法以供usercacheservlet.java調(diào)用,此外,還需要調(diào)整原getuserlisthtml()方法,如下所示:

  代碼清單 3 調(diào)整后的userlist.java代碼

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. }

  首先,我們在第9行定義了一個靜態(tài)的usermap對象用以緩存用戶信息,這個map以userid為鍵保存username的值。第11~49行的靜態(tài)filluser()方法從數(shù)據(jù)庫中獲取用戶的信息填充到usermap中。當(dāng)用戶訪問login.jsp生成用戶下拉框時,用戶數(shù)據(jù)直接從usermap緩存中讀取,而不再從數(shù)據(jù)庫中讀取,你可以從第54~56行的代碼中看到這種獲取用戶數(shù)據(jù)方式的改變。當(dāng)添加或刪除用戶時,可以通過http://localhost:8080/webmodule/usercacheservlet刷新緩存數(shù)據(jù)。

  實戰(zhàn)經(jīng)驗

  使用緩存保存不常變動而頻繁訪問的數(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

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 丰都县| 绵阳市| 定日县| 岱山县| 马关县| 辛集市| 台北市| 始兴县| 万载县| 阿城市| 渑池县| 蒙城县| 财经| 汶川县| 沭阳县| 华亭县| 南康市| 吉隆县| 巍山| 柘荣县| 南溪县| 阿坝| 南雄市| 峨眉山市| 丹凤县| 通州区| 彰武县| 香格里拉县| 鞍山市| 金堂县| 大邑县| 五河县| 哈尔滨市| 措美县| 政和县| 建湖县| 巴楚县| 平舆县| 蓬莱市| 彰化县| 桐庐县|