JavaScript--正则表达式
正则表达式(regular expression)对象包含一个正则表达式模式(pattern)。它具有用正则表达式模式去匹
配或代替一个串(string)中特定字符(或字符集合)的属性(properties)和方法(methods)。
正则表达式构造函数: new RegExp("pattern"[,"flags"]);
参数说明:
pattern -- 一个正则表达式文本
flags -- 如果存在,将是以下值:
g: 全局匹配
i: 忽略大小写
gi: 以上组合
在构造函数中,一些特殊字符需要进行转意(在特殊字符前加"\")。正则表达式中的特殊字符:
字符 含意
\ 转意,即通常在"\"后面的字符不按原来意义解释,如/b/匹配字符"b",当b前面加了反斜杆后/\b/,转意为
匹配一个单词的边界。
-或-
对正则表达式功能字符的还原,如"*"匹配它前面元字符0次或多次,/a*/将匹配a,aa,aaa,加了"\"后,/a\*/
将只匹配"a*"。
^ 匹配一个输入或一行的开头,/^a/匹配"an A",而不匹配"An a"
$ 匹配一个输入或一行的结尾,/a$/匹配"An a",而不匹配"an A"
* 匹配前面元字符0次或多次,/ba*/将匹配b,ba,baa,baaa
+ 匹配前面元字符1次或多次,/ba*/将匹配ba,baa,baaa
? 匹配前面元字符0次或1次,/ba*/将匹配b,ba
(x) 匹配x保存x在名为$1...$9的变量中
x|y 匹配x或y
{n} 精确匹配n次
{n,} 匹配n次以上
{n,m} 匹配n-m次
[xyz] 字符集(character set),匹配这个集合中的任一一个字符(或元字符)
[^xyz] 不匹配这个集合中的任何一个字符
[\b] 匹配一个退格符
\b 匹配一个单词的边界
\B 匹配一个单词的非边界
\cX 这儿,X是一个控制符,/\cM/匹配Ctrl-M
\d 匹配一个字数字符,/\d/ = /[0-9]/
\D 匹配一个非字数字符,/\D/ = /[^0-9]/
\n 匹配一个换行符
\r 匹配一个回车符
\s 匹配一个空白字符,包括\n,\r,\f,\t,\v等
\S 匹配一个非空白字符,等于/[^\n\f\r\t\v]/
\t 匹配一个制表符
\v 匹配一个重直制表符
\w 匹配一个可以组成单词的字符(alphanumeric,这是我的意译,含数字),包括下划线,如[\w]匹配"$5.98"
中的5,等于[a-zA-Z0-9]
\W 匹配一个不可以组成单词的字符,如[\W]匹配"$5.98"中的$,等于[^a-zA-Z0-9]。
说了这么多了,我们来看一些正则表达式的实际应用的例子:
HTML代码的屏蔽
function mask_HTMLCode(strInput) {
var myReg = /<(\w+)>/;
return strInput.replace(myReg, "<$1>");
}
E-mail地址验证:
function test_email(strEmail) {
var myReg = /^[_a-z0-9]+@([_a-z0-9]+\.)+[a-z0-9]{2,3}$/;
if(myReg.test(strEmail)) return true;
return false;
}
正则表达式对象的属性及方法:
预定义的正则表达式拥有有以下静态属性:input, multiline, lastMatch, lastParen, leftContext,
rightContext和$1到$9。其中input和multiline可以预设置。其他属性的值在执行过exec或test方法后被根据
不同条件赋以不同的值。许多属性同时拥有长和短(perl风格)的两个名字,并且,这两个名字指向同一个值。(
JavaScript模拟perl的正则表达式)
正则表达式对象的属性:
属性 含义
$1...$9 如果它(们)存在,是匹配到的子串
$_ 参见input
$* 参见multiline
$& 参见lastMatch
$+ 参见lastParen
$` 参见leftContext
$'' 参见rightContext
constructor 创建一个对象的一个特殊的函数原型
global 是否在整个串中匹配(bool型)
ignoreCase 匹配时是否忽略大小写(bool型)
input 被匹配的串
lastIndex 最后一次匹配的索引
lastParen 最后一个括号括起来的子串
leftContext 最近一次匹配以左的子串
multiline 是否进行多行匹配(bool型)
prototype 允许附加属性给对象
rightContext 最近一次匹配以右的子串
source 正则表达式模式
lastIndex 最后一次匹配的索引
正则表达式对象的方法:
方法 含义
compile 正则表达式比较
exec 执行查找
test 进行匹配
toSource 返回特定对象的定义(literal
representing),其值可用来创建一个新的对象。重载Object.toSource方法得到的。
toString 返回特定对象的串。重载Object.toString方法得到的。
valueOf 返回特定对象的原始值。重载Object.valueOf方法得到
例子:
<script language = "JavaScript">
var myReg = /(w+)s(w+)/;
var str = "John Smith";
var newstr = str.replace(myReg, "$2, $1");
document.write(newstr);
</script>
将输出"Smith, John"
运行regedit,编辑注册表
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ContentIndex
右侧FilterFilesWithUnknownExtensions子键(REG_DEWORD类型)
的键值改为1。
数据仓库应该说还是一个正在发展中的事物,它的技术发展及应用的
动力是商业竞争的需要。因而其定义及分类也会随着时代的发展而有
所变化。目前流行的描述方法是:"数据仓库是把企业中各分散的原始
操作数据和来自外部的数据汇集和整理成一个单一的关系数据库,为
企业提供完整、及时、准确和明了的商业决策信息,并使最终用户可
以直接从数据仓库提取信息来进行各种决策分析"。
从数据仓库的数据来源及实施环境来看,它离不开数据库,数据仓
库技术与数据库技术有紧密联系,二者能相互连通,相互支持,又有着
重要差别。主要是数据仓库侧重于决策分析,而数据库则侧重于操作
和管理。
其中Data Mart(专用数据仓库)是为满足用户特定需求而创建的
数据仓库,具有传统意义上的数据仓库的基本特征,可以看成是中央数
据仓库的一个子集,是针对某个部门级的应用( 如市场、财务、销售
、产品控制等)而建立的数据仓库。企业最高级集中化的数据仓库可
称之为原子化(Atomic)数据仓库。它主要用作其各个子集——Data M
art的集结基础(Staging ground)以及作为参照(reference)用的中央
数据仓库。
各个Data Mart物理上往往散布到与最终用户较近的地点以节约
通信开销并提高响应速度。故相对于集中化的数据仓库而言,把Data
Mart又称分布式的数据仓库。与中央数据仓库相比它与(某组)用户更
具交互性。
应着重指出的是,建立Data Mart的着眼点主要在于它的目标而不
是规模。一般情况下D ata Mart比中央数据仓库小一些,比如在大型
保险公司的数据仓库中所涉及的"主题"可能是保险金、客户等,而在
其地区办事处建立的Data Mart可能仅涉及这些主题的一个子集——
本地区的客户、保险金等。
交互式数据仓库解决方案Sybase IQ
作为国际著名数据库厂商之一的Sybase公司推出了交钥匙型的数
据仓库解决方案。
Sybase交互式数据仓库解决方案的着眼点是以较低的花费,按一
个易于管理和扩充的基础框架为企业用户和信息技术部门提供快速的
解决方案。
Sybase的特色产品便是Sybase IQ,它能方便地为用户建立Data M
art,即部门级的数据仓库,或"面向应用系统的数据仓库"。
为使各Data Mart能与该企业中其它Data Mart保持一致的增长和
维护,在创建时就应有充分的考虑。因而Sybase推出了一个名为"Quic
k Start Data Mart"的交钥匙型解决方案。它是以Sybase IQ为核心,
由Sybase及第三方(如:Business Object等)的产品和服务打包而成。
另外还包括了必要的专家咨询和技术培训,以保证在短期内为用户创
建一个实用的Data M art。
这一方案的特点包括:
●能够快速获得效益,风险低;
●以较经济的方式能够对大量用户的即席查询给出极快的响应;
。
●易于实现企业内部数据仓库与Inernet应用的有机结合。
Sybase IQ技术
Sybase IQ是针对DSS应用而提供的一个特定的数据库服务器,它
能上百倍地提高交互式即席查询的速度,特别适用于交互式数据仓库
环境。
Sybase IQ服务器可透明地集成到Sybase的开放性客户/服务器体
系结构中,它使用标准的SQL命令,支持DB-Lib、CT-Lib和ODBC客户调
用。因而,利用Isql及各种流行的前端工具,如PowerBuilder、Access
、SAS Assist及Business Object等都可方便地访问Sybase IQ服务器
。
Sybase IQ服务器可与SQL Server混合使用。一个内置的智能查
询管理器可识别并透明地将对数据库的更新传递到SQL Server以完成
OLTP;同时利用Sybase IQ来解决用于DSS的即席查询。Sybase IQ的Bi
t-Wise索引可定期地在非高峰时刻批量地进行更新。SQL Server和Sy
base IQ有一个共同集成的目录(Catalog),这样,在Sybase环境中可统
一管理安全性和其他服务,Sybase IQ也可有效地支持SMP环境及多用
户并发操作。
Sybase IQ服务器的技术特色
Sybase IQ服务器的主要特点为:
●数据的垂直分割——数据是按"列"来储存。查询时仅需读取在
该查询中所涉及的各列的索引,因而彻底避免了耗时的全表扫描。
●采用了突破性的数据存取方法——Bit-Wise索引技术。
●在数据压缩和并行处理方面有独到之处。
●提供有效的预连接(PreJoin)策略。
Sybase IQ服务器的核心由于采用了正在申请专利的Bit-Wise索
引技术,它在处理复杂的即席查询时,能比传统的B-Tree索引能提高响
应速度10~100倍。
对B-Tree及Bit-Map索引的简要回顾
1.传统的B-Tree(平衡树)索引是通过跟踪一个选择的数据字段的
值和直接指向包含该数据项的数据页的方式来提供快速查找数据记录
。
图1 传统的B-Tree 树索引
若为一个特定的客户查找信息记录就只有快速读取索引,然后直
接定位到包含该客户信息的数据页中。索引方式通过直接指向相关信
息来消除高代价的表扫描。
B-Tree非常适合于查找并取回少量的行。但对典型的数据仓库的
复杂交互式查询应用B -Tree有三个缺点:
首先,B-Tree只在索引是高度可选择(Highly Selective)又称之
为高基数(Cardinality )的时候才有价值,对一些唯一值极少的(低基
数)数据字段就几乎毫无价值。
B-Tree索引第二个限制是在数据仓库中构造和维护索引的代价。
由于B-Tree索引包含实际数据和其他信息(如指针等),因而使得索引
需占用一定的空间和时间。如果构造所有相关的索引,数据仓库就会
占据2~4倍原始数据空间。当成批插入删除时,索引就非常敏感,有可
能失去平衡并降低性能。通常说来,10%~15%的数据修改会导致重建
索引。
最后,B-Tree索引设计用于简单查询及已知公共存取路径的环境
下才有优点,而在数据仓库应用中,通常是复杂的查询,并经常带有分
组及聚合条件。此时,B-Tree索引往往是无能为力。
2.Bit-Map(位图)索引和使用B-Tree相比,位图为每个记录的名字
段用给定真或假("1"或"0")的方式表示。
传统的位图索引突破了B-Tree索引的一些限制。位图索引可以非
常有效地对低基数数据进行索引,但位图式索引却不适用于高基数数
据,在聚集数据、完成关系联结和取回原始数据值等方面的效率不高
。
Bit-Wise的索引技术特点
1.Sybase IQ在存储数据的方式上与传统的RDBMS完全不同,它不
是以"记录行"而是按"列"为单位来存储数据。即所谓的"对数据进行
垂直分割",它在Bit-Map索引基础上扩充存放了该字段中的不同取值,
一般的DSS查询往往仅涉及大量数据记录中的少数列,因而不需访问原
始数据就能快速获得查询结果。显然,利用这些不同取值也就能快速
地进行数据聚集、分组、求最大值、最小值及平均值等。它弥补了位
图式索引不适用于高基数数据的缺点。
2.由于列数据比行数据更易进行压缩,因而Sybase IQ以压缩方式
存放原始数据时可节省50%的磁盘空间,在获取查询结果数据时减少了
I/O次数,响应速度自然加快。
3.Sybase IQ采用操作系统级的并行处理机制,因而像分类、Bit-
Map操作及I/O操作都可由操作系统独立地进行调度以消除瓶颈,进而
在数据加载时其能充分利用SMP环境中多CPU的资源潜力。
Bit-Wise"数据驱动的"索引机制在Sybase IQ中对每个字段所建
索引的类型和个数主要是取决于其数据的特征和经常被使用的情况而
不是针对某组特定的查询(后者被称为"查询驱动的"索引机制)。Bit-
Wise索引是"数据驱动的",因而无需DBA为各种查询分别考虑优化策略
。
Sybase IQ支持的主要索引类型为:
·LowFast-LF(低基数)
·HighGroup-HG(高基数)
·HighNonGroup-HNG(高基数)
·FastProjiectinFP
建立Bit-Wise索引的一般原则
1)在每个列上都建FP索引;
2)在唯一值<1000的字段上建立LF索引;
3)在参加连接的字段上建HG或LF索引;
4)唯一值>1000且用在GROUP BY,SELCT DISITICT,COUNT DISITIC
T中的字段上建立HG索引;
5)此外的其它列若出现在where条件中或聚集运算中,则建立HNG
索引。
Sybase IQ可利用预连接技术来提高即席查询速度
Sybase IQ支持两类连接处理:一类是即席连接(在查询时处理);
另一类是预连接(在加载时处理)。大多数应用是二者的结合。
即席连接适用于多对多的联系,被连接的表之间的尺寸差别超过1
0倍。
预连接适用于一对多的联系,被连接的表之间的尺寸差别不大于1
0倍,如:等值或左、右外连接。但预连接将导致增大存储量并降低加
载速度。
Sybase IQ能对已建立了HG或LF索引的列,再利用"Joined Indexs
et"完成预连接处理。它通常能使查询速度提高10倍以上。
我们可通过下表的比较来进一步理解Bit-Wise索引的技术特色:
表1
设置Sybase IQ的基本步骤
在安装Sybase IQ产品之后:
1.建立与Sybase IQ Indexspace相关的SQL Server基础数据库,I
ndexspace是SybaseIQ 用于存储索引结构和部分数据的原始设备(raw
devices)或系统文件;
2.建立同基础数据库同名的Sybase IQ Indexspace,最大为2GB,I
/O块同压缩比有关,调节范围512B到32KB;
3.在基础数据库上建表;
4.运行Sybase IQ的存储过程,估算所需空间;
5.为表中的某列或所有列建立Sybase IQ Indexsets,Indexsets
是Sybase IQ存储表中某列索引空间的,它存储于Indexspace中;
6.定义不同Sybase IQ的索引类型,(每列都建立一个FP索引然后
酌情建立别种索引);
7.往Sybase IQ Indexset中加入新数据,从相关的数据库中插入
数据到Sybase IQ Inde xes或利用ASCII文件加载;
8.建立供预连接用的Joined Indexset;
9.往Joined Indexset中加入新数据。
现在已可通过Isql或其他前端工具查询Sybase IQ数据了。
测试比较
经实际测试,Sybase IQ效果良好。
前言:
一个很不错的php开源项目管理工具,有了它,不用project了,也不用自己开发项目管理工具了,足够应付中小型软件企业的日常项目管理工作。
1、软件需求:
easyphp1.8 dotProject_2_0_1_20050705_UTF-8_Chinese_by_Markwu2、安装:
1)首先安装:
easyphp1.8 ;启动apache/mysql/php服务。
创建MySql数据库和用户:
在Dos窗口下进入到MySql\bin下,输入命令:mysql -uroot -p 回车(默认安装时没密码)然后执行下面语句。
CREATE DATABASE dotproject;
GRANT ALL PRIVILEGES ON dotproject.* TO 'dp_user'@'localhost' IDENTIFIED BY 'pw';
2)解压dotProject_2_0_1_20050705_UTF-8_Chinese_by_Markwu到www目录下,改目录名为dotproject。注意要用这个utf-8版本,从dotproject下载的版本中文会乱码。
3)执行安装:
http://yourserverip/dotproject/install/index.php,则可以完成安装过程,包括数据库的建立。
4)到dotproject/index.php登陆,admin-passwd.
5)到system admin->default user confonrce,设置默认语言为简体中文。
6)打开gd支持以显示甘特图:在easyPHP面板,配置->php扩展,把php-gd2选上,再重启apache,则即可显示甘特图。
7)重新登陆dotproject,完成整个安装过程。
//注意:如果自己更新语言包应放在www\dotproject\locales下;
如果mysql用高版本的应运行如下语句:
先用root登录MYSQL服务器,执行
mysql>set password for dp_user@"localhost"=old_password('yourPassword');
原因是因为你使用的mysql服务器版本中使用了新的密码验证机制,这需要客户端的版本要在4.0以上,原来的密码函数被改为old_password();,这样使用password()生成的密码在旧的版本上的客户端就不好使了,而PHP中的MYSQL客户端都是3.23的(当然,mysqli的扩展除外),问题就在这了。
服务器重整以后,cvs update/commit时候会出现如下错误提示:
cvs server: cannot open directory . for empty check: Invalid argument
虽然不影响使用,但是却很让人不爽。
而chacl时候,则是:
cvs [server aborted]: cannot find .: No such file or directory
干脆就直接出错。研究了一下cvsnt里面的设置,感觉应该只和cvsroot及temp目录有关——毕竟只用到这两个目录而已。检查之后发现winnt/temp没有对cvsuser这个系统帐号的权限。设置之后问题解决。
虽然cvsuser只是一个停用了的cvs用户绑定帐号,但是权限管理方面仍然遵循着ntfs的规则。这么说来停用的意义应该仅仅是限制登录。
MyEclipse 4.1 Milestone2 has enhanced the JavaScript Editor and Debugger to include the following features:
- Editor
-
Syntax highlighting
-
Integrated outline and property views
-
Validation and syntax checking
-
Code assist for common JavaScript elements, functions, and variables
-
Code assist documentation for functions
-
Source formatting
-
Toggle comments
- Debugger
- Debug any web page containing JavaScript source or included JavaScript files, or standalone JavaScript files
- Operations: Pause, Resume, Step Into, Step Over, Step to Return, Terminate
- Views:
- Web Browser View
- Call Stack View
- Variables View
- Console View
- Set JavaScript breakpoints in:
- JavaScript files
- HTML with embedded JavaScript and linked JavaScript files
- JSP files
- Conditional breakpoints planned for MyEclipse 4.1.1
- Integrates with Eclipse Launch Manager
- Quick launch from context-menu using "Debug As"
- Launch from Eclipse Debug toolbar action
- Use Launch Profile to modify launch configuration
- Launch JavaScript resource from project location or deployed MyEclipse web-application
|
|
JavaScript Outline View |
The JavaScript outline view depicts method and variable declarations in their associated scope. Variables can be filtered from the view. Future releases will support for more complex JavaScript constructs.
|
|
JavaScript Validation and Syntax Checking |
The JavaScript Editor now has syntax validation with error and warning markers in the editor and Problems view. Varying levels of JavaScript validation can be configured in the MyEclipse preferences.
The JavaScript validation includes warnings for your javascript source code.
|
|
Code Assist for JavaScript |
Code assist is provided for most common DHTML objects like document, window, element, etc. The IE and Netscape icons identify browser support for the function or property. The MyEclipse JavaScript Editor preferences enable the customization of code-assist proposals to filter browser specific proposals and to hide the icons.
The code assist also provides proposals that include the current functions defined in the JavaScript file.
Global and local variables are also included in the code-assist proposals..
|
|
JavaScript Source Code Formatting |
The JavaScript editor now has an improved source code formatting.
|
|
JavaScript Quick Comment |
Quickly toggle single line comments on/off using the Ctrl+Shift+C key sequence or use the Source menubar action. Select a region or set the cursor on the line to toggle as a comment.
Enter Ctrl+Shift+C to add or remove the single line comments. |
|
MyEclipse JavaScript Debugger |
The MyEclipse JavaScript Debugger (Milestone 2) is the first fully integrated client-side Eclipse debugger for JavaScript. Feature highlights include:
- Debug any web page containing JavaScript source or included JavaScript files, or standalone JavaScript files
- Operations: Pause, Resume, Step Into, Step Over, Step to Return, Terminate
- Views:
-
- Web Browser View
- Call Stack View
- Variables View
- Console View
- Set JavaScript breakpoints in:
-
- JavaScript files
- HTML with embedded JavaScript and linked JavaScript files
- JSP files
- Conditional breakpoints planned for MyEclipse 4.1.1
- Integrates with Eclipse Launch Manager
-
- Quick launch from context-menu using "Debug As"
- Launch from Eclipse Debug toolbar action
- Use Launch Profile to modify launch configuration
- Launch JavaScript resource from project location or deployed MyEclipse web-application
Features planned for MyEclipse 4.1.1:
- Conditional JavaScript breakpoints
- JavaScript Snippet Evaluation Editor
- Smart Browser session organization
|
MyEclipse JavaScript Debugger -- Setting JavaScript breakpoints |
Set breakpoints in JavaScript, HTML and JSP using traditional breakpoint setting facilities.
<html BP image here>
Breakpoints appear in the left margin as a blue ball image,
|
MyEclipse JavaScript Debugger -- Quick JavaScript Launcher |
Launch JavaScript debuggable resources from the Debug As actions on the toolbar and the context-menu of the HTML, JSP and JavaScript editors or from the Run menubar.
|
|
MyEclipse JavaScript Debugger -- Configuring a JavaScript Launch Profile |
A custom JavaScript launch profile is created or edited using the Run>Debug... action from the menubar, toolbar, or context-menu context-menu of the HTML, JSP and JavaScript editors. The launch profile's Project and launch URL are provided. The launch URL can reference a deployed web resource, e.g., http://192.168.1.101/helloworld/helloajax.html or a local file in your project workspace, e.g., file://C:/...,
|
|
MyEclipse JavaScript Debugger -- Breakpoint/Stepping Operations in JavaScript |
When a JavaScript breakpoint is encountered in the browser, the source file containing the breakpoint opened in the corresponding editor and positioned to the breakpoint line-number. The JavaScript Debugger controls allow you to then Resume execution, Step Into a function at the next line, Step Over a function at the next line, Step to End of the current function, or Terminate the current application thread,
|
|
MyEclipse JavaScript Debugger -- Support for breakpoints in include JavaScript files |
The JavaScript Debugger supports breakpoints set in both top-level and included resources. In the following screenshot the breakpoint is set in a JavaScript file that is included in an HTML file.
|
|
|
New JavaScript Editor |
The new and improved Javascript Editor have new Outline View support for javascript variables and methods, content assist for javascript objects, and a preview capability.
Smart content assist is available for the javascript document object. Notice, that both IE and Netscape specifc objects are shown.
The javascript editor also have preview support using a builtin browser that will enable testing of javascript.
|
AJAX开发者的最新工具和技术
基于XML的异步JavaScript,简称AJAX,是当前Web创新(称为Web2.0)中的一个王冠。感谢组成AJAX的各种技术,Web应用的交互如Flickr, Backpack和Google在这方面已经有质的飞跃。这个术语源自描述从基于网页的Web应用到基于数据的应用的转换。在基于数据的应用中,用户需求的数据如联系人列表,可以从独立于实际网页的服务端取得并且可以被动态地写入网页中,给缓慢的Web应用体验着色使之像桌面应用一样。
虽然大部分开发人员在过去使用过XMLHttp或者使用Iframe来加载数据,但仅到现在我们才看到传统的开发人员和公司开始采用这些技术。就像新的编程语言或模型伴随着更多的痛苦,开发人员需要学习新的技巧及如何最好利用这些新技术。
AJAX模式
许多重要的技术和AJAX开发模式可以从现有的知识中获取。例如,在一个发送请求到服务端的应用中,必须包含请求顺序、优先级、超时响应、错误处理及回调,其中许多元素已经在Web服务中包含了,就像现在的SOA。AJAX开发人员拥有一个完整的系统架构知识。同时,随着技术的成熟还会有许多地方需要改进,特别是UI部分的易用性。
AJAX开发与传统的CS开发有很大的不同。这些不同引入了新的编程问题,最大的问题在于易用性。由于AJAX依赖浏览器的JavaScript和XML,浏览器的兼容性和支持的标准也变得和JavaScript的运行时性能一样重要了。这些问题中的大部分来源于浏览器、服务器和技术的组合,因此必须理解如何才能最好的使用这些技术。
综合各种变化的技术和强耦合的客户服务端环境,AJAX提出了一种新的开发方式。AJAX开发人员必须理解传统的MVC架构,这限制了应用层次之间的边界。同时,开发人员还需要考虑CS环境的外部和使用AJAX技术来重定型MVC边界。最重要的是,AJAX开发人员必须禁止以页面集合的方式来考虑Web应用而需要将其认为是单个页面。一旦UI设计与服务架构之间的范围被严格区分开来后,开发人员就需要更新和变化的技术集合了。
时刻想着用户
AJAX的最大机遇在于用户体验。在使应用更快响应和创新的过程中,定义Web应用的规则正在被重写;因此开发人员必须更注重用户。现在用户已经逐渐习惯如何使用Web应用了。例如用户通常希望每一次按钮点击会导致几秒的延迟和屏幕刷新,但AJAX正在打破这种长时间的状况。因此用户需要重新体验按钮点击的响应了。
可用性是AJAX另人激动的地方而且已经产生了几种新颖的技术。其中最引人注目的是一种称为“黄色隐出”的技术,他在数据更新之前时将用户界面变为黄色,更新完成后立刻恢复原来的颜色。AJAX开发人员将用户从Web应用的负载中解放出来;小心地利用AJAX提供的丰富接口,不久桌面开发人员会发现AJAX是他们的方向。
几种工具和技术
随着AJAX迅速地引人注目起来,我想开发人员对这种技术的期待也迅速地增加。就像任何新技术,AJAX的兴旺也需要一整个开发工具/编程语言及相关技术系统来支撑。
JavaScript
如名字所示AJAX的概念中最重要而最被忽视的是他也是一种JavaScript编程语言。JavaScript是一种粘合剂使AJAX应用的各部分集成在一起。在大部分时间,JavaScript通常被服务端开发人员认为是一种企业级应用不需要使用的东西应该尽力避免。这种观点来来自以前编写JavaScript代码的经历:繁杂而又易出错的语言。类似的,他也被认为将应用逻辑任意地散布在服务端和客户端中,这使得问题很难被发现而且代码很难重用。在AJAX中JavaScript主要被用来传递用户界面上的数据到服务端并返回结果。XMLHttpRequest对象用来响应通过HTTP传递的数据,一旦数据返回到客户端就可以立刻使用DOM将数据放到网面上。
XMLHttpRequest
XMLHttpRequest对象在大部分浏览器上已经实现而且拥有一个简单的接口允许数据从客户端传递到服务端,但并不会打断用户当前的操作。使用XMLHttpRequest传送的数据可以是任何格式,虽然从名字上建议是XML格式的数据。
开发人员应该已经熟悉了许多其他XML相关的技术。XPath可以访问XML文档中的数据,但理解XML DOM是必须的。类似的,XSLT是最简单而快速的从XML数据生成HTML或XML的方式。许多开发人员已经熟悉Xpath和XSLT,因此AJAX选择XML作为数据交换格式有意义的。XSLT可以被用在客户端和服务端,他能够减少大量的用JavaScript编写的应用逻辑。
CSS
为了正确的浏览AJAX应用,CSS是一种AJAX开发人员所需要的重要武器。CSS提供了从内容中分离应用样式和设计的机制。虽然CSS在AJAX应用中扮演至关重要的角色,但他也是构建创建跨浏览器应用的一大阻碍,因为不同的浏览器厂商支持各种不同的CSS级别。
服务器端
但不像在客户端,在服务端AJAX应用还是使用建立在如Java,.Net和PHP语言基础上机制;并没有改变这个领域中的主要方式。
既然如此,我们对Ruby on Rails框架的兴趣也就迅速增加了。在一年多前,Ruby on Rails已经吸引了大量开发人员基于其强大功能来构建Web和AJAX应用。虽然目前还有很多快速应用开发工具存在,Ruby on Rails看起来已经储备了简化构建AJAX应用的能力。
开发工具
在实际构建AJAX应用中,你需要的不只是文本编辑器。既然是JavaScript非编译的,他可以容易地编写和运行在浏览器中;然而,许多工具提供了有用的扩展如语法高亮和智能完成。
不同的IDE提供了对JavaScript支持的不同等级。来自JetBrains的IntelliJ IDEA是一个用来JavaScript开发的更好的IDE,虽然许多开发人员也喜欢Microsoft’s Visual Studio产品(允诺会在最新的版本中改善对AJAX的支持)。Eclipse包含了两个免费的JavaScript编辑器插件和一个商业的来自ActiveStat的Komodo IDE。
另一个JavaScript和AJAX开发中的问题是调试困难。不同的浏览器提供不同的通常是隐藏的运行时错误信息,而JavaScript的缺陷如双重变量赋值(通常是由于缺少数据类型)使得调试更加困难。在AJAX的开发中,调试就更复杂了,因为其需要标识究竟是客户端还是服务端产生的错误。在过去,JavaScript调试的方法是删除所有代码然后一行行的增加直到错误出现。现在,更多开发人员回到为IE准备的Microsoft Script Debugger和为Mozilla浏览器准备的Venkman。
浏览器兼容性
JavaScript编程的最大问题来自不同的浏览器对各种技术和标准的支持。构建一个运行在不同浏览器(如IE和火狐)是一个困难的任务。因此几种AJAX JavaScript框架或者生成基于服务端逻辑或标记库的JavaScript,或者提供符合跨浏览器AJAX开发的客户端JavaScript库。一些流行的框架包括:AJAX.Net, Backbase, Bitkraft, Django, DOJO, DWR, MochiKit, Prototype, Rico, Sajax, Sarissa, and Script.aculo.us.
这些框架给开发人员更多的空间使得他们不需要担心跨浏览器的问题。虽然这些框架提升了开发人员构建应用的能力,但由于厂商已经开发了更细节的用户界面的打包组件解决方案,因此在AJAX组件市场中需要考虑一些其他因素。例如提供通用用户界面的组件如组合框和数据栅格的几个厂商,都可以被用来在应用中创建良好的通过类似电子数据表方式来查看和编辑数据的体验。但这些组件不仅是封装了组件的用户界面而且包括与服务端数据的通讯方式,这些组件通常使用基于标记方式来实现如ASP.Net或JSF控件。
展望
最近IE和火狐之间的浏览器之争变得火热起来,因此AJAX开发人员需要足够敏捷的作出反应。关键点在一些问题如CSS或XML,虽然各种浏览器形成采用最新标准的不同阵营(如Mozilla拥抱SVG和E4X标准及在最新火狐BETA版本中使用XUL,而微软使用自己的XAML技术)。所有这些技术代表当前AJAX主流JavaScript和XML的市场方向改变。
总的来说,AJAX开发人员必须尽快地跟进最新的技术并利用高产的工具集。成功的AJAX开发人员还需要留心他们的使用者以避免将任何问题扩大化。并且AJAX开发人员还需要持续地创新来创建增强Web应用易用性的新方法。
用Axis 1.1 for Java进行Web Services开发 下面的所有几乎来自Axis1.1的文档。但不完全来自文档,本人做了部分修改,这些修改完全出自国内读者的需要。 什么是SOAP? SOAP是一个基于XML的用于应用程序之间通信数据编码的传输协议。最初由微软和Userland Software提出,随着不断地完善和改进,SOAP很快被业界广泛应用,目前完全发布版本是1.1。在其发展过程中,W3C XML标准工作小组积极促成SOAP成为一个真正的开放标准。在写作此文档之时,SOAP1.2草案已经发布,1.2对1.1中相对混乱的部分做了改进。 SOAP被广泛作为新一代跨平台、跨语言分布计算Web Services的重要部分。 这里太肤浅的说明,请参阅我的整理《一步一步学习SOAP》。 什么是Axis? Axis本质上就是一个SOAP引擎,提供创建服务器端、客户端和网关SOAP操作的基本框架。Axis目前版本是为Java编写的,不过为C++的版本正在开发中。 但Axis并不完全是一个SOAP引擎,它还包括: 是一个独立的SOAP服务器。 是一个嵌入Servlet引擎(例如Tomcat)的服务器。 支持WSDL。 提供转化WSDL为Java类的工具。 提供例子程序。 提供TCP/IP数据包监视工具。 Axis是第三代Apache SOAP,从2000年起,SOAP v2开发小组开始讨论如何让Axis更加灵活、可配置,以及能够处理SOAP和来自W3C的各种XML标准。通过不断地讨论和代码编写,Axis目前取得了如下成果: 速度提高。 Axis通过基于事件的SAX对XML文档进行处理,从而在速度和效率上比Apache SOAP有所提高。 灵活性提高。 稳定性提高。 提供面向组件的部署。 提供一个简洁的传输抽象框架。其核心引擎完全于传输方式独立。从而使基于何种协议传输的选择更加灵活。 支持WSDL。包括到处WSDL和客户代理生成等。 在目前发行1.1版本中有什么东西? SOAP1.1/1.2引擎。 灵活的配置和部署系统。 支持及时自动生成SOAP服务(JWS)。 支持所有的基本数据类型,为自定义串行操作提供类型映射系统。 JavaBean的自动串行操作,包括将自定义属性类型映射到XML的属性和元素。 RPC和基于消息的SOAP服务提供者。 从部署好的服务自动生成WSDL。 WSDL2Java工具可以从WSDL描述文件中产生相应的客户和服务器端SOAP操作框架。 初步提供安全扩展,能够与Servlet2.2安全集成。 通过HTTP Cookie和与传输无关的SOAP头信息提供会话跟踪。 初步支持带附件的SOAP消息。 在EJB方面提供把EJB作为Web服务的访问途经。 基于Servlet的HTTP传输。 基于JMS的传输。 独立的服务器(但需要HTTP 服务器和Servlet容器支持)。 提供客户端、服务器端相关应用程序的样例。 Axis的运行需要如下组件包 axis.jar jaxrpc.jar saaj.jar commons-logging.jar commons-discovery.jar wsdl4j.jar 符合JAXP-1.1的XML处理器。 一步一步开始用Axis进行Web Services操作 下面给出一段简单的调用Web Services方法的客户端代码(由于原文档中直接用导入包的方式初学者不易了解那个类在那个包中,所以下面我做了一些简单的修改,希望能给学习者清晰的思路): public class TestClient { public static void main(String[] args) { try{ String endpoint="http://localhost:8080/axis/SayHello.jws?wsdl";// 调用的web服务的url地址,这里是一个http请求,希望得到的结果是wsdl文档。 org.apache.axis.client.Service service=new org.apache.axis.client.Service();//建立请求服务框架实例。 /* * org.apache.axis.client.Service实现JAX-RPC's javax.xml.rpc.Services接口 * 该接口充当产生下面提到的org.apache.axis.client.Call实例 * 的角色。 */ org.apache.axis.client.Call call=(org.apache.axis.client.Call)service.createCall();//从框架中生成一个维护调用的实例。 /* * org.apache.axis.client.Call实现了JAX-RPC's javax.xml.rpc.Call接口。 */ call.setTargetEndpointAddress(new java.net.URL(endpoint)); call.setOperationName(new javax.xml.namespace.QName("http://www.edu-edu.com.cn/luopc/ws","echoString"));//设置需要调用的函数名称 String result=(String)call.invoke(new Object[]{"hello!"}); System.out.println(result); }catch(Exception e){ System.err.println(e.toString()); } } } 上面的代码可能和原文档中不同,并且在名称空间、函数多态上会给用户造成糊涂。不过别急,我在翻译手册的同时会加入很多解释的代码,如果哪位纯粹看不懂可以通过邮件获取帮助:luopc@edu-edu.com.cn ,邮件主题必须是我提供的文档名称。 通过上面的调用代码,最终生成向服务器请求SOAP信息包,具体XML内容如下: <?xml version="1.0" encoding="UTF-8"?><SOAP-ENV:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <SOAP-ENV:Body> <ns1:echoString xmlns:ns1="http://www.edu-edu.com.cn/luopc/ws"> <arg0 xsi:type="xsd:string">Hello!</arg0> </ns1:echoString> </SOAP-ENV:Body></SOAP-ENV:Envelope> 这里我不再多少,细心的朋友请从代码中找相应的对应信息来进行自己的逻辑理解。至于SOAP协议在我以后的翻译文档中会加入进去。 从上面的代码中我们在调用的时候输入了参数new Object[]{“hello!”}。然后从生成的SOAP请求包中可以看到自动序列化成<arg0 xsi:type="xsd:string">Hello!</arg0>。你可以看到参数名称为arg0,类型为xsd:string。其实在Axis客户端我们可以直接通过具体的方法来设置每一个参数名称、类型以及返回值类型。如下代码: call.addParameter("testParam", org.apache.axis.Constants.XSD_STRING, javax.xml.rpc.ParameterMode.IN);call.setReturnType(org.apache.axis.Constants.XSD_STRING); 加入上面的代码之后生成如下的SOAP信息: <?xml version="1.0" encoding="UTF-8"?><SOAP-ENV:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <SOAP-ENV:Body> <ns1:echoString xmlns:ns1="http://www.edu-edu.com.cn/luopc/ws"> <testParam xsi:type="xsd:string">Hello!</testParam> </ns1:echoString> </SOAP-ENV:Body></SOAP-ENV:Envelope> 可以作简单的对比。 也许你会疑惑设置参数名称和不设置参数名称有什么区别的疑问。这里作简单的解释: 1. 为什么要call.setReturnType(org.apache.axis.Constants.XSD_STRING)? 上面你可以调用或者可以不调用,但当返回结果中没有标明数据类型时Axis就不知道如何进行数据类型转换。当然如果返回类型你很清楚并且返回应答SOAP的结果中表明了相应的数据类型你便可以不进行上面的函数调用。 2. 为什么要设置参数名称和类型? 好了,下在你知道了如何调用Web Services了,下面告诉你如何写作和发布Web Services。 通过Axis发布Web Services 这里写作一个简单的类,然后一步一步进行发布。希望用户能够从中理出一些思路来。我在其他的关于Web Services的文章中会专门针对Web Services的通用发布方法。虽然Web Services牵涉到很多复杂的知识,但请大家不要感觉到这些操作简单,也许你已经有很多疑问,没关系,记下你的疑问,不断的投试。 public class SayHello { public String echoString(String hello){ return hello; }} 哈哈,这个类是不是太简单了。 一步一步来。 Axis提供两种将Java类发布成Web Services的途径,即即时快速自动发布和通过配置文件进行发布。我们首先从最容易部署的入手。 JWS----即时部署 简单说就是将自己写的Java类源文件按一定的规则Copy到特定的目录下便可自行被Axis部署。具体步骤如下: 将上面写的SayHello.java复制到axis目录下。 改名为SayHello.jws。 注意:在你写的类中不能有具体包的信息,因为这正是Axis即时部署不支持的。 运行我们前面写的客户端进行测试,运行结果是hello!。 目前你是否有如下的问题?
如果类中用多态的函数将如何处理? 其实很简单,我们知道在每次发出调用请求之前代理程序在后台会直接请求你给的URL,这里是http://localhost:8080/axis/SayHello.jws?wsdl,其实这一请求返回来的是WSDL描述文件,通过具体的描述文件的内容和你输入的参数的类型比较,最终确定发送什么请求。细节上的解释需要用户阅读SOAP的具体内容。我也会提供相应的权威文当翻译的。
Axis的客户端默认就是通过HTTP协议传输吗?
如何将自己定义的类型进行映射? 通过WSDD自定义部署
上面的自动部署相当简单,但当你需要 映射自己的类型时 不需要暴露源代码时 需要自己的路径和包管理时 对用户操作Web Services的事件进行相应时
就需要通过WSDD来自定义部署。 前面新特性中提到过,Axis是一个很灵活的可配置系统,但在配置之前你得懂得Axis Web Services描述文档(WSDD)的格式和意义。这里有一个简单的例子(deploy.wsdd): <deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> <service name="SayHello2" provider="java:RPC"> <parameter name="className" value="luopc.ws.SayHello"/> <parameter name="allowedMethods" value="*"/> </service> </deployment> 很简短的描述就会自定义对特定类以Web Services的形式发布。上面的每一个service项都会意味着开通一个相应的可被WSDL文件引用的服务。其内部描述信息将会描述从请求-处理请求-应答需要的所有核心信息。这里provider=”java:RPC”对应着相应的服务类为org.apache.axis.providers.java.RPCProvider。其实你可以通过多种方式提供相应的服务。在关于Axis的架构文章中将会详细解释这些内容。
上面的各个参数我不再解释,我想大家一看就明白。 下面让我们在上面的简单配置上开始一步一步的进行各种高级配置: 服务存活范围 Axis提供Session、Request和Application三种可选范围配置。具体配置标记为:
<service name="MyService"...> <parameter name="scope" value="value"/> ... </service> 一旦你完成上面的文件。可以写一个脚本批处理文件来完成部署。批处理文件如下:
java -classpath F:\resource\tools\axis-1_1\lib\axis.jar;F:\resource\tools\axis-1_1\lib\commons-discovery.jar;F:\resource\tools\axis-1_1\lib\jaxrpc.jar;F:\resource\tools\axis-1_1\lib\commons-logging.jar;F:\resource\tools\axis-1_1\lib\log4j-1.2.8.jar;F:\resource\tools\axis-1_1\lib\wsdl4j.jar;F:\resource\tools\axis-1_1\lib\j2ee.jar org.apache.axis.client.AdminClient sayHelloD.wsdd。 上面的一些jar文件都是Axis运行需要的组件,所以必须添加到环境中。上面的目录是我的机器里的目录,你可以按自己的目录进行。 如果部署成功,会输出<Admin>Done processing</Admin>信息。 但本人这里再强调几个: 你首先要将你编译好的类放到axis/web-inf/classes/下面。 可以通过http://localhost:8080/axis/services/SayHello2来调用。 你可以从我的配置文件中发现了包的概念。 可以用相应的xml文件进行卸载已部署的服务。 卸载方法如下: 编写如下XML文档
<undeployment xmlns="http://xml.apache.org/axis/wsdd/"> <service name="MyService"/> </undeployment> 把上面的批处理文件中的sayHelloD.wsdd换成该文件便可。
继续关注高级部署
如果你想知道自己的某个Web Services被调用多少次,你应该怎么做呢? Axis提供了相应的跟踪机制。
首先你应该编写一个满足一定接口的事件处理类。 在配置文件中添加事件处理器信息。
我们先看看配置文件中的信息:
<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> <!-- define the logging handler configuration --> <handler name="track" type="java:samples.userguide.example4.LogHandler"> <parameter name="parameter1" value="访问该services"/> </handler> <!-- define the service, using the log handler we just defined --> <service name="SayHello2" provider="java:RPC"> <requestFlow> <handler type="track"/> </requestFlow> <parameter name="className" value="luopc.ws.SayHello"/> <parameter name="allowedMethods" value="*"/> </service> </deployment> 上面的绿色部分起到核心的配置信息提供。
下面提供一个事件处理类,同样来自原文档,但为了更清晰我同样将所有的类前面加上了包名称。 package luopc.ws;
/** * @author luopc */ public class EventHandler extends org.apache.axis.handlers.BasicHandler{ public void invoke(org.apache.axis.MessageContext mtxt){ String param=(String)getOption("parameter1"); System.out.println(param); }
public static void main(String[] args) { } }
就这样,我们对请求跟踪了。嘻嘻。
可以远程进行管理(不推荐)
前面就提到服务类型的问题,在Axis有四种类型的服务,分别为RPC、Document、Wrapped和Message。 |
Axis下 WebService 的调用问题
本人按照网上例子制作一个Sample,遇到一个问题,当用JAVA编写的客户端调用返回值类型是int的函数时能正确得到返回值,但是调用返回值类型是String的函数时,不能正确得到返回值。以下为服务器端程序源代码: /** * 此处插入类型描述。 * 创建日期:(2005-10-27 10:32:48) * @author:Administrator */ import java.util.*; public class ZxjTest { protected String name="gaga"; protected int age=20; protected int sex=22; protected List items=new ArrayList(); /** * ZxjTest 构造子注解。 */ public ZxjTest() { super(); } public String getName() { return name; } public int getAge() { return age; } public int getSex() { return sex; } public List getItems() { return items; } } 客户端调用的源代码: String endpoint = "http://myserver:7001/ZxjTest.jws"; Service service = new Service(); Call call = (Call) service.createCall(); call.setTargetEndpointAddress(new java.net.URL(endpoint)); call.setOperationName("getName"); String ret = (String) call.invoke(new Object[] {}); 出错的就是最后一句。如果这一句改成调用返回值是Int的函数,就不会出错。请问,这是Axis的配置的问题吗?如果是,该如何改? 应该不大可能是Axis的配置的问题,你调用的是 public String getName() { return name; } 因此返回的是String,这个是没有错误的! 你的程序我在自己机器上运行的很好!不管调用哪个方法,都一样输出。你可以把String ret = (String) call.invoke(new Object[] {});改成Object ret = (Object)call.invoke(new Object[] {});这样的话你就不用去类型转换了! 或者如果你要类型转换的话,也可以这样做: 1,如果调用返回类型是string的方法 那么最后一句应该为 String ret = (String) call.invoke(new Object[] {}); 2,如果调用返回类型是int的方法,那么最后一句应该为 Integer ret = (Integer)call.invoke(new Object[] {}); 还有要注意的是在利用客户端进行测试的时候,确保服务器已经启动,否则会出错。如果你是采用http://myserver:7001/ZxjTest.jws的话,你的web-inf下确保没有 server-config.wsdd,否则也会出错。 还有一个很简单的错误,可能仅仅只是WebLogic配置的问题。最好重建一个应用并重新配置。 |
|
查找引擎之王 google 于 4/11 开放了它的查询接口,可以让全世界各地的 Java 以及 .NET 程序员,免费地以 WebServices 的方式,对 google 下查找指令,并且可以将结果使用于自己的程序或网页中。不过使用上也有限制,它一天只允许未付费的程序员查找 1000 次。要使用前,必须先向 google 注册帐号,取得一个 32 位长度的 license key ,每次呼叫查询时,必须带入这个 license key 即可使用。因为 WebServices 以 WSDL (Web Service Definition Language) 的方式描述所开放的接口,走的通讯协定是 SOAP on HTTP ,所以理论上可以穿越防火墙。 Java 范例程序如下∶
import java.io.*;
import com.google.soap.search.*; // 这是 googleapi.jar ,由 google 所提供
public class SearchGoogle {
public static void main(String[] args) {
if (args.length != 2)
{
System.err.println("Usage: java SearchGoogle LicenseKey 查询字符串 ");
System.exit(1);
}
String clientKey = args[0];
String queryString = args[1];
System.out.println(" 查询字符串 = " + queryString);
// 产生查找对象,设定输出编码 (big5)
GoogleSearch s = new GoogleSearch();
s.setKey(clientKey);
s.setOutputEncoding("big5");
try
{
s.setQueryString(qyeryString);
GoogleSearchResult r = s.doSearch();
System.out.println(" 查找结果 :");
System.out.println("======================");
System.out.println(r.toString());
}
catch (GoogleSearchFault e)
{
System.out.println(" 查找失败 ");
}
}
}
使用方法以及查询结果(执行环境∶ Linux + JDK 1.3.1_01 ,主机位于防火墙后端)∶
java -classpath .:../lib/googleapi.jar
SearchGoogle xxxxxxxxx- 我的 LicenseKey-xxxxxxxxx LinuxFab
查询字符串 = LinuxFab
查找结果 :
======================
{
TM = 0.048257
Q = "LinuxFab"
CT = ""
TT = ""
CATs =
{
{SE="Big5", FVN="Top/World/Chinese_Traditional/ 计算机 /Operating_Systems/Unix/Linux"}
}
Start Index = 1
End Index = 10
Estimated Total Results Number = 11500
Document Filtering = true
Estimate Correct = false
Rs =
{
[
URL = "http://bbs.ee.ntu.edu.tw/boards/Linux/21/"
Title = " ◆ 【 LinuxFab 早报】 "
Snippet = " ◆ 【 LinuxFab 早报】 . ... 5, ◇ 【 LinuxFab 本周专栏】 如何制作简易 Floppy Liunx, linuxfab. 07/13/01. ... "
Directory Category = {SE="", FVN=""}
Directory Title = ""
Summary = ""
Cached Size = "11k"
Related information present = true
Host Name = ""
],
[
URL = "http://bbs.ee.ntu.edu.tw/boards/Linux/21/73.html"
Title = " ◇ 【 LinuxFab 早报】 - Linux 2.4.10 内核中剽窃了 ┅ "
Snippet = " ◇ 【 LinuxFab 早报】 - Linux 2.4.10 内核中 剽窃了 ┅ . 发信人 : linuxfab.bbs ... "
Directory Category = {SE="", FVN=""}
Directory Title = ""
Summary = ""
Cached Size = "10k"
Related information present = true
Host Name = "bbs.ee.ntu.edu.tw"
],
[
URL = "http://www.lslnet.com/linux/docs/linux-3033.htm"
Title = "LinuxFab: Red Hat7.0 ? 新特色 - [? 森林 - 自由 ? 件 ]"
Snippet = " ... LinuxFab: Red Hat7.0 ? 新特色 ? 森林 http://www.lslnet.com 2000 年 9 月 24 日 09:59 ... 摘自∶ http:linuxfab.cx [ ?? 窗口 ]. ... "
Directory Category = {SE="", FVN=""}
Directory Title = ""
Summary = ""
Cached Size = "5k"
Related information present = true
Host Name = ""
],
下略
当然,输出结果不是这么杂乱, google 所提供的 api 有各种查找设定方法,例如从第几笔开始查找、设定传回笔数、偏好查找(避免查找 java 时传回 咖啡 的结果) ... 等等,各位可以好好玩一玩。
如果您不想使用 google 的 library ,您也可以利用手边的 WebServices 工具程序,自动抓取 google 所提供的 WSDL 文档(位于∶ http://api.google.com/GoogleSearch.wsdl ),并且产生相关的 java 对象。以下以 GLUE 这套 Java WebServices 软体包做范例∶
$ wsdl2java http://api.google.com/GoogleSearch.wsdl -p example -d example/
write file example/IGoogleSearchPort.java
write file example/GoogleSearchServiceHelper.java
write file example/ResultElement.java
write file example/DirectoryCategory.java
write file example/GoogleSearchResult.java
write file GoogleSearchService.map
GLUE 的强处在于它自动为您处理所有 XML <-> Java Object Mapping 以及 SOAP 传输的问题,您甚至不需要看懂 WSDL 便可直接使用 WebServices !我们现在已经将 WSDL 转换成 Java 对象, package 名为 example ,接下来便是撰写 Client 去连接 google ∶
import java.io.*;
import electric.registry.Registry; // 包含于 GLUE-STD.jar ,为 GLUE 标准版的 library
import example.*; //GLUE 自动为您由 WSDL 产生出来的 Java 对象
public class SearchGoogle2 {
public static void main(String[] args) {
if (args.length != 2)
{
System.err.println("Usage: java SearchGoogle LicenseKey 查询字符串 ");
System.exit(1);
}
String clientKey = args[0];
String queryString = args[1];
System.out.println(" 查询字符串 = " + queryString );
String url = "http://api.google.com/GoogleSearch.wsdl";
try
{
// 利用 GLUE 产生的接口,去 bind google 的 WSDL
IGoogleSearchPort searcher = (IGoogleSearchPort) Registry.bind(url , IGoogleSearchPort.class);
// 查询
GoogleSearchResult result = searcher.doGoogleSearch
( clientKey , queryString , 0 , 1 , false , "" , false , "" , "Big5" , "Big5" );
System.out.println(" 查找结果 :");
System.out.println("======================");
System.out.println(" 回应数量∶ " + result.resultElements.length );
System.out.println(" 第一笔结果∶ ");
System.out.println(" 简介∶ " + result.resultElements[0].summary );
System.out.println("URL ∶ " + result.resultElements[0].URL );
System.out.println(" 片段∶ " + result.resultElements[0].snippet );
System.out.println(" 标头∶ " + result.resultElements[0].title );
System.out.println(" 主机∶ " + result.resultElements[0].hostName );
System.out.println(" 目录∶ " + result.resultElements[0].directoryTitle );
}
catch (electric.registry.RegistryException e)
{
System.out.println(" 错误∶ " + e.getMessage());
}
}
}
执行结果指令如下∶
$ java -classpath .:../lib/GLUE-STD.jar:../lib/j2ee.jar:../lib/jnet.jar
SearchGoogle2 xxxxxxxxx- 我的 LicenseKey-xxxxxxxxx LinuxFab
查询字符串 = LinuxFab
查找结果 :
======================
回应数量∶ 1
第一笔结果∶
简介∶
URL ∶ http://bbs.ee.ntu.edu.tw/boards/Linux/21/
片段∶◆ 【 LinuxFab 早报】 . ... 5, ◇ 【 LinuxFab 本周专栏】 如何制作简易 Floppy Liunx, linuxfab. 07/13/01. ...
标头∶◆ 【 LinuxFab 早报】
主机∶
目录∶
要注意的是,这只是 google beta2 版本的 WSDL ,未来接口一定会有所更动,而且远端主机 (api.google.com) 仍然不太稳定,有时候会连不过去,有时又会出现 Internal Server Error 的错误。不过以上的介绍应该可以给大家一个简单的 WebServices 概念了吧?目前几乎所有的程序语言都有 WebServices 的相关软体包,不论您是 PHP 网页制作者,或是 VB 窗口程序员,应该都找到相关的软体包,直接在您的网页 / 程序上面撰写 WebServices 的 Client 以及 Server 。
截稿前消息∶全球最大的网络书店 Amazon ,也开始提供 WebServices 接口给代销商( associates ,可以在个人网页上放置连往 Amazon 的 icon 或连结,藉此赚取部分成交金额)使用。代销商现在可以利用 Amazon 提供的 WebServices 撰写 Web/Desktop 应用程序了!看来类似的 WebServices 将会逐渐在许多大站点中陆续被采用,或许 LinuxFab/SourceFab 可以考虑引进此技术,使本站成为华人 Open Source 界的网络运算中心。
用IBM的笔记本的朋友非常的多,大多数人都喜欢删除原带的系统,自己来按装新的操作系统,可是重装系统后对于IBM随机带的软件可以说是一头雾水,因为软件大多都为英文,而且数量又多,没办法许多朋友就用全部按装法,把只要是随机带的全部装到机器上,可是有一部分是完全没有必要装的,或者说可以选择性的按装,本文的目的是为了让大家了解大多数随机软件的用途,让大家按自己的用途来按装,从而结省了有限的内存空间,
注: 其中大部分软件只能使用在T2x,X2x,R系列,A2x以后的机型,对于570这种老机器好多软件是无法安装的,系统为Windows XP
1. Battery MaxiMiser Wizard 按装性:必装~
这个软件按字面来看是”电池最大化向导”,它是通过电池中的一块芯片来查看电池的健康情况以及电池的充电次数和剩余电量等等一些相关参数的.它还可以自己定义电源管理模式,比如用电池时屏幕是4格亮度,CPU按最小的频率使用等.,
2. IBM PM驱动 按装性:必装
PM的意为Power Management Driver,也就是电源管理驱动,它是十分重要的一个软件,它可以来控制当本本在市电与电池之间切换时,CPU与主板PCI总线频率的控制,也就是我们所说的CPU降频使用,当然您的CPU必须支持Speed Step技术,此软件也与上面的软件配合使用
3.HotKey 驱动 按装性:必装
IBM的热键驱动,它的功能有当用户调整音量与屏幕亮度时,在屏幕下方显示当前音量和亮度的等级,以图形方式显示.还包括打开键盘灯和屏幕放大的提示.等.
4. ThinkPad Configuration 按装性:必装
这个软件相当于您系统中的设备管理器,它的功能可以说是相当强大,它可以管理IBM ThinkPad笔记本电脑中的所有硬件,以及内置的安全芯片,查看系统信息等等,它可以打开和屏蔽笔记本中的各种接口,如PCMCIA,红外端口等.
5. Presentation Director 按装性:可选
它叫演示向导,一个非常实用的驱动,它非常适合那些经常外出接投影仪和大屏幕显示设备的商务人士,它的组合键是FN+F7,按下后会出现一个选择分辩率的列表,当用户外接一个显示设备时可选择一个适合的分辩率,演示后还可以直接切换回来,就不用来回的调整屏幕的分辩率了,如果去多个地方又要用到不同的分辩率和显示设备,那么可以手动设置不同的分辩率和屏幕的显示方式,方便快速,节约时间,从而提高的工作效率.
6. Keyboard Customizer Utility 按装性:可选
用过ThinkPad本本的朋友都知道IBM的键盘没有视窗键,这个软件就可以让你用其它的键来代替视窗键.当然它的功能不止这些,它还可以让用户按照自己的喜好把键盘上的一些组合健定义成快捷键,比如笔者就把Shift+右方向键,定义成为了光驱打开.它还可以当您外接键盘时可以用重新定义功能键,有兴趣的朋友不仿自己试试.
7. EasyEject Utility 按装性:可选
它的功能等同于系统中安全移除硬件向导,组合键为FN+F9,它的优点是界面十分直观,当用户要停用移动设备时,它可以以帮助您安全的移除您连接的设备,包括用户接的扩展坞
8. IBM Active Protection System 按装性:必装
APS驱动,这个驱动只支持T41以后的本本,当然还包括R51等支持这个硬盘保护功能笔记本,APS是一种主动的硬盘保护系统,它的作用是当用户在使用笔记本过程中,电脑意外下落,这个系统会在非常快的时间内做出反应,停止硬盘工作,保护用户的数据,把损失降到最小,笔者建议有这个功能的本本用户最好还是装上,不在乎那几M的内存,安全才是最重要的.
9. IBM Access Connections 按装性:可选
笔都最喜欢用的一个软件,个人认为是IBM随机软件中最最经典的一个,没有一个共享软件比的上它,说它经典是因为它非常试合网络管理员来使用,也非常适合天天带着本本在不同的网络间漫游的人(不管有线网络,无线网络,ADSL,还是企业内网),有了它网管就不用来回更改本本的IP地址了,不用建立一大堆的连接方式,不用用脑子记住不同的DNS,不同的网关,它的方便之处只有你用了才可以深深的明白,呵呵,说多了有点.具体的说,它可以让用户分别定义不同的网络配置文件,这件配置文件中包括不同的网络连接方式,不同的IP地址,网关,DNS等等,当用户从一个网络中切换到另一个网络中,不需要重新更改本机的IP地址,只要按一下FN+F5组合键,从定义好的列表中选择一种适合的配置文件即可,真是太方便了.它的优点和细节功能真是一句两句说不清楚,总之呢希望朋友们好好的利用它节省我们的时间,提高我们的工作效率
10. UltraNav Wizard 按装性:可选
这个驱动只适合那些有触模板的ThinkPad计算机,包括T30.T4x,R51等等,它的功能也很多,它可以调整触模板的一些细节设置,比如可以把触模板左右键设成快捷健,打开用户的程序.还可以把触模板的一边设成滚轮来浏览网页等等.
11.Access IBM 按装性:可选)
就是按下本本右上角那个蓝色的按钮出来的东东,它包括帮助文件,还有恢复系统等等,笔者没有按装,个人感觉它是一个花瓶,所以我把那个蓝色按钮改成快捷键了.如果朋友们喜欢那个蓝色按钮打开时的界面,我想还是装上去吧.对于那些对ThinkPad了解深入的朋友就没有必要按装了
12. Access IBM Message Center 按装性:可选
IBM的消息中心,我想它是给像我这样的懒人准备的,我一般很少去IBM的官方网站去看看出个什么新驱动没有,装上它就方便多了,有什么新驱动和关于您本本的新消息,它会马上通知您下载和按装,比较方便的
13. Software Installer 按装性: 必装 适用机型:全部
意为“软件安装者”当初在第一篇文章中,没把它加入是我的失误,现在隆重介绍此软件,经常在Windows软件区看到不少XD,求这个驱动,那个驱动的,其实只要装了Software Installer您就不用在上IBM官方网站找驱动了,SI可以帮助你找到你的计算机所需要的最新驱动程序,当然前提是小黑必须连接入互联网,它会自己搜索针对本机的驱动程序,让用户有选择性的下载,速度还不错。没用过的XD快快装上吧。
14.System Migration Assistant 按装性: 建议安装 适用机型:全部
英文意为“IBM 系统迁移辅助程序”,我想大多数的兄弟都不太喜欢重装系统,因为有一些个人设置(如桌面、图标、网络设置、窗口大小、等一些小细节、甚至还包括声音)都要重新来过,有时还会忘记一些重要设置,有了IBM 系统迁移辅助程序,就太方便了,它可以把用户的个人设置,全部导出为扩展名为*.sma的备份文件,重装系统后,再导入到新装的系统中就可以完全1:1的回到您重装系统之前,速度快不说、最重要是它备份文件的完整性、和可选择性,它可以选择您想备份的,去掉不想备份。全中文界面,就好比选择性的克隆一样
经我试用,SMA居然还可以把你在原系统中的共享文件夹也给备份了,当然包括用户信息如:Administrator的设置等等,总之SMA带给你的只有方便和简单加上快速。
15. IBM Client Security Software 按装性: 可选 适用机型:T2x\T4x\R5x\等
IBM 客户端安全软件,也就是IBM广告中经常提到的CSS 1.0 2.0,CSS不光应用于小黑,也应用于ThinkCentre台式电脑,CSS通过嵌入式安全子系统,也就是安全芯片,对用户的重要数据进行加密,和保护,当然还包括管理用户的常用密码,如果有CSS的XD可以不防一试,想加密文件时,就不必在按装第三方加密软件了。
16. IBM File and Folder Encryption 按装性:可选
意为IBM 文件和文件夹加密,是和CSS客户端配合使用的一个程序,简称为IBM FFE,它的名气没有CCS那么大,FFE只能加密C盘的文件,对于其它驱动器,FFE是无法加密的。个人认为用CSS就可以了。FFE没有必要安装。
17. IBM Rescue and Recovery 按装性:建议安装
大名鼎鼎的IBM 营救和恢复程序,简称R&R,虽然我很少使用它,因为它太大了。4××MB,不过为了这个文章装一下研究,事先说明R&R只支持Win2000和XP,R&R是一个超级强大的备份压缩工具,个人认为R&R可以代替HPA了,R&R可以备份全部的系统文件到硬盘中,或者到其它的移动介质,它可以备份所有分区,或者单独的分区,备份过程是在Windows下进行的,如果您想恢复您备份的系统,重装启动,按下F11键,一个很漂亮又熟悉的介面就会出现在你在眼前,他可以代替世面上所以的备份恢复软件,大家不防一试。R&R太强大了,光*我的一个介绍难于让大家直观了解,大家可以装上看看