posts - 39,  comments - 44,  trackbacks - 0
           
          關于RSS

          RSS是站點用來和其他站點之間共享內容的一種簡易方式(也叫聚合內容)

          在門戶網站大行其道,人們已經習慣通過搜索引擎來獲取新聞資訊的今天,一種全新的資訊傳播方式已經悄悄地來到我們身邊,仔細觀察一些網站,你可能注意到一些被標記為"XML"或"RSS"的橙色圖標。

          面對撲面而來的新聞,不用再花費大量的時間沖浪和從新聞網站下載,只要通過下載或購買一種小程序,這種技術被稱為簡易信息聚合(RSS:Really Simple Syndication)。RSS會收集和組織定制的新聞,按照你希望的格式、地點、時間和方式,直接傳送到你的計算機上。新聞網站和那些在線日記作者已體會到了RSS提要帶來的樂趣,這也使讀者可以更容易跟蹤RSS提要

          RSS是一個縮寫的英文術語,在英文中被認為有幾個不同的源頭,并被不同的技術團體做不同的解釋。它既可以是"Rich Site Summary"(豐富站點摘要),或"RDF Site Summary"(RDF站點摘要),也可以是"Really Simple Syndication"(真正簡易聚合)。現在已有的有Netscape, 1.0 (RSS-DEV版本),和 0.9x and 2.0 (UserLand Software版本) 0.9x和2.0。不過幾乎所有能支持RSS的程序都可以瀏覽不同版本的RSS。

          RSS是基于文本的格式。它是XML(可擴展標識語言)的一種形式。通常RSS文件都是標為XML,RSS files(通常也被稱為RSS feeds或者channels)通常只包含簡單的項目列表。一般而言,每一個項目都含有一個標題,一段簡單的介紹,還有一個URL鏈接(比如是一個網頁的地址)。其他的信息,例如日期,創建者的名字等等,都是可以選擇的。

          RSS是站點用來和其他站點之間共享內容的一種簡易方式(也叫聚合內容),通常被用于新聞和其他按順序排列的網站,例如Blog。一段項目的介紹可能包含新聞的全部介紹,Blog post等等。或者僅僅是額外的內容或者簡短的介紹。這些項目的鏈接通常都能鏈接到全部的內容。網絡用戶可以在客戶端借助于支持RSS的新聞聚合工具軟件(例如NewzCrawler、FeedDemon),在不打開網站內容頁面的情況下閱讀支持RSS輸出的網站內容。網站提供RSS輸出,有利于讓用戶發現網站內容的更新。

          RSS如何工作?首先您一般需要下載和安裝一個RSS閱讀器,然后從網站提供的聚合新聞目錄列表中訂閱您感興趣的新聞欄目的內容。訂閱后,您將會及時獲得所訂閱新聞頻道的最新內容。 對于一般用戶來說,用RSS訂閱新聞可以像使用Outlook Express收取訂閱的郵件一樣簡單;而對于Web應用程序的開發者而言,RSS的工作過程也不是那么復雜,至少比大多數其他常見的Web技術都更容易被理解和被實現。 有人認為,RSS的初衷似乎是為了給郵件列表訂閱服務以致命的打擊,若從RSS的應用方式來看,這幾乎是不可避免的。但從實際效果來看,RSS最火爆的應用并非是商業信息的集中訂閱,而是個人通過Web實現的信息聚合,一個典型的例子就是各國的網志作者(Blogger)首先成為最普遍的RSS應用人群。
          posted @ 2008-04-01 19:42 礦礦 閱讀(110) | 評論 (0)編輯 收藏
          create database hy
          on primary --默認就屬于primary主文件組
          (
          --主數據文件的具體描述
           name='hy_data', --主數據文件的邏輯名
           filename='E:\temp1\hy_data.mdf', --主數據文件的物理名
          size=3mb,--主數據文件的初始大小
          maxsize=100mb,--主數據文件的增長最大值
          filegrowth=10%--主數據文件的增長率
          ),(
            --次數據文件的具體描述,具體參數含義同主數據文件的含義
           name='hyn_data',
           filename='E:\temp1\hyn_data.ndf',
          size=3mb,
          maxsize=100mb,
          filegrowth=10%
          )
          log on
          (
          --日志文件的具體描述,各參數的含義同主數據文件各參數含義
           name='hylog_log1',
           filename='E:\temp1\hylog1_log.ldf',
          size=1mb,
          filegrowth=10%
          ),(
          --次日志文件的具體描述,具體各參數含義同上
          name='hylog_log2',
           filename='E:\temp1\hylog2_log.ldf',
          size=1mb,
          filegrowth=10%
          )
          use hy
          go
          create table 忍者派別表   --創建忍者派別表
          (
            編號 int,--編號
            稱號 Nvarchar(20) not null --稱號
          )
          go
           create table 師傅表--創建師傅表
          (
           編號 int,--編號
           姓名 Nvarchar(20) not null,--姓名
           稱號 int--稱號
          )
          go
          create table 忍者信息表--創建忍者信息表
          (
          編號 int identity(1,1),--編號
          姓名 Nvarchar(20) not null,--姓名
          性別 char(2),--性別
          攻擊力 int,--攻擊力
          派別 int not null,--派別
          師傅 int not null--師傅
          )
          go
           --為忍者派別表添加約束
          alter table 忍者派別表
          add constraint pk_編號 primary key (編號)
          go
          --為師傅表添加約束
          alter table 師傅表
          add constraint pk_ 編號 primary key (編號)
          稱號 int not null
          go
          --為忍者信息表添加約束
          alter table 忍者信息表
          add constraint pk_ 編號 primary key (編號)
          add constraint df_性別
          default ('男') for 性別
          攻擊力 int check(攻擊力>0)
          派別 int references 忍者派別表(編號)
          師傅 int not null references 師傅表(編號)
          go
          --為忍者派別表添加數據
          insert into 忍者派別表(編號,稱號)values(1,'木葉下忍')
          insert into 忍者派別表(編號,稱號)values(2,'木葉中忍')
          insert into 忍者派別表(編號,稱號)values(3,'木葉上忍')
          insert into 忍者派別表(編號,稱號)values(4,'砂隱下忍')
          insert into 忍者派別表(編號,稱號)values(5,'砂隱中忍')
          insert into 忍者派別表(編號,稱號)values(6,'砂隱上忍')
          insert into 忍者派別表(編號,稱號)values(7,'雨隱下忍')
          insert into 忍者派別表(編號,稱號)values(8,'雨隱中忍')
          insert into 忍者派別表(編號,稱號)values(9,'雨隱上忍')
          insert into 忍者派別表(編號,稱號)values(10,'音隱下忍')
          insert into 忍者派別表(編號,稱號)values(11,'音隱中忍')
          insert into 忍者派別表(編號,稱號)values(12,'音隱上忍')
          insert into 忍者派別表(編號,稱號)values(13,'巖隱下忍')
          insert into 忍者派別表(編號,稱號)values(14,'巖隱中忍')
          insert into 忍者派別表(編號,稱號)values(15,'巖隱上忍')
          insert into 忍者派別表(編號,稱號)values(16',云隱下忍')
          insert into 忍者派別表(編號,稱號)values(17',云隱中忍')
          insert into 忍者派別表(編號,稱號)values(18',云隱上忍')
          insert into 忍者派別表(編號,稱號)values(19',霧隱下忍')
          insert into 忍者派別表(編號,稱號)values(20',霧隱中忍 ')
          insert into 忍者派別表(編號,稱號)values(21',霧隱上忍')
          insert into 忍者派別表(編號,稱號)values(22',曉')
          insert into 忍者派別表(編號,稱號)values(23',逃之忍')
          insert into 忍者派別表(編號,稱號)values(24',火影 ')
          insert into 忍者派別表(編號,稱號)values(25',風影 ')
          insert into 忍者派別表(編號,稱號)values(26',雨影')
          insert into 忍者派別表(編號,稱號)values(27',音影')
          insert into 忍者派別表(編號,稱號)values(28',巖影')
          insert into 忍者派別表(編號,稱號)values(29',未知')
          insert into 忍者派別表(編號,稱號)values(99',三忍')
          go
          --為師傅表添加數據
          insert into 師傅表(編號,姓名,稱號)values(1,'旗木卡卡西',3)
          insert into 師傅表(編號,姓名,稱號)values(2,'依魯卡',2)
          insert into 師傅表(編號,姓名,稱號)values(3,'自來也',99)
          insert into 師傅表(編號,姓名,稱號)values(4,'夕日紅',3)
          insert into 師傅表(編號,姓名,稱號)values(5,'阿斯瑪',3)
          insert into 師傅表(編號,姓名,稱號)values(6,'阿凱',3)
          insert into 師傅表(編號,姓名,稱號)values(7,'猿飛',24)
          insert into 師傅表(編號,姓名,稱號)values(8,'馬基',6)
          insert into 師傅表(編號,姓名,稱號)values(9,'未知',29)
          go
          --為忍者信息表添加約束
          insert into 忍者信息表(編號,姓名,性別,攻擊力,派別,師傅)values('漩渦鳴人','男',100,1,1)
          insert into 忍者信息表(編號,姓名,性別,攻擊力,派別,師傅)values('日向雛田','男',100,1,5)
          insert into 忍者信息表(編號,姓名,性別,攻擊力,派別,師傅)values('春野櫻','女',60,1,1)
          insert into 忍者信息表(編號,姓名,性別,攻擊力,派別,師傅)values('犬冢牙','男',100,1,4)
          insert into 忍者信息表(編號,姓名,性別,攻擊力,派別,師傅)values('犬冢牙','男',100,1,4)
          insert into 忍者信息表(編號,姓名,性別,攻擊力,派別,師傅)values('山中井野','女',100,1,4 )
          insert into 忍者信息表(編號,姓名,性別,攻擊力,派別,師傅)values('奈良鹿丸','男',150,2,5)
          insert into 忍者信息表(編號,姓名,性別,攻擊力,派別,師傅)values('宇智波佐助','男',200,1,1)
          insert into 忍者信息表(編號,姓名,性別,攻擊力,派別,師傅)values('秋道丁次','男',100,1,5)
          insert into 忍者信息表(編號,姓名,性別,攻擊力,派別,師傅)values('我愛羅','男',160,25,9)
          insert into 忍者信息表(編號,姓名,性別,攻擊力,派別,師傅)values('勘九郎','男',100,4,9)
          insert into 忍者信息表(編號,姓名,性別,攻擊力,派別,師傅)values('手鞠','女',110,4,9)
          insert into 忍者信息表(編號,姓名,性別,攻擊力,派別,師傅)values('白','男',120,20,9)
          insert into 忍者信息表(編號,姓名,性別,攻擊力,派別,師傅)values('桃地再不斬','男',180,23,9)
          insert into 忍者信息表(編號,姓名,性別,攻擊力,派別,師傅)values('干柿鬼鮫','男',250,22,9)
          insert into 忍者信息表(編號,姓名,性別,攻擊力,派別,師傅)values('藥師兜','男',120,11,9)
          go
          --查詢數據
          select * from 忍者派別表
          select * from 師傅表
          select * from 忍者信息表



          posted @ 2008-03-23 21:02 礦礦 閱讀(154) | 評論 (0)編輯 收藏

          一、三層體系架構

          1.表示層(USL):主要表示Web方式,也可以表示成WINFORM方式。如果邏輯層相當強大和完善,無論表現層如何定義和更改,邏輯層都能完善地提供服務。

          2.業務邏輯層(BLL):主要是針對具體的問題的操作,也可以理解成對數據層的操作,對數據業務邏輯處理。如果說數據層是積木,那邏輯層就是對這些積木的搭建。

          3.數據訪問層(DAL):主要是對原始數據(數據庫或者文本文件等存放數據的形式)的操作層,而不是指原始數據,也就是說,是對數據的操作,而不是數據庫,具體為業務邏輯層或表示層提供數據服務。



          二、具體區分

          1.表示層:主要對用戶的請求接受,以及數據的返回,為客戶端提供應用程序的訪問。

          2.業務邏輯層:主要負責對數據層的操作,也就是說把一些數據層的操作進行組合。

          3.數據訪問層:主要看你的數據層里面有沒有包含邏輯處理,實際上他的各個函數主要完成各個對數據文件的操作,而不必管其他操作。


          三、總結

          三層結構是一種嚴格分層方法,即數據訪問層只能被業務邏輯層訪問,業務邏輯層只能被表示層訪問,用戶通過表示層將請求傳送給業務邏輯層,業務邏輯層完成相關業務規則和邏輯,并通過數據訪問層訪問數據庫獲得數據,然后按照相反的順序依次返回將數據顯示在表示層。

          posted @ 2008-01-20 01:51 礦礦 閱讀(157) | 評論 (0)編輯 收藏

           

          一、 引言

            JMX(Java管理擴展)提供了一組工具用來管理本地和遠程應用程序、系統對象、設備等。本文將解釋如何使用JMX(JSR 160)來遠程控制Web應用程序,并將解釋應用程序中可用于JMX客戶的代碼,同時將展示使用如MC4J和jManage等的不同客戶如何連接到支持JMX的應用程序。此外,我們還將詳細地討論使用RMI協議和JNDI來保護通訊層。
                 首先我們要分析一個簡單的web應用程序,它監控已經登陸的用戶數目并通過一個安全的JMX服務來顯示該項統計。我們還將運行這個應用程序的多個實例并且從所有的運行實例中跟蹤這個統計數字。當然,你可以下載這個示例web應用程序。它需要你安裝J2SE 5.0 SDK并且你的JAVA_HOME環境變量指向基安裝目錄。J2SE 5.0實現了1.2版本的JMX API和JMX 1.0版本的Remote API。同時還需要一個支持Servlet的容器;我使用的是Apache Tomcat 5.5.12。另外,我還使用Apache Ant來構建這一示例應用程序。

            二、 建立示例應用程序

            首先,你要下載示例應用程序并且使用ant war(更多的細節見build.XML中的注釋)來創建一個WAR文件。把jmxapp.war復制到Tomcat的webapps目錄。假定Tomcat正在運行于你的本地機器的端口8080,那么該應用程序的URL將是:

          http://localhost:8080/jmxapp

            如果你看到一個提示你輸入名字和口令的登陸屏幕,那么一切已經就緒了。

            三、 跟蹤一些有意義的數據

            本文中的應用程序使用Struts框架來提交登錄表單。一旦提交結束,即執行LoginAction.execute(..)方法-它將簡單地檢查是否用戶的ID為"hello"以及是否其口令為"world"。如果二者都正確,那么登錄成功并且控制被導向login_success.JSP;如果不正確,那么我們返回到登錄表單。根據登錄成功與否決定調用incrementSuccessLogins(HttpServletRequest)方法還是incrementFailedLogins(HttpServletRequest)方法。現在,讓我們先分析一下incrementFailedLogins(HttpServletRequest):

          private void incrementFailedLogins(HttpServletRequest request) {
           HttpSession session = request.getSession();
           ServletContext context =session.getServletContext();
           Integer num = (Integer) context.getAttribute( Constants.FAILED_LOGINS_KEY);
           int newValue = 1;
           if (num != null) { newValue = num.intValue() + 1; }
           context.setAttribute( Constants.FAILED_LOGINS_KEY, new Integer(newValue));
          }

            這個方法增加一個在應用程序范圍存儲的FAILED_LOGINS_KEY變量。這個incrementSuccessLogins(HttpServletRequest)方法是以相似的方法實現的。該應用程序追蹤有多少人成功地登錄和有多少人認證失敗。這真不錯,但是我們該如何存取這些數據?這就是引入JMX的原因。

            四、 創建JMX MBeans

            MBeans基礎知識及其適于JMX架構的方面超出了本文所討論的范圍。我們將為我們的應用程序簡單地創建、實現、暴露和保護一個MBean。我們所感興趣的是暴露相應與下列兩個方法的兩種數據。下面是我們的簡單MBean接口:

          public interface LoginStatsMBean {
           public int getFailedLogins();
           public int getSuccessLogins();
          }

            這兩個方法簡單地返回成功和失敗登陸的數目。LoginStatsMBean的實現-LoginStats,為上面兩種方法提供了一種具體的實現。讓我們分析一下getFailedLogins()實現:

          public int getFailedLogins() {
           ServletContext context = Config.getServletContext();
           Integer val = (Integer) context.getAttribute( Constants.FAILED_LOGINS_KEY);
           return (val == null) ? 0 : val.intValue();
          }

            該方法返回一個存儲在ServletContext中的值。getSuccessLogins()方法是以相似的方式實現的。

            五、 創建和保護一個JMX代理

            管理應用程序的JMX相關方面的JMXAgent類有以下幾個責任:

            1. 創建一個MBeanServer。

            2. 用MBeanServer注冊LoginStatsMBean。

            3. 創建一個JMXConnector以允許遠程客戶進行連接。

             o 包含對JNDI的使用。

             o 也必須有一個RMI注冊運行。

            4. 使用一個用戶名和口令保護JMXConnector。

            5. 分別在應用程序啟動和停止時,啟動和停止JMXConnector。

            JMXAgent的類輪廓是:

          public class JMXAgent {
          public JMXAgent() {
          //初始化JMX服務器
          }
          public void start() {
          //啟動JMX服務器
          }
          //在應用程序結束時調用
          public void stop() {
          //停止JMX服務器
          }
          }

            讓我們理解在該構造器的這部分代碼-它能夠使得客戶遠程地監控該應用程序。

            用MBeans創建一個MBeanServer

            我們首先創建一個MBeanServer對象。它是JMX基礎結構的核心組件,它允許我們暴露我們的MBeans作為可管理的對象。MBeanServerFactory.createMBeanServer(String)方法使得這一任務極為輕松。所提供的參數是服務器的域。可以把它當作這個MBeanServer的唯一的名字。然后,我們用MbeanServe來注冊LoginStatsMBean。MBeanServer.reGISterMBean(Object,ObjectName)方法使用的參數有兩個:一個是MBean實現的一個實例;另一個是類型ObjectName的一個對象-它用于唯一地標識該MBean;在這種情況下,DOMAIN+":name=LoginStats"就足夠了。

          MBeanServer server = MBeanServerFactory.createMBeanServer(DOMAIN);
          server.registerMBean(new LoginStats(),new ObjectName(DOMAIN+ ":name=LoginStats"));
          六、 創建JMXServiceURL

            到現在為止,我們已經創建了一個MBeanServer并且用它注冊了LoginStatsMBean。下一步是使得該服務器對客戶可用。為此,我們必須創建一個JMXServiceURL-它描述了客戶將用來存取該JMX服務的URL:

          JMXServiceURL url = new JMXServiceURL("rmi",null,
          Constants.MBEAN_SERVER_PORT,
          "/jndi/rmi://localhost:" +Constants.RMI_REGISTRY_PORT +"/jmxapp");

            讓我們細致地分析一下上面一行代碼。該JMXServiceURL構造器使用了四個參數:

            1. 在連接時使用的協議(rmi,jmxmp,iiop,等等)。

            2. JMX服務的主機。用localhost作為參數就足夠了。然而,提供null強制JMXServiceURL找到可能是最好的主機名。例如,在這種情況下,它將把null翻譯成zarar-這是我的計算機的名字。

            3. JMX服務使用的端口。

            4. 最后,我們必須提供URL路徑-它指示怎樣找到JMX服務。在這種情況下,它會是/jndi/rmi://localhost:1099/jmxapp。

            其中,/jndi部分是指,客戶必須為JMX服務做一下JNDI查詢。rmi://localhost:1099指示,存在一個運行于本機的端口1099的RMI注冊。這里的jmxapp是在RMI注冊中唯一標識這個JMX服務的。在JMXServiceURL對象上的一個toString()產生下列結果:

          service:jmx:rmi://zarar:9589/jndi/rmi://localhost:1100/jmxapp

            上面是客戶將最終使用來連接到該JMX服務的URL。J2SE 5.0文檔有關于這個URL結構的更為詳細的解釋。

            (一) 保護服務

            J2SE 5.0提供了一種有利于JMX用一種容易的方式進行用戶認證的機制。我創建了一個簡單的文本文件-它存儲用戶名和口令信息。文件的內容是:

          zarar siddiqi
          fyodor dostoevsky

            用戶zarar和fyodor被分別通過口令siddiqi和dostoevsky認證。下一步是創建并保護一個JMXConnectorServer,它暴露了該MbeanServer。username/password文件的路徑被存儲在該鍵下的一個映射中-jmx.remote.x.password.file。這個映射在以后創建JMXConnectorServer時使用。

          ServletContext context = Config.getServletContext();
          //得到存儲jmx用戶信息的文件
          String userFile =context.getRealPath("/")+"/Web-INF/classes/"+Constants.JMX_USERS_FILE;
          //創建authenticator并且初始化RMI服務器
          Map<string> env = new HashMap<string>();
          env.put("jmx.remote.x.password.file", userFile);
          現在,讓我們創建JMXConnectorServer。下面一行代碼完成這一功能:
          connectorServer = JMXConnectorServerFactory.
          newJMXConnectorServer(url, env, server);

            這個JMXConnectorServerFactory.newJMXConnectorServer(JMXServiceURL,Map,MBeanServer)方法使用我們剛創建的三個對象作為參數-它們是JMXServiceURL,存儲認證信息的映射和MBeanServer。其中,connectorServer實例變量允許我們分別在應用程序啟動和停止時,分別用start()和stop()來啟動和停止JMXConnectorServer。

            提示 盡管JSR 160的J2SE 5.0實現相當有力;但是另外的實現,例如MX4J,也提供了一些類-它們提供了方便的特性,例如口令混淆,也就是PasswordAuthenticator類。

            七、 啟動RMI注冊

            在早些時候,我提到RMI注冊并且指出當訪問服務時執行一個JNDI查詢。然而,現在我們沒有一個正運行的RMI注冊,因此一個JNDI查詢將失敗。一個RMI注冊的啟動可以用手工方式或編程方式來實現。

            (一) 使用命令行

            在你的WindowsLinux命令行上,輸入下列一名來啟動一個RMI注冊:

          rmiregistry &

            這將啟動你的默認主機和端口(分別是localhost和1109)的RMI注冊。然而,對于我們的web應用程序來說,我們不可能依賴一個在應用程序啟動時可用的RMI而寧愿用編程方式來實現之。

            (二) 以編程方式啟動RMI注冊

            為了以編程方式啟動RMI注冊,你可以使用LocateRegistry.createRegistry(int port)方法。該方法返回類型注冊的一個對象。當我們想在應用程序一端終止這個注冊時,我們保存這個參考。就在我們啟動我們的在JMXAgent.start()中的JMXConnectorServer之前,我們首先啟動RMI注冊,使用下列代碼行:

          registry = LocateRegistry.createRegistry(Constants.RMI_REGISTRY_PORT);

            在應用程序一端,在JMXAgent.stop()中停止JMXConnectorServer之后,調用下列方法來終止該注冊:

          UnicastRemoteObject.unexportObject(registry,true);

            注意,StartupListener類觸發了應用程序開始和結束任務。
          八、 訪問我們的JMX服務

            我們可以有好幾種方法來存取JSR 160服務。為此,我們可以通過編程或通過使用一個GUI來實現。

            (一) 使用MC4J連接

            通過把jmxapp.war復制到Tomcat的Webapps目錄來發布該應用程序。下載并且安裝MC4J。一旦安裝完,創建一新的類型JSR 160的服務器連接并且指定該服務器URL-它在應用程序啟動時在應用程序服務器日志中打印。在我的示例中,它是:

          service:jmx:rmi://zarar:9589/jndi/rmi://localhost:1100/jmxapp

            提供用戶名和口令,MC4J分別把它們參考為"Principle"和"Credentials"。點擊Next將把你帶到一個屏幕-在此你可以定制你的classpath。默認設置應該工作正常,并且你可以點擊"Finish"來連接到該JMX服務。一旦建立連接,瀏覽如圖1所示的MC4J樹結構,直到你找到LoginStats MBean實現的"Properties"選項。


          圖1.MC4J視圖

            點擊Properties顯示統計,如圖2所示:


          圖2.屬性窗口

            (二) 使用jManage連接到一個"簇"

            通過把jmxapp.war復制到Tomcat的webapps目錄發布該應用程序。請注意一下在應用程序啟動時所打印的URL。接下來,發布這個應用程序的另一個實例-通過改變Constants類中的RMI_REGISTRY_PORT并且MBEAN_SERVER_PORT變量,這樣該應用程序的第二個實例就不會試圖使用已經在使用的端口了。改變在build.XML文件中的app.name屬性,以便新的實例將被發布到一個不同的上下文(例如,jmxapp2)。用ant創建一個清理的war文件-它將在其目錄下創建jmxapp2.war。把jmxapp2.war復制到Tomcat的webapps目錄。該應用程序將要發布,而且現在你有相同應用程序的兩個實例在運行了。我再次提醒你注意在啟動時所打印的URL。

            下載和安裝jManage。一旦安裝了,使用jManage的web接口來創建一個JSR 160應用程序-通過使用主頁中的"添加新應用程序"鏈接。"添加應用程序"頁面顯示在圖3中:


          圖3."添加應用程序"頁面

            為要發布的第二個應用程序重復前面的步驟并再次使用適當的用戶名、口令和URL。。一旦你創建了這兩個應用程序,你必須通過遵循在主頁中找到的"添加新應用程序簇"鏈接來創建一個簇。現在,把這兩個已經創建的應用程序添加到你的簇上,如圖4所示:


          圖4.添加應用程序簇頁面


            好了,我們已經完成了!從主頁上,點擊簇中的一個應用程序,然后點擊"Find More Objects"按鈕。你將看到name=LoginStats MBean;點擊它,則你就會看到我們已經暴露的FailedLogins和SuccessLogins屬性。點擊在該同一頁面上的"Cluster View"鏈接將顯示與圖5相類似的一個頁面-其中,你可以看到兩個應用程序的運行計數統計:


          圖5.針對jmxapp和jmxapp2的簇視圖

            試著登錄到兩個應用程序(http://localhost:8080/jmxapp和http://localhost:8080/jmxapp2)并且觀察這些數字是怎樣改變的。

            九、 結論

            現在你已經知道了怎樣使你的新的和現有web應用程序支持JMX并且安全地管理它們-使用MC4J和jManage。盡管J2SE 5.0提供了JMX說明書的一個有力的實現,但是另外的開源工程例如XMOJO和MX4J還提供了另外的特征,例如經由web接口甚至更多的方式的連接。如果有興趣的讀者想了解更多地有關JMX的知識,你可以看一下J. Steven Perry寫的《Java Management Extensions》一書。如果你對遠程應用程序管理感興趣的話,Jeff Hanson寫的《Connecting JMX客戶and Servers》將是很有閱讀價值的,其中提供了許多真實世界的例子。

          posted @ 2008-01-20 01:47 礦礦 閱讀(239) | 評論 (0)編輯 收藏
                    J2SE 5.0中的Java.util.concurrent程序包提供了一個新的線程框架組件,這個框架組件處理了與建立、執行和管理線程相關的很多低層細節信息。在本文中我們將細致地了解一下它的重要特性。

            如果你使用C、C++或Java先前的版本進行多線程編程,就知道在代碼中管理線程是多么頭疼的事情。在單線程程序中,代碼中引起應用程序失敗的bug每次都在同一個點出現。但是在多線程程序中,只有某些原因遇到一起的時候才會出現失敗。由于預見可能引發應用程序失敗的所有條件是非常困難的,所以多線程編程是有挑戰性的。有些程序員從根本上避免這種挑戰,而另外一些--聰明的解決問題的人員--則一直坐在他們的計算機面前直到問題解決。

            J2SE 5.0平臺包含了一個新的并發工具程序包。這個程序包中的類替并發類(concurrent classe)或并發設計中使用的應用程序建立阻塞(blocking)。該并發工具包含下面一些內容:

            · 高性能的、靈活的線程池

            · 異步執行事務的框架組件

            · 為并發訪問優化過的集合類宿主(host)

            本文介紹了J2SE 5.0框架組件類和它們的重要特性。本文的下載代碼提供了一些簡單的、容易使用的示例,它演示了所有的新線程框架組件類。你在閱讀文章內容之后運行這些示例可以使自己對這些特性有更好的理解。

            Executor(執行器)框架組件

            Executor框架組件提供了一個簡單的、標準的、可擴充的類,它提供了一些有用的功能,如果沒有這些功能,我們要手工實現這些它們,會覺得十分單調和困難。該框架組件使調用、調度和執行的操作標準化了。它通過一組執行策略為控制異步事務提供了支持。

            Executor接口執行已提交的可以運行的事務。它提供了一條途徑,允許我們把事務提交從事務執行機制中分離出來。程序員通常使用Executor代替顯式地(explicitly)建立線程。Executor接口也提供事務的同步和異步執行。

            對于同步執行,使用下面的命令:

          Class MySynExecutor implements Executor{
           public void execute(Runnable r) {
            r.run();
           } 
          }

            對于異步執行,使用下面的命令:

          Class MyASynExecutor implements Executor{
           public void execute(Runnable r) {
            new Thread(r).start();
           }
          }

            ExecutorService(執行器服務)類

            ExecutorService類為管理一個或多個異步事務的終止和跟蹤事務執行的過程提供了方法。代碼下載中的MyExecutorService.java文件演示了管理事務終止的過程。它初始化了大小為三個的線程池,然后依次添加了線程。當線程的數量達到線程池的大小限制時,它調用關閉(shutdown)方法。在調用shutdown()方法之后,這個線程池不再接受新事務的執行。在等待十秒以后,該線程池調用shutDownNow()。這個方法會盡最大的努力來終止所有運行中的事務。在示例中,應用程序試圖終止運行中的線程失敗了。

            ScheduledExecutorService(調度執行器服務)

            ScheduledExecutorService類是我的最喜歡的類。它對于調度那些周期性執行的事務非常方便,而周期性執行的事務對于清除工作(例如清除你的應用程序建立的臨時文件等等)尤其有用。下載代碼中的MyScheduledExecutorService.java文件通過每五秒鐘發出"嘟嘟"一聲演示了調度的過程:

          final Runnable beeper = new Runnable() {
           public void run() { System.out.println("beep"); }
          };
          final ScheduledFuture beeperHandle =scheduler.scheduleAtFixedRate(beeper, 1, 5, SECONDS);
          posted @ 2008-01-20 01:43 礦礦 閱讀(2387) | 評論 (3)編輯 收藏
                  首先說一說進入計算機專業的目的,我個人是因為十分喜歡IT業,很喜歡折騰電腦,所以在填報志愿是毫不猶豫的在報了的所有的學校都填寫的計算機專業,夢想著進入計算機專業后能遇見很多高手,能交到幾個知己,誰之進來后卻大失所望。計算機專業的學生有很多以前對計算機不怎么了解,而且還有部分人進大學前連計算機摸都沒摸過,對計算機很熟悉的很少,高手更是鳳毛麟角,大多數人是服從了父母之命,顯而易見,目前社會最熱的行業是IT業,工資最高的也是IT業,抱著這個因素,大多數考生的父母都讓自己的孩子進入了計算機專業,而大多數學生也天真的認為從計算機專業畢業后就能夠像電視里演的大多數白領一樣每天只用坐在辦公室里和同事們聊聊天,和老板吃吃飯,每天簽幾個字然后就有高工資等著你去拿。

             進校后他們發現其實他們在專業課方面什么都聽不懂,自己也一點興趣都沒有,沒有興趣那就沒有學習的動力,而且這個專業是要靠悟性的,而興趣是培養悟性的第一步,然后他們會發現越往后學專業課越難,也越聽不懂,好一點的就會狠下心來,硬著頭皮苦學一通,有可能也就能走出一片路來,而不好的就會就此放棄,只需要混著考試通過,混畢業,找個單位安心上班。有些人上了幾年學連自己上哪些課都不知道;拿個程序他分不清是用C語言寫的還是用PASCAL寫的;不小心進了DOS不知道怎么再回到WINDOWS。但說起游戲來頭頭是道,好像每個都是職業玩家一樣,有的每天只知道泡在網吧。這就是中國計算機人才下一代的悲哀!

             再說現在計算機專業大學生的學習和生活。大多數計算機專業的學生對本專業的發展及前景一無所知,每天都是看小說、玩游戲、看電影、打牌、喝酒、睡覺等等很有"前途"的事情。偶爾看見一兩個同學看看與計算機專業有關的書,跑去拿來一看,全是什么"游戲攻略"、"黑客秘技"等此類書籍。還有的人連C語言和C++誰是誰都還沒搞清楚,就拿本VC的書"刻苦鉆研",真不知他們看懂了沒有。好多學生都買了電腦,但用處都是游戲機+碟機+音響,每天都在用電腦玩著各種流行的游戲、看著最新的大片、聽著時尚的音樂,就是不用電腦學習。有的學生甚至問我電腦除了玩游戲還能干什么,我問他你為什么這么問,他告訴我他覺得電腦只能用來玩游戲,不知道還能不能干干別的什么。據我了解,近幾年在國內好幾所高校的計算機專業的畢業生的畢業設計竟然是做網頁,在大學了四年,學完了《數據結構》、《軟件工程》、《C語言》等專業課后,竟然交了一個沒有學過計算機的人自學一兩天就能做好的東西!

            這就是大多數計算機專業的學生,在我在大學玩了兩年之后,我突然明白該為自己的未來打算打算了,但還有許多人仍然還什么都不明白,所以就有了這篇文章。
          如果你是以上我說的那種受父母之命來學計算機的學生,如果你看了《計算機應用文摘》第15期的《寫給想當程序員的朋友》一文后,發現自己沒有當程序員的欲望,那么我這里有幾條路給你選擇:
          1、**頁制作,將來去網站工作!
          2、學習3D MAX等軟件,去作動畫!
          3、學習美術設計!
          4、網絡,將來考個CCNA,去專業組網!
          5、在保證能順利畢業的前提下,去瘋狂玩游戲,做個職業玩家或做一個或幾個網絡游戲的GM。(我身邊就有這樣的人)
          6、以上五條都與計算機有關,要有一定的專業知識,但比起你的專業課簡單多了。如果你看到這里還不覺得有適合你干的,那這條最適合你:在你們學校去修雙學位,修一個自己感興趣的專業,計算機真的不適合你!
          如果以上幾條有適合你的,那么你就努力去做適合你的那一片天地,去看雜志的下一篇文章,下面的文字你看了只會浪費你的時間。


             如果你是計算機專業的在校大學生,而且想當軟件設計師,那么請往下看:
          1、大學生活豐富多彩,會令你一生都難忘,但難忘有很多種,你可以學了很多東西而難忘,也會因為什么都沒學到而難忘!
          2、計算機專業是一個很枯燥的專業,但即來之、則安之,只要你努力學,也會發現其中的樂趣的。
          3、記住:萬丈高樓平地起!基礎很重要,尤其是專業基礎課,只有打好基礎才能學得更深。
          4、C語言是基礎,很重要,如果你不學好C語言,那么什么高級語言你都學不好。
          5、C語言與C++語言是兩回事。就象大熊貓和小熊貓一樣,只是名字很像!
          6、請先學習專業課《數據結構》、《計算機組成原理》,不要剛開始就拿著一本VC在看,你連面向對象都搞不清楚,看VC沒有任何用處。
          7、對編程有一定的認識后,就可以學習C++了。(是C++而不是VC,這兩個也是兩碼事!C++是一門語言,而VC教程則是講解如何使用MFC類庫,學習VC應建立在充分了解C++的基礎之上。看VC的書,是學不了C++語言的。)
          8、學習編程的秘訣是:編程,編程,再編程;
          9、認真學習每一門專業課,那是你的吃飯碗。
          10、在學校的實驗室就算你做錯一萬次程序都不會有人罵你,如果你在公司你試試看!所以多去實驗室上機,現在錯的多了,畢業后就錯的少了。
          11、從現在開始,在寫程序時就要養成良好的習慣。
          12、不要漏掉書中任何一個練習題--請全部做完并記錄下解題思路。
          13、你會買好多參考書,那么請把書上的程序例子親手輸入到電腦上實踐,即使配套光盤中有源代碼。
          14、VC、C#、.NET這些東西都會過時,不會過時的是數據結構和優秀的算法!
          15、記住:書到用時方恨少。不要讓這種事發生在你身上,在學校你有充足的時間和條件讀書,多讀書,如果有條件多讀原版書,你要知道,當一個翻譯者翻譯一本書時,他會不知不覺把他的理念寫進書中,那本書就會變得像雞肋!
          16、我還是強調認真聽專業課,因為有些課像《數據結構》、《編譯原理》、《操作系統》等等,這種課老師講一分鐘能讓你明白的內容,你自己看要看好幾個月,有的甚至看了好幾年都看不明白。
          17、抓住在學校里的各種實踐的機會,要為自己積累經驗,就業時經驗比什么都有用。
          18、多去圖書館,每個學校的圖書館都有很多好書等你去看!
          19、編程不是技術活,而是體力活。
          20、如果你決定了要當一個好的軟件設計師,那么請你放棄游戲,除非你是那種每天只要玩游戲就能寫出好程序的天才!
          21、你要有足夠的韌性和毅力!有個高手出了一道題測試你的韌性和毅力:找個10000以內的素數表,把它們全都抄下來,然后再檢查三遍,如果能夠不間斷地完成這一工作,你就可以滿足這一條。
          22、找到只屬于你自己的學習方法!不要盲目的追隨別人的方法,適合自己的才是最好的!
          23、請熱愛軟件設計這項工作!
          以上的話有些是我的經驗,有些是我從高手那里直接COPY來的,但他們都很有用,記住他們,并遵守他們,那你們一定會成功!

             對于大多數初學者來說,好多人有這種問題存在:我到底先學什么?學C/C++?還是學VC?還是學Borland C++ Builder呢?還是Delphi?哪一個更好呢?學習程序設計和學習程序設計語言究竟是怎么一個關系?初學者究竟應該如何取舍呢?就這些問題,我從一個高手那里看了一下的這段話,可以幫助在這方面有問題的人:學習程序設計就好比學習射擊,而程序設計語言就對應射擊中的氣槍、手槍、步槍等各種槍械。學習射擊必須要選擇一種槍械,不可能沒有槍還能學好射擊的,也不可能同時學會使用所有的槍械。但是,如果掌握一種槍械的射擊,再學別的也就觸類旁通了。因為在熟悉一種槍械的同時,也學習了射擊技術本身。再學其他的,自然事半功倍。學習程序設計也是一樣,必然要從學習一門程序設計語言開始入手。在學會系統的編程理念之后,用什么工具都一樣!

             之所以寫這篇文章呢是因為自己眼看身邊那么多的同學一個個都"不務正業",荒廢了學業,心急如焚,自己也荒廢了好幾年,眼看微軟的Windows從3.X到現在的2003 Server,而中國的軟件業還是在原地踏步,難道我們真要每年等微軟給他的操作系統換一次名字,我們給他交一次錢嗎?這么大的利潤為什么不留給我們自己,為什么不讓別的國家給我們交錢呢?這是廣大中國軟件工程師的一個共同的夢,要實現這個夢的人是現在還在大學里的"軟件設計師"們,他們是中國軟件明天的希望!希望廣大計算機業的大學生看到這篇文章后,睡覺的能醒來,玩游戲的能停下來,在網吧的能出來,一起拿起課本,坐在電腦前,用程序寫出中國軟件業明天的輝煌!

          附: 雖然非常的現實,對有些同學來說有點殘酷,但是的是一針見血!!!!! 
          posted @ 2008-01-20 01:38 礦礦 閱讀(459) | 評論 (1)編輯 收藏
          前段時間考過了SUN CERTIFIED JAVA PROGRAMMER ,考完后一直很忙,現在閑下來,和大家分享一下考試的經驗 。

            1 ) JAVA 2 PLAT FORM 考試科目是310-025 ,有59題,及格線是61%,即答對36題。考試時間是90 分鐘。特別令人厭惡的是考試前有個AGREEMENT,連你讀它的時間也被計算在內。小弟開始不知道,還在慢慢讀,突然發現已經用了3分鐘,趕緊開始作題。估計 AGREEMENT 沒有什么重要的東西,可以直接跳過。時間勉強夠用,我大概花了60分鐘作完題,剩下20多分鐘檢查,居然又給我發現了3-5 題錯誤,都是一時疏忽,落入題目設下的圈套,所以一定要留時間檢查。可惜我剩下10 題左右沒有時間檢查 。

            2)考試范圍非常窄。基本上都是基本語言知識,象SWING,JSP,SERVLET,JDBC,BEANS等等都不涉及。大家可以到SUN 網站上下載考試大綱。考試范圍窄不意味著容易,相反,一些很基本的東西被翻來覆去,變著花樣考,反而更難 。

            3)考試只有選擇題,包括單選和復選。多數復選題明確指明有幾個答案,不會搞錯。

            4)印象中幾乎所有的考題都涉及2-3個以上的知識點,幾乎沒有可以一眼就看出答案的題目。70%的考題是給你一段程序,然后問運行結果變量的值。這種題目非常容易落入陷阱,一不小心就被費了。還有20%的題目是給你幾個陳述句,選正確的。這些陳述句都是考很偏很偏的東西,也不太好答。基本上我的經驗是:如果一個題目馬上能看出答案,請你在仔細研究一下題目,多數情況是你落入陷阱了。如果一個題目你能很明確的看出來他要考你什么知識點,那這個題目就完成一半了。最慘的是知道題目要考你什么,但是忘記了或沒有復習相關知識細節,只好胡猜答案了。

            5)考試的一個重點是INNER CLASS。印象中一半以上的題目和他有關。都是大CLASS套小CLASS 等。我復習時花了很多時間在這上面,以為自己很懂了,結果考試是還是有問題。一定要透徹理解相關定義,語法,特別是各種各樣的MODIFIER 的用法。有很多很特殊的MODIFER 規則。這些規則一定要熟練掌握并牢記在心。

            6)考試的另一個重點是循環語句。我考,我自以為對循環控制語句很熟悉了,結果考試考一些很偏很特別的用法,雖然慢慢作都能作出來,但浪費太多時間在這上面,實在可惜。大家好好看看書。

            7)其它的象:CASTING ,IO ,LAYOUT ,EVEN HANDLING,AWT,THREAD,GARBAGECOLLECTION,MATH CLASS 等等,都有若干考題。

            8)考試題目幾乎完全不體現實際應用。如果我有一個JAVA 編譯器在身邊,幾乎所有的考題都可以輕松解決。我感覺SUN 希望考生能象JAVA 編譯器一樣熟悉JAVA 的特殊語法和特殊規則。這實際是完全沒有必要的。

            9)我收集了很多模擬考題和BRAINDUMP ,有近千題。奇怪的是只有不到10 題出現在考試中,看來SUN 的考試題庫實行的可能是動態題庫,考背BRAINDUMP 是沒有什么希望通過了。而且程序考題只有稍微改動一個符號,結果就完全不同,BRAINDUMP 很多題目靠不住。所以大家一定要在一定實際經驗的基礎上,好好看透一本輔導書,多作題,多分析題,多思考,才能比較容易通過考試。

            10)不管大家如何評價認證考試,反正考多幾個證書不是壞事。起碼加薪找工比較方便。 I have:SCJP, MCSE, MCSD, MCDBA, MCSE+Internet.haha...It is better than nothing.Don't trust the people who sell SCJP questions online!It is very useless and a lot of errors!Work on your own experience!

          posted @ 2008-01-20 01:32 礦礦 閱讀(342) | 評論 (1)編輯 收藏
          1.OOP中唯一關系的是對象的接口是什么,就像計算機的銷售商她不管電源內部結構是怎樣的,他只關系能否給你提供電就行了,也就是只要知道can or not而不是how and why.所有的程序是由一定的屬性和行為對象組成的,不同的對象的訪問通過函數調用來完成,對象間所有的交流都是通過方法調用,通過對封裝對象數據,很大限度上提高復用率。

          2.OOP中最重要的思想是類,類是模板是藍圖,從類中構造一個對象,即創建了這個類的一個實例(instance)。

          3.封裝:就是把數據和行為結合起在一個包中)并對對象使用者隱藏數據的實現過程,一個對象中的數據叫他的實例字段(instance field)。

          4.通過擴展一個類來獲得一個新類叫繼承(inheritance),而所有的類都是由Object根超類擴展而得,根超類下文會做介紹。

          5.對象的3個主要特性

          behavior---說明這個對象能做什么

          state---當對象施加方法時對象的反映

          dentity---與其他相似行為對象的區分標志

          每個對象有唯一的indentity 而這3者之間相互影響。

          6.類之間的關系

          use-a:依賴關系

          has-a:聚合關系

          is-a:繼承關系--例:A類繼承了B類,此時A類不僅有了B類的方法,還有其自己的方法.(個性存在于共性中)。

          7.構造對象使用構造器:構造器的提出,構造器是一種特殊的方法,構造對象并對其初始化。

          例:Data類的構造器叫Data

          new Data()---構造一個新對象,且初始化當前時間。

          Data happyday=new Data()---把一個對象賦值給一個變量happyday,從而使該對象能夠多次使用,此處要聲明的使變量與對象變量二者是不同的.new返回的值是一個引用。

          構造器特點:構造器可以有0個,一個或多個參數

          構造器和類有相同的名字

          一個類可以有多個構造器

          構造器沒有返回值

          構造器總是和new運算符一起使用

          8.重載:當多個方法具有相同的名字而含有不同的參數時,便發生重載.編譯器必須挑選出調用哪個方法。

          9.包(package)Java允許把一個或多個類收集在一起成為一組,稱作包,以便于組織任務,標準Java庫分為許多包.java.lang java.util java,net等,包是分層次的所有的java包都在java和javax包層次內。

          10.繼承思想:允許在已經存在的類的基礎上構建新的類,當你繼承一個已經存在的類時,那么你就復用了這個類的方法和字段,同時你可以在新類中添加新的方法和字段。

          11.擴展類:擴展類充分體現了is-a的繼承關系. 形式為:class (子類) extends (基類)。

          12.多態:在java中,對象變量是多態的.而java中不支持多重繼承。

          13.動態綁定:調用對象方法的機制。

          (1)編譯器檢查對象聲明的類型和方法名。

          (2)編譯器檢查方法調用的參數類型。

          (3)靜態綁定:若方法類型為priavte static final 編譯器會準確知道該調用哪個方法。

          (4)當程序運行并且使用動態綁定來調用一個方法時,那么虛擬機必須調用x所指向的對象的實際類型相匹配的方法版本。

          (5)動態綁定:是很重要的特性,它能使程序變得可擴展而不需要重編譯已存代碼。

          14.final類:為防止他人從你的類上派生新類,此類是不可擴展的。

          15.動態調用比靜態調用花費的時間要長。

          16.抽象類:規定一個或多個抽象方法的類本身必須定義為abstract。

          例:public abstract string getDescripition

          17.Java中的每一個類都是從Object類擴展而來的。

          18.object類中的equal和toString方法。
          equal用于測試一個對象是否同另一個對象相等。
          toString返回一個代表該對象的字符串,幾乎每一個類都會重載該方法,以便返回當前狀態的正確表示.
          (toString 方法是一個很重要的方法)
          19.通用編程:任何類類型的所有值都可以同object類性的變量來代替。
          20.數組列表:ArrayList動態數組列表,是一個類庫,定義在java.uitl包中,可自動調節數組的大小。
          21.class類 object類中的getclass方法返回ckass類型的一個實例,程序啟動時包含在main方法的類會被加載,虛擬機要加載他需要的所有類,每一個加載的類都要加載它需要的類。
          22.class類為編寫可動態操縱java代碼的程序提供了強大的功能反射,這項功能為JavaBeans特別有用,使用反射Java能支持VB程序員習慣使用的工具。
          能夠分析類能力的程序叫反射器,Java中提供此功能的包叫Java.lang.reflect反射機制十分強大.
          1.在運行時分析類的能力。
          2.在運行時探察類的對象。
          3.實現通用數組操縱代碼。
          4.提供方法對象。

          而此機制主要針對是工具者而不是應用及程序。
          反射機制中的最重要的部分是允許你檢查類的結構.用到的API有:
          java.lang.reflect.Field 返回字段
          java.reflect.Method 返回方法.
          java.lang.reflect.Constructor 返回參數

          方法指針:java沒有方法指針,把一個方法的地址傳給另一個方法,可以在后面調用它,而接口是更好的解決方案。
          23.接口(Interface)說明類該做什么而不指定如何去做,一個類可以實現一個或多個interface。
          24.接口不是一個類,而是對符合接口要求的類的一套規范。
          若實現一個接口需要2個步驟:
          1.聲明類需要實現的指定接口。
          2.提供接口中的所有方法的定義。
          聲明一個類實現一個接口需要使用implements 關鍵字

          class actionB implements Comparable 其actionb需要提供CompareTo方法,接口不是類,不能用new實例化一個接口。
          25.一個類只有一個超類,但一個類能實現多個接口。Java中的一個重要接口:Cloneable

          26.接口和回調.編程一個常用的模式是回調模式,在這種模式中你可以指定當一個特定時間發生時回調對象上的方法。
          例:ActionListener 接口監聽
          類似的API有:java.swing.JOptionPane
          java.swing.Timer
          java.awt.Tookit
          27.對象clone:clone方法是object一個保護方法,這意味著你的代碼不能簡單的調用它。

          28.內部類:一個內部類的定義是定義在另一個內部的類。

          原因是:

          1.一個內部類的對象能夠訪問創建它的對象的實現,包括私有數據。
          2.對于同一個包中的其他類來說,內部類能夠隱藏起來。
          3.匿名內部類可以很方便的定義回調。
          4.使用內部類可以非常方便的編寫事件驅動程序。
          29.代理類(proxy):
          1.指定接口要求所有代碼
          2.object類定義的所有的方法(toString equals)
          30.數據類型:Java是強調類型的語言,每個變量都必須先申明它都類型,java中總共有8個基本類型.4種是整型,2種是浮點型,一種是字符型,被用于Unicode編碼中的字符,布爾型。
           
          posted @ 2008-01-08 04:02 礦礦 閱讀(255) | 評論 (1)編輯 收藏
          由基本概念開始全面認識Java

          Java應該怎么學?Java能做什么?什么是Applet?什么是Servlet、Jsp、EJB?還有Webspere、Weblogic又是做什么的等等。之所以學員會有這些疑問,是因為大家普遍對Java相關概念聽說的太多而了解的又相對少的緣故。

          學通Java語言需要一個過程,所有Java相關的概念都會在學習的過程中逐漸變得清昕。這個過程的開始就是要先學會標準的Java技術(J2SE),然后是學Java的簡單Web運用,然后分布式運用,再以后對Java的移動技術運用就很容易理解了。

          以下是Java標準技術的一些要點:

          一、Java的跨平臺性,即一次編譯到處運行

          簡單地說Java的跨平臺性就是指,編譯后的Java程序可直接在不同的平臺上運行而不用重新編譯,這一特性使得Java隨著Web應用的普及而迅速普及起來。而Java的跨平臺性是如何實現的呢?這就要理解Java虛擬機和字節碼的概念。

          實際上,編譯后的Java代碼并不是傳統的二進制代碼(如Windows下的.exe文件),而是Java字節碼,這種字節碼文件是不能直接在操作系統上執行的。要想在一個操作系統上運行一個Java程序必須有一個中間環節來負責將Java字節碼解釋成二進制碼,這個中間環節就是Java虛擬機(簡稱JVM)。由于目前大多數操作系統已經實現了JVM,所以Java輕松實現跨平臺性。

          二、面象對象技術

          Java全面支持面象對象技術,這體現在Class(類)是Java程序構成的基本單元,一個Java程序通常由許多Class組成,而且這些Class還會有一定的繼承關系,Java支持Class的單繼承,從而使類之間的繼承關系更明確。繼承的結果產生類的多態性,類的多態本質上講就是可以用父類的引用訪問繼承類的實現(子類對象),類的這種多態性最終形成了組件對象模型的基礎,即通過接口(父類)訪問實現(子類)。

          三、Java中的I/O操作

          Java中以字節流(InputStream和OutputStream)、節符流(Reader和Writer)來分別讀寫二進制數據和字符數據,使用非常簡單有效。Java類庫中的File類不僅提供文件操作而且還包含文件夾操作,如下面這幾行代碼可以列出C盤根目錄下的所有文件:

          File f=new File("c://");

          String [] m_dir= f.list();

          for(int i=0;iSystem.out.println(m_dir[i]);

          四、Java中的圖形及事件處理

          可以用awt包或swing包的Java類來進行大部分的Java圖形界面設計,下面的幾行代碼將產生一個200*200像素的窗體:

          Frame f=new Frame("Welcome");f.setSize(200,200);f.setVisible(true);


          默認情況下,Frame窗體的關閉按鈕不起作用,這也是Java初學者迷惑的地方。為了使用戶按下關閉按鈕時能關閉Frame窗體,需要讓這個窗體響應一個WindowEvent事件,具體的做法就是給這個窗體添加一個事件監聽器對象,這個事件監聽器就是WindowListener接口的實現。在上面的代碼中插入如下代碼就可以關閉窗體:

          f.addWindowListener(new WindowAdapter(){public void windowClosing(WindowEvent e){System.exit(0);}}


          這里用到一個無名內部類,無名內部類是Java中內部類的一種靈活運用方式。

          五、Java中線程及同步控制

          線程概念的引入是為了實現并行處理,從而提高程序的效率。Java中的線程實現非常簡單,可以用兩種方式來創建線程,一種是實現Runnable接口,另一種是繼承Thread類重寫run()方法。兩種方式唯一的不同就是前者保留了繼承一個類的可能(因為Java只支持類的單繼承,但接口沒有此限制)。

          永遠都用start()方法來啟動一個線程,線程類中的run()可以被直接調用,但決不是啟動一個線程,二者有著本質的區別。

          用同步控制關鍵字synchronized來保護線程敏感數據,synchronized塊中的內容可以保證同一時刻只能被一個線程訪問,所以其中的數據是線程安全的。

          用Object類中的wait()和notify()方法可以實現線程間交互,但要記住wait()和notify()方法只有發生在同一個對象上才能真正實現線程間交互。被某一對象wait()方法阻塞的線程需要另外一個調用了同一對象notify()的線程干預才能恢復運行。notify()方法一次喚醒一個被wait()方法阻塞的線程,notifyAll()方法可以一次喚醒所有被wait()方法阻塞的線程。

          六、Java本地方法(native方法)的實現

          Java不是完美的,Java的不足除了體現在運行速度上要比傳統的C++慢許多之外,Java無法直接訪問到操作系統底層(如系統硬件等),為此Java使用native方法來擴展Java程序的功能。

          可以將native方法比作Java程序同C程序的接口,其實現步驟:

          1、Java中聲明native()方法,然后編譯;
          2、用javah產生一個.h文件;
          3、寫一個.cpp文件實現native導出方法,其中需要包含第二步產生的.h文件(注意其中又包含了JDK帶的jni.h文件);
          4、將第三步的.cpp文件編譯成動態鏈接庫文件;
          5、在Java中用System.loadLibrary()方法加載第四步產生的動態鏈接庫文件,這個native()方法就可以在Java中被訪問了。

          上述所提及的一些Java技術具有一定的普遍性,它們基本上是在Java各個方面的運用中都需要掌握的術。實際上Java的運用非常廣泛,而且每個方面都需要遵循不同的規范。以下是對Java應用的簡要介紹。
          (一)理解Java SDK的三個版本:
          Java SDK Micro Edition (J2ME)
          用于開發掌上電腦、手機等移動通信設備上使用的應用程序。并不是所有的移動設備都支持Java,只有具備J2ME運行環境(JVM+J2ME API)的設備才能運行Java程序。J2ME的集成開發工具(通常都有帶有一些訪真器)有 Sun 的J2ME Wireless Toolkit 、IBM的Visul Age Micro Edition 等。
          Java SDK Standard Edition(J2SE)
          主要用于開發一般臺式機應用程序。我們平時所說的JDK就指J2SE,而我們學Java就是從學習J2SE開始的。
          Java SDK Enterprise Edition (J2EE)
          用于開發分布式的企業級大型應用程序。其中的核心是Entetprise Java Beans(EJB,分布式Java組件)的開發。
          (二)Java小程序 (Applet)
          Java小程序是一個繼承了Applet類并重寫了init()、paint()、stop()等方法的的Java類,它被布署在Web服務器(如IIS)上,當客戶端請求Web頁時,瀏覽器從Web服務器上將其下載到本地客戶端,然后,瀏覽器創建該Applet類的實例并調用其init()方法,從安全角度考慮,Applet沒有訪問本地文件的權限。由于Applet是被瀏覽器執行的,所以Applet不需要一個main()方法。實際上,除了Java Application之外,所有其它Java應用都不需要一個main()方法。
          (三)服務器端Java小程序 (Servlet)
          Servlet也是一個Java類,和Applet形成對比,Servlet是運行于服務器端的Java小程序,而且Servlet需要一個單獨的Web服務器(如Tomcat)做容器。除此之外,Servlet中用到的一些類(如HttpServlet)并不包含在J2SE API中,所以需要將Servlet.jar(在Tomcat的common\lib文件夾下)加到環境變量中去。下面是一個簡單的Servlet例子:

          public class Myservlet extends HttpServlet{ public void doGet(HttpServletRequest request,HttpServletResponse response){try{response.setContentType("text/html");PrintWriter out=response.getWriter();out.println("");out.println("");out.println("Hello world");out.println("");out.println("");}catch(IOException e){}}}


          將這個Class文件編譯后放至Tomcat\webapps\examples\WEB-INF\classes下,然后在瀏覽器地址欄里輸入http://127.0.0.1:8080/examples/servlet/Myservlet即可看到 Hello world出現在瀏覽器中。
          (四)Java Server Page (JSP)
          同Servlet相似的是,JSP運行于Web服務器端,并且也需要Tomcat之類的容器。不同的是,由于JSP是將Java代碼嵌在html標記里(同ASP一樣用),JSP的界面設計同后臺開發人員的工作可以有效分離。可以想像讓開發人員用Servlet寫一個花捎的Web頁面有多困難,所以JSP+Servlet混合Web應用是比較理想的選擇。
          看起來JSP同ASP的實現機制大同小異,其實也存在著本質的區別。所有的ASP頁面都是解釋運行的,而JSP頁在第一次被請求時會被編譯,再以后的客戶請求都是直接運行服務器上的.class文件(在Tomcat的Work文件夾下),所以JSP要比ASP速度上快許多。
          (五)Java Beans
          Java Bean 是可復用的組件,對Java Bean并沒有嚴格的規范,理論上講,任何一個Java類都可以是一個Bean。但通常情況下,由于Java Bean是被容器所創建(如Tomcat)的,所以Java Bean應具有一個無參的構造器,另外,通常Java Bean還要實現Serializable接口用于實現Bean的持久性。
          (六)Enterprise Java Beans (EJB)
          Java Bean實際上相當于微軟COM模型中的本地進程內COM組件,它是不能被跨進程訪問的。Enterprise Java Bean 相當于DCOM,即分布式組件。它是基于Java的遠程方法調用(RMI)技術的,所以EJB可以被遠程訪問(跨進程、跨計算機)。但EJB必須被布署在諸如Webspere、WebLogic這樣的容器中,EJB客戶從不直接訪問真正的EJB組件,而是通過其容器訪問。EJB容器是EJB組件的代理,EJB組件由容器所創建和管理。客戶通過容器來訪問真正的EJB組件。
          這種模型很像COM+管理器,其實EJB容器正是起到COM+管理器的作用,只是EJB組件相對COM組件來說更易用、更安全。
          總的說來,Java作為面象對象技術的一個代表,在當今商業應用中更容易開發出高效的、多層的分布式應用程序,而且,由于Java技術有很強的健壯性和易用性,加上同UML應用的結合,開發一個商業應用軟件的周期會大大縮短,所以Java會有不錯的前景。

           

          ------------------
          posted @ 2008-01-08 04:01 礦礦 閱讀(217) | 評論 (0)編輯 收藏
          僅列出標題
          共4頁: 上一頁 1 2 3 4 
          主站蜘蛛池模板: 通道| 铁岭市| 若尔盖县| 巴彦淖尔市| 定安县| 内黄县| 阿瓦提县| 会泽县| 新河县| 邛崃市| 霍城县| 荥阳市| 宜昌市| 美姑县| 柯坪县| 喀喇| 白银市| 明水县| 铜山县| 吉安市| 灌云县| 寿阳县| 射洪县| 龙泉市| 大埔区| 南郑县| 马山县| 木兰县| 西畴县| 济宁市| 天气| 昭平县| 怀柔区| 随州市| 凤山市| 新绛县| 荥阳市| 宜昌市| 隆昌县| 思南县| 思茅市|