高山流水
msgbartop
动之则分,静之则合,无过不及,随曲就伸。
msgbarbottom

24 十 08 LIS的2.0之路:我眼中的millennium

这次2008年中国INNOVATIVE用户年会,带来了不少与2.0相关的消息,虽然很多内容都已零零星星的知道了,但由他们的高级销售人员用漂亮的PPT演示出来,还是让我对他们有了更深层次的了解,也促使我的思考角度有所转变。

报告很长,挑了一些感兴趣的字词记录了一下:

encore,这是他们新的2.0 opac,或者说2.0的资源揭示平台,不仅可以支持他们的系统,还可以支持其他公司的系统,看起来很2,万二很快就可以体验到的。

单点登录,“像雅虎,google一样,只登录一次”,有点生搬硬套的感觉,单独的一个系统,谈什么单点登录?

mashup,把自己的系统封闭起来,引入mashup,图书馆不能自己mashup、只能购买他们的mashup,把其他网络资源变成他们的服务来卖钱。

OAI收割,可以把其他系统(例如dspace)的资源通过OAI收割到他们的系统中。

开放API,终于有API了,通过一个xQuery API,把数据向图书馆开放,支持程度暂时不知,是否免费暂时不知。

content Pro,资源中心的概念,UGC模式下的多媒体数字化馆藏,但演示出来的,看来看去都是一个ms Flickr的图片分享网站,数据设计一看就是采用DC。

基于web的统计报表,还以为可以cool一点的web统计报表,毕竟技术很简单很成熟了,结果演示一看,原来是网页上提交统计请求,然后给你下载一个excel文件,一点都不酷,倒~

标签系统,把主题词提取出来形成标签,支持标签二级分类,通过这种方式发挥主题词的作用,很好。只不过,这只能算标签的皮毛。

RFID,这么好的市场前景,自然不能放过,通过express lane自助终端软件 + RFID + Circa (移动式终端硬件),可以实现低成本的自助借还和方便的图书清点。当然,他们也会单独卖接口。

(全文…)

Tags: , , ,

29 五 07 Millennium系统OPAC整合之五:让2.0来得更猛烈一些吧!

友情敬告:开放是出路,服务是前途!
这两天本想继续写Ajax,回应一下K师的博文和清心的提问,但下午碰到了件事情,之后偶不得不将之前所写的“Millennium系统OPAC整合”系列文章做出一些改动——主要是将一些被某些人视之为神圣的东西,应要求供奉起来。
但说实话,神圣么,偶不觉得,不过《国产007》的司令说了:即使是一张厕纸,也要好好对待的。因此,偶应要求去掉或改写了相关内容:如相关屏幕截图(即使是偶们馆的哦)、相关参数内容及其他。如果有朋友需要进一步交流,请先联系他们,取得授权,否则偶们只能偷偷摸摸的哦~特此公告,嘿嘿~
呵呵,现在小钟了解槐师所言“制度破坏的力量”了,偶都不知道自己能搞这么大的破坏,那么,就让破坏来得更猛烈一些吧!
整合之三:构建自己的WebBridge一文中,原本思路是采用系统开放的参数,来提交到第三方服务器,从而实现相关功能。那么,如果系统没有这些参数,或者说偶觉得这些参数过于恶心,不用,还能不能实现我们想要的功能呢?
能!
这就是Ajax。
Ajax伟大的地方 在于其所带来的Web
应用客户端化,在于其提供的异步交互颠覆了传统的“提交/等待/
重新显示” 模式。
上一篇整合博文中,偶简单介绍了Ajax的基础,通过JavaScript+Dom,我们可以很轻松的知道,用户现在在哪个页面上,在看哪些信息,甚至可以变态的了解到,用户鼠标的滑动轨迹…….
那么对于整合之三一文,偶在这里提出一个更好的解决方案,该方案,具有更广泛的应用价值,也就是说,本方案已经不再局限于Mllnnm系统了。
第一节:得到参数
让我们回头看看整合之三一文中所隐藏掉的东西,那是告诉我们如何获取参数的一段话。我们在那里,绕来绕去得到了一个检索词,和一个ISBN号,从而实现参数的提交。
现在我觉得这种方式很笨,我决定,通过Ajax来取得我想要的东西——最正规的方式是通过Javascript脚本将当前用户浏览器的DOM文档分解,使用getElementsByTagName()逐一分析并得出任意页面上的值。
当然,也有些捷径。
一般来说,大部分OPAC系统的参数提交,都是通过GET方式进行——我们可以通过看看浏览器的地址栏上是否带有一串很长的参数得出判断。这一串地址,我们要得到它,可以通过window.location.href、window.location.search等等方式获取。获取这串URL之后,我们可以发现,该URL里面包含了许多丰富的信息,我们所需要做的只是进行简单的文本分析。
比如,通过关键词检索得出《thinking in java》一书的书目详细信息页面Url是:

http://202.116.13.244/search*chx?/Xthinking%20in%20java&searchscope=1&SORT=R/Xthinking%20in%20java&
;searchscope=1&SORT=R&SUBKEY=thinking%20in%20java/1%2C3%2C3%2CE/frameset&FF=Xthinking%20in%2
0java&searchscope=1&SORT=R&1%2C1%2C
(该URL不需授权吧?有点怕怕呢……)
将多余的信息去掉,我们可以得出:
SUBKEY=thinking%20in%20java
这其实就是用户提交的关键字。
除了URL,我们还可以用FORM,像在Millennium系统的书目信息页面,仍然提供了检索框,方便用户进行进一步检索,对于该检索框的值,我们可以通过document.form.searcharg.value语句来获取,当然,这是不正规的写法,正规写法是:doucument.getElementsByTagName(”searcharg”).getAttribute(”value”)。
如果说URL和FORM中没有我们想要的值,如本例子中的ISBN号,那么我们只有老老实实的分析DOM,并找出
ISNB号所在的单元格,再通过innerHTML()属性获取相关值。
而上面这一切,都只是通过一段脚本,在用户浏览器上执行的。
那么得到了参数之后,接下来就要和服务器通讯了。
第二节:异步通讯
用户在继续他的操作,而浏览器已经在不打扰用户的情况下,跟我们的服务器通讯了。
这就是XMLHttpRequest对象。
XMLHttpRequest对象可以通过脚本创建,并且可以给服务器发送HTTP请求,当然,毫无疑问的它能接收服务器的反馈。我们通过以下语句创建一个XMLHttpRequest对象:

xRequest=new
XMLHttpRequest();//创建对象,实际上要复杂一些


同时,我们通过onreadystatechange定义它的回调函数,然后将相关参数传送至服务器。

xRequest.onreadystatechange=onReadyState;//定义回调函数

xRequest.open(HttpMethod,url,true);//打开http访问

xReqeust.send(params);//传送相关参数

而在在服务器端,我们接收用户提交的参数,并执行数据库操作,完成后,将相关信息反馈回客户端浏览器。反馈数据的形式可以是txt、html、甚至是JavaScript数组等。

第三节:更新页面的某一部分

客户端浏览器通过侦听回调函数,确定服务器处理完请求后,就可以通过createElement()等方法来实现文档的修改,把相关反馈信息,更新到当前文档即可。代码…..略……

以上三节内容,已经给我们揭示了一个很好的方向,对于一些封闭的WEB应用,我们可以通过Ajax,实现很多原本不可实现的事情。大家一起发挥想象吧~
总结:
呵呵,写着写着,就变成写Ajax了,其实Ajax是非常有用的工具,随着用户“我的地盘我做主”的吼声越来越多,相关技术肯定会不断涌现。保守,只能被淘汰。软件不是什么值钱的东西,服务才是。
看看ORACLE吧,看看GOOGLE吧~

Tags: , , ,

09 五 07 Millennium系统OPAC整合之四:AJAX基础

因为无知,所以进步,只有努力,才能专业——以此自勉。
对于近乎封闭的OPAC系统来说,AJAX是把利剑。为什么这么说呢?


OPAC系统失败之处:
1、绝大部分基于自有web解析服务器,web页面程序不开放,无法进行数据层面的操作和修改;
2、绝大部分基于封闭的数据库,用户无法直接访问数据库取到相关记录;
3、几乎没有支持用户开发需求的第三方接口。
AJAX的锋利之处:
1、运行在客户端浏览器上,与OPAC平台无关。只要能在OPAC页面中嵌入相关脚本,即可实现相关功能;
2、可以通过DOM操作,获取用户当前页面上的所有信息——包括书名、ISBN号、索书号等等;
3、可以在不影响用户操作的前提下,通过xmlhttprequest对象,向某一服务器发送请求,并得到反馈数据;
4、可以通过DOM操作,无刷新改变当前页面的结构与内容。
由上面的对比,可以看到,要做OPAC资源整合,AJAX是绝妙的武器。那么操作AJAX的基础是不是很简单呢?
是的,下面是一些最基本的操作方式,但这些基本的操作方式,已经足以让我们完成80%的工作。
一、嵌入脚本:

首先,假设有这么一个理想的页面:
sample.html
<html>
<head>
<title>Ajax in
action</title>

</head>
<body>
<table width=”200″
border=”1″>

<tr>

<td>书名:</td>

<!–此处定义了td标签的id–>

<td
id=”t”>Ajax in Action</td>

</tr>

</table>
</body>
</html>

那么我们要嵌入脚本,是很容易的事情,我们可以把脚本直接写到里面,也可以通过外接脚本文件的形式嵌入,例如,在</head>标签之上加上一行:

<script
type=”text/javascript”
src=”ajax_sample.js”></script>
那么为什么要嵌入脚本呢?请接着来~


二、页面信息的读取:
脚本是AJAX的核心,只有通过脚本,才能实现AJAX的操作。
我们现在要实现ajax_sample.js对sample.html页面信息的读取,确切的说,是要得到该页面上的书名。
ajax_sample.js:
window.onload=function() //当网页加载后运行脚本
{

//通过id获取当前文档的书名单元格对象
var
objTitle=document.getElementById(’t');


//输出对象内容


alert(objTitle.innerHTML);

}

通过document.getElementById()方法,我们分别获取了sample.html网页中的书名单元格对象,并通过innerHTML属性得到了具体的值——“Ajax
in
Action”——这样,我们初步实现了文档内容的分析操作。

当然,sample.html具有一定的理想性——结构清晰、具有id属性——目前OPAC系统里面,我相信大部分页面的HTML是极其恶心、惨不忍睹的,但是这并不能阻挡AJAX的步伐,除了getElementById()方法,我们还可以通过getElementsByTagName()来实现节点的搜索。

三、发送请求到服务器:
好了,我们顺利的分析了文档的内容,那么在这里首先问大家一下:分析用户文档的意义何在?
意义在于,我们要知道读者正在浏览的信息,比如是哪一本书,这样我们才能针对读者的行为给他们更多的惊喜。
在本例中,得到了书名之后,我们就可以通过xmlhttprequest对象,将书名传送到专门的服务器,由服务器去实现更多的功能。
ajax_sample.js:
window.onload=function() //当网页加载后运行脚本
{

//通过id获取当前文档的书名单元格对象
var
objTitle=document.getElementById(’t');


//输出对象内容

//alert(objTitle.innerHTML);

//与服务器通讯

sendRequest(”[服务器处理程序的URL]“,”t=”+objTitle.innerHTML);

}

function
CreateXmlHttpRequest()//创建XmlHttpRequest对象

{

var xRequest=null;//定义


if(window.XMLHttpReqeust)//支持XMLHttpReqeust对象

{

xRequest=new XMLHttpRequest();


}


else if(typeof ActiveXobject !=”undefined”)//支持ActiveX对象

{

xRequest=new
ActiveXobject(”Microsoft.XMLHTTP”);

}

return xRequest;//返回

}

function
sendRequest(url,params)//发送请求函数

{

HttpMethod=”GET”;//传送方式

var
sRequest=CreateXmlHttpRequest();//创建实例

if(sRequest)

{

sRequest.open(HttpMethod,url,true);//打开http访问

sReqeust.send(params);//传送相关参数

}

}

四、服务器的反馈程序:
通过上面的步骤,已经实现了客户端将数据传送到服务器,这时,服务器可以做的事情很多了,比如,检索一下有没有电子图书,并向用户返回相关信息。
ajaxsample.java
//yuanxinz.2007.05.09

package ajaxsample;

import java.io.*;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.servlet.*;

import java.servlet.http.*;
public class ajaxsample extends
HttpServlet

{

public void init(ServletConfig config) throws
ServletException

{

//…..

}

protected void doGet(HttpServletRequest
request,HttpServletResponse response) throws
ServletException,IOException

{

String s =
request.getParameter(”s”);//获取参数

//执行电子图书数据库检索

……

rs = pool.getRs(”select * from
表 where 题名 like ‘%”+s+”%’);

try{

if(rs.next())

{

rs.previous();

//将结果输出为文本

PrintWriter
out = response.getWriter();

response.setContentType(”text/plain;charset=gb2312″);

response.setHeader(”Cache-Control”,
“no-cache”);

response.setHeader(”Pragma”,
“no-cache”);

String
outstr=”";

int
i = 0;

while(rs.next())

{

outstr
= outstr + rs.getString(”题名”) + “|” + rs.getString(”url”) +
“\n”;

i++;

}

out.println(outstr);

out.close();

}

else

{

response.setStatus(HttpServletResponse.SC_NO_CONTENT);

}

//关闭数据库连接之类的….

…….

}

catch(SQLException e)

{

e.printStackTrace();

}

}

}

上面的servlet在接到用户请求后,将进行相关检索,并返回一个文本:

Ajax in Action|http://******

……

Ajax in action
**|http://*****

AJAX可以返回多种类型的数据,包括html、XML文档和javascript脚本等等。
五、接收反馈数据,并修改当前文档:
现在一切又回到了用户浏览器,首先,我们要通过定义回调处理函数,来确定服务器已经将相关的数据返回。
ajax_sample.js:
window.onload=function() //当网页加载后运行脚本
{

//通过id获取当前文档的书名单元格对象
var
objTitle=document.getElementById(’t');


//输出对象内容


//alert(objTitle.innerHTML);

//与服务器通讯

sendRequest(”[服务器处理程序的URL]“,”t=”+objTitle.innerHTML);

}

function
CreateXmlHttpRequest()//创建XmlHttpRequest对象

{
var
xRequest=null;//定义


if(window.XMLHttpReqeust)//支持XMLHttpReqeust对象

{

xRequest=new XMLHttpRequest();

}
else if(typeof
ActiveXobject !=”undefined”)//支持ActiveX对象

{

xRequest=new
ActiveXobject(”Microsoft.XMLHTTP”);

}
return
xRequest;//返回

}

function
sendRequest(url,params)//发送请求函数

{

HttpMethod=”POST”;//传送方式

var
sRequest=CreateXmlHttpRequest();//创建实例

if(sRequest)

{

//这里调用回调

sRequest.onreadystatechange=onReadyState;

sRequest.open(HttpMethod,url,true);//打开http访问

sReqeust.send(params);//传送相关参数
}
}

function
onReadyState()

{

var redy=sRequest.readyState;//获取sRequest实例的状态

var data=null;

if(ready=4)//完成状态

{

data=xRequest.responseText;

}

else


{


data=”正在读取相关数据….”

}
}

用户浏览器收到服务器反馈的文本后,就可以通过createElement()等方法来实现文档的修改。

ajax_sample.js:
window.onload=function() //当网页加载后运行脚本
{

//通过id获取当前文档的书名单元格对象
var
objTitle=document.getElementById(’t');


//输出对象内容


//alert(objTitle.innerHTML);

//与服务器通讯
var
empty=document.getElementById(’empty’);//定义一个空节点


sendRequest(”[服务器处理程序的URL]“,”t=”+objTitle.innerHTML);

}

function
CreateXmlHttpRequest()//创建XmlHttpRequest对象

{
var
xRequest=null;//定义


if(window.XMLHttpReqeust)//支持XMLHttpReqeust对象

{

xRequest=new XMLHttpRequest();

}
else if(typeof
ActiveXobject !=”undefined”)//支持ActiveX对象

{

xRequest=new
ActiveXobject(”Microsoft.XMLHTTP”);

}
return
xRequest;//返回

}

function
sendRequest(url,params)//发送请求函数

{

Tags: , ,

12 四 07 Millennium系统OPAC整合之三:构建自己的WebBridge

Millennium系统的OPAC中,有一个产品叫WebBridge,通过它,读者可以在查阅相关书目信息的同时,以OPENURL的方式在各类开放数据库中获取相关全文、电子图书、搜索引擎结果及其他相关信息。如下图所示(点击放大):

(应要求,不得放截图,大家要看自己找去~嘿嘿,若被授权,可email偶)

示例用的是香港大学的OPAC系统,大家可以通过
http://library.hku.hk/ 体验一下。
不可否认,WebBridge是个好东西,但是好东西往往意味着高价钱,(应要求,此处省略若干字…..若被授权,请EMAIL偶)。有句俗话叫癞蛤蟆想吃天鹅肉,小钟就像那见过了天鹅,却只能流着口水的癞蛤蟆,始终惦记在心里啊~
所谓庸人自扰,相思成病,看着好东西却得不到是很伤的,所以小钟无奈之下退而求其次——天鹅肉吃不到,但鸭子咱会养,咱整个鸭子试试!
言归正传,分析一下这个WebBridge,关键在于其针对读者的检索结果,在结果页面上提供了一个或若干个相关参数,通过这些参数,可以构建出相应的URL,从而提交到各类开放数据库。
就这么个简单的东西。
那么小钟要做的事情就两点:
一、找出一个有用的参数。这个参数可以是检索词,题名或者ISBN号等等。
二、找出一个可以修改检索结果页面的地方,让检索结果页面可以显示部分自定义的内容。
而这两点其实都不难。
一、(应要求,在此省略字数400多字,若被授权并需进一步交流,请email小钟)

二、对页面进行修改,这就更简单了,只要能输入HTML的地方,就可以任意嵌入我们想要嵌入的东西,方法有很多,比如,嵌入一个IFRAME、嵌入一个DIV、嵌入一段脚本……

具体实现过程如下:

一、(应要求,此处省略300多字,若被授权并需进一步交流,请email小钟)

二、提供一个webbridge.asp网页,该网页用于接收参数并实现相关功能,例如:

dim para ‘参数

para=trim(request(”para”))

if IsNumeric(replace(para,”x”,”"))=true then
‘如果传入的是ISBN号

response.Write(”随书光盘:“)
‘查找随书光盘信息

….

if
…. then

如有光盘可请求上网


else

下载光盘

end
if

….

response.Write(”电子图书:“)
‘查找电子图书

超星数字图书

方正电子图书

书生电子图书

NetLibrary

GOOGLE查找电子图书

response.Write(”电子期刊:“) ‘查找期刊

….

else ‘如果传入的是检索词

….

end if

效果如下图(点击放大):

(应要求,不得随便截图,自己看去,若被授权,可EMAIL偶)

读者点击下载光盘,可以下载《Thinking in
java》这本书的随书光盘,点击GOOGLE查找免费电子图书,可以提交检索到GOOGLE图书等等。

当然,由于能用的参数有限,也没有用到AJAX,目前大概也只能做到这个程度,聊胜于无吧。

其实,对于所需的各类参数,即使Millennium的OPAC系统一个参数都不提供,我们也完全可以使用javascript
+
Dom,进行用户页面分析获得,进而通过AJAX,与各类数据库进行无刷新操作!

而这就是小钟下一步要去做的事情:
一个基于JAVA+AJAX的,独立的、开源的书目TAGGING系统,敬请期待。

一点补充:在上面的webbridge.asp文件中,仅仅通过判断传入的参数是否为数字而确定是不是ISBN号存在一些bug,建议根据来源页面判断传入的参数是检索词还是ISBN号。在ASP中,判断来源页面的环境变量为HTTP_REFERER

Tags: , , ,

23 三 07 Millennium系统OPAC整合之二:如何禁用读者借阅信息登录中的PIN

OPAC和网站整合任务之二中,要实现读者登录了网站后,可以直接查看自己的借阅信息,而无需登录OPAC系统。那么就要求网站自动帮助读者完成这一登录过程。
Millennium系统默认读者通过OPAC查询自己的借阅信息时,需要输入姓名、bcode(校园卡号)和PIN进行登录。用户的姓名、bcode都可以直接从网站用户数据库中获取,但PIN就比较讨厌。我们尝试采用对付ILAS的办法对付它——即全部用户指定PIN(例如999),从而绕过它——但Millennium系统不买帐,必须要在web客户端进行验证后才能确定,这显然是不可行的。
所以最好能够禁用它。
网上看了一下其他使用Millennium系统的图书馆的OPAC,打电话咨询了几个馆,都不知道在哪里设置,设置了的也说是公司帮忙设置的。呵呵,看来香港同行所说的“如果能用好Millennium系统一半的功能,就很不错了”并不假。
无奈之下,系统管理员赵老师开始截图,准备向公司寻求帮助了,但自己总觉得既然可以设置的,那么就应该找得到它,再次琢磨web option,发现禁用PIN这类的功能,涉及到的不仅仅是OPAC页面,而是关乎整个系统。思路有了后,马上通过系统选项进去查看相关内容,果然是顺藤摸瓜,爽!
相关信息如下,希望能给使用这一系统的朋友们一点帮助:)
(应要求,此处省略具体实现过程,100多字,若被授权并需要进一步交流,请email小钟)

。。。。。。
将此选项改为NO即可。

Tags: , ,