当你想用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 阅读(459) |
评论 (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 阅读(219) |
评论 (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 阅读(189) |
评论 (0) |
编辑 收藏
解决JAVA加密出口限制
jce_policy-1_5_0 download
posted @
2008-01-28 14:36 kylixlu 阅读(798) |
评论 (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 阅读(971) |
评论 (0) |
编辑 收藏