– 你在逃避什么?
– 我在寻求。
– 一个满怀希望的人。
– 有希望不好么?
– 希望是对那些状况不太好的人说的。
–
《越狱》 Fernando Sucre
– 你在逃避什么?
– 我在寻求。
– 一个满怀希望的人。
– 有希望不好么?
– 希望是对那些状况不太好的人说的。
–
《越狱》 Fernando Sucre
富婆去夜总会找乐子,老板娘挑了几个帅小伙,富婆不满意.老板娘挑了几个壮小伙,富婆还不满意.老板问那富婆到底想要什么样的,富婆说要体力好、精力旺盛、能加班、能熬夜、随叫随到、吃苦耐劳,老板一下乐了…..张口喊:”
搞程序的,出来接客!
http://www.javafan.net/article/20051229144530549.html (原,Google搜索)
http://www.it.com.cn/f/edu/061/4/218911.htm (闲耘转自此,发此文时原文链接暂不可用。)
2006-1-4 9:22:00 文/ zhangxhsj 出处:javafan.net
此文是转帖,闲耘作了稍许修改
RMI,远程方法调用(Remote Method Invocation)是Enterprise JavaBeans的支柱,是建立分布式Java应用程序的方便途径。RMI是非常容易使用的,但是它非常的强大。
RMI的基础是接口,RMI构架基于一个重要的原理:定义接口和定义接口的具体实现是分开的。下面我们通过具体的例子,建立一个简单的远程计算服务和使用它的客户程序
一个正常工作的RMI系统由下面几个部分组成:
远程服务的接口定义
远程服务接口的具体实现
桩(Stub)和框架(Skeleton)文件
一个运行远程服务的服务器
一个RMI命名服务,它允许客户端去发现这个远程服务
类文件的提供者(一个HTTP或者FTP服务器)
一个需要这个远程服务的客户端程序
下面我们一步一步建立一个简单的RMI系统。首先在你的机器里建立一个新的文件夹,以便放置我们创建的文件,为了简单起见,我们只使用一个文件夹存放客户端和服务端代码,并且在同一个目录下运行服务端和客户端。
如果所有的RMI文件都已经设计好了,那么你需要下面的几个步骤去生成你的系统:
1、 编写并且编译接口的Java代码
2、 编写并且编译接口实现的Java代码
3、 从接口实现类中生成桩(Stub)和框架(Skeleton)类文件
4、 编写远程服务的主运行程序
5、 编写RMI的客户端程序
6、 安装并且运行RMI系统
1、 接口
第一步就是建立和编译服务接口的Java代码。这个接口定义了所有的提供远程服务的功能,下面是源程序:
//Calculator.java
//define the interface
import java.rmi.Remote;
public interface Calculator extends Remote {
public long add(long a, long b)
throws java.rmi.RemoteException;
public long sub(long a, long b)
throws java.rmi.RemoteException;
public long mul(long a, long b)
throws java.rmi.RemoteException;
public long div(long a, long b)
throws java.rmi.RemoteException;
}
注意,这个接口继承自Remote,每一个定义的方法都必须抛出一个RemoteException异常对象。
建立这个文件,把它存放在刚才的目录下,并且编译。
>javac Calculator.java
2、 接口的具体实现
下一步,我们就要写远程服务的具体实现,这是一个CalculatorImpl类文件:
//CalculatorImpl.java
//Implementation
import java.rmi.server.UnicastRemoteObject
public class CalculatorImpl
extends UnicastRemoteObject
implements Calculator {
// 这个实现必须有一个显式的构造函数,
//并且要抛出一个RemoteException异常
public CalculatorImpl()
throws java.rmi.RemoteException {
super();
}
public long add(long a, long b)
throws java.rmi.RemoteException {
return a + b;
}
public long sub(long a, long b)
throws java.rmi.RemoteException {
return a - b;
}
public long mul(long a, long b)
throws java.rmi.RemoteException {
return a * b;
}
public long div(long a, long b)
throws java.rmi.RemoteException {
return a / b;
}
}
同样的,把这个文件保存在你的目录里然后编译他。
这个实现类使用了UnicastRemoteObject去联接RMI系统。在我们的例子中,我们是直接的从UnicastRemoteObject这个类上继承的,事实上并不一定要这样做,如果一个类不是从UnicastRmeoteObject上继承,那必须使用它的exportObject()方法去联接到RMI。
如果一个类继承自UnicastRemoteObject,那么它必须提供一个构造函数并且声明抛出一个RemoteException对象。当这个构造函数调用了super(),它久激活UnicastRemoteObject中的代码完成RMI的连接和远程对象的初始化。
3、 桩(Stubs)和框架(Skeletons)
下一步就是要使用RMI编译器rmic来生成桩和框架文件,这个编译运行在远程服务实现类文件上。
>rmic CalculatorImpl
在你的目录下运行上面的命令,成功执行完上面的命令你可以发现一个Calculator_stub.class文件,如果你是使用的Java2SDK,那么你还可以发现Calculator_Skel.class文件。
4、 主机服务器
远程RMI服务必须是在一个服务器中运行的。CalculatorServer类是一个非常简单的服务器。
//CalculatorServer.java
import java.rmi.Naming;
public class CalculatorServer {
public CalculatorServer() {
try {
Calculator c = new CalculatorImpl();
Naming.rebind(”rmi://localhost:1099/CalculatorService”, c);
} catch (Exception e) {
System .out.println(”Trouble: ” + e);
}
}
public static void main(String args[]) {
new CalculatorServer();
}
}
建立这个服务器程序,然后保存到你的目录下,并且编译它。
5、 客户端
客户端源代码如下:
//CalculatorClient.java
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.net.MalformedURLException;
import java.rmi.NotBoundException;
public class CalculatorClient {
public static void main(String[] args) {
try {
Calculator c = (Calculator)
Naming.lookup(”rmi://localhost/CalculatorService”);
System.out.println( c.sub(4, 3) );
System.out.println( c.add(4, 5) );
System.out.println( c.mul(3, 6) );
System.out.println( c.div(9, 3) );
} catch (MalformedURLException murle) {
System.out.println();
System.out.println(”MalformedURLException”);
System.out.println(murle);
} catch (RemoteException re) {
System.out.println();
System .out.println(”RemoteException”);
System.out.println(re);
} catch (NotBoundException nbe) {
System.out.println();
System.out.println(”NotBoundException”);
System.out.println(nbe);
} catch (java.lang.ArithmeticException ae) {
System.out.println();
System.out.println(”java.lang.ArithmeticException”);
System.out.println(ae);
}
}
}
保存这个客户端程序到你的目录下(注意这个目录是一开始建立那个,所有的我们的文件都在那个目录下),并且编译他。
6、 运行RMI系统
现在我们建立了所有运行这个简单RMI系统所需的文件,现在我们终于可以运行这个RMI系统啦!来享受吧。
我们是在命令控制台下运行这个系统的,你必须开启三个控制台窗口,一个运行服务器,一个运行客户端,还有一个运行RMIRegistry。
首先运行注册程序RMIRegistry,你必须在包含你刚写的类的那么目录下运行这个注册程序。
>rmiregistry
好,这个命令成功的话,注册程序已经开始运行了,不要管他,现在切换到另外一个控制台,在第二个控制台里,我们运行服务器CalculatorService,因为RMI的安全机制将在服务端发生作用,所以你必须增加一条安全策略。以下是对应安全策略的例子 policy.txt :
grant {
permission java.security.AllPermission “”, “”;
};
注意:这是一条最简单的安全策略,它允许任何人做任何事,对于你的更加关键性的应用,你必须指定更加详细安全策略。
现在为了运行服务端,你需要除客户类(CalculatorClient.class)之外的所有的类文件。确认安全策略在policy.txt文件之后,使用如下命令来运行服务器。
> java -Djava.security.policy=policy.txt CalculatorServer
这个服务器就开始工作了,把接口的实现加载到内存等待客户端的联接。好现在切换到第三个控制台,启动我们的客户端。
为了在其他的机器运行客户端程序你需要一个远程接口(Calculator.class) 和一个stub(CalculatorImpl_Stub.class)。 使用如下命令运行客户端
prompt> java -Djava.security.policy=policy.txt CalculatorClient
如果所有的这些都成功运行,你应该看到下面的输出:
1
9
18
3
如果你看到了上面的输出,恭喜你,你成功了,你已经成功的创建了一个RMI系统,并且使他正确工作了。即使你运行在同一个计算机上,RMI还是使用了你的网络堆栈和TCP/IP去进行通讯,并且是运行在三个不同的Java虚拟机上。这已经是一个完整的RMI系统。
–
闲耘注,我测试了不用 -Djava.security.policy=policy.txt 参数也执行成功,可能是我本机权限足够…
前些时候,热血来潮,想“规范”下书写Javascript的风格,其中有一条,所有的语句都必须分号结束。于是写出了如下代码:
if (true) {
// do something…
};
注意最后的分号,其实是没有必要的,浏览器解释的时候,无论在判断的大括号后是否继续有连续的代码,不要这个分号一样不会出错,像这样:
if(true){var b = true;}var s = ’string’;
和
if(true){var b = true;};var s = ’string’;
执行效果没有任何差别,但是有一种情况,在赋值操作时,必须在大括号后加分号,否则有连续的代码时会出错。加上分号可以避免压缩源代码时候因为这个分号的原因出错。例如:
var f = function(){};
好,加分号就加分号,但是有一点,会不会因为这个多加的分号,造成性能的影响呢,于是有了如下的测试代码:
<script language=”javascript” type=”text/javascript”>/*<![CDATA[*/
var Empty = new Object();
// 空语句
Empty.Sentence = new Object();
Empty.Sentence.counter = 100000;
Empty.Sentence.getMultSemicolonTime = function(){
var start = new Date();
for(var i = 0; i < this.counter; i++){
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
}
return (new Date() - start);
}
Empty.Sentence.getNoneSemicolonTime = function(){
var start = new Date();
for(var i = 0; i < this.counter; i++){}
return (new Date() - start);
}
Empty.Sentence.test = function(){
var arrMult = new Array();
var sumMult = 0;
var arrNone = new Array();
var sumNone = 0;
var counter = 10;
var sMult = ”, sNone = ”;
for(var i = 0; i< counter; i++){
var mu = this.getMultSemicolonTime()
var no = this.getNoneSemicolonTime();
sumMult += mu;
sumNone += no;
arrMult.push(mu);
arrNone.push(no);
}
for(var i = 1; i < counter; i++)
sMult += new String(arrMult[i] + ‘, ‘);
for(var i = 1; i < counter; i++)
sNone += new String(arrNone[i] + ‘, ‘);
document.write(
‘多分号:’ + sMult + ‘ = ‘ + sumMult + ‘<br />’ +
‘无分号:’ + sNone + ‘ = ‘ + sumNone
);
};
Empty.Sentence.test();
/*
Empty.Loop = new Object();
Empty.Loop.getNoneLoopTime = function(){
var start = new Date();
return (new Date() - start);
};
Empty.Loop.getEmptyLoopTime = function(){
var start = new Date();
while(true){}
};*/
/*]]>*/</script>
经过本机测试,尽管有一些不稳定因素,但是就我的结果看来,结果应该是空语句(;)不执行,或者说执行时间为零,并不影响总体的效果,至少可以说影响相当小。
我的机器并不好,如果有朋友得出不同的结果,请联系闲耘 。不论是否相同,请把您的结果数据发一份给我,谢谢。
另,在Google Docs上发布到Blog上来的空格缩进竟然失效,郁闷。
此文是转帖。
IIS,Tomcat,Apache,Resin
1、IIS
http://www.86un.com/Article/ShowArticle.asp?ArticleID=228
Internet Information Server是允许在公共Intranet或Internet上发布信息的Web服务器
首先,Internet Information Server的缩写为(IIS)是一个World Wide Web server。Gopher server和FTP server全部包容在里面。 IIS意味着你能发布网页,并且有ASP(Active Server Pages)、JAVA、VBscript产生页面,有着一些扩展功能。IIS支持一些有趣的东西,象有编辑环境的界面(FRONTPAGE)、有全文检索功能的(INDEX SERVER)、有多媒体功能的(NET SHOW)
其次,IIS是随Windows NT Server 4.0一起提供的文件和应用程序服务器,是在Windows NT Server上建立Internet服务器的基本组件。它与Windows NT Server完全集成,允许使用Windows NT Server内置的安全性以及NTFS文件系统建立强大灵活的Internet/Intranet站点。
2、TOMCAT
http://www.study888.com/computer/pro/java/web/200506/85727.html
如今,基于Web的应用越来越多,传统的Html已经满足不了如今的需求。我们需要一个交互式的Web,于是便诞生了各种Web语言。如Asp,Jsp,Php等。当然,这些语言与传统的语言有着密切的联系,如Php基于C和C++语言,Jsp基于Java语言。本文所要介绍的Tomcat即是一个Jsp和Servlet的运行平台。
Tomcat不仅仅是一个Servlet容器,它也具有传统的Web服务器的功能:处理Html页面。但是与Apache相比,它的处理静态Html的能力就不如Apache。我们可以将Tomcat和Apache集成到一块,让Apache处理静态Html,而Tomcat处理Jsp和Servlet。这种集成只需要修改一下Apache和Tomcat的配置文件即可。
基于Tomcat的开发其实主要是Jsp和Servlet的开发,开发Jsp和Servlet非常简单,你可以用普通的文本编辑器或者IDE,然后将其打包成WAR即可。我们这里要提到另外一个工具Ant,Ant也是Jakarta中的一个子项目,它所实现的功能类似于Unix中的make。你需要写一个build.xml文件,然后运行Ant就可以完成xml文件中定义的工作,这个工具对于一个大的应用来说非常好,我们只需在xml中写很少的东西就可以将其编译并打包成WAR。事实上,在很多应用服务器的发布中都包含了Ant。另外, 在Jsp1.2中,可以利用标签库实现Java代码与Html文件的分离,使Jsp的维护更方便。
3、APACHE
Apache是一�N免�M的�W站伺服器,所以也不用�X…
Apache是一�N�子新首罡呔W站伺服器,是微��的三倍…
Apache是一�N最��定的�W站伺服器,效率好!
Apache是世界排名第一的Web服务器, 根据Netcraft(http://www.netsraft.co.uk/)所作的调查,世界上百分之五十以上的Web服务器在使用Apache.
1995年4月, 最早的Apache(0.6.2版)由Apache Group公布发行. Apache Group 是一个完全通过Internet进行运作的非盈利机构, 由它来决定Apache Web服务器的标准发行版中应该包含哪些内容. 准许任何人修改隐错, 提供新的特征和将它移植到新的平台上, 以及其它的工作. 当新的代码被提交给Apache Group时, 该团体审核它的具体内容, 进行测试, 如果认为满意, 该代码就会被集成到Apache的主要发行版中.
Apache 的特性:
1) 几乎可以运行在所有的计算机平台上.
2) 支持最新的HTTP/1.1协议
3) 简单而且强有力的基于文件的配置(HTTPD.CONF).
4) 支持通用网关接口(CGI)
5) 支持虚拟主机.
6) 支持HTTP认证.
7) 集成PERL.
集成的代理服务器
9) 可以通过WEB浏览器监视服务器的状态, 可以自定义日志.
10) 支持服务器端包含命令(SSI).
11) 支持安全SOCKET层(SSL).
12) 具有用户会话过程的跟踪能力.
13) 支持FASTCGI
14) 支持JAVA SERVLETS.
…
缺点(MAYBE IT IS, MAYBE NOT):
APACHE没有为管理员提供图形用户接口(GUI), 但最近的APACHE版本已经有了GUI的支持.
4、RESIN
http://www.zhirui.com/it/2004/8-5/2875.html
Resin服务器平台介绍简介Resin提供了最快的jsp/servlets运行平台。在java和javascript的支持下,Resin可以为任务灵活选用合适的开发语言。Resin的一种先进的语言XSL(XML stylesheet language)可以使得形式和内容相分离。 如果您选用jsp平台作为internet商业站点的支持,那么速度、价格和稳定性都是要考虑到的,resin十分出色,表现更成熟,很具备商业软件的要求。而且,它是全免费的。从站点下载的就是完整版本。所以值得向您推荐! 相对于tomcat3.1,后者更象是一个正在研究的项目。目前resin可以支持sun的j2ee,而tomcat不能直接支持,而j2ee是基于java服务器端大系统的基础。但tomcat结构非常合理,而且是apache组织的产品,因此有着很好的远景。Resin1.1的特性包括:1 支持jsp1.1和在服务器端编译的javascript.2 比mod_perl,mod_php更快,比Jakarta Tomcat快3倍。您可以在Caucho的站点看到很全面的各种测试报告。3 使用servlet2.2引擎。4 自动的servlet/bean编译!5 Servlet,XSL Filtering6 支持IIS,Apache,Netscape和其它内置了HTTP/1.1的Web服务器。7 XSLT和XPath1.0引擎。8 企业级的共享软件(基于一个开放源码的协议)安装与启动:安装特别简单,只需将resin-1.1.3.zip解压缩到某个目录即可。在运行之前需要有jdk的支持。启动方式是执行:resin-1.1.3/bin/httpd (在NT)系统已经按照缺省设置启动,系统将监听8080端口。 jsp文件可放在resin-1.1.3/doc目录下;servlet可以放在resin-1.1.3/doc/web-inf/classes下面。测试 从http://localhost:8080/中可以看到resin的欢迎界面。 下载您可以在此下载最新的Resin1.1.3。大概是2.5M。当然,您也可以去 http://www.caucho.com官方站点了解详细内容并下载resin1.1.3或者1.1.2并且看一下resin的License
Apache与Tomcat的区别
APACHE是一个web服务器环境程序,启用他可以作为web服务器使用,不过只支持静态网页。如:(asp,php,cgi,jsp)等动态网页的就不行。
如果要在APACHE环境下运行jsp 的话就需要一个解释器来执行jsp网页,而这个jsp解释器就是TOMCAT, 为什么还要JDK呢?因为jsp需要连接数据库的话,就要jdk来提供连接数据库的驱程,所以要运行jsp的web服务器平台就需要APACHE+TOMCAT+JDK。
整合的好处是:
如果客户端请求的是静态页面,则只需要Apache服务器响应请求;
如果客户端请求动态页面,则是Tomcat服务器响应请求;
因为jsp是服务器端解释代码的,这样整合就可以减少Tomcat的服务开销 。
http://dev2dev.bea.com.cn/techdoc/20060927885.html
《在Eclipse中构建备忘单》
链接中作者是是Eclipse 3.1中完成,并且是英文界面。
本文参照上文,在Eclipse 3.2.1中实践完成,中文界面。
Eclipse自带备忘单示例可以选择菜单”帮助->备忘单”。
如果备忘单仍不可见,可以选择菜单”窗口->显示视图->其他”。在”显示视图”对话框中,选择”备忘单->备忘单”,确定即可,可以拖放备忘单视图以调整备忘单的显示位置。
要创建备忘单,需要先创建备忘单项目。选择菜单”新建->项目”,在”新建”对话框中,选择”插件开发->插件项目”
选择下一步。在”新建插件项目”对话框中,输入项目名,并注意取消”项目设置”中的”创建Java项目”复选框,选择适当的Eclipse版本号。
下一步。输入”插件提供程序”,选择”完成”。
此时,已经我们创建了一个空的备忘单。在”包资源管理器”中我们可以看到如下资源结构:
接下来,我们需要创建一个xml文件,用来定义备忘单的内容信息。下面是一个简单的xml文件 ( cheatsheetDemo.xml ) 示例:
version=“1.0″ encoding=“UTF-8″ ?>
这是备忘单的第二步。
仅仅是描述而已。
在这份示例中,文档结构很清晰明了,根元素
这样的格式化元素。
这份xml文档可以放在项目任何位置,最简单的方法是放在根目录。
用”插件清单编辑器”打开”Myplugins/META-INF/MANIFEST.MF”,打开如下视图:
继续,我们选择”扩展”选项卡。
单击”添加”。
在”新建扩展”对话框中取消”只显示必须插件中的扩展点”,选择”org.eclipse.ui.cheatsheets.cheatSheetContent”,完成。
会弹出”新建插件依赖”对话框,选择”是”。
右键”org.eclipse.ui.cheatsheets.cheatSheetContent”,选择”新建->category”新建分组。
得到如图,注意输入分组的id和name。
右键”org.eclipse.ui.cheatsheets.cheatSheetContent”,选择”新建->cheatsheet”新建备忘单。
如图,注意输入id,name和category,这里要输入的分组category就是刚刚新建的分组id,并输入或浏览我们上面新建的xml文档到contentFile中。
最后选择”build.properties”选项卡,保证我们新建的所有xml文档都包含在项目中,如下,我在这里输入了
,\
cheatsheetDemo.xml
完成之后,全部保存,我们需要把这个插件导出为jar文件。右键”包资源管理器”中的”Myplugins”项目,选择”导出”。
在”导出”对话框中,选择”插件开发/可部署插件和段”,下一步。
这里要注意的是,选择要导出的Plugin,并在”目标”选项卡中选择导出目标目录,以及”选项”选项卡中,选中”将各个插件打包为JAR归档”,选择完成。
将导出的jar包拷贝到%eclipse_home%/plugins/目录下,重启Eclipse。然后选择菜单”帮助->备忘单”。
选择我们刚刚创建的备忘单,注意备忘单的名称和我们定义的名称之间的对应关系,如果你重启Eclipse仍然没有看到你创建的备忘单,可以退出Eclipse,并删除%eclipse_home%/configuration目录下的org.eclipse.update子目录,然后启动Eclipse。
创建好的备忘单如下所示:
好了,完成的备忘单创建和部署已经全部完成。如果你发现创建了不可用的备忘单,说明你并没有完全导出所有的xml 文档,你需要重新审视”build.properties”选项卡中内容了。
问题:由于发布备忘单需要先打成jar包,并需要重启Eclipse,有没有什么方法可以方便的修改备忘单呢?或者说怎么创建一个临时的”便条”呢?
from : http://www.zhangdi.name/2007/01/05/%e6%9c%aa%e5%91%bd%e5%90%8d.html
在工作当中,每个人都有自己的行为习惯,但有些坏习惯会成为你实现目标的障碍。下面是八种职场常见的坏习惯,虽然它们不像酗酒和吸毒具有那么明显的破坏性,但绝对会阻碍你取得事业的成功。
一,办事拖拉。一 名信奉完美主义的美术设计师总是很晚才交上作品,但他没有意识到,准时与作品质量具有同等的重要性。在现代企业,每个人的工作往往要等到前一个人完成其分工部分后才能开始。如果你在竞争中拖拖拉拉,其他人就不再依赖你,甚至开始怨恨你、抛弃你。
二,准备不足。你所卖的东西一定就是人家想买的吗?除非你详尽调查市场,否则那种思维只会带来失败。一根制作精良的马车皮鞭算是个工艺品,挂在居室内想必也不错,不过倘若你的顾客对马和马车没什么爱好,就别老提你的马鞭。
三,不能坚持到底。一名相当成功的健身俱乐部经理告诉我,他不再参加管理讲座了,尽管讲座讲的东西很好,但要员工去执行新规定却很少奏效。我的看法是,如果新技术确实很重要,经理人就应当拿出足够时间来设法实现这些目标。
四,不吸取教训。成功人士之所以成功,不在于他们比其他人犯的错误更少,而在于他们不重复过去的错误。从错误中学到的东西常比成功教我们的更多,犯了错却不吸取教训,白白放弃如此宝贵的受教育机会实在可惜。在你从错误中学习之前,你必须承认犯错,不幸的是许多人拒绝认错。
五,有能力,无魅力。随着年龄的增长,人们更喜欢和有一定能力且平易近人的人交往,而不是那些脑瓜聪明却不可一世的人。我认识一位绝顶聪明的管理咨询师,他因为不擅人际交往而一再失败,对此他还牢骚满腹:”请根据我的成绩来评判我,别在意我的态度。我可不是那些马屁精。”他不明白,魅力是使人保持平和,而非教人溜须拍马。以他的能力和资质完全可以登上成功之舟,可是他却失之交臂。
六,当老好人。如果你总是为了取悦他人而唯唯诺诺,最后你反而会失去人们的尊敬。当你失去他人的尊敬后,要想重新获得就很难。偶尔在与你持不同意见的人面前说不,同时保持弹性并能坚持工作,也是获得尊敬的方法。有位猎头公司管理人经常对应聘者说”不”,因为人们对拒绝的反应,最能表现出他们是否具有领导才能。
七,不切实际的幻想。当分不清理想与现实的区别时,失败的陷阱差不多就布好了。重组公司是合理的,但一下子达到许多目标是不切实际的。洛杉矶一家文具店既在调整销售,又修改公司流程,同时还改变了退货政策。尽管这些措施都很必要,但6个月后,这家商店申请了破产。
八,用人不当。一家五金连锁店的”好人”老板聘用了一名他认为”强硬”的首席运营官。老板最大的错误在于,把顽固不化与坚持原则混为一谈。最后,老板被迫解雇了这名运营官,但此时好几名高级职员已经离开企业。世界上确实存在着坏人。假如你给了他们发挥的机会,最后吃亏的只能是你自己。
归属感萌生创造力。
–
修正版
有归属感才有创造力。
–
原创版
如果你是等待这个奖项给自己增光,那么得不得无所谓;如果你的得奖,能够给这个奖项增光,你可以得。
— 王蒙
自嘲自重,笑对人生。
溪回谷转愁无处;
忽有梅花一两枝。
你的身躯很庞大,但你的生命需要的仅仅是一颗心。
[美・好莱呜]利奥・罗斯顿
天空不留下鸟的痕迹,但我已飞过。
幸福的人善于忘记自己给过别人什么,却永远记得别人给过自己什么。
机遇像个小偷,来时无声无息,走时你却损失惨重。
伟大的人讨论思想,中等的人讨论事件,小人物讨论人。
— 印度谚语
如果你昨天的成绩显得很了不起,说明你今天做得还不够。
– 加利福尼亚州某中学教导处送给学生的一句话
古朴高低屋,
斜阳远近山。
林梢烟以带,
村外水如环。