俊星的BLOG

          #

          HTTP Client及HTTPS初探

          HTTP Client是一個(gè)客戶端HTTP協(xié)議的類(lèi)庫(kù)
          1、首先是下載APACHE HTTP CLIENT相關(guān)的JAR,目前我引入到工程中的相關(guān)文件時(shí):
          httpclient-4.0.3.jar
          httpcore-4.0.1.jar
          httpmime-4.0.3.jar
          commons-codec-1.4.jar
          commons-logging-1.1.1.jar

          JAR包之前的引用關(guān)系在README等相關(guān)說(shuō)明中已有。

          2、下載并運(yùn)行TOMCAT,我下載的是TOMCAT6(對(duì)應(yīng)的是JDK5),主要注意的是需要配置CATALINA_HOME這個(gè)環(huán)境變量。

          3、制作服務(wù)器端證書(shū),下面是我一個(gè)示例:
          C:\Documents and Settings\dingjunxing>keytool -genkey -alias tomcat3 -keystore F
          :\eclipse\workspace\httpc\tomcat3.keystore
          輸入keystore密碼:  
          123456
          您的名字與姓氏是什么?
            [Unknown]:  localhost
          您的組織單位名稱(chēng)是什么?
            [Unknown]:  sz
          您的組織名稱(chēng)是什么?
            [Unknown]:  sz
          您所在的城市或區(qū)域名稱(chēng)是什么?
            [Unknown]:  shenzhen
          您所在的州或省份名稱(chēng)是什么?
            [Unknown]:  guangdong
          該單位的兩字母國(guó)家代碼是什么
            [Unknown]:  cn
          CN
          =localhost, OU=sz, O=sz, L=shenzhen, ST=guangdong, C=cn 正確嗎?
            [否]:  y
          輸入
          <tomcat3>的主密碼
                  (如果和 keystore 密碼相同,按回車(chē)):  
          123456

          4、根據(jù)服務(wù)器證書(shū)導(dǎo)出客戶端證書(shū),有兩種方式,一種為采用IE,下面提供一個(gè)利用KEY TOOL導(dǎo)出的方式:
          keytool -export -file tomcat3.cert -alias tomcat3 -keystore F:\eclipse\workspace\httpc\tomcat3.keystore
          注意:上面命令行必須進(jìn)入到
          %java_home%/jre/lib/security中。

          5、將獲取到的客戶端證書(shū)導(dǎo)入:
          C:\Program Files\Java\jdk1.5.0_15\jre\lib\security>keytool -import -keystore cac
          erts 
          -file F:\eclipse\workspace\httpc\tomcat3.cert
          輸入keystore密碼:  
          123456
          Owner: CN
          =localhost, OU=sz, O=sz, L=shenzhen, ST=guangdong, C=cn
          發(fā)照者: CN
          =localhost, OU=sz, O=sz, L=shenzhen, ST=guangdong, C=cn
          序號(hào): 4cc55438
          有效期間: Mon Oct 
          25 17:56:08 CST 2010 至: Sun Jan 23 17:56:08 CST 2011
          認(rèn)證指紋:
                   MD5:  E4:2E:BE:AC:A1:5D:E0:
          95:C7:95:93:BF:B3:F3:EE:5E
                   SHA1: F8:9A:BB:FA:C8:C5:8A:D2:FA:
          98:A1:95:64:65:42:9A:8F:0B:4A:7D
          信任這個(gè)認(rèn)證? [否]:  y
          認(rèn)證已添加至keystore中

          6、TOMCAT中相關(guān)設(shè)置,主要是修改CATALINA_HOME下的conf/server.xml,在其中添加如下一個(gè)連接器:
          <Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol" SSLEnabled="true"
                         maxThreads
          ="150" scheme="https" secure="true"
                         clientAuth
          ="false" sslProtocol="TLS" keystoreFile="F:\eclipse\workspace\httpc\tomcat3.keystore" keystorePass="123456"/>    

          7、運(yùn)行相關(guān)代碼:
          package org.apache.http.examples.client;

          import java.io.File;
          import java.io.FileInputStream;
          import java.security.KeyStore;

          import org.apache.http.HttpEntity;
          import org.apache.http.HttpResponse;
          import org.apache.http.client.methods.HttpGet;
          import org.apache.http.conn.scheme.Scheme;
          import org.apache.http.conn.ssl.SSLSocketFactory;
          import org.apache.http.impl.client.DefaultHttpClient;

          /**
           * This example demonstrates how to create secure connections with a custom SSL
           * context.
           
          */
          public class ClientCustomSSL {

              
          public static void main(String[] args) throws Exception {
                  DefaultHttpClient httpclient 
          = new DefaultHttpClient();

                  KeyStore trustStore 
          = KeyStore.getInstance(KeyStore.getDefaultType());
                  FileInputStream instream 
          = new FileInputStream(new File("tomcat3.keystore"));
                  
          try {
                      trustStore.load(instream, 
          "123456".toCharArray());
                  } 
          finally {
                      instream.close();
                  }

                  SSLSocketFactory socketFactory 
          = new SSLSocketFactory(trustStore);
                  Scheme sch 
          = new Scheme("https", socketFactory, 8443);
                  httpclient.getConnectionManager().getSchemeRegistry().register(sch);

                  HttpGet httpget 
          = new HttpGet("https://localhost:8443/docs");

                  System.out.println(
          "executing request" + httpget.getRequestLine());

                  HttpResponse response 
          = httpclient.execute(httpget);
                  HttpEntity entity 
          = response.getEntity();

                  System.out.println(
          "----------------------------------------");
                  System.out.println(response.getStatusLine());
                  
          if (entity != null) {
                      System.out.println(
          "Response content length: " + entity.getContentLength());
                  }
                  
          if (entity != null) {
                      entity.consumeContent();
                  }

                  
          // When HttpClient instance is no longer needed,
                  
          // shut down the connection manager to ensure
                  
          // immediate deallocation of all system resources
                  httpclient.getConnectionManager().shutdown();
              }

          }
          運(yùn)行結(jié)果正常,當(dāng)然也可以通過(guò)在瀏覽器中輸入“https://localhost:8443/”的方式進(jìn)行訪問(wèn)。

          posted @ 2010-10-25 20:13 俊星 閱讀(1993) | 評(píng)論 (2)編輯 收藏

          CAS認(rèn)證初探

          在網(wǎng)上找到一份比較老的參考文檔:http://www.ibm.com/developerworks/cn/webservices/ws-casestudy/part4/

          1、列舉出來(lái)其需要的幾項(xiàng)功能:

          該服務(wù)主要需要具備三項(xiàng)功能:

          1. 用戶注冊(cè):用戶在統(tǒng)一身份認(rèn)證服務(wù)中注冊(cè)帳號(hào),以后這個(gè)帳號(hào)可以在所有使用統(tǒng)一身份認(rèn)證服務(wù)的應(yīng)用系統(tǒng)中使用。
          2. 帳號(hào)關(guān)聯(lián):如果用戶之前已經(jīng)在相關(guān)的應(yīng)用系統(tǒng)中擁有帳號(hào),同時(shí)也已經(jīng)設(shè)置了相應(yīng)的權(quán)限,那么用戶能夠?qū)⑦@些應(yīng)用 系統(tǒng)的帳號(hào)與統(tǒng)一身份認(rèn)證服務(wù)的帳號(hào)進(jìn)行關(guān)聯(lián),使得用戶登錄統(tǒng)一身份認(rèn)證服務(wù)之后,就能夠自動(dòng)使用相關(guān)的應(yīng)用系統(tǒng)用戶來(lái)訪問(wèn)應(yīng)用系統(tǒng)。
          3. 用戶認(rèn)證:為應(yīng)用系統(tǒng)提供用戶身份認(rèn)證,兼顧兩個(gè)應(yīng)用方式:
            • 應(yīng)用系統(tǒng)使用統(tǒng)一身份認(rèn)證服務(wù)作為它的用戶系統(tǒng),用戶與應(yīng)用系統(tǒng)進(jìn)行交互,進(jìn)行登錄操作,應(yīng)用 系統(tǒng)將用戶提供的用戶名/密碼等轉(zhuǎn)發(fā)給統(tǒng)一身份認(rèn)證服務(wù)以檢驗(yàn)其是否通過(guò)授權(quán)。
            • 用戶首先登錄統(tǒng)一身份認(rèn)證服務(wù),并獲取權(quán)限令牌,以后可以使用這個(gè)權(quán)限令牌訪問(wèn)其他的應(yīng)用系 統(tǒng),應(yīng)用系統(tǒng)接收該權(quán)限令牌時(shí)應(yīng)當(dāng)與統(tǒng)一身份認(rèn)證服務(wù)進(jìn)行交互,以檢驗(yàn)訪問(wèn)的合法性。

          用戶注冊(cè)

          用戶注冊(cè)(包括用戶更新注冊(cè)信息)的流程可以使用下圖來(lái)表示。其中主要包含了兩個(gè)流程:新用戶注冊(cè)和用戶更新注冊(cè)信息。

          新用戶注冊(cè):

          1. 用戶向統(tǒng)一身份認(rèn)證服務(wù)發(fā)出新用戶注冊(cè)請(qǐng)求
          2. 服務(wù)查詢用戶注冊(cè)庫(kù),如果該用戶可以注冊(cè)(沒(méi)有同名ID等違背約束條件的情況發(fā)生),那么將該用戶的信息保存到 用戶注冊(cè)庫(kù)中。
          3. 當(dāng)保存完畢后,統(tǒng)一身份認(rèn)證服務(wù)響應(yīng)用戶,注冊(cè)完成。

          用戶更新注冊(cè)信息:

          1. 用戶向統(tǒng)一身份認(rèn)證服務(wù)發(fā)出用戶注冊(cè)信息更新請(qǐng)求。
          2. 服務(wù)查詢用戶注冊(cè)庫(kù),如果該用戶信息可以更新(有該ID存在,同時(shí)提供的密碼也是正確的等等),那么將該用戶的 信息將在用戶注冊(cè)庫(kù)中更新。
          3. 當(dāng)保存完畢后,統(tǒng)一身份認(rèn)證服務(wù)響應(yīng)用戶,更新完成。

          帳號(hào)關(guān)聯(lián)

          帳號(hào)關(guān)聯(lián)操作可以使用下圖來(lái)表示。圖中僅包含一個(gè)登記新的帳號(hào)關(guān)聯(lián)的操作,相關(guān)的修改、刪除操作被省略了,有興趣的讀者可 以自行給出

          登記新的帳號(hào)關(guān)聯(lián):

          1. 用戶向統(tǒng)一身份認(rèn)證服務(wù)發(fā)出帳號(hào)關(guān)聯(lián)注冊(cè)請(qǐng)求,用戶提供了應(yīng)用系統(tǒng)的標(biāo)識(shí)A,同時(shí)提供了可以在該應(yīng)用系統(tǒng)中使用 的用戶信息(可能包含用戶名和密碼等)。
          2. 服務(wù)首先向該應(yīng)用系統(tǒng)A征詢,用戶信息是否合法。如果合法則響應(yīng)服務(wù)。
          3. 如果收到合法響應(yīng),那么服務(wù)就將這個(gè)帳號(hào)關(guān)聯(lián)注冊(cè)信息保存到用戶注冊(cè)庫(kù)中,以后該用戶登錄統(tǒng)一身份認(rèn)證服務(wù)之 后,就能夠使用相應(yīng)的應(yīng)用系統(tǒng)A。
          4. 當(dāng)注冊(cè)庫(kù)完成保存操作后,統(tǒng)一身份認(rèn)證服務(wù)響應(yīng)用戶,注冊(cè)完成。

          身份認(rèn)證組件模式

          統(tǒng)一身份認(rèn)證服務(wù)的一個(gè)基本應(yīng)用模式是以應(yīng)用系統(tǒng)的身份認(rèn)證組件的形式工作,在這個(gè)應(yīng)用模式下,主導(dǎo)地位的是應(yīng)用系統(tǒng)。在 這種情況下,應(yīng)用系統(tǒng)自身沒(méi)有用戶系統(tǒng),因此本模式下涉及的帳號(hào)一定是統(tǒng)一身份認(rèn)證服務(wù)的用戶帳號(hào)。

          流程描述如下:(僅描述正常流程)

          1. 用戶使用在統(tǒng)一認(rèn)證服務(wù)注冊(cè)的用戶名和密碼(也可能是其他的授權(quán)信息,比如數(shù)字簽名等)登陸應(yīng)用系統(tǒng)A
          2. 應(yīng)用系統(tǒng)A,將用戶名和密碼連同自己的標(biāo)識(shí)(應(yīng)用系統(tǒng)A的標(biāo)識(shí))一起轉(zhuǎn)發(fā)給統(tǒng)一認(rèn)證服務(wù),要求統(tǒng)一認(rèn)證服務(wù)完成 登錄操作。
          3. 統(tǒng)一認(rèn)證服務(wù)核查自己的應(yīng)用系統(tǒng)注冊(cè)庫(kù)(使用UDDI Registry,我將在后面解釋為什么使用UDDI Registry)看看應(yīng)用系統(tǒng)A是否已經(jīng)是統(tǒng)一認(rèn)證服務(wù)的用戶系統(tǒng)。同時(shí)在用戶注冊(cè)庫(kù)中核查由應(yīng)用系統(tǒng)A轉(zhuǎn)發(fā)過(guò)來(lái)的用戶名和密碼。
          4. 待核查完畢后,統(tǒng)一認(rèn)證服務(wù)響應(yīng)應(yīng)用系統(tǒng)A,登錄完成。
          5. 應(yīng)用系統(tǒng)A創(chuàng)建一個(gè)系統(tǒng)會(huì)話(Session,系統(tǒng)A自己的機(jī)制),并將應(yīng)用系統(tǒng)A自己的權(quán)限令牌返回給用戶, 以后用戶端可以通過(guò)這個(gè)權(quán)限令牌持續(xù)訪問(wèn)應(yīng)用系統(tǒng)A,直至登出系統(tǒng)或是會(huì)話超時(shí)。

          統(tǒng)一認(rèn)證模式

          統(tǒng)一認(rèn)證模式是以統(tǒng)一身份認(rèn)證服務(wù)為核心的服務(wù)使用模式。用戶登錄統(tǒng)一身份認(rèn)證服務(wù)后,即可使用所有支持統(tǒng)一身份認(rèn)證服務(wù) 的應(yīng)用系統(tǒng)。

          流程描述如下:(僅描述正常流程)

          1. 用戶使用在統(tǒng)一認(rèn)證服務(wù)注冊(cè)的用戶名和密碼(也可能是其他的授權(quán)信息,比如數(shù)字簽名等)登陸統(tǒng)一認(rèn)證服務(wù);
          2. 統(tǒng)一認(rèn)證服務(wù)創(chuàng)建了一個(gè)會(huì)話,同時(shí)將與該會(huì)話關(guān)聯(lián)的訪問(wèn)認(rèn)證令牌返回給用戶;
          3. 用戶使用這個(gè)訪問(wèn)認(rèn)證令牌訪問(wèn)某個(gè)支持統(tǒng)一身份認(rèn)證服務(wù)的應(yīng)用系統(tǒng);
          4. 該應(yīng)用系統(tǒng)將訪問(wèn)認(rèn)證令牌傳入統(tǒng)一身份認(rèn)證服務(wù),認(rèn)證訪問(wèn)認(rèn)證令牌的有效性;
          5. 統(tǒng)一身份認(rèn)證服務(wù)確認(rèn)認(rèn)證令牌的有效性;
          6. 應(yīng)用系統(tǒng)接收訪問(wèn),并返回訪問(wèn)結(jié)果,如果需要提高訪問(wèn)效率的話,應(yīng)用系統(tǒng)可選擇返回其自身的認(rèn)證令牌已使得用戶 之后可以使用這個(gè)私有令牌持續(xù)訪問(wèn)。

          此外,關(guān)于訪問(wèn)認(rèn)證令牌的失效,有兩個(gè)策略,一個(gè)是由用戶主動(dòng)發(fā)起聲明,聲明其擁有的訪問(wèn)認(rèn)證令牌不再有效,這類(lèi)似注銷(xiāo)的 操作,另一個(gè)是用戶一段時(shí)間內(nèi)沒(méi)有使用這個(gè)認(rèn)證令牌,認(rèn)證令牌自動(dòng)失效,這類(lèi)似超時(shí)的處理。

          信任代理模式

          在Internet應(yīng)用環(huán)境下,安全性和信任的重要性是顯而易見(jiàn)的,對(duì)于商用系統(tǒng)而言,避免非法訪問(wèn)和入侵是他所需要考慮 的幾個(gè)重要問(wèn)題之一,沒(méi)有比商用數(shù)據(jù)丟失或是商用系統(tǒng)被違規(guī)使用更糟糕的了。

          在信任代理模式下,一個(gè)組織可以為他所有需要提供安全信任保障的應(yīng)用系統(tǒng)設(shè)置一個(gè)統(tǒng)一身份認(rèn)證服務(wù),對(duì)這些應(yīng)用系統(tǒng)的訪問(wèn) 全部由統(tǒng)一身份認(rèn)證服務(wù)代理。

          流程描述如下:(僅描述正常流程)

          1. 用戶使用在統(tǒng)一認(rèn)證服務(wù)注冊(cè)的用戶名和密碼(也可能是其他的授權(quán)信息,比如數(shù)字簽名等)登陸統(tǒng)一認(rèn)證服務(wù);
          2. 統(tǒng)一認(rèn)證服務(wù)創(chuàng)建了一個(gè)會(huì)話,同時(shí)將與該會(huì)話關(guān)聯(lián)的訪問(wèn)認(rèn)證令牌返回給用戶;
          3. 用戶使用這個(gè)訪問(wèn)認(rèn)證令牌訪問(wèn)某個(gè)支持統(tǒng)一身份認(rèn)證服務(wù)的應(yīng)用系統(tǒng),不過(guò)用戶并不將請(qǐng)求消息直接交給應(yīng)用系統(tǒng), 而是傳給統(tǒng)一身份認(rèn)證服務(wù),在消息中標(biāo)識(shí)了最終的應(yīng)用系統(tǒng)的ID。
          4. 統(tǒng)一認(rèn)證服務(wù)訪問(wèn)應(yīng)用系統(tǒng)注冊(cè)庫(kù)(UDDI Registry),獲取了應(yīng)用系統(tǒng)的訪問(wèn)入口(統(tǒng)一認(rèn)證服務(wù)可以將這個(gè)訪問(wèn)入口緩存在本地,以減少以后與應(yīng)用系統(tǒng)注冊(cè)庫(kù)的交互次數(shù))。并確認(rèn)這個(gè)應(yīng)用系 統(tǒng)的確是支持統(tǒng)一身份認(rèn)證服務(wù)的;
          5. 統(tǒng)一認(rèn)證服務(wù)將請(qǐng)求消息轉(zhuǎn)發(fā)給指定的應(yīng)用系統(tǒng),如果該應(yīng)用系統(tǒng)使用自己的用戶系統(tǒng)的話,那么該消息應(yīng)當(dāng)包含了預(yù) 先定義好的相關(guān)聯(lián)的用戶名和密碼等。
          6. 應(yīng)用系統(tǒng)將請(qǐng)求結(jié)果返回給統(tǒng)一認(rèn)證服務(wù),最后統(tǒng)一認(rèn)證服務(wù)將響應(yīng)消息返回給用戶,完成調(diào)用。

          在該模式下,所有應(yīng)用系統(tǒng)僅接收來(lái)自統(tǒng)一認(rèn)證服務(wù)的訪問(wèn)請(qǐng)求,這樣,解決方案提供商可以將主要的安全方面的投入部署在統(tǒng)一 認(rèn)證服務(wù)那端。


          posted @ 2010-10-22 15:23 俊星 閱讀(1158) | 評(píng)論 (0)編輯 收藏

          freetts初探

          FreeTTS是一個(gè)語(yǔ)音合成庫(kù),今天進(jìn)行了相關(guān)的試用。
          1、下載完畢之后,構(gòu)建工程,拷貝到LIB中的JAR有:en_us.jar、freetts.jar、jsapi.jar、freetts-jsapi10.jar
          2、jsapi.jar因?yàn)椴捎玫氖跈?quán)不同于freetts,所以需要運(yùn)行jsapi.exe并同意后來(lái)獲取
          3、需要將speech.properties拷貝到user.home或者java.home/lib下
          4、編寫(xiě)基于JSAPI的HelloWorld程序:
          import java.util.Locale;

          import javax.speech.Central;
          import javax.speech.EngineList;
          import javax.speech.synthesis.Synthesizer;
          import javax.speech.synthesis.SynthesizerModeDesc;
          import javax.speech.synthesis.Voice;

          public class HelloWorld {

              
          public HelloWorld() {
              }

              
          public static void listAllVoices(String modeName) {
                  System.out.println(
          "All " + modeName + " Mode JSAPI Synthesizers and Voices:");
                  SynthesizerModeDesc required 
          = new SynthesizerModeDesc(null, modeName, Locale.US, nullnull);
                  EngineList engineList 
          = Central.availableSynthesizers(required);
                  
          for (int i = 0; i < engineList.size(); i++) {
                      SynthesizerModeDesc desc 
          = (SynthesizerModeDesc) engineList.get(i);
                      System.out.println(
          "    " + desc.getEngineName() + " (mode=" + desc.getModeName() + ", locale="
                              
          + desc.getLocale() + "):");
                      Voice voices[] 
          = desc.getVoices();
                      
          for (int j = 0; j < voices.length; j++)
                          System.out.println(
          "        " + voices[j].getName());
                  }
              }

              
          public static void main(String args[]) {
                  
          // 利用 FreeTTS 讀出Good job
                  try {
                      SynthesizerModeDesc desc 
          = new SynthesizerModeDesc("FreeTTS en_US general synthesizer""general",
                              Locale.US, 
          nullnull);
                      Synthesizer synthesizer 
          = Central.createSynthesizer(desc);
                      
          if (synthesizer == null) {
                          System.exit(
          1);
                      }
                      synthesizer.allocate();
                      synthesizer.resume();
                      desc 
          = (SynthesizerModeDesc) synthesizer.getEngineModeDesc();
                      Voice voices[] 
          = desc.getVoices();
                      
          for (Voice v : voices) {
                          synthesizer.getSynthesizerProperties().setVoice(v);
                          synthesizer.speakPlainText(
          "good job"null);
                          synthesizer.waitEngineState(
          0x10000L);
                      }
                      synthesizer.deallocate();
                  } 
          catch (Exception ex) {
                      ex.printStackTrace();
                  }
              }
          }

          5、編寫(xiě)基于FreeTTS的測(cè)試程序:
          import com.sun.speech.freetts.Voice;
          import com.sun.speech.freetts.VoiceManager;

          public class FreeTTSHelloWorld {

              
          public FreeTTSHelloWorld() {
              }

              
          public static void listAllVoices() {
                  System.out.println();
                  System.out.println(
          "All voices available:");
                  VoiceManager voiceManager 
          = VoiceManager.getInstance();
                  Voice voices[] 
          = voiceManager.getVoices();
                  
          for (int i = 0; i < voices.length; i++)
                      System.out.println(
          "    " + voices[i].getName() + " (" + voices[i].getDomain() + " domain)");

              }

              
          public static void main(String args[]) {
                  listAllVoices();
                  System.out.println();
                  VoiceManager voiceManager 
          = VoiceManager.getInstance();
                  Voice helloVoice 
          = voiceManager.getVoice("kevin16");
                  
          if (helloVoice == null) {
                      System.exit(
          1);
                  }
                  helloVoice.allocate();
                  helloVoice.speak(
          "GOOD JOB KINKDING");
                  helloVoice.deallocate();
                  System.exit(
          0);
              }
          }

          posted @ 2010-10-15 11:28 俊星 閱讀(3436) | 評(píng)論 (2)編輯 收藏

          RSS初探

          1、此處有一篇比較好RSS原理介紹文章:http://www.sunnychen.org/article.asp?id=82
          2、編寫(xiě)相關(guān)的實(shí)現(xiàn)代碼:
          import java.io.IOException;
          import java.io.PrintWriter;
          import java.net.ServerSocket;
          import java.net.Socket;
          import java.sql.Connection;
          import java.sql.DriverManager;
          import java.sql.ResultSet;
          import java.sql.SQLException;
          import java.sql.Statement;
          import java.sql.Timestamp;
          import java.text.SimpleDateFormat;
          import java.util.ArrayList;
          import java.util.Date;
          import java.util.List;
          import java.util.Locale;
          import java.util.TimeZone;

          /**
           * 簡(jiǎn)單HTTP服務(wù)器
           * 
           * 
          @author kinkding
           
          */
          public class MyHTTPServer implements Runnable {
              ServerSocket server;
              
          int port = 80;

              
          public MyHTTPServer() throws IOException {
                  server 
          = new ServerSocket(port);
                  
          new Thread(this).start();
                  System.out.println(
          "HTTP服務(wù)器已經(jīng)啟動(dòng)");
              }

              
          public void run() {
                  
          while (true) {
                      
          try {
                          Socket client 
          = server.accept();
                          System.out.println(
          "接收到客戶端:" + client);

                          PrintWriter out 
          = new PrintWriter(client.getOutputStream(), true);
                          out.println(
          "HTTP/1.0 200 OK");
                          out.println(
          "Content-Type:text/html;charset=GBK");
                          out.println();
          // HTTP協(xié)議:空行表示信息結(jié)束
                          this.sendRss(out);
                          out.close();
                          client.close();
                      } 
          catch (Exception e) {
                          e.printStackTrace();
                      }
                  }
              }

              
          private void sendRss(PrintWriter out) throws IOException {
                  
          // 按照RSS 2.0 的規(guī)則進(jìn)行生成
                  out.println("<?xml version=\"1.0\" encoding=\"GBK\"?>");
                  out.println(
          "<rss version=\"2.0\">");
                  out.println(
          "<channel>");
                  out.println(
          "<title>科技要聞-CT新聞</title>");
                  out.println(
          "<link>http://localhost</link>");
                  out.println(
          "<language>zh-cn</language>");
                  out.println(
          "<description>科技要聞-CT新聞</description>");
                  Date date 
          = new Date();
                  SimpleDateFormat formatter 
          = new SimpleDateFormat("E, dd MMM yyyy HH:mm:ss z", Locale.US);
                  formatter.setTimeZone(TimeZone.getTimeZone(
          "GMT"));
                  out.println(
          "<pubDate>" + formatter.format(date) + "</pubDate>");
                  
          // 封裝條目
                  List<Message> msgs = this.queryMsgs();
                  
          for (Message m : msgs) {
                      out.println(
          "<item>");
                      out.println(
          "<title>" + m.name + "</title>");
                      out.println(
          "<pubDate>" + formatter.format(m.time) + "</pubDate>");
                      out.println(
          "<description>" + m.desc + "</description>");
                      out.println(
          "<link>http://localhost/" + m.id + "</link>");
                      out.println(
          "<guid>http://localhost/" + m.id + "</guid>");
                      out.println(
          "</item>");
                  }
                  out.println(
          "</channel>");
                  out.println(
          "</rss>");
              }

              
          private List<Message> queryMsgs() {
                  List
          <Message> msgs = new ArrayList<Message>();
                  
          try {
                      Class.forName(
          "org.postgresql.Driver");
                      String url 
          = "jdbc:postgresql://localhost:5432/postgres";
                      Connection connection 
          = DriverManager.getConnection(url, "postgres""admin");
                      Statement stmt 
          = connection.createStatement();
                      
          // 查詢前5條記錄進(jìn)行顯示
                      ResultSet rs = stmt.executeQuery("SELECT * FROM tbl_messages order by msg_time desc limit 5");

                      
          while (rs.next()) {
                          Message msg 
          = new Message();
                          msg.id 
          = rs.getInt("msg_id");
                          msg.name 
          = rs.getString("msg_name");
                          msg.desc 
          = rs.getString("msg_desc");
                          msg.time 
          = rs.getTimestamp("msg_time");
                          msgs.add(msg);
                      }
                      rs.close();
                      stmt.close();
                      connection.close();
                  } 
          catch (ClassNotFoundException e) {
                      e.printStackTrace();
                  } 
          catch (SQLException e) {
                      e.printStackTrace();
                  }
                  
          return msgs;
              }

              
          public static void main(String[] args) {
                  
          try {
                      
          new MyHTTPServer();
                  } 
          catch (IOException e) {
                      e.printStackTrace();
                  }
              }

              
          class Message {
                  
          int id;
                  String name;
                  String desc;
                  Timestamp time;
              }

          }

          3、配置postgresql,本機(jī)安裝的是9.0版本,特別需要注意的是,安裝目錄中不能有空格。(直接exe方式安裝的話,會(huì)自動(dòng)生成一個(gè)服務(wù));
          同時(shí)還需要額外到官網(wǎng)下載相關(guān)的jdbc驅(qū)動(dòng),因我本機(jī)JAVA是1.5,所以選擇的是JDBC3的驅(qū)動(dòng)包:postgresql-9.0-801.jdbc3.zip
          4、編寫(xiě)相關(guān)的腳本:
          create table tbl_messages(
          msg_id 
          integer PRIMARY KEY,
          msg_name 
          text,
          msg_desc 
          text,
          msg_time  
          timestamp     
          );

          INSERT INTO tbl_messages (msg_id,msg_name, msg_desc, msg_time) VALUES (1'騰訊正式起訴360不正當(dāng)競(jìng)爭(zhēng)','北京時(shí)間10月14日晚間消息,新浪科技今天在騰訊官網(wǎng)獲悉,騰訊已于近日正式起訴360,要求奇虎及其關(guān)聯(lián)公司停止侵權(quán)、公開(kāi)道歉并作出賠償。'current_timestamp);
          INSERT INTO tbl_messages (msg_id,msg_name, msg_desc, msg_time) VALUES (2'國(guó)奧“搶人“引中超多隊(duì)不滿','  本屆國(guó)奧隊(duì)集訓(xùn)計(jì)劃的安排,意味集訓(xùn)的26人將錯(cuò)過(guò)中超聯(lián)賽的最后四輪比賽。受影響最大的大連實(shí)德俱樂(lè)部只同意楊博宇一人按時(shí)去報(bào)到,呂鵬、王選宏和趙宏略三人將在聯(lián)賽結(jié)束后才能去參加集訓(xùn)。'current_timestamp);
          INSERT INTO tbl_messages (msg_id,msg_name, msg_desc, msg_time) VALUES (3'外交部就日朝官員訪華及南海問(wèn)題等答問(wèn)','  2010年10月14日,外交部發(fā)言人馬朝旭主持例行記者會(huì)。'current_timestamp);
          INSERT INTO tbl_messages (msg_id,msg_name, msg_desc, msg_time) VALUES (4'智利總統(tǒng)稱(chēng)將追究礦難責(zé)任','據(jù)外電報(bào)道,智利圣何塞銅礦救援行動(dòng)取得了令人感動(dòng)的成功,也吸引了全世界關(guān)注的目光,不過(guò),在救援行動(dòng)完成后,圣何塞銅礦的“命運(yùn)”又將何去何從?智利總統(tǒng)皮涅拉14日表示,該礦將永久性關(guān)閉,同時(shí),將責(zé)成當(dāng)局對(duì)相關(guān)責(zé)任人進(jìn)行懲罰。'current_timestamp);
          INSERT INTO tbl_messages (msg_id,msg_name, msg_desc, msg_time) VALUES (5'魯能只是所謂領(lǐng)頭羊','  本周六,上海申花就將北上長(zhǎng)春,客場(chǎng)挑戰(zhàn)長(zhǎng)春亞泰。對(duì)于這個(gè)幾個(gè)賽季都沒(méi)有戰(zhàn)勝的對(duì)手來(lái)說(shuō),本場(chǎng)比賽異常關(guān)鍵。賽前,老布對(duì)這個(gè)對(duì)手異常重視,在他看來(lái),長(zhǎng)春這個(gè)對(duì)手絕非一般,而對(duì)于本場(chǎng)比賽,老布也明確表示,自己要率領(lǐng)球隊(duì),贏得本場(chǎng)比賽的勝利,打破從未戰(zhàn)勝過(guò)長(zhǎng)春的尷'current_timestamp);
          INSERT INTO tbl_messages (msg_id,msg_name, msg_desc, msg_time) VALUES (6'英第二大警察局通過(guò)Twitter公布每起案件','北京時(shí)間10月14日晚間消息,據(jù)國(guó)外媒體報(bào)道,英國(guó)第二大警察局大曼徹斯特警察局周四表示,計(jì)劃將所處理的每一起案件在24小時(shí)內(nèi)發(fā)布到Twitter網(wǎng)站上。'current_timestamp);

          5、運(yùn)行:
          在瀏覽器中輸入http://localhost/進(jìn)行訪問(wèn)即可。

          posted @ 2010-10-15 00:23 俊星 閱讀(142) | 評(píng)論 (0)編輯 收藏

          Nutz初步試用

          在javaeye上看到Nutz,挺新鮮的一個(gè)東西,下面是試用的相關(guān)記錄。
          1、在數(shù)據(jù)庫(kù)中創(chuàng)建相關(guān)的表:
          CREATE TABLE tbl_test_person(
          ID NUMBER(10) PRIMARY KEY,
          NAME VARCHAR2(100),
          remark VARCHAR2(1000)
          );

          2、編寫(xiě)相關(guān)json格式數(shù)據(jù)源配置文件datasource.json:
          {
              dataSource : {
                  type : "org.apache.commons.dbcp.BasicDataSource",
                  events : {
                      depose : 'close'
                  },
                  fields : {
                      driverClassName : 'oracle.jdbc.driver.OracleDriver',
                      url : 'jdbc:oracle:thin:@10.10.5.161:1521:oradb10',
                      username : 'fwmstest',
                      password : 'fwmstest'
                  }
              }
          }

          3、編寫(xiě)相關(guān)的POJO:
          package test;

          import org.nutz.dao.entity.annotation.Column;
          import org.nutz.dao.entity.annotation.Table;

          @Table(
          "tbl_test_person")
          public class Person {
              @Column
              
          private int id;

              @Column
              
          private String name;

              @Column
              
          private String remark;

              
          public int getId() {
                  
          return id;
              }


              
          public void setId(int id) {
                  
          this.id = id;
              }


              
          public String getName() {
                  
          return name;
              }


              
          public void setName(String name) {
                  
          this.name = name;
              }


              
          public String getRemark() {
                  
          return remark;
              }


              
          public void setRemark(String remark) {
                  
          this.remark = remark;
              }


              
          public String toString() {
                  
          return "id:" + id + ",name:" + name + ",remark:" + remark;
              }


          }


          4、配置相關(guān)的引用JAR:
          ORACLE的驅(qū)動(dòng)包c(diǎn)lasses12.zip
          APACHE的commons-dbcp-1.3.jar包(最開(kāi)始直接下載的是commons-dbcp-1.4.jar,但工程環(huán)境是1.5,所以運(yùn)行的時(shí)候直接報(bào)java.lang.UnsupportedClassVersionError: Bad version number in .class file)以及相關(guān)的commons-pool-1.5.5.jar
          log4j-1.2.16.jar

          5、編寫(xiě)MAIN程序:
          package test;

          import java.util.List;

          import org.apache.commons.dbcp.BasicDataSource;
          import org.nutz.dao.Dao;
          import org.nutz.dao.impl.NutDao;
          import org.nutz.ioc.Ioc;
          import org.nutz.ioc.impl.NutIoc;
          import org.nutz.ioc.loader.json.JsonLoader;

          public class MainApp {

              
          public static void main(String[] args) {
                  Ioc ioc 
          = new NutIoc(new JsonLoader("test/datasource.json"));
                  BasicDataSource ds 
          = ioc.get(BasicDataSource.class"dataSource");
                  Dao dao 
          = new NutDao(ds);
                  
          // 插入10條數(shù)據(jù)
                  for (int i = 0; i < 10; i++) {
                      Person p 
          = new Person();
                      p.setId(i 
          + 1);
                      p.setName(
          "good" + i);
                      p.setRemark(
          "remark" + i);
                      dao.insert(p);
                  }
                  
          // 查詢所有記錄
                  List<Person> list = dao.query(Person.classnullnull);
                  
          for (Person p : list) {
                      System.out.println(p);
                  }
              }

          }


          6、程序運(yùn)行結(jié)果如下:
          控制臺(tái)的輸出:
          2010-10-14 12:59:56 WARN [main] !!You are using default SystemLog! Don't use it in Production environment!!
          id:1,name:good0,remark:remark0
          id:2,name:good1,remark:remark1
          id:3,name:good2,remark:remark2
          id:4,name:good3,remark:remark3
          id:5,name:good4,remark:remark4
          id:6,name:good5,remark:remark5
          id:7,name:good6,remark:remark6
          id:8,name:good7,remark:remark7
          id:9,name:good8,remark:remark8
          id:10,name:good9,remark:remark9

          數(shù)據(jù)庫(kù)中,執(zhí)行查詢語(yǔ)句,也對(duì)上了號(hào)。

          posted @ 2010-10-14 13:10 俊星 閱讀(4110) | 評(píng)論 (0)編輯 收藏

          僅列出標(biāo)題
          共10頁(yè): 上一頁(yè) 1 2 3 4 5 6 7 8 9 下一頁(yè) Last 
          主站蜘蛛池模板: 延寿县| 永清县| 罗平县| 沽源县| 阿勒泰市| 商南县| 田林县| 九江县| 莱州市| 高陵县| 松阳县| 平阳县| 桑植县| 龙陵县| 边坝县| 龙口市| 安吉县| 深圳市| 新竹市| 阳泉市| 九江市| 玉环县| 清水河县| 红原县| 宜丰县| 渑池县| 普陀区| 沁源县| 贡觉县| 柳河县| 山阳县| 建水县| 岳西县| 绥中县| 金堂县| 宁化县| 定西市| 嘉鱼县| 秀山| 淄博市| 上思县|