服务端 JavaScript
相对客户端而言,服务器端的 JavaScript 相对平淡很多,但是随着 JavaScript 被更多的开发人员重视,JavaScript 在服务器端也开始迅速的发展起来,Helma, Apache Sling 等等。在服务器端的 JavaScript 比客户端少了许多限制,如本地文件的访问,网络,数据库等。
一个比较有意思的服务端 JavaScript 的例子是 Aptana 的 Jaxer,Jaxer 是一个服务器端的 Ajax 框架,我们可以看这样一个例子(例子来源于 jQuery 的设计与实现这 John Resig):
<html>
<head>
<script src="http://code.jquery.com/jquery.js"
runat="both"></script>
<script>
jQuery(function($){
$("form").submit(function(){
save( $("textarea").val() );
return false;
});
});
</script>
<script runat="server">
function save( text ){
Jaxer.File.write("tmp.txt", text);
}
save.proxy = true;
function load(){
$("textarea").val(
Jaxer.File.exists("tmp.txt") ? Jaxer.File.read("tmp.txt") : "");
}
</script>
</head>
<body onserverload="load()">
<form action="" method="post">
<textarea></textarea>
<input type="submit"/>
</form>
</body>
</html>
runat 属性说明脚本运行在客户端还是服务器端,client 表示运行在客户端,server 表示运行在服务器端,而 both 表示可以运行在客户端和服务器端,这个脚本可以访问文件,并将文件加载到一个 textarea 的 DOM 元素中,还可以将 textarea 的内容通过 Form 表单提交给服务器并保存。
再来看另一个例子,通过 Jaxer 对数据库进行访问:
<script runat="server">
var rs = Jaxer.DB.execute("SELECT * FROM table");
var field = rs.rows[0].field;
</script>
通过动态,灵活的语法,再加上对原生的资源(如数据库,文件,网络等)操作的支持,服务器端的 JavaScript 应用将会越来越广泛。
当 Google 的 JavaScript 引擎 V8 出现以后,有很多基于 V8 引擎的应用也出现了, 其中最著名,最有前景的当算 Node.js 了,下面我们来看一下 Node.js 的例子:
var sys = require('sys'),
http = require('http');
http.createServer(function (req, res) {
setTimeout(function () {
res.sendHeader(200, {'Content-Type': 'text/plain'});
res.sendBody('Hello World');
res.finish();
}, 2000);
}).listen(8000);
sys.puts('Server running at http://127.0.0.1:8000/');
保存这个脚本为 sayHello.js,然后运行:
node sayHello.js
程序将会在控制台上打印:
Server running at http://127.0.0.1:8000/
访问 http://127.0.0.1:8000,两秒钟之后页面会响应:Hello, World。 再来看另一个官方提供的例子:
var tcp = require('tcp');
var server = tcp.createServer(function (socket) {
socket.setEncoding("utf8");
socket.addListener("connect", function () {
socket.send("hello\r\n");
});
socket.addListener("receive", function (data) {
socket.send(data);
});
socket.addListener("eof", function () {
socket.send("goodbye\r\n");
socket.close();
});
});
server.listen(7000, "localhost");
访问 localhost 的 7000 端口,将建立一个 TCP 连接,编码方式为 utf-8,当客户端连接到来时,程序在控制台上打印:
hello
当接收到新的数据时,会将接收到的数据原样返回给客户端,如果客户端断开连接,则向控制台打印:
goodbay
Node 提供了丰富的 API 来简化服务器端的网络编程,由于 Node 是基于一个 JavaScript 引擎的,因此天生的就具有动态性和可扩展性,因此在开发网络程序上,确实是一个不错的选择。
{$ activeFileHint $}