??xml version="1.0" encoding="utf-8" standalone="yes"?>
那天在某个网站上发现有“添加到google bookmark”的链接Q兴奋了一阵,Ngoogle也推出bookmark服务了?l果在google lab里面找了一阉|有找刎ͼq脆在google上搜了一阉|在个性主里扑ֈ了它的媄子。试用了一下,功能十分陋,很是失望。但是q个失望Q让我看Cgoogle不一L地方......
说到bookmark功能Q对web2.0E微了解的朋友都应该熟?zhn)delicious, yahoo, diigo{名字。从我的角度Ԍq个service是很有h(hun)值的Q的ؓ搜集互联|资料带来了很大的便利,不仅如此diigoq提供了highlight功能Q可以把|页像看书一样勾画重点;从网站的角度Ԍ提供q样的service是抓住用L非常好的ZQ但从技术角度讲Q又会发现这个service的web技术难度ƈ不大Q而有一定难度的处理大规模用戯问带来的performance问题恰恰又是Google的强V所以,我想如果有一天google在delicious, yahoo, diigo{公司后推出自己的Bookmark一定可以凭借自q影响力和技术优势后来居上?br />
可是相反Q我们却明显地感CQgoogleq不惛_借自己在互联|领域的C打压其他公司Q吞噬其市场。一斚wQ有很简单的道理Q“一个delicious的用P他完全可以同时成为google的用P你要用bookmark我推荐你去delicious或者diigoQ你要用search用map请你到我q儿来”,竞争在一念之间化解了Q另一斚wQ如果像YouTubeq样体现Z巨大市场价值的公司Qgoogle把它收入帐下,造就一个双赢局面。google的策略,我理解:“稳住自qsearch engineQ做原创性的serviceQ剩下的I间l别人留着”。所以,虽然wؓ巨无霸,但google其实没有l同行带来窒息的感觉Q同旉׃做得更好。你有原创的东西Qgoogle鼓励你做得更好;google有原创的东西Q你要抄袭,也请加aQgoogle是真正把双赢{略做到了的公司Q包括从其adwordsq告计划也可以明昑֜感觉到。所以,我对google的前景依然看好,当然q种看好完全是一U直觉式的,我不是经学Ӟ对业界也不甚了解Q但直觉在预事物发展的时候往往比一大堆的理论管用?img src ="http://www.tkk7.com/weidagang2046/aggbug/86121.html" width = "1" height = "1" />
我在最q的一?/span>
web
目中ؓ了实?/span>
bookmark
功能到?/span>
javascript
跨域讉K的问题。v初,?/span>
google
上搜的很多解x案ƈ不适用于我的情形,只在有一文章中提到的远E加?/span>
javascript
Ҏ(gu)从理Z看到了解决的希望。但可惜作者只是一W带q,q未用例子详l说明,所以不得不摸烦了一阉|把这个问题搞定。在此,希望通过本文为同栯q个问题困扰的朋友们提供一个解x法作为参考。如有错误,Ƣ迎指正Q?/span>
Bookmark
是目前许?/span>
web2.0
|站
(http://del.icio.us/, www.diigo.com
{)都提供的热门
feature
。它能将互联|上自己喜欢的网|藏到
Bookmark
服务器上。本文要解决的问题就发生在用h交网?/span>
URL
Q还包括
Tag, Notes
{)l?/span>
Bookmark
服务器时?/span>
关于
URL
的提交至可以有三种方式Q?/span>
1.
登陆
Bookmark
服务器的提交面Q将要收藏的
URL
通过该页面提交给服务器?/span>
2.
安装览器插Ӟ通过插g?/span>
URL
提交l服务器?/span>
3.
?/span>
Bookmark
服务器动态加?/span>
javascript
工具到当前面Q通过它来完成提交工作。(参?/span>
diigo
的例子,收藏一个网链接到览器收藏夹Q链接的
URL
是一D?/span>
javascript
代码Q它会从服务器加载一D?/span>
javascript
注入当前|页Q?/span>
W一U方式开发v来最单,但对用户来讲比较ȝQ每ơ都需要先登陆
Bookmark
服务器才能完成提交;W二U方式我q不熟?zhn)插g开发,而且用户也不喜欢太多的插件堆满自q览器;W三U方式开发难度小Q又避免了每ơ登陆服务器的麻烦,所以我最l采用了它?/span>
上面讲的W三U方式中动态加载的
javascript
工具除了需要生?/span>
UI
供用户填写信息(
URL
Q?/span>
tag
Q?/span>
notes
{)Q当用户点击提交的时候,q要完成与服务器通信的功能。在没有跨域讉Kl验的情况下Q最先想到的当然?/span>
ajax
Q但很快׃发现Ҏ(gu)行不通?/span>
跨域讉KQ简单来说就?/span>
A
|站?/span>
javascript
代码试图讉K
B
|站Q包括提交内容和获取内容。由于安全原因,跨域讉K是被各大览器所默认止的。写q跨域访?/span>
ajax
的朋友相信都遇到q被告知“没有权限”的情况。通过
XMLHttp
来发送数据给
Bookmark
服务器的试p|了。于是,看到|上的一些资料,我又开始尝试用
javascript
工具在用户|页动态创Z个隐藏的
iframe, iframe
?/span>
src
指向服务器的一?/span>
servlet
Q试N过调用
iframe
中提供的
javascript
来完成与服务器的通信。但不幸的是Q用L中?/span>
javascript
代码讉K
iframe
也被览器归域访问(Ҏ(gu)
iframe
?/span>
src
指向其它|站的情形)Q尝试再ơ失败?/span>
最l,在一文章中看到Q与
iframe
不同Q如?/span>
A
|站?/span>
B
|站加蝲
javascript
Q?/span>
A
|站可以自由的访问该
javascript
的内容,q不会被览器认为是跨域讉K。模仿刚?/span>
iframe
的思\Q当用户点击提交Ӟ可以动态创Z?/span>
javascript
对象Q该对象?/span>
src
指向
Bookmark
服务器的一?/span>
servlet
Q注意:
URL
?/span>
Tag
?/span>
Notes
?/span>
User
?/span>
Password
{信息被作ؓ
src URL
参数传给服务器。请看下面的代码Q?/span>
var
url =
"http://localhost:8080/Deeryard/BookmarkServlet?"
+
"url="
+ url_source +
"&"
+
"title="
+ title +
"&"
+
"tag="
+ tag +
"&"
+
"notes="
+ notes +
"&"
+
"user="
+ user
+ "&"
+
"password="
+ password;
url = encodeURI(url);
//Submit to server with a trick
var
js_obj = document.createElement(
"script"
);
js_obj.type =
"text/javascript"
;
js_obj.setAttribute(
"src"
, url);
//Get response from server by appending it to document
document.body.appendChild(js_obj);
上面例子中,
js_obj.setArrribute()
信息作?/span>
src
?/span>
URL
参数提交l了
Bookmark servlet
。那么用户又如何取得服务器的响应信息呢?{案是最末一行代码,
servlet
的输出必L
javascript
代码Q它可以调用用户|页上的其他
javascript
函数Q以及操?/span>
dom
对象。下面的
servlet
代码生成了一?/span>
javascript
函数调用Q?/span>
out.write("onServerResponse(INADEQUATE_INFORMATION);");
document.body.appendChild(js_obj)
执行?/span>
onServerResponse(
INADEQUATE_INFORMATION)
׃得到执行Q客户|页响应服务器结果。这样一个完整的通信q程完成了?/span>
来ȝ一下这个案例,首先与很多跨域访问的情Ş不同Q本文提到的跨域讉K需要对服务器端q行控制Q即让服务器?/span>
Servlet
来适应客户端网?/span>
javascript
的需求;而其他一些常见的例子则对服务器端没有控制能力Q比如从其他|站抓内容的偷E序。另外,需要注意的是这U方法中实际用到?/span>
get
Ҏ(gu)来提交信息,从一些资料上看到Q?/span>
get
Ҏ(gu)每次提交的信息不能超q?/span>
2k
?/span>
2006-8-27
Perl 作ؓ一U脚本语a可以实时地生成和执行代码。这U特性可以把代码的编译推q到q行Ӟ所以又UCؓ“动态代码”。另外, Perl 也如 Java ?/span> C++ 一h供了异常处理机制。本文将初步探讨 Perl 中实现动态代码和异常处理机制的函敎ͼ eval 。如有错误不IƢ迎讨论和批评指正?/span>
eval 函数可以看作?/span> Perl 虚拟机,它的参数是一D?/span> Perl 代码。利?/span> ’perldoc –f eval?/font> 可以获取 eval 函数使用帮助Q其中介l了它的两种使用方式Q?/span>
l
eval EXPR
EXPR 是一个的表达式,例如Q?/span>
eval
"print $a"
;
eval
'print $a'
.
', $b'
;
eval
1
+
3
;
eval
'print '
.
'$a + $b, "\n"'
;
eval
$command;#$command = ‘print “hello Perl”?/span>
eval
$ARGV[0];
在执行时Q?/span> Perl 解释器会首先解析表达式的|然后表辑ּgZ?/span> Perl 语句插入当前执行上下文。所以,新生成的语句?/span> eval 语句本nh相同的上下文环境。这U方式中Q每ơ执?/span> eval 语句Q表辑ּ都会被解析。所以,如果 eval EXPR 如果出现在@环中Q表辑ּ可能会被解析多次?/span> eval 的这U方式?/span> Perl 脚本E序能实时生成和执行代码Q从而实C“动态代码”?/span>
l
eval BLOCK
BLOCK 是一个代码块Q例如:
eval {print $a};
eval {$a = 1, $b = 2, $c = $a + $b};
与第一U方式不同, BLOCK 只会被解析一ơ,然后整个插入当前 eval 函数所在的执行上下文。由于解析上的性能的优势,以及可以在编译时q行代码语法查,q种方式通常被作?/span> Perl 用来ZD代码提供异常捕捉机Ӟ虽然前一U方式也可以?/span>
按帮助的名称Q称 eval 的参数程序ؓ“小E序?/span> (mini-program) 。在两种方式中, eval 函数的返回值都是小E序的最后一条语句的|如果遇到 return 语句Q与子例E相同?/span>
Script1:
#!/usr/bin/perl -w
push
(
@program,'$i = 1;');
push
(
@program,'$i = 3; $j = 2; $k = $i + $j');
push
(
@program, '$i = 3; return 24; $k = $i + $j');
foreach
$exp (@program)
{
$rtn =eval($exp);
print
$rtn,"\n";
}
Output:
1
5
24
|
如果程序中有语法错误、运行时错误遇到 die 语句Q?/span> eval 返?/span> undef 。错误码被保存在 $@ 中?/span>
Script2:
#!/usr/bin/perl -w
push
(
@program, '$i = 3; die "error message"; $k = $i + $j');
foreach
$exp (@program)
{
$rtn =eval($exp);
if
(
!
defined
(
$rtn))
{
print
"Exception: "
,
$@,"\n";
}
else
{
print
$rtn,"\n";
}
}
;
Output:
Exception: error message at (eval 1) line 1.
|
Script3:
#!/usr/bin/perl -w
# a run-time error
eval
'$answer ='
;
# sets $@
warn
$@ if$@;
Output:
syntax error at (eval 1) line 2, at EOF
|