無名的博客

          #

          用xmlhttp和session監聽站內人數(session監聽、無刷新取server端數據)

            這個題目含有許多需要解釋的概念,最容易說明的是“站內消息”,這是很多論壇都有的功能,可以通過web向其他的在線用戶發送消息,很多用戶都使用過。站內消息的第一個好處是大家都不需要安裝客戶端,你不用知道對方的MSN或者QQ,就能與他聯系,稱贊他的觀點或者是給他一頓臭罵。第二個好處是客戶管理方便,利用session來維護在線名單,各種腳本都已經把session操作封裝得很易用了,不用像其他無狀態的即時通信工具(比如使用UDP通信的工具)一樣,要費一些腦細胞來解決在線名單的問題。缺點嘛,就是實時性不好,一般是在用戶跳轉或者刷新頁面才能探測消息、更新在線名單。

            Session監聽嘛,沒什么好解釋的,java提供了很靈活的事件機制來監聽session,可以監聽session的創建和銷毀,監控session所攜帶數據的創建、變化和銷毀,可以監聽session的銳化和鈍化(了解對象序列化的兄弟應該知道這個),其他的平臺是個什么情況我不太清楚,估計也差不多吧。如果能夠對所有客戶的session進行監控,就不用再去操作麻煩而危險的Application了。

            Xmlhttp是MS推的一項技術,功能很復雜,可以做很多事情,比如客戶端可以在簡單的HTML中打開HTTP連接,主動向server請求數據并獲得返回數據,是DOM技術一個非常重要的應用,利用它來寫無刷新的動態頁面簡直是so easy,做過web開發的兄弟應該明白它的意義有多么重大。

          一、 session監聽

            servlet中對session的監聽有很多接口,功能很靈活,最常用的是監聽Session和Attribute。這里要澄清一下概念,servlet中的session監聽和Attribute監聽含義有差別,session監聽指的不是我們一般所理解的放置一個session或者銷毀一個session,這是Attribute監聽的功能,因為servlet中放置session的語法是session.setAttribute(“session名”,要放入的對象)。而session監聽,監聽的是HTTP連接,只要有用戶與server連接,就算連接的是一個空白的jsp頁面,也會觸發session事件,所以此處的session實際上指的是connection,用來統計當前在線用戶數最合適了。不知道我說清楚了沒有。下面分別講解這兩種監聽方式。

          1、 session監聽

            首先編寫一個session監聽類,實作HttpSessionListener接口,它的作用是計算當前有多少個在線用戶:

          1. /**
          2. *@Author bromon
          3. *2004-6-12
          4. */
          5. package org.bromon.test;
          6. import javax.servlet.*;
          7. import javax.servlet.http.*;
          8. public class SessionCount implements HttpSessionListener
          9. {
          10.     private static int count=0;
          11.     public void sessionCreated(HttpSessionEvent se)
          12.     {
          13.         count++;
          14.         System.out.println(“session創建:”+new java.util.Date());
          15.     }
          16.     public void sessionDestroyed(HttpSessionEvent se)
          17.     {
          18.        count--;
          19.        System.out.println(“session銷毀:”+new java.util.Date());
          20.     }
          21.     public static int getCount()
          22.     {
          23.        return(count);
          24.      }
          25. }




            怎么樣,是不是一目了然?count被定義為static,是因為要保證整個系統只有這一個count。如果你實在不放心,可以把它寫成一個單例類。

            然后在web.xml中聲明這個監聽器:
          <listener>
          <listener-class>
          org.bromon.test.SessionCount
          </listener-class>
          </listener>

            編寫一個測試頁面test.jsp,內容是獲得count:
          <%
          int count=org.bromon.test.SessionCount.getCount();
          out.println(count);
          %>

            需要注意的是,這里根本不涉及任何session的操作。重啟動App server,試著連接test.jsp,可以看到監聽器已經開始工作。

          2、 Attribute監聽
            作為一個站內消息系統,肯定要獲得所有登陸者的ID,才有可能互發消息。這就涉及Attribute監聽。假設我們寫了個用戶登陸的模塊,用戶通過身份驗證之后會產生一個session,保存它的相關信息,比如:

          1. //check.jsp
          2. <%
          3.     String name=request.getParameter(“name”);
          4.     Name=new String(name.getBytes(“ISO8859-1”));
          5.     session.setAttribute(“user”,name);
          6. %>



            做過jsp的兄弟應該對這段代碼再熟悉不過了,下面寫個監聽器來監聽用戶登陸,把所有用戶的ID保存到一個List當中,這個監聽器實作HttpSessionAttributeListener接口:

          1. /**
          2. *@Author bromon
          3. *2004-6-12
          4. */
          5. package org.bromon.test;
          6. import javax.servlet.*;
          7. import javax.servlet.http.*;
          8. import java.util.*;
          9. public class OnlineList implements HttpSessionAttributeListener
          10. {
          11.     private static List list=new ArrayList();
          12.     public void attributeAdded(HttpSessionBindingEvent se)
          13.     {
          14.         if(“user”.equals(se.getName()))
          15.         {
          16.             list.add(se.getValue());
          17.          }
          18.     }
          19.     public void attributeRemoved(HttpSessionBindingEvent se)
          20.     {
          21.          if(“user”.equals(se.getName()))
          22.          {
          23.             list.remove(se.getValue());
          24.          }
          25.     }
          26.     public void attributeReplaced(HttpSessionBindingEvent se){}
          27.     public static List getList()
          28.     {
          29.          return(list);
          30.      }
          31. }



          寫個簡單的jsp來得到用戶列表:
          <%
              java.util.List list=org.bromon.test.OnlineList.getList();
              out.println(“共有”+list.size()+”名用戶已登陸:”);
              for(int I=0;I<lise.size();i++)
              {
                  out.println(list.get(i));
              }
          %>

          也許你說,這有什么神奇呢,監聽session而已,不著急,看看xmlhttp。

          二、 XMLHTTP

            XMLHTTP的用處很多,這里只說我們需要的,就是無刷新的與server通信,看這段代碼:

          1. <script language="javascript"
          2. xml = new ActiveXObject("Microsoft.XMLHTTP"); 
          3. var post=" ";//構造要攜帶的數據 
          4. xml.open("POST","http://localhost:7001/TestWL/index.jsp",false);//使用POST方法打開一個到服務器的連接,以異步方式通信 
          5. xml.setrequestheader("content-length",post.length); 
          6. xml.setrequestheader("content-type","application/x-www-form-urlencoded"); 
          7. xml.send(post);//發送數據 
          8. var res = xml.responseText;//接收服務器返回的數據 
          9. document.write(res); 
          10. </script>




            豁然開朗,這段代碼就是打開一個HTTP連接,以標準的HTTP格式傳遞數據,如果你喜歡,可以用XML的格式來傳遞。更改一下xml對象的構造方式就可以兼容Mozilla和Netscape。下面來寫一個輪詢,每隔一段時間刷新一次用戶列表,當然,是不需要刷新頁面的:

          1. <html>
          2. <head><title>探測器</title>
          3. <script language="javascript">
          4. function detect()
          5. {
          6. xml = new ActiveXObject("Microsoft.XMLHTTP"); 
          7. var post=" ";//構造要攜帶的數據 
          8. xml.open("POST","http://localhost:7001/TestWL/index.jsp",false);//使用POST方法打開一個到服務器的連接,以異步方式通信 
          9. xml.setrequestheader("content-length",post.length); 
          10. xml.setrequestheader("content-type","application/x-www-form-urlencoded"); 
          11. xml.send(post);//發送數據 
          12. var res = xml.responseText;//接收服務器返回的數據 
          13. list.innerText=res;
          14. setTimeout(“detect()”,5000);//每隔5秒鐘輪詢一次
          15. </script>
          16. <body onload=”detect()”>
          17. <a id=”list”></a>
          18. </body>
          19. </html>



            這樣的通信方式數據量很小,不用重新傳遞整個頁面,5秒鐘輪一次,普通PC也能承受較大的在線數。構造一個探測器來監聽在線列表和消息,效果是很好的,即使你的客戶坐在電腦前袖手旁觀,鍵鼠都不碰一下,也能保證數據即時傳遞,頁面也不會發生跳轉和刷新。

            Session監聽加上XMLHTTP通信,開發一個較為完善的站內消息系統實在易如反掌。

          posted @ 2005-10-18 10:45 十三郎 閱讀(581) | 評論 (0)編輯 收藏

          關于struts里中的集合里的javaBean里有集合和javaBean的顯示問題

          具體的代碼如下:
          cargoExport為一個存放在request的ArrayList。
           
          <logic:present name="cargoExport">
           <logic:iterate id="cargo" name="cargoExport" type="ywsoftware.ship.businessTable.TCtcargo">
            <logic:present name="cargo">
            
              <bean:write name="cargo" property="shipper" />
            
          //下邊為顯示javaBean里某個屬性也是javaBean的顯示格式
             <bean:define id="tctcg" name="cargo" property="ctcg" type="ywsoftware.ship.businessTable.TCtcg"/>
             <bean:write name="tctcg" property="marks" />
          //下邊為顯示javaBean里某個屬性是集合的顯示格式   
             <logic:iterate id="loadct" name="cargo" property="loadCTs" type="ywsoftware.ship.businessTable.TLoadct">
                    <logic:present name="loadct">
                     <bean:write name="loadct" property="cntrNo" />
                    </logic:present>
                </logic:iterate>
               
            </logic:present>
           </logic:iterate>
          </logic:present>

          --------------------------------------------------
          //下邊為顯示集和里存放的是數組 
          <logic:iterate id="element" indexId="ind" name="catalog">
            <bean:write name="ind"/>. <bean:write name="element" property="key"/><BR>
            <logic:iterate id="elementValue" name="element" property="value" length="23" offset="0">
                -----<bean:write name="elementValue"/><BR>
            </logic:iterate>
          </logic:iterate>

          posted @ 2005-10-18 10:40 十三郎 閱讀(471) | 評論 (0)編輯 收藏

          關于hibernate配置使用weblogic7.0里的連接池

              在經過了幾天的郁悶的日子后,終于把hibernate跟weblogic的連接池結合使用給搞定了,煞是開心啊。當配置成功后才感覺如此簡單,其實就是DataSource跟JNDi命名問題。以下為正確的配置。與大家分享(weblogic7.0+sql server2000)

          第一步、加載JDBC驅動,我用的是JTDS,在startWebLogic.cmd里加上set CLASSPATH=E:\jtds-1.0.3.jar;在weblogic啟動時,在DOS窗口里可以看到。

          第二步、啟動weblogic,設置連接池,如下圖所示:

          第三步、配置DataSource,如下圖所示:(注意:DataSource Name跟JNDI Name可以不相同。但是如果其中一個前面加了“jdbc/",則另一個也要加,要不就全不要加)

          第四步、配置hibernate.cfg.xml文件,如下所示:
          <!-- properties start-->
            
          <property name="connection.datasource">jdbc/DB</property>
           <property name="hibernate.dialect">
            net.sf.hibernate.dialect.SQLServerDialect
           </property>
          <!-- properties end-->

          好了,這就是配置的過程,程序不需要改動。以下附直接連接數據庫的配置
           <!-- properties start-->
           <property name="hibernate.connection.driver_class">
            net.sourceforge.jtds.jdbc.Driver
           </property>
           <property name="hibernate.connection.url">
            jdbc:jtds:sqlserver://localhost/tax_web
           </property>
           <property name="hibernate.connection.username">sa</property>
           <property name="hibernate.connection.password"></property>
           <property name="hibernate.connection.pool.size">8</property>
           <property name="hibernate.dialect">
            net.sf.hibernate.dialect.SQLServerDialect
           </property>
           <property name="hibernate.show_sql">false</property>
           <!-- properties end-->

          posted @ 2005-10-18 10:33 十三郎 閱讀(819) | 評論 (1)編輯 收藏

          在JSP中執行dos命令

               在JSP中我們經常要調用服務器端的一些dos命令,已達到一些特殊的效果,但同時調用服務器端的dos命令也存在著一些安全隱患,因此需要慎重使用。

               以下以一個例子來說明用jsp執行dos的過程,比如在服務器端每天都會自動生成一個目錄(目錄名稱為當天的日期),再此目錄下會生成一些當天的新聞文件,管理員會把這些文件幾個月作一次備份,備份完后在把這些文件刪除。

               如果在服務器上,我們可以在dos下直接執行c:\j2sdk\jar cf d:\bak\200502.jar d:\news\20050101 命令, 然后再把20050101目錄刪除即可。

               在JSP中我們應當這么來寫

          <%
          //執行dos命令
          String commandstr = "c:/j2sdk/jar cf d:/bak/200502.jar d:/news/20050101";
          Process p ;
          try {
             p = Runtime.getRuntime().exec(commandstr);
          //等待剛剛執行的命令的結束  
          while (true){  
                     if(p.waitFor() == 0)   break;
             }    
             
          } catch (Exception e) {
              out.println(e.toString());
             }

          //刪除已經打包的文件及其目錄
          File f = new File("d:/news/20020101");
          String[] allFiles = f.list();
          for (int i = 0; i < allFiles.length; i++) {
             File delF = new File("d:/news/20050101/"+allFiles[i]);
             delF.delete();
          }
          File delD = new File("d:/news/20050101");
          delD.delete();
          %>

               在jsp中以下代碼必須執行,如果沒有該代碼,則由于刪除文件的速度快于打包的速度,因此當壓縮包還沒有打包完成,一些文件已經被刪除,加入下面的代碼,會在此一直做循環,一直p.waitFor()(這個方法的說明是:等待子進程的結束,如果已經結束,一般返回0)返回0為止才會接著執行后面的代碼
          while (true){  
                     if(p.waitFor() == 0)   break;
             } 

          posted @ 2005-10-18 10:27 十三郎 閱讀(3706) | 評論 (0)編輯 收藏

          配置eclipse3.0.1的VE插件

          第一步、下載所需要的軟件和插件(本人測試的版本如下版本號相同)

          1. Eclipse3.0.1?(軟件)?
          2. emf-sdo-runtime-2.0.1??(插件)?
          3. GEF-runtime-3.0.1?(插件)
          4. VE-runtime-1.0.1.1?(插件)

          第二步、配置插件

          1. 把Eclipse3.0.1解壓到d:\,其目錄為d:\eclipse。
          2. 在d:\eclipse目錄下新建一個plugins-2的文件夾,然后把emf-sdo-runtime-2.0.1、GEF-?runtime-3.0.1、VE-runtime-1.0.1.1三個壓縮包解壓到該目錄,在解壓時點擊右鍵選擇“解壓到<文件名>”。
          3. 在d:\eclipse目錄下新建一個links的文件夾,在目錄下新建三個文件,擴展名都為.link,文件名為下載的三個插件的文件名,這三個文件里的內容分別填上相對應的內容,以下的path后的內容皆為三個插件的路徑,如下:
          • path=D:\\eclipse\\plugins-2\\VE-runtime-1.0.1.1
          • path=D:\\eclipse\\plugins-2\\GEF-runtime-3.0.1
          • path=D:\\eclipse\\plugins-2\\emf-sdo-runtime-2.0.1

          第三步、使用eclipse進行可視化編程

          1. 在eclipse目錄下找到eclipse.exe,點擊右鍵新建一個“桌面快捷方式”,在桌面上找到剛剛新建的快捷方式,點擊右鍵,選擇“屬性”,在彈出窗口的目標后面的文本框里?D:\eclipse\eclipse.exe 的后面加上 -clean,然后雙擊這個圖標啟動eclipse。
          2. 啟動eclipse后,點擊“文件---新建--項目”,按照新建一個項目。
          3. 點擊“文件---新建--其它”,再彈出的窗口里點擊java,在展開的列表里選擇AWT或SWING,接著按照接下來的提示新建一個文件。
          4. 在首次運行時可能看不到可供拖放的一些組件,需要在“窗口--顯示視圖--其它”,在彈出的對話框里里單擊“基本”,在列出的列表中選中“Plalette”,點擊確定。

          posted @ 2005-10-18 10:11 十三郎 閱讀(1244) | 評論 (7)編輯 收藏

          僅列出標題
          共4頁: 上一頁 1 2 3 4 下一頁 
          主站蜘蛛池模板: 门源| 苍山县| 安义县| 永平县| 辛集市| 永定县| 敖汉旗| 绥江县| 龙山县| 舒兰市| 昌宁县| 即墨市| 建平县| 深水埗区| 丹巴县| 永新县| 武定县| 涞源县| 松滋市| 通州区| 通化县| 阳曲县| 禄劝| 抚松县| 锦州市| 华容县| 黎平县| 余庆县| 龙川县| 涡阳县| 黑龙江省| 井陉县| 靖州| 华亭县| 冕宁县| 辽源市| 蕲春县| 北票市| 长沙县| 正蓝旗| 无为县|