2010年10月12日
#
1、在本地數據庫中創建如下表:
-- Create table
create table TMP_CR_PERSONS
(
SPECIALTY VARCHAR2(50),
USER_GROUP VARCHAR2(50),
USER_NAME VARCHAR2(50),
USER_CATEGORY VARCHAR2(50)
)
2、創建DBLINK:
create database link LK2PMS connect to XXX identified by XX
using '(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.5.99)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = oradb9)
)
)'
3、創建視圖,查詢變更清單:
CREATE OR REPLACE VIEW V_TMP_CR_LIST AS
SELECT D.CHANGE_REQUEST_CODE,
D.PROJECT_NAME,
D.PRODUCT_NAME,
D.MODULE_NAME,
D.TYPE,
D.PRIVILEGE,
D.PROPOSE_TIME,
WF.TRANSACTOR,
WF.TASKNAME,
P.SPECIALTY,
P.USER_GROUP,
P.USER_CATEGORY
FROM PMS_CHANGE@lk2pms D,
(SELECT MAX(ID) ID
FROM WFT_FLOWCONTROL@lk2pms WF
WHERE WF.WORKFLOWID = 'ChangeRequest'
GROUP BY WF.WORKID) MX,
WFT_FLOWCONTROL@lk2pms WF,
TMP_CR_PERSONS P
WHERE WF.ID = MX.ID
AND WF.WORKID = D.CHANGE_REQUEST_ID
AND D.CHANGE_REQUEST_CODE LIKE 'CR%'
AND WF.TRANSACTOR = P.USER_NAME
AND D.STATE NOT IN ('結束','終止','拒絕');
4、創建統計視圖:
CREATE VIEW V_TMP_CR_STAT AS
SELECT T.USER_GROUP, T.USER_NAME, COUNT(V.CHANGE_REQUEST_CODE) TOTAL
FROM V_TMP_CR_LIST V, TMP_CR_PERSONS T
WHERE V.TRANSACTOR(+) = T.USER_NAME
GROUP BY CUBE(T.USER_GROUP, T.USER_NAME);
1、當然是訪問老系統中的,應該都采用兼容視圖
2、在訪問網公司系統的時候,出現內存不能寫的錯誤提示,讓后直接頁面加載失敗,解決辦法是,找到用SOGOU瀏覽器加載頁面后,發現需要安裝JITDSign這個插件,所以手工找到JITDSign.cab,解壓后直接運行“regsvr32 JITDSign.ocx”,再刷新頁面,OK了。
3、其他問題暫未發現。
1、利用命令“D:\FWMS\code\trunk\main\ear\ejb>dir /a:d /b”,列舉出所有的EJB模塊清單
2、結合上面的清單,結合正則“^(.*)$”,替換為“<ant antfile="${FWMS_code}/ear/ejb/$1/META-INF/build.xml" dir="${FWMS_code}/ear/ejb/$1/META-INF" target="ejbdoclet"/>”形式,并將得到的ant元素清單放置到工程下build.xml的“Generating_Code”target中。
3、基于如下正則,利用UE批量替換properties文件中的project.path:
查找:(project.path.*)
目標:project.path=../../../APP-INF/classes;../../../APP-INF/lib/activation.jar;../../../APP-INF/lib/ant.jar;../../../APP-INF/lib/apachepoi.jar;../../../APP-INF/lib/axis.jar;../../../APP-INF/lib/axis-ant.jar;../../../APP-INF/lib/bsh2.0.jar;../../../APP-INF/lib/classes12.zip;../../../APP-INF/lib/commons-
文件:build.properties
路徑:D:\FWMS\code\trunk\main\ear\ejb\
(注意需要選中搜索子目錄項)
4、上述完成之后,執行build_code.bat 即可完成EJB的編譯
5、設置ct-config.xml中相關內容,最后是啟動weblogic 并設置數據源,同時發布應用。
6、發布啟動weblogic的時候,報“java.lang.OutOfMemoryError: PermGen space”異常,在C:\bea\weblogic92\common\bin的commEnv.cmd中,查看到其內存設置為“set MEM_ARGS=-Xms128m -Xmx256m”;在C:\bea\user_projects\domains\fwms_domain\bin下startWebLogic.cmd中,添加“set MEM_ARGS=-Xms256m -Xmx512m -XX:MaxPermSize=128m”,適當加大內存。
此處的CAS是指Central Authentication Service,也即統一認真服務,這里采用的是JASIG提供的相關服務端及客戶端類庫,結合TOMCAT進行測試。
1、下載相關的服務器端和客戶端類庫,官網是:
http://www.jasig.org/cas/,目前我采用的是:
服務器端:cas-server-3.3.4-release.zip
客戶端:cas-client-2.0.11.zip
2、配置TOMCAT的SSL,具體可見上一篇博文:
在%CATALINA_HOME%/conf/server.xml中,添加:
<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"/>
配置OK后,可通過訪問“https://localhost:8443/examples/servlets/servlet/HelloWorldExample”來進行驗證
3、配置CAS服務器端:
將cas-server-3.3.4-release.zip中modules文件夾下的cas-server-webapp-3.3.4.war的解壓到TOMCAT的webapps目錄下。
重啟TOMCAT后,可以通過訪問“http://localhost:8080/cas/login”并輸入相同的用戶名密碼來進行驗證。
另:需要特別說明,cas應用中默認配置的是SimpleTestUsernamePasswordAuthenticationHandler,該處理類只要保持用戶名、密碼一直即可通過驗證。
4、配置CAS客戶端:
在webapps\examples\WEB-INF中,對web.xml添加如下內容:
<filter>
<filter-name>CAS Filter</filter-name>
<filter-class>edu.yale.its.tp.cas.client.filter.CASFilter</filter-class>
<init-param>
<param-name>edu.yale.its.tp.cas.client.filter.loginUrl</param-name>
<param-value>https://localhost:8443/cas/login</param-value>
</init-param>
<init-param>
<param-name>edu.yale.its.tp.cas.client.filter.validateUrl</param-name>
<param-value>https://localhost:8443/cas/serviceValidate</param-value>
</init-param>
<init-param>
<param-name>edu.yale.its.tp.cas.client.filter.serverName</param-name>
<param-value>localhost:8080</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CAS Filter</filter-name>
<url-pattern>/servlets/servlet/HelloWorldExample</url-pattern>
</filter-mapping>
同時,將cas-client-2.0.11.zip中的casclient.jar,拷貝到webapps\examples\WEB-INF\lib中,重啟TOMCAT即可進行驗證。
5、驗證CAS:
a、在瀏覽器中訪問“http://localhost:8080/examples/servlets/servlet/HelloWorldExample”
b、基于前面配置的過濾器,瀏覽器會定向CAS的認證頁面“https://localhost:8443/cas/login?service=http%3A%2F%2Flocalhost%3A8080%2Fexamples%2Fservlets%2Fservlet%2FHelloWorldExample”
c、在CAS的認證頁面中輸入相同的用戶名密碼test/test后,執行登錄
d、瀏覽器提示安全警告,點擊確定后即轉入到“http://localhost:8080/examples/servlets/servlet/HelloWorldExample?ticket=ST-1-xWK9nwArDLbjCwYiXOqu-cas”,同時頁面打出“Hello World”,配置成功。
HTTP Client是一個客戶端HTTP協議的類庫
1、首先是下載APACHE HTTP CLIENT相關的JAR,目前我引入到工程中的相關文件時:
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包之前的引用關系在README等相關說明中已有。
2、下載并運行TOMCAT,我下載的是TOMCAT6(對應的是JDK5),主要注意的是需要配置CATALINA_HOME這個環境變量。
3、制作服務器端證書,下面是我一個示例:
C:\Documents and Settings\dingjunxing>keytool -genkey -alias tomcat3 -keystore F
:\eclipse\workspace\httpc\tomcat3.keystore
輸入keystore密碼: 123456
您的名字與姓氏是什么?
[Unknown]: localhost
您的組織單位名稱是什么?
[Unknown]: sz
您的組織名稱是什么?
[Unknown]: sz
您所在的城市或區域名稱是什么?
[Unknown]: shenzhen
您所在的州或省份名稱是什么?
[Unknown]: guangdong
該單位的兩字母國家代碼是什么
[Unknown]: cn
CN=localhost, OU=sz, O=sz, L=shenzhen, ST=guangdong, C=cn 正確嗎?
[否]: y
輸入<tomcat3>的主密碼
(如果和 keystore 密碼相同,按回車): 123456
4、根據服務器證書導出客戶端證書,有兩種方式,一種為采用IE,下面提供一個利用KEY TOOL導出的方式:
keytool -export -file tomcat3.cert -alias tomcat3 -keystore F:\eclipse\workspace\httpc\tomcat3.keystore
注意:上面命令行必須進入到%java_home%/jre/lib/security中。
5、將獲取到的客戶端證書導入:
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
發照者: CN=localhost, OU=sz, O=sz, L=shenzhen, ST=guangdong, C=cn
序號: 4cc55438
有效期間: Mon Oct 25 17:56:08 CST 2010 至: Sun Jan 23 17:56:08 CST 2011
認證指紋:
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
信任這個認證? [否]: y
認證已添加至keystore中
6、TOMCAT中相關設置,主要是修改CATALINA_HOME下的conf/server.xml,在其中添加如下一個連接器:
<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、運行相關代碼:
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();
}
}
運行結果正常,當然也可以通過在瀏覽器中輸入“https://localhost:8443/”的方式進行訪問。
在網上找到一份比較老的參考文檔:http://www.ibm.com/developerworks/cn/webservices/ws-casestudy/part4/
1、列舉出來其需要的幾項功能:
該服務主要需要具備三項功能:
- 用戶注冊:用戶在統一身份認證服務中注冊帳號,以后這個帳號可以在所有使用統一身份認證服務的應用系統中使用。
- 帳號關聯:如果用戶之前已經在相關的應用系統中擁有帳號,同時也已經設置了相應的權限,那么用戶能夠將這些應用
系統的帳號與統一身份認證服務的帳號進行關聯,使得用戶登錄統一身份認證服務之后,就能夠自動使用相關的應用系統用戶來訪問應用系統。
- 用戶認證:為應用系統提供用戶身份認證,兼顧兩個應用方式:
-
- 應用系統使用統一身份認證服務作為它的用戶系統,用戶與應用系統進行交互,進行登錄操作,應用
系統將用戶提供的用戶名/密碼等轉發給統一身份認證服務以檢驗其是否通過授權。
- 用戶首先登錄統一身份認證服務,并獲取權限令牌,以后可以使用這個權限令牌訪問其他的應用系
統,應用系統接收該權限令牌時應當與統一身份認證服務進行交互,以檢驗訪問的合法性。
用戶注冊
用戶注冊(包括用戶更新注冊信息)的流程可以使用下圖來表示。其中主要包含了兩個流程:新用戶注冊和用戶更新注冊信息。
新用戶注冊:
- 用戶向統一身份認證服務發出新用戶注冊請求
- 服務查詢用戶注冊庫,如果該用戶可以注冊(沒有同名ID等違背約束條件的情況發生),那么將該用戶的信息保存到
用戶注冊庫中。
- 當保存完畢后,統一身份認證服務響應用戶,注冊完成。
用戶更新注冊信息:
- 用戶向統一身份認證服務發出用戶注冊信息更新請求。
- 服務查詢用戶注冊庫,如果該用戶信息可以更新(有該ID存在,同時提供的密碼也是正確的等等),那么將該用戶的
信息將在用戶注冊庫中更新。
- 當保存完畢后,統一身份認證服務響應用戶,更新完成。
帳號關聯
帳號關聯操作可以使用下圖來表示。圖中僅包含一個登記新的帳號關聯的操作,相關的修改、刪除操作被省略了,有興趣的讀者可
以自行給出
登記新的帳號關聯:
- 用戶向統一身份認證服務發出帳號關聯注冊請求,用戶提供了應用系統的標識A,同時提供了可以在該應用系統中使用
的用戶信息(可能包含用戶名和密碼等)。
- 服務首先向該應用系統A征詢,用戶信息是否合法。如果合法則響應服務。
- 如果收到合法響應,那么服務就將這個帳號關聯注冊信息保存到用戶注冊庫中,以后該用戶登錄統一身份認證服務之
后,就能夠使用相應的應用系統A。
- 當注冊庫完成保存操作后,統一身份認證服務響應用戶,注冊完成。
身份認證組件模式
統一身份認證服務的一個基本應用模式是以應用系統的身份認證組件的形式工作,在這個應用模式下,主導地位的是應用系統。在
這種情況下,應用系統自身沒有用戶系統,因此本模式下涉及的帳號一定是統一身份認證服務的用戶帳號。
流程描述如下:(僅描述正常流程)
- 用戶使用在統一認證服務注冊的用戶名和密碼(也可能是其他的授權信息,比如數字簽名等)登陸應用系統A
- 應用系統A,將用戶名和密碼連同自己的標識(應用系統A的標識)一起轉發給統一認證服務,要求統一認證服務完成
登錄操作。
- 統一認證服務核查自己的應用系統注冊庫(使用UDDI Registry,我將在后面解釋為什么使用UDDI
Registry)看看應用系統A是否已經是統一認證服務的用戶系統。同時在用戶注冊庫中核查由應用系統A轉發過來的用戶名和密碼。
- 待核查完畢后,統一認證服務響應應用系統A,登錄完成。
- 應用系統A創建一個系統會話(Session,系統A自己的機制),并將應用系統A自己的權限令牌返回給用戶,
以后用戶端可以通過這個權限令牌持續訪問應用系統A,直至登出系統或是會話超時。
統一認證模式
統一認證模式是以統一身份認證服務為核心的服務使用模式。用戶登錄統一身份認證服務后,即可使用所有支持統一身份認證服務
的應用系統。
流程描述如下:(僅描述正常流程)
- 用戶使用在統一認證服務注冊的用戶名和密碼(也可能是其他的授權信息,比如數字簽名等)登陸統一認證服務;
- 統一認證服務創建了一個會話,同時將與該會話關聯的訪問認證令牌返回給用戶;
- 用戶使用這個訪問認證令牌訪問某個支持統一身份認證服務的應用系統;
- 該應用系統將訪問認證令牌傳入統一身份認證服務,認證訪問認證令牌的有效性;
- 統一身份認證服務確認認證令牌的有效性;
- 應用系統接收訪問,并返回訪問結果,如果需要提高訪問效率的話,應用系統可選擇返回其自身的認證令牌已使得用戶
之后可以使用這個私有令牌持續訪問。
此外,關于訪問認證令牌的失效,有兩個策略,一個是由用戶主動發起聲明,聲明其擁有的訪問認證令牌不再有效,這類似注銷的
操作,另一個是用戶一段時間內沒有使用這個認證令牌,認證令牌自動失效,這類似超時的處理。
信任代理模式
在Internet應用環境下,安全性和信任的重要性是顯而易見的,對于商用系統而言,避免非法訪問和入侵是他所需要考慮
的幾個重要問題之一,沒有比商用數據丟失或是商用系統被違規使用更糟糕的了。
在信任代理模式下,一個組織可以為他所有需要提供安全信任保障的應用系統設置一個統一身份認證服務,對這些應用系統的訪問
全部由統一身份認證服務代理。
流程描述如下:(僅描述正常流程)
- 用戶使用在統一認證服務注冊的用戶名和密碼(也可能是其他的授權信息,比如數字簽名等)登陸統一認證服務;
- 統一認證服務創建了一個會話,同時將與該會話關聯的訪問認證令牌返回給用戶;
- 用戶使用這個訪問認證令牌訪問某個支持統一身份認證服務的應用系統,不過用戶并不將請求消息直接交給應用系統,
而是傳給統一身份認證服務,在消息中標識了最終的應用系統的ID。
- 統一認證服務訪問應用系統注冊庫(UDDI
Registry),獲取了應用系統的訪問入口(統一認證服務可以將這個訪問入口緩存在本地,以減少以后與應用系統注冊庫的交互次數)。并確認這個應用系
統的確是支持統一身份認證服務的;
- 統一認證服務將請求消息轉發給指定的應用系統,如果該應用系統使用自己的用戶系統的話,那么該消息應當包含了預
先定義好的相關聯的用戶名和密碼等。
- 應用系統將請求結果返回給統一認證服務,最后統一認證服務將響應消息返回給用戶,完成調用。
在該模式下,所有應用系統僅接收來自統一認證服務的訪問請求,這樣,解決方案提供商可以將主要的安全方面的投入部署在統一
認證服務那端。
FreeTTS是一個語音合成庫,今天進行了相關的試用。
1、下載完畢之后,構建工程,拷貝到LIB中的JAR有:en_us.jar、freetts.jar、jsapi.jar、freetts-jsapi10.jar
2、jsapi.jar因為采用的授權不同于freetts,所以需要運行jsapi.exe并同意后來獲取
3、需要將speech.properties拷貝到user.home或者java.home/lib下
4、編寫基于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, null, null);
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, null, null);
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、編寫基于FreeTTS的測試程序:
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);
}
}
1、此處有一篇比較好RSS原理介紹文章:
http://www.sunnychen.org/article.asp?id=82
2、編寫相關的實現代碼:
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;
/**
* 簡單HTTP服務器
*
* @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服務器已經啟動");
}
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協議:空行表示信息結束
this.sendRss(out);
out.close();
client.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
private void sendRss(PrintWriter out) throws IOException {
// 按照RSS 2.0 的規則進行生成
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條記錄進行顯示
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,本機安裝的是9.0版本,特別需要注意的是,安裝目錄中不能有空格。(直接exe方式安裝的話,會自動生成一個服務);
同時還需要額外到官網下載相關的jdbc驅動,因我本機JAVA是1.5,所以選擇的是JDBC3的驅動包:
postgresql-9.0-801.jdbc3.zip
4、編寫相關的腳本:
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不正當競爭','北京時間10月14日晚間消息,新浪科技今天在騰訊官網獲悉,騰訊已于近日正式起訴360,要求奇虎及其關聯公司停止侵權、公開道歉并作出賠償。', current_timestamp);
INSERT INTO tbl_messages (msg_id,msg_name, msg_desc, msg_time) VALUES (2, '國奧“搶人“引中超多隊不滿',' 本屆國奧隊集訓計劃的安排,意味集訓的26人將錯過中超聯賽的最后四輪比賽。受影響最大的大連實德俱樂部只同意楊博宇一人按時去報到,呂鵬、王選宏和趙宏略三人將在聯賽結束后才能去參加集訓。', current_timestamp);
INSERT INTO tbl_messages (msg_id,msg_name, msg_desc, msg_time) VALUES (3, '外交部就日朝官員訪華及南海問題等答問',' 2010年10月14日,外交部發言人馬朝旭主持例行記者會。', current_timestamp);
INSERT INTO tbl_messages (msg_id,msg_name, msg_desc, msg_time) VALUES (4, '智利總統稱將追究礦難責任','據外電報道,智利圣何塞銅礦救援行動取得了令人感動的成功,也吸引了全世界關注的目光,不過,在救援行動完成后,圣何塞銅礦的“命運”又將何去何從?智利總統皮涅拉14日表示,該礦將永久性關閉,同時,將責成當局對相關責任人進行懲罰。', current_timestamp);
INSERT INTO tbl_messages (msg_id,msg_name, msg_desc, msg_time) VALUES (5, '魯能只是所謂領頭羊',' 本周六,上海申花就將北上長春,客場挑戰長春亞泰。對于這個幾個賽季都沒有戰勝的對手來說,本場比賽異常關鍵。賽前,老布對這個對手異常重視,在他看來,長春這個對手絕非一般,而對于本場比賽,老布也明確表示,自己要率領球隊,贏得本場比賽的勝利,打破從未戰勝過長春的尷', current_timestamp);
INSERT INTO tbl_messages (msg_id,msg_name, msg_desc, msg_time) VALUES (6, '英第二大警察局通過Twitter公布每起案件','北京時間10月14日晚間消息,據國外媒體報道,英國第二大警察局大曼徹斯特警察局周四表示,計劃將所處理的每一起案件在24小時內發布到Twitter網站上。', current_timestamp);
5、運行:
在瀏覽器中輸入
http://localhost/進行訪問即可。
在javaeye上看到Nutz,挺新鮮的一個東西,下面是試用的相關記錄。
1、在數據庫中創建相關的表:
CREATE TABLE tbl_test_person(
ID NUMBER(10) PRIMARY KEY,
NAME VARCHAR2(100),
remark VARCHAR2(1000)
);
2、編寫相關json格式數據源配置文件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、編寫相關的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、配置相關的引用JAR:
ORACLE的驅動包classes12.zip
APACHE的commons-dbcp-1.3.jar包(最開始直接下載的是commons-dbcp-1.4.jar,但工程環境是1.5,所以運行的時候直接報java.lang.UnsupportedClassVersionError: Bad version number in .class file)以及相關的commons-pool-1.5.5.jar
log4j-1.2.16.jar
5、編寫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條數據
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.class, null, null);
for (Person p : list) {
System.out.println(p);
}
}
}
6、程序運行結果如下:
控制臺的輸出:
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
數據庫中,執行查詢語句,也對上了號。
1、編寫相關的備份腳本backup.bat:
@echo off
mysqldump -uroot -pXXX test>D:\db_backup\test%date:~0,10%.sql
其中“%date:~0,10%”表示取出日期后截取前10個字符,因為在目標機器運行%date%得到的是“2010-10-13 星期三”,不符合要求。
2、執行過程中,報如下錯誤:
mysqldump: Got error: 1045: Access denied for user:
'root@localhost ' (Using password: NO) when trying to connect
原因是權限不夠,處理措施如下:
C:\Documents and Settings\Administrator.SPARK001>mysql -uroot -pXXX
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1450
Server version: 5.0.67-community MySQL Community Edition (GPL)
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'IDENTIFIED BY 'root' WITH GRANT OPTION;
Query OK, 0 rows affected (0.06 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
3、運行bat文件后,即生成了“test2010-10-13.sql”類的文件,最后通過設置WINDOWS系統工具中的任務計劃功能,即可實現自動備份。
基于APACHE COMMONS中的NET包提供的FTP客戶端類庫實現,下面是具體的代碼:
package test;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;

import org.apache.commons.net.PrintCommandListener;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;


public class ClientTest
{

public static void main(String[] args)
{
ClientTest main = new ClientTest();
FTPClient ftp = new FTPClient();
// 設置一個監聽
ftp.addProtocolCommandListener(new PrintCommandListener(new PrintWriter(System.out)));

try
{
ftp.connect("localhost", 2121);
int reply = ftp.getReplyCode();

if (!FTPReply.isPositiveCompletion(reply))
{
ftp.disconnect();
System.out.println("FTP server refused connection");
}
// 登錄
ftp.login("admin", "admin");
main.uploadFile(ftp);
main.listFiles(ftp);
main.downloadFile(ftp);
main.deleteFile(ftp);
main.listFiles(ftp);
// 退出
ftp.logout();

} catch (IOException e)
{
e.printStackTrace();

if (ftp.isConnected())
{

try
{
ftp.disconnect();

} catch (Exception e2)
{
}
}
}
}
// 列舉文件

private void listFiles(FTPClient ftp) throws IOException
{
System.out.println("------------START------------");

for (FTPFile f : ftp.listFiles())
{
System.out.println(f.getName() + " " + f.getSize());
}
System.out.println("------------END------------");
}

// 上傳文件

private void uploadFile(FTPClient ftp) throws IOException
{
ftp.setFileType(FTP.BINARY_FILE_TYPE);
ftp.enterLocalPassiveMode();
InputStream input = new FileInputStream("res/conf/dushu.jpg");
ftp.storeFile("dushu.jpg", input);
input.close();
}

// 下載文件

private void downloadFile(FTPClient ftp) throws IOException
{
ftp.setFileType(FTP.BINARY_FILE_TYPE);
ftp.enterLocalPassiveMode();
OutputStream output = new FileOutputStream("res/conf/dushu_down.jpg");
ftp.retrieveFile("dushu.jpg", output);
output.close();
}

// 刪除文件

private void deleteFile(FTPClient ftp) throws IOException
{
ftp.deleteFile("dushu.jpg");
}
}

輸出如下:
220 Service ready for new user.
USER admin
331 User name okay, need password for admin.
PASS admin
230 User logged in, proceed.
TYPE I
200 Command TYPE okay.
PASV
227 Entering Passive Mode (127,0,0,1,13,12)
STOR dushu.jpg
150 File status okay; about to open data connection.
226 Transfer complete.
------------START------------
SYST
215 UNIX Type: Apache FtpServer
PASV
227 Entering Passive Mode (127,0,0,1,13,14)
LIST
150 File status okay; about to open data connection.
226 Closing data connection.
dushu.jpg 83694
------------END------------
TYPE I
200 Command TYPE okay.
PASV
227 Entering Passive Mode (127,0,0,1,13,16)
RETR dushu.jpg
150 File status okay; about to open data connection.
226 Transfer complete.
DELE dushu.jpg
250 Requested file action okay, deleted /dushu.jpg.
------------START------------
PASV
227 Entering Passive Mode (127,0,0,1,13,18)
LIST
150 File status okay; about to open data connection.
226 Closing data connection.
------------END------------
QUIT
221 Goodbye.

最后,提供一張自己拍的讀書圖: