時間和日子在無知無覺中過去,問自己收獲了什么?
每天無所事事。
列個標(biāo)題,挖個坑,希望每天能來挑一點(diǎn)土。
《解讀eclipse_3.50_galileo 源碼》
從第一次使用eclipse(大概是03年的事,那時比較好用的是2.1版還是1.4版已記不清了)就想看看這么巧妙的一個玩意兒是怎么實(shí)現(xiàn)的,一直懶散無度,從未下手。
這段時間用SWT做個小工具,是邊找邊抄,為什么要那么寫,不知道--真是有違一慣的作風(fēng)。
每天下班后,都不是為什么奔忙著,網(wǎng)頁?網(wǎng)游?都不知道自己看了些什么,玩了些什么。
eclipse 的jar很多,核心的是core.runtime和osgi(早些版本里,是沒有osgi的),core.runtime比較小,就幾個類,先攻擊小的少的--毛主席真是偉大的軍事家呀。
敬禮,睡覺去。
前言
一直想學(xué)習(xí)C,在剛知道有計(jì)算機(jī)的時候就想學(xué)習(xí)C,上學(xué)時,偷上計(jì)算機(jī)專業(yè)的課,學(xué)了半年Turbo C,學(xué)到指針時,暈了,也就沒有下文。工作之后,時有心血來潮之時,但還是沒怎么學(xué)習(xí),Java還是比較簡單,Java幾乎占據(jù)了工作全部,更少有學(xué)習(xí)C了。用Java,研究到Java的核心,發(fā)覺還是得學(xué)C,學(xué)呀,學(xué)吧。
今天也是一時的心血來潮了,趁著有股勁,開始動手,記錄一下,以期待和方便下次來潮。
寫出的代碼,得編譯才可以運(yùn)行,這個編譯環(huán)境,得先搭起來。VC、Visual Studio,都微軟的東西,有點(diǎn)抵觸,也有些大,不安裝了,手工配一套環(huán)境吧。
網(wǎng)上搜了一下,Windows系統(tǒng)配C的編譯環(huán)境,得要MinGW或者cygWin,以前都下載過,但一直不知道它們本身是個什么東西,再查,知道大概:二者均基于GCC(GNU Compiler Collection -格努編譯套件),再加一些基本的類庫。去各自的官網(wǎng)分別下載安裝,感受:cygWin更象是一個linux的模擬器,把linux環(huán)境下的GCC給模擬出來,其它的就都一樣需要基本的編譯器、類庫,其它的如make工具。使用的時候,個人取向選擇minGW,在環(huán)境變量中指向{$minGW}\bin,gcc和make就可以在cmd中運(yùn)行了。
寫個簡單的hello world源程序,gcc一把,生產(chǎn)可執(zhí)行文件,運(yùn)行,結(jié)果出來,OK!
注,下載minGW時,我選擇了自動安裝下載,一個個的下載,點(diǎn)來點(diǎn)去,累的慌。
單獨(dú)下載minGW,要如下幾個包,再分別解開放在同一目錄中。
gcc-core | C語言編譯器 |
gcc-c++ | C++語言編譯器 |
mingw-runtime | MinGW的運(yùn)行時庫(這個必須安裝) |
win32api | win32的API函數(shù)頭文件和連接庫 |
binutils | MinGW的匯編器和連接器等基礎(chǔ)工具 |
gdb | MinGW中的調(diào)試工具 |
mingw32-make | Make工具,用以更好的管理你的項(xiàng)目 |
make解后,沒有通常的make.exe,只有一個mingw32-make.exe文件,其實(shí),把這個文件改名為make.exe就行。
1978:第一個關(guān)鍵的年份
1988:雖然是第一個十年,但十歲的生日沒多少印象了,更多的是開始注意的第一個年份。
1993:初中結(jié)束了,
1997:高中結(jié)束了,
2000/06/30:大學(xué)畢業(yè)了,世紀(jì)之交呀!
2000/08/03:子身跑到汕頭的一個小鎮(zhèn)開始第一份工作,真正的人生地不熟。到目的地時,身上只有20塊錢了,還是年青的老板給我付的“摩的”費(fèi)。
2001/11/03:混到一份跟自己所學(xué)專業(yè),所做的工作一點(diǎn)也不相關(guān)的工作,毅然一個人跑到北京。首都呀!當(dāng)時天很冷,比我想象的要冷,下車后把能穿的都穿上,不知象什么熊。打22塊錢的車找到公司,競?cè)贿€沒到上班時間。
2004/06/xx:一個傷感的月份,也注定要離開這個做了好幾年有公司。
2004/08/04:換了一個比較遠(yuǎn)的公司,在朝陽,自己租住在西直門。
2005/02/28:一個沒有29日的月份,還沒開始工作,就沒有選擇的離開了。
2005/07/03:
2006/07/03:換了一份工作,不知什么感受。
與Velocity的第一次見面,是03年,有個新同事推薦使用,因當(dāng)時我在做別的項(xiàng)目,也沒怎么仔細(xì)了解,簡單的知曉類似如模板一類的東西。之后有過幾次接觸,但,都沒花時間仔細(xì)看,前段時間,幫朋友做一個小東西,覺得用個模板做,會省很多事,想到Velocity。東西很小,做完了都沒時間看Velocity,今天正好有時間,研究研究。
Velocity是apache下的一個開源項(xiàng)目,其網(wǎng)址:http://velocity.apache.org/;下載地址:http://velocity.apache.org/download.cgi,可直接下載源碼,也可通過SVN獲取源碼。
在eclipse中創(chuàng)建一個web應(yīng)用工程,把Velocity的源碼拷到j(luò)ava資源目錄下,自動編譯后,報(bào)幾個錯,拷貝下載的Velocity源碼lib目錄下的commons-collections-3.1.jar、oro-2.0.8.jar、commons-lang-2.1.jar這個三類包到web應(yīng)用工程的lib目錄下即可。
準(zhǔn)備就緒,就寫個例子跑跑試試。寫一個hello.vm的模板文件,創(chuàng)建一個對應(yīng)的Servlet,就可以運(yùn)行了。兩文件源碼貼出如下:
hello.vm
<html>
<body>
#set($greet = "你好哇!")
Hello!$name, $greet
</body>
</html>
HelloServlet.java
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Hashtable;
import java.util.Properties;
import javax.servlet.ServletConfig;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.velocity.Template;
import org.apache.velocity.app.Velocity;
import org.apache.velocity.context.Context;
import org.apache.velocity.servlet.VelocityServlet;
public class HelloServlet extends VelocityServlet {
protected Properties loadConfiguration(ServletConfig config)
throws IOException, FileNotFoundException {
Properties p = new Properties();
String path = config.getServletContext().getRealPath("/");
if (path == null) {
path = "/";
}
p.setProperty(Velocity.FILE_RESOURCE_LOADER_PATH, path);
p.setProperty("runtime.log", path + "velocity.log");
p.setProperty(Velocity.INPUT_ENCODING, "GBK");
p.setProperty(Velocity.OUTPUT_ENCODING, "GBK");
return p;
}
public Template handleRequest(HttpServletRequest request,
HttpServletResponse response, Context ctx) {
Template template = null;
try {
ctx.put("name","Velocity");
template = Velocity.getTemplate("/hello.vm");
} catch (Exception e) {
e.printStackTrace();
}
return template;
}
}
創(chuàng)建servelt要注意的幾個地方。
1、新建的Servlet要擴(kuò)展Velocity的VelocityServlet
2、在servlet中要實(shí)現(xiàn) public Template handleRequest(HttpServletRequest request,HttpServletResponse response, Context ctx)
A)把要返回到頁面上的數(shù)據(jù)放到context中對應(yīng)到指定鍵值(鍵值名為對應(yīng)模板中定義的變量名)
B)引入指定模板文件
3、導(dǎo)入配置文件的方法protected Properties loadConfiguration(ServletConfig config),是否實(shí)現(xiàn),是可選的 ,其作用在后面說明。
發(fā)布運(yùn)行后,訪問http://localhost:8080/vt/HelloServelt,就可看到結(jié)果了。
運(yùn)行起來,看到結(jié)果,是覺得很簡單,其運(yùn)行過程,就要跟蹤看源碼才能知道了。
看源碼,先看的,肯定是VelocityServlet.java。發(fā)現(xiàn)源碼注釋中,這個類已不推薦使用,推薦使用Velocity的一個子項(xiàng)目tool中的VelocityViewServlet.java,我沒有當(dāng)tool子項(xiàng)目,就先看這個“過時的”實(shí)現(xiàn)。
VelocityServlet.java,擴(kuò)展了HttpServlet,實(shí)現(xiàn)了doGet、doPost、init基本方法,前兩個方法都直接調(diào)用新實(shí)現(xiàn)的doRequest方法,這些都是很常規(guī)的操作。
doRequest方法做如下幾件事:創(chuàng)建上下文、設(shè)置響應(yīng)內(nèi)容文件類型、獲取模板(調(diào)用每個請求中的具體實(shí)現(xiàn))、合并數(shù)據(jù)做出響應(yīng)、出錯處理及資源清理。看到這兒,整個請求和響應(yīng)過程很清晰,并沒什么特別的處理。
接下來,看看它的初始化做了些什么事。就做了三件事,超類初始化、自己的初始化、緩存內(nèi)容類型數(shù)據(jù)。自己的初始化,也就是(i)導(dǎo)入配置信息,(ii)根據(jù)配置信息做初始化設(shè)置。導(dǎo)入配置信息,是根據(jù)指定的幾個地方,獲取配置數(shù)據(jù)(在提供的樣例中,重載了它的獲取配置數(shù)據(jù)的方法,自己靈活的寫入一些配置信息);根據(jù)配置信息做初始化的工作,應(yīng)用單例設(shè)計(jì)模式,保證初始化工作的處理唯一。
VelocityServlet自已的初始化,調(diào)用另一個類org.apache.velocity.app.Velocity的init( Properties p )方法,就看看Velocity里做了些什么。Velocity里全是靜態(tài)方法。主要有如下幾個方法:
1、初始化;2、預(yù)演傳入的數(shù)據(jù)(發(fā)現(xiàn)在應(yīng)用中沒有使用,只在單元測試代碼中引用到);3、合并數(shù)據(jù)和模板;4、設(shè)置/獲取屬性;5、操作信息提示(不過,都不推薦使用了),整個的看下來,有兩點(diǎn):1、主要的還是初始化和數(shù)據(jù)合并了;2、這個類只是一個中轉(zhuǎn)類,所有的方法,最終都是調(diào)另一個類org.apache.velocity.runtime.RuntimeSingleton的方法。
打開RuntimeSingleton的代碼,看一看,發(fā)現(xiàn)它同Velocity類差不多,類本身不做實(shí)際的處理操作。它與Velocity不同的是,它是申明一個靜態(tài)的實(shí)例,再調(diào)用這個實(shí)例,個別地方(init())加了同步控制。如此處理體現(xiàn)它這個類的名字--單例,核心的還是這個靜態(tài)實(shí)例org.apache.velocity.runtime.RuntimeInstance。
到RuntimeInstance,就開始接觸到Velocity的處理核心了。
寫到這兒,突然沒有寫下去的沖動了,暫切休息一下。
抽時間看了一下Velocity子項(xiàng)目tool下的VelocityViewServlet的源碼,比VelocityServlet要實(shí)現(xiàn)的好多了,與struct接合的比較好。
Velocity,不僅僅適合于web應(yīng)用,還可以作生成SQL、XML的模板,內(nèi)容比較多,待一一挖掘。