作者:Andy(http://blog.xintiantang.com/andy),轉(zhuǎn)載請先聯(lián)系我
這篇文章于2005/08/30 20:00開始,計劃在一個月內(nèi)完成,所以將會人工置頂。內(nèi)容有點(diǎn)兒亂,先把想的和做的記下來,然后再慢慢整理。同時歡迎提出你的看法。
對于普通用戶來說,使用傳統(tǒng)的桌面應(yīng)用程序(可能采用不同語言和工具開發(fā)的)可能存在這樣那樣的限制,比如界面風(fēng)格千變?nèi)f化、操作習(xí)慣不統(tǒng)一、學(xué)習(xí)難度大、無法或很難和外部應(yīng)用通信等。而傳統(tǒng)的服務(wù)器端應(yīng)用程序或網(wǎng)站也存在許多限制,比如網(wǎng)絡(luò)連通可能出現(xiàn)問題、響應(yīng)速度慢、不能保證服務(wù)器端始終可用、擔(dān)心數(shù)據(jù)安全和個人隱私問題、不夠靈活、使用不方便等。
而基于瀏覽器的桌面應(yīng)用程序正是綜合桌面應(yīng)用程序和服務(wù)器端應(yīng)用程序的功能產(chǎn)生的。它包含以下優(yōu)點(diǎn):
基于瀏覽器的桌面應(yīng)用程序(Browser-based desktop application)的定義:一個包含嵌入式網(wǎng)站服務(wù)器(Embedded web server)的能夠在瀏覽器內(nèi)的客戶端的獨(dú)立運(yùn)行(Stand alone)的應(yīng)用程序。
我把基于瀏覽器的桌面應(yīng)用程序(Browser-based desktop application)簡稱為BBDA。其實(shí)BBDA和AJAX技術(shù)一樣,也是一個buzzword,而不是什么新技術(shù),只不過把幾種通用的軟件或技術(shù)組合在一起而已。
其實(shí),BBDA很符合目前熱炒的WebOS(基于網(wǎng)絡(luò)瀏覽器的操作系統(tǒng))的特性,這方面Google做了個最好的Demo:Google Desktop, 在GD中,一切內(nèi)容的表現(xiàn)都是網(wǎng)頁(雖然隱藏了瀏覽器),并且很容易和Google網(wǎng)站進(jìn)行通信(比如同時搜索本地和搜索Web,利用RSS或XML-PRC或SOAP之類的協(xié)議讀新聞、郵件、天氣預(yù)報、股票行情等)?,F(xiàn)在GDS(Google Desktop Search)只是GD的一個模塊而已,百度的桌面搜索只是單純地模仿了GDS,卻沒有猜到原來Google是要做GD,好傻的百度。Google這幾年的收購和挖人活動(Google寬帶, Google browser等),看來一切都是為了WebOS而努力。這里順便說一下Yahoo剛收購的Konfabulator,Konfabulator和GD有很大不同,我覺得它只是包含許多小軟件或和網(wǎng)站交互的工具,只是個玩具箱而已,要做WebOS靠這個可以嗎?看來Yahoo的眼光似乎始終不如Google。推薦看看這篇文章:GoogleOS? YahooOS? MozillaOS? WebOS?
由于我主要做Java開發(fā),所以只列出可能涉及的Java軟件包:Browser(IE/FireFox), JDK, Tomcat/Jetty, HSQLDB/Apache Derby, Hibernate, Lucene, Struts/WebWork/JSF/Tapestry/Wicket/Flex&Laszlo(Flash RIA), DWR(AJAX), Apache Web Services(SOAP/XML-RPC), Apache POI(Word/Excel/ PDF), MP3 ID TAG 3 lib ,JPEG EXIF lib...
我的目的是組合幾種通用的JAVA軟件,用來進(jìn)行快速的BBDA開發(fā)。對于開發(fā)者而言,只要選好合適的軟件,并合理組合起來,完全可以達(dá)到或超過Ruby on rails的功能和開發(fā)效率。同時,對于普通用戶而言,只要打開瀏覽器輸入http://localhost就行了,用戶可以在瀏覽器里管理日記(blog?)、日歷、通訊錄、照片(flickr?)、音樂(itunes?)、文件、網(wǎng)摘(delicious?)、閱讀訂閱的RSS(bloglines?)、查看郵件(web mail)、新聞之類等,并可以進(jìn)行搜索、共享、發(fā)布、與外部應(yīng)用或網(wǎng)站同步等,構(gòu)成一個完整的個人門戶系統(tǒng)(Personal portal)。
接下來我會發(fā)布一個進(jìn)行BBDA開發(fā)的基礎(chǔ)軟件包(將會包含一個簡單的相冊的BBDA),下面是我對基礎(chǔ)軟件包的說明。
關(guān)于嵌入式網(wǎng)站服務(wù)器(Embedded web server):
我這幾天試用了Jetty和Tomcat。總以為Jetty很小呢,最適合做BBDA呢,結(jié)果發(fā)現(xiàn)軟件包也很大了,另外很多功能不如Tomcat,Tomcat Embed 5.5由于使用Ecipse JDT,現(xiàn)在已經(jīng)很小了(3M左右),而且標(biāo)準(zhǔn),所以選了Tomcat Embed(這里下載)。下面的代碼是Tomcat Embed的啟動程序。
Start.java:
package com.terac.tomcat;
import java.net.InetAddress;
import java.net.UnknownHostException;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Host;
import org.apache.catalina.LifecycleException;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.startup.Embedded;public class Start {
public static void main(String[] args) {
try {
String path = System.getProperty("SERVER_HOME");
if(path!=null&&!"".equals(path)){
int port = Integer.parseInt(System.getProperty("SERVER_PORT","8080"));
startTomcat(path,port);
}
} catch (Exception e) {
e.printStackTrace();
}
}
private static void startTomcat(String path,int port) throws UnknownHostException,
LifecycleException {
System.setProperty("catalina.home", path);
Embedded embedded = new Embedded();
Engine engine = embedded.createEngine();
engine.setName("Engine");
Host host = embedded.createHost("localhost", "web");
Context rootContext = embedded.createContext("", "");
rootContext.setPrivileged(true);
host.addChild(rootContext);
engine.addChild(host);
engine.setDefaultHost("localhost");
embedded.addEngine(engine);
Connector connector = embedded.createConnector((InetAddress) null,port, false);
embedded.addConnector(connector);
embedded.start();
}
}start.bat:
@set classpath=./lib/所有的jar文件
@java -DSERVER_HOME=%cd% -DSERVER_PORT=80 -classpath %classpath% com.terac.tomcat.Start
關(guān)于嵌入式數(shù)據(jù)庫(Embeded database):
Apache Derby雖然比HSQLDB強(qiáng)大,但還是太大了,尤其是當(dāng)用到IBM的JDBC Driver時。所以只好選HSQLDB。下面的代碼是在Web應(yīng)用程序啟動時啟動HSQLDB服務(wù)器。
HSQLDBServletContextListener.java:
還未整理好
web.xml中需要加入listener:
com.terac.hsqldb.HSQLDBServletContextListener
關(guān)于全文檢索引擎(Full text search engine):
Apache Lucene應(yīng)用廣泛,也足夠強(qiáng)大,高亮顯示(Highlighting)需要自己實(shí)現(xiàn),自動摘要(autosummarize)需要Classifier4j 。下面是常用類的封裝代碼:
Indexer.java:
還未整理好
Searcher.java:
還未整理好 Highlighter.java:
還未整理好
關(guān)于對象關(guān)系映射工具(OR mapping tools):
Hibernate是最常用最強(qiáng)大的工具。下面是Hibernate Session的封裝代碼:
HibernateUtil.java:
import net.sf.hibernate.HibernateException;
import net.sf.hibernate.SessionFactory;
import net.sf.hibernate.Session;
import net.sf.hibernate.cfg.Configuration;
import org.apache.log4j.Logger;public class HibernateUtil {
private static Log log = LogFactory.getLog(HibernateUtil.class);
public static final ThreadLocal threadSession = new ThreadLocal();
private static final SessionFactory sessionFactory;
static {
try {
sessionFactory = new Configuration().configure().buildSessionFactory();
} catch (Throwable ex) {
// We have to catch Throwable, otherwise we will miss
// NoClassDefFoundError and other subclasses of Error
log.error("Building SessionFactory failed.", ex);
throw new ExceptionInInitializerError(ex);
}
}
public static Session currentSession() throws HibernateException {
Session s = (Session) threadSession.get();
if (s == null) {
s = sessionFactory.openSession();
threadSession.set(s);
}
return s;
}
public static void closeSession() throws HibernateException {
Session s = (Session) session.get();
session.set(null);
if (s != null)
s.close();
}
}
關(guān)于模型-視圖-控制框架(MVC framework):
現(xiàn)在的MVC framework太多了,傳統(tǒng)的有Struts/WebWork,新的有JSF/Tapestry/Wicket/Flex&Laszlo(Flash RIA) ,Wicket網(wǎng)站列出了55種之多!我試過JSF,始終不能另我滿意,正在嘗試這個Wicket。
今天寫到這,待續(xù)。。。
Andy 2005/08/31 14:45 | 技術(shù) |
Alan Cooper很牛,但他說的話可不是圣經(jīng)啊,沒有什么是永遠(yuǎn)不變的。
Posted by: Andy www at 2005/08/31 15:41
Browser-based desktop application以前也聽說過,你說GDS我就一下明白了,嚴(yán)重關(guān)注中
Posted by: duduwolf www at 2005/08/31 04:02
技術(shù)太深奧了,我看不懂,先學(xué)習(xí)兩個初步的感覺:1、不能說瀏覽器就易用,人機(jī)交互的看法是,瀏覽器使人機(jī)交化工程的發(fā)展倒退了10年,原文記不住了,有時間找出來,alan copper說的2、你的browserbased其實(shí),好像,也可以叫做Web enable application,從這個角度上看,我理解目前是一種商業(yè)折中方案,即既可以部署在本機(jī)也可以部署在BS架構(gòu)特別聲明,不是拍磚,一點(diǎn)想法,期盼你的文章完成并學(xué)習(xí)