要在tomcat前面放个apache吗?

转自 http://wiki.apache.org/tomcat/FAQ/Connectors#Q3 Why should I integrate Apache with Tomcat? (or not) There are many reasons to integrate Tomcat with Apache. And there are reasons why it should not be done too. Needless to say, everyone will disagree with the opinions here. With the performance of Tomcat 5 and 6, performance reasons become harder to justify. …

要在tomcat前面放个apache吗? Read More »

Facebook 的API

初略地研究了一下Facebook的API 基本上,你可以    1. 用JS从客户端调这个API, 也可以用php, java从服务器端调用API    2. API可以返回json结构的数据,也可以直接返回html. 两种格式都可以为Mash-up服务    3. 可以用“iframe包含”方式来mash-up facebook的一个页面,也可以嵌入facebook的自定义标签来调用API 官方给的例子:    1.客户端直接使用 iframe <body> <iframe src="http://www.facebook.com/plugins/like.php?href=YOUR_URL"><iframe> </body>    2. 在客户端用facebook提供的XML标签库(XFBML) ,使你的页面代码更简洁 <body> <script src="http://connect.facebook.net/en_US/all.js#xfbml=1"></script> <fb:like></fb:like> </body>    3. 客户端获得JSON数据 <body> <div id="fb-root"></div> <script src="http://connect.facebook.net/en_US/all.js"> </script> <script> FB.init({ appId:’119449798131809′, cookie:true, status:true, xfbml:true }); FB.api(‘/me’, function(user) { if(user != null) { …

Facebook 的API Read More »

MIME邮件格式的定义在 RFC5322中

http://tools.ietf.org/html/rfc5322 3.4. Address Specification    Addresses occur in several message header fields to indicate senders    and recipients of messages.  An address may either be an individual    mailbox, or a group of mailboxes.    address         =   mailbox / group    mailbox         =   name-addr / addr-spec    name-addr       =   [display-name] angle-addr    angle-addr      =   [CFWS] …

MIME邮件格式的定义在 RFC5322中 Read More »

通过Runtime.getRuntime().exec() 调用系统应用时,应该异步打印verbose信息

如果你这样打, 可能会导致执行阻塞 private static void printInput(Process p) throws IOException { BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream())); String line; while ((line = in.readLine()) != null) { System.out.println(line); } in.close(); } 所以,你要用非阻塞的方式来打。CXF源代码里有个不错的例子: if (p.getErrorStream() != null) { StreamPrinter errorStreamPrinter = new StreamPrinter(p.getErrorStream(), "", System.out); errorStreamPrinter.start(); //StreamPrinter是一个线程 } if (p.getInputStream() != null) { StreamPrinter infoStreamPrinter = new StreamPrinter(p.getInputStream(), …

通过Runtime.getRuntime().exec() 调用系统应用时,应该异步打印verbose信息 Read More »

讨论:如果一个布尔值可能为空,则不要用布尔来定义它的类型

“肚子里的孩子是不是男的?”? 除了回答“是”或“否”,还可以回答“不知道/未定” 原始的boolean类型不能赋值为“未定”,不能用; java.lang.Boolean类型的对象可以赋值为“null”,似乎可以解决这个问题。 但这种做法仍有隐患:   1. 有的人对“Boolean值可能为空”缺乏意识。 比如你的同事再调用你的 isBoy()时可能并不会先判断它是否为null.   2. 有些框架对封装类型如Boolean, Integer会使用默认值机制。比如有些Web Service框架就会把客户端传来的Boolean值强行设置成Boolean.FALSE 为了解决这个问题,最好弃用布尔类型,改用enum,或者字符串。人们在潜意识里都知道enum和字符串可能为空,因此不会贸然犯错。 enum Gender{ MALE, FEMALE }

jax-ws中映射多态

public interface AnimalService { @WebMethod void add(Animal animal); } 这里Animal是抽象类,它有两个子类Cat和Dog; 有没有办法在WSDL里实现这种多态? 答案是可以,使用@XmlSeeAlso注解即可 @XmlSeeAlso({Cat.class, Dog.class}) public abstract class Animal{ } 这样产生的WSDL里会有这样的东西: <xs:complexType name="cat"> <xs:complexContent> <xs:extension base="tns:animal"> <xs:sequence> … </xs:sequence> </xs:extension> </xs:complexContent> </xs:complexType>

SalesForce: 一个Managed Package的ISV应该采用什么样的开发部署过程?

一个第三方开发者(ISV) 需要开发Managed Package让消费者使用,而在这个ISV组织内部,软件开发又要经历 Dev -> QA测试 -> UAT测试 -> 上线 等步骤,而且Dev还要跟源码版本控制工具(如CVS)结合起来。 最佳模式是什么?  首先,应该利用SalesForce的Migration Tool把Package中的所有Metadata 变成文件,然后把这些文件纳入到CVS中进行管理。在Dev时,这些文件应该放在一个“开发源码分支”中。 文件修改后,可以利用Migration Tool把它们作为MetaData塞回SalesForce服务器,最后开发人员可以登录SalesForce网站进行功能测试。  那QA环境怎么办? 是否应该把“开发源码分支”中的文件集成到一个“QA源码分支”,然后再把这些文件塞回SalesForce,最后在SalesForce网站中测试?   答案是不行。因为namespace会冲突。 我们知道Dev和QA各有一个SalesForce实例,Managed Package在Dev分支中建立后,这个package对应的namespace已经被Dev实例独占了; 如果你想用Migration Tool把这个Package下的Metadata送到QA实例,则意味着QA实例也需要使用这个namespace. 但这是不可能的,因为一个namespace只能属于一个SalesForce实例。 那不同的实例用不同的namespace行不行?  不行。因为namespace会被直接硬编码到Apex代码中,它不是一个可以放在配置项里的东西。 所以,我们只能在Dev实例中手动打包,然后以publisher/subscriber的方式将这个包发布到QA实例中。 不过,QA实例的“安装pakcage”这种行为无法让某种配置管理工具自动记录下来。这是一个问题。 (未完待续)

SalesForce: 企业开发模式

Development Modes:   1.直接在PROD环境中用WEB界面开发   2.Dev -> PROD   3.Dev -> QA -> PROD   4.Dev -> QA -> Stage(UAT) -> PROD  适用于多个项目一起上线的情形   5.最后一种做法,它适用于多个项目一起开发但不同时走的情形. 这种做法很复杂,在此不表. 2/3/4/5 都要遵守一个约定: 在PROD上手动做的改动,都应该集成到其他环境中. 否则, 当DEV,QA,Stage -> PROD时,可能会发生冲突   关于PROD -> DEV的同步,有一些最佳实践   1. 不准直接在PROD上做改动.所有改动都要从DEV开始   2. 如果要改PROD,只做Metadata API相关的改动;因为这种改动会生成一条可追踪的轨迹   3. PROD上只设一个Admin.单人管理,比多人管理,可以集中记录所有的改动   4. 定期做PROD->DEV同步,以避免遗漏   Release时还要注意SalesForce自己的升级问题.  而且,SalesForce中Sandbox和PROD的版本还未必一致.Sandbox的版本可能更高,也可能更低