當你想用Java寫一Facebook的應用?你把在facebook的帳號中加入的程序開發模塊,下載了相關的java類庫。忽然你發現不得不停下來:開發相關的入門介紹,樣例代碼和文檔說明在哪兒?這樣的挫敗感令人憤怒,而最終導致你不得不放棄。
但愿有人會盡快寫一個不錯的應用Java 開發facebook應用的入門指南。也許只需要你給我些好吃的巧克力,我們可以寫些相關的介紹文檔,老實說我們的確也解決了不少相關的問題。這里有一些技巧幫助你使用java開始建立自己的 facebook應用。 這并不是一個完整的入門指南,但他可以幫你在著手做時少走些彎路。
八個注意事項輔助你構建Java/facebook應用
1.為了你的幸福和健康,建議你使用5.0或更高的JDK開發包。
2.不用看facebook java開發包中的列子,因為那些例子是針對java桌面應用程序的。而通常你是需要寫一個web應用,這兩種應用的區別還是很大的。 一開始,你需要一個web應用服務容器,你可以能會選擇tomcat,但我不會,這里面有另一個故事,我會找個合適的時間再告訴你。Facebook的網絡應用有一個不常見的調用模式。大多數你的頁面會被facebook調用。用戶請求一個facebook的頁面,頁面中的主要內容會從你的服務器中返回給用戶。你體統的內容會融合到facebook的頁面里返回給用戶。大多數情況下這些流程不需要你的干預就能很好的執行。但需要注意的是你服務器端產生的頁面中的javascript是不能執行的,這就意味著普通的ajax不再在facebook中應用。如果你需要使用AJAX的技術實現facebook 提供的 mock-ajax不能完成的功能,則需要通過facebook的頁面跳到你服務配器上的一般頁面。
3.配置你在facebook上的應用程序
不要忘了填寫facebook應用的配置文件,你應該設置: 應用程序的回調網址。
應用程序的名字- 這個名字用來表示標識在facebook的頁面。(這些頁面可以是用iframe嵌入到facebook的導航頁,也可以是用FBML標記的頁面)。一但設定,比如http://apps.facebook.com/yourappname/yourpagename 這個頁面就會從facebok產生一個請求到你的服務器 .對于新用戶來說,這就是一個你的應用程序的歡迎頁面,邀請用戶來使用傳播你的這個應用。
4.用facebookrestclient
最重要的階級,在客戶端類庫中最重要的類是facebookrestclient.這個類中包含一系列調用facebook服務端的方法,并涵蓋了大部分你需要的功能。可惜facebookrestclient是不是個架構清晰的類。幾乎所有的請求,需要一個facebookrestclient 這是建造一個會話密鑰 .用戶登陸后可以從CGI變量中獲得會話的密鑰。(參考 FacebookParam.SESSION_KEY.toString())沒有登陸的用戶需要引導到一個登陸頁面。 試試以下方法:
// 創建一個無會話狀態的FacebookRestClient
FacebookRestClient client = new FacebookRestClient ( 你的api密鑰 , 你的加密密鑰 ) ;
String token = client.authcreateToken () ;
String loginURL = “http : //www.facebook.com/login.php?v=1.0&apikey=&”+ YOUR APIKEY +“&auth_token =”+ token ;
// 這里轉向到登陸頁面
// 登陸后就會返回會話key
FacebookRestClient.auth_getSession() 以我的經驗基本沒用。他的作用是把一個無會話的client變成一個有會話的。我發現從CGI變量中獲取會話要比試用這個方法簡單。
當有一個會話key的FacebookRestClient,你可以調用這個類提供的各種facebook編輯方法。這些方法可以很方便與facebook進行交換操作。但不幸的事這些方法返回的是未經處理的XML文檔,這些文檔后續的處理會比較麻煩。
比如 friends_get()返回的是
<document>
<friendsgetresponse>
<uid>1</uid>
<uid>2</uid>
<uid>3</uid>
</friendsgetresponse>
</document>
你也許想封裝一些提取信息的方法,例如調用friends_get(),試試這個
Document d = client . friends_get () ;
NodeList userIDNodes = d . getElementsByTagName ( " uid " ) ;
int fcount = ids . getLength () ;
List < Integer > friends = new ArrayList < Integer > () ;
for ( int i = 0 ; i < fcount ; i ++ )
{ Node node = userIDNodes . item ( i ) ;
String idText = node . getTextContent () ;
Integer id = Integer . valueOf ( idText ) ;
friends . add ( id ) ; }
這樣friends的列表里就填充好了用戶的id.
5.servlet返回局部頁面
當你生產在facebook中的頁面時,比如這樣的一個地址http://apps.facebook.com/yourappname/yourpagename,你必須返回的一個HTML或FBML標記的頁面片段,而不是一個完全的HTML頁面。
6.學習FBML .
FBML這是一套特有的facebook標簽。試用標簽可以讓你很方便的完成很多功能(比如顯示用戶的名稱和圖片)。
7.用戶邀請好友
你想完成病毒式推廣的邀請好友?facebook最近修改了他的api(2007.11)。新版本主要改進了一個特殊的form,fb:form.
原來完成這功能的方法FacebookRestClient.notifications_sendRequest()已經不再使用了,如果你不慎調用將會得到一個異常。
8.用戶檔案信息顯示頁面
要想將一些信息放入用戶的檔案信息頁面,使用FacebookRestClient.profile_setFBML()。這個方法復寫了你在應用里設定的默認信息頁面。當你設定了用戶的個人檔案的FBML頁面,這些頁面被流量時,facebook會緩存這些頁面信息而不會即時更新。這樣就使得用戶信息的動態更新會麻煩一些。當一個事件觸發用戶信息改變時,你需要重新調用profile_setFBML()更新這些信息。幸運的時既然你已經有一個登陸的客戶端可以做任何事情,所以這個客戶端也可以任意設置你的用戶資料的數據項。
posted @
2008-02-15 01:00 kylixlu 閱讀(466) |
評論 (0) |
編輯 收藏
Bean是Enterprise Java Bean的縮寫,一個Bean扮演著應用程序素材的角色。她包含有一個functional interface,一個life-cycle interface,以及一個實做它所支援的商業方法的類別。
Bean Instance(Bean實例)
一個Bean Instance是Bean位于一個容器中的instantiation,如果把bean比作class,那么Bean Instance就是Java Object。
Bean-managed persistence(Bean自己所管理的永續性)
這個術語是用來描述Enterprise Java Bean如何來存儲它們的state到數據庫或者是其他的存儲機制。容器將促使Bean呼叫Bean的EjbLoad()和EjbSave()方法。
Container(容器)
一個Bean的容器會實做bean的home
interfaces與remote interfaces。它應該提供一組公用程序類別以便能夠隱藏bean
instances,介入方法調用,維持交易完整性與bean
instances池的一般管理。雖然Ejb規則中規定一個容器必須管理超過一種以上的bean,不過通常每個容器只有一個bean。
Container-managed demarcation
對于一個enterprise bean,不論何時,當其中的一個商業方法被呼叫,容器便自動啟動一項新的交易。商業方法完成后,交易就結束了。容器啟動交易的形式由bean的交易屬性來決定,或者,由商業方法本身來決定(如果有指明的話)。
Container-managed persistence(委托容器管理的永續性)
Bean開發者可以委托容器來負責記錄Bean的最新狀態。Bean的狀態必須由
Bean中的許多public Fields得到。容器可以確保這些public fields在任何bean的方法被喚醒之前為正確的。public
fields必須在deployment descriptor中定義,然后才產生container classes。
Entity beans
Entity beans 代表可以辨認的永續物件。典型的實例就是:它可以代表關系數據庫中個別的rows。當然,也可以是檔案系統中的檔案,或者是任何其他獨一無二的可辨識資料。
Home
每一個Enterprise
Bean,不論是Session或者是Entity bean,都有一個interface來讓客戶端能夠建立與移除一個bean
instance。以Entity為例,home interface 提供一些方法以允許客戶端對于一個bean
instance來作定位用。這個interface遵循Java RMI interface的規定。每個home
interface都繼承自一個遠端界面,即EJBHome。
Remote
一個bean的remote interface 描述對于一個bean
instance中可供客戶端呼叫的方法集合。這個interface 遵循Java RMI interface的規定。每個remote
interface都繼承自一個遠端界面,即EJBObject。
Session beans
Session beans為 particular client所建立。如果經過一段被稱為timeout的指定空閑時間之后,就不再存在。
Session synchronization
Session beans 可選擇性地實做Session
Synchronization interface。這樣可以允許Session beans在交易將完成之前與完成之后被通知。session
bean可以使用beforeCompletion()方法來否決交易的成功完成,并且能夠使用afterCompletion()來判斷交易成功與否。
Transaction Attribute (交易屬性)
一項transaction
attribute可以用在bean與其特殊的商業方法上。其可能的值有六種,分別是TX_NOT_SUPPORTED,TX_REQUIRED,
TX_SUPPORTS,TX_REQUIRES_NEW,TX_MANDATORY,TX_BEAN_MANAGED。
posted @
2008-02-05 19:09 kylixlu 閱讀(227) |
評論 (0) |
編輯 收藏
Hibernate一共包括了23個jar包,令人眼花繚亂。本文將詳細講解Hibernate每個jar包的作用,便于你在應用中根據自己的需要進行取舍。
下載Hibernate,例如2.0.3穩定版本,解壓縮,可以看到一個hibernate2.jar和lib目錄下有22個jar包:
hibernate2.jar:
Hibernate的庫,沒有什么可說的,必須使用的jar包
cglib-asm.jar:
CGLIB庫,Hibernate用它來實現PO字節碼的動態生成,非常核心的庫,必須使用的jar包
dom4j.jar:
dom4j是一個Java的XML
API,類似于jdom,用來讀寫XML文件的。dom4j是一個非常非常優秀的Java XML
API,具有性能優異、功能強大和極端易用使用的特點,同時它也是一個開放源代碼的軟件,可以在SourceForge上找到它。在IBM
developerWorks上面可以找到一篇文章,對主流的Java XML
API進行的性能、功能和易用性的評測,dom4j無論在那個方面都是非常出色的。我早在將近兩年之前就開始使用dom4j,直到現在。如今你可以看到越
來越多的Java軟件都在使用dom4j來讀寫XML,特別值得一提的是連Sun的JAXM也在用dom4j。這是必須使用的jar包,
Hibernate用它來讀寫配置文件。
odmg.jar:
ODMG是一個ORM的規范,Hibernate實現了ODMG規范,這是一個核心的庫,必須使用的jar包。
commons-collections.jar:
Apache Commons包中的一個,包含了一些Apache開發的集合類,功能比java.util.*強大。必須使用的jar包。
commons-beanutils.jar:
Apache Commons包中的一個,包含了一些Bean工具類類。必須使用的jar包。
commons-lang.jar:
Apache Commons包中的一個,包含了一些數據類型工具類,是java.lang.*的擴展。必須使用的jar包。
commons-logging.jar:
Apache
Commons包中的一個,包含了日志功能,必須使用的jar包。這個包本身包含了一個Simple
Logger,但是功能很弱。在運行的時候它會先在CLASSPATH找log4j,如果有,就使用log4j,如果沒有,就找JDK1.4帶的
java.util.logging,如果也找不到就用Simple
Logger。commons-logging.jar的出現是一個歷史的的遺留的遺憾,當初Apache極力游說Sun把log4j加入JDK1.4,
然而JDK1.4項目小組已經接近發布JDK1.4產品的時間了,因此拒絕了Apache的要求,使用自己的java.util.logging,這個包
的功能比log4j差的很遠,性能也一般。后來Apache就開發出來了commons-logging.jar用來兼容兩個logger。因此用
commons-logging.jar寫的log程序,底層的Logger是可以切換的,你可以選擇log4j,java.util.logging或
者它自帶的Simple
Logger。不過我仍然強烈建議使用log4j,因為log4j性能很高,log輸出信息時間幾乎等于System.out,而處理一條log平均只需
要5us。你可以在Hibernate的src目錄下找到Hibernate已經為你準備好了的log4j的配置文件,你只需要到Apache
網站去下載log4j就可以了。commons-logging.jar也是必須的jar包。
使用Hibernate必須的jar包就是以上的這幾個,剩下的都是可選的。
ant.jar:
Ant編譯工具的jar包,用來編譯Hibernate源代碼的。如果你不準備修改和編譯Hibernate源代碼,那么就沒有什么用,可選的jar包
optional.jar:
Ant的一個輔助包。
c3p0.jar:
C3PO是一個數據庫連接池,Hibernate可以配置為使用C3PO連接池。如果你準備用這個連接池,就需要這個jar包。
proxool.jar:
也是一個連接池,同上。
commons-pool.jar, commons-dbcp.jar:
DBCP數據庫連接池,Apache的Jakarta組織開發的,Tomcat4的連接池也是DBCP。
實際上Hibernate自己也實現了一個非常非常簡單的數據庫連接池,加上上面
3個,你實際上可以在Hibernate上選擇4種不同的數據庫連接池,選擇哪一個看個人的偏好,不過DBCP可能更通用一些。另外強調一點,如果在
EJB中使用Hibernate,一定要用App Server的連接池,不要用以上4種連接池,否則容器管理事務不起作用。
connector.jar:
JCA 規范,如果你在App Server上把Hibernate配置為Connector的話,就需要這個jar。不過實際上一般App Server肯定會帶上這個包,所以實際上是多余的包。
jaas.jar:
JAAS是用來進行權限驗證的,已經包含在JDK1.4里面了。所以實際上是多余的包。
jcs.jar:
如果你準備在Hibernate中使用JCS的話,那么必須包括它,否則就不用。
JDBC2_0-stdext.jar:
JDBC2.0的擴展包,一般來說數據庫連接池會用上它。不過App Server都會帶上,所以也是多余的。
jta.jar:
JTA規范,當Hibernate使用JTA的時候需要,不過App Server都會帶上,所以也是多余的。
junit.jar:
Junit包,當你運行Hibernate自帶的測試代碼的時候需要,否則就不用。
xalan.jar, xerces.jar, xml-apis.jar:
Xerces是XML解析器,Xalan是格式化器,xml-apis實際上是
JAXP。一般App
Server都會帶上,JDK1.4也包含了解析器,不過不是Xerces,是Crimson,效率比較差,不過Hibernate用XML只不過是讀取
配置文件,性能沒什么緊要的,所以也是多余的。
posted @
2008-02-05 18:57 kylixlu 閱讀(194) |
評論 (0) |
編輯 收藏
解決JAVA加密出口限制
jce_policy-1_5_0 download
posted @
2008-01-28 14:36 kylixlu 閱讀(809) |
評論 (1) |
編輯 收藏
以前也有過個問題,忘記怎麼弄了,GOOGLE一把,找到了答案,為了防止忘記,記錄一下,嘻嘻
需要新建一個 jaxp.properties, 內容如下:
javax.xml.parsers.SAXParserFactory: org.apache.xerces.jaxp.SAXParserFactoryImpl
保存文件到$JAVA_HOME/jre/lib/下面
接下來可能會出現下面的錯誤信息:
javax.xml.parsers.FactoryConfigurationError: Provider org.apache.xerces.jaxp.SAX
ParserFactoryImpl could not be instantiated: java.lang.NullPointerException
因此還需要把xercesImpl.jar復制到D:\jdk1.5.0_01\jre\lib\endorsed下面(沒有這個目錄就創建這個目錄)
重新啟動resin,我的webapp啟動成功了。
訪問 http://lizongbo.myresintest.com/mywebapp/,頁面正常出現。
b.另外一種更簡單的解決方法,不需要修改jdk的配置
((此方法沒有測試過,請參考http://www-900.ibm.com/developerWorks/cn/webservices/ws-axisfaq/index.shtml和http://www.caucho.com/quercus/faq/question.xtp?question_id=295)):
<host id="lizongbo.myresintest.com" root-directory=".">
<web-app id='/' document-directory="webapps/ROOT"/>
<web-app id='/lizongbo' document-directory="E:/jb/oscachedemo/test">
<system-property javax.xml.transform.TransformerFactory="org.apache.xalan.processor.TransformerFactoryImpl"/>
<system-property javax.xml.parsers.DocumentBuilderFactory="org.apache.xerces.jaxp.DocumentBuilderFactoryImpl"/>
<system-property javax.xml.parsers.SAXParserFactory="org.apache.xerces.jaxp.SAXParserFactoryImpl"/>
<system-property org.xml.sax.driver="org.apache.xerces.parsers.SAXParser"/>
</web-app>
</host>
posted @
2008-01-28 12:49 kylixlu 閱讀(979) |
評論 (0) |
編輯 收藏