`
lgf444
  • 浏览: 78903 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
最近访客 更多访客>>
社区版块
存档分类
最新评论

DWR中文文档v0.9 11

    博客分类:
  • AJAX
阅读更多

第10章. 附录

10.1 常见问题

10.1.1 TransformerFactoryConfigurationError 当应用服务器启动时,报出如下错误

javax.xml.transform.TransformerFactoryConfigurationError: 
Provider org.apache.xalan.processor.TransformerFactoryImpl not found 
javax.xml.transform.TransformerFactory.newInstance(Unknown Source)

 

 这个并非DWR导致的,是Tomcat没有设置属性导致的。最快的回答是下载Xalan并且把xalan.jar替换掉 $Tomcat-HOME/common/lib目录下的xalan.jar。DWR2.0比DWR1.x能更好地应付这个问题,但核心问题仍然是DWR的XML串行化对象需要一个XSLT的解析。

10.1.2 XML解析错误

这是一开始用DWR会产生的常见的错误,无论对DWR做什么都不会有用,主要是因为Tomcat里面自带的Xerces的问题,要么是该有的时候没有,要么是不该有的时候有了。

JDK 1.3自身没有XML解析器,所以你需要xercesImpl.jar和xml-apis.jar. 

 JDK 1.4.0 和 JDK 1.4.1 虽然有了XML解析器,但是有很多bug,所以你还是需要把xercesImpl.jar放到tomcat\common\endorsed目录下。

JDK 1.4.2和JDK 5自带的XML解析器工作的很好,你就不需要再加其他的了。 另外要提的一点是,不同版本的Tomcat需要的XML解析器不一样。所以要注意检查它和JDK的版本兼容性。

10.1.3 使用weblogic的类路径问题

Weblogic 8.1(有可能其他版本同样)可能找不到DWR的类。

这大多出现在dwr.jar放在APP-INF目录下(APP_INF/lib)的情况。在这种情况下DWR依然可以工作,例如debug页面可以看见,但是DWR找不到你的类。

解决办法是把dwr.jar放到WEB-INF/lib目录下。

10.1.4 没有cookies的情况下用DWR

当不能用cookies时,servlet规范通过URL重写来支持HttpSession。DWR 2.x通过它生成的URL来支持这项功能。但是DWR 1.x没有这个功能。你可以通过以下办法让DWR 1.x 也支持cookies: 

 从dwr.jar中提取engine.js,保存到你的文件系统中,就像jsp文件一样. 

 修改"DWREngine._sendData = function(batch)" 方法, 加入一行:

statsInfo += ";jsessionid=" + <%="'"+session.getId()+"'"%>

 这样就可以让DWR 1.x支持url重写了。DWR 2+默认支持。

10.2 JavaScript高级应用

本节选自于IBM developerWorks 中国 以及《ajax in action》部分章节,并非本人原创,仅整理献给大家。

JavaScript 常被人们认为是编程语言中无足轻重的一员。这种观点的形成可以“归功”于其开发工具、复杂且不一致的面向 HTML 页面的文档对象模型以及不一致的浏览器实现。但 JavaScript 绝对不仅仅是一个玩具这么简单。在本文中,Bruce Tate 向您介绍了 JavaScript 的语言特性。

 几乎每个 Web 开发人员都曾有过诅咒 JavaScript 的经历。这个备受争议的语言受累于其复杂的称为文档对象模型 (DOM)的编程模型、糟糕的实现和调试工具以及不一致的浏览器实现。直到最近,很多开发人员还认为 Javascript 从最好的方面说是无可避免之灾祸,从最坏的方面说不过是一种玩具罢了。

 然而 JavaScript 现在开始日益重要起来,而且成为了广泛应用于 Web 开发的脚本语言。JavaScript 的复苏使一些业界领袖人物也不得不开始重新审视这种编程语言。诸如 Ajax (Asynchronous JavaScript + XML) 这样的编程技术让 Web 网页更加迷人。而完整的 Web 开发框架,比如 Apache Cocoon,则让 JavaScript 的应用越来越多,使其不只限于是一种用于制作 Web 页面的简单脚本。JavaScript 的一种称为 ActionScript 的派生物也推动了 Macromedia 的 Flash 客户端框架的发展。运行在 JVM 上的实现 Rhino 让 JavaScript 成为了 Java™ 开发人员所首选的一类脚本语言。

我的好友兼同事 Stuart Halloway 是 Ajax 方面的专家,曾在其教授的 JavaScript 课程中做过这样的开场白:“到 2011 年,JavaScript 将被公认为是一种拥有开发现代应用程序所需的一整套新特性的语言” 。他继而介绍说 JavaScript 程序要比类似的 Java 程序紧密十倍,并继续展示了使其之所以如此的一些语言特性。

在这篇文章中,我将带您探究 JavaScript 的一些特性,看看这些特性如何让它如此具有吸引力:

10.2.1 用变量操纵函数

使用 JavaScript 时,我会经常在变量或数组中存储函数,例如,查看一下一例

<head>
   <script type='text/javascript'> 
       hot = function hot() { 
         alert('Sweat.') 
       } 
       cold = function cold() { 
         alert('Shiver.')
       } 

       function swap() { 
           temp = hot
           hot = cold 
           cold = temp
           alert('Swapped.') 
       } 
   </script>
 </head> 
<body> 
<button onclick="hot();">Hot</button> 
<button onclick="cold();">Cold</button> 
<button onclick="swap();">Swap</button>
 </body>

 

 函数是 JavaScript 中的一类对象,可以自由地操纵它们。首先我声明两个函数:hot 和 cold。并分别在不同的变量存储它们。单击 Hot 或 Cold 按钮会调用对应的函数,生成一个告警。接下来,声明另一个函数用来交换 Hot 和 Cold 按钮的值,将此函数与第三个按钮关联,该按钮显示如图 3 所示的告警:

 这个例子说明可以像处理其他变量一样处理函数。C 开发人员很容易将此概念看作是函数指针 功能,但 JavaScript 的高阶函数的功能更为强大。该特性让 JavaScript 程序员能够像处理其他变量类型一样轻松处理动作或函数。

10.2.2 高阶函数

将函数用作函数的参数,或将函数作为值返回,这些概念属于高阶函数的领域。

<head>
 <script type='text/javascript'>

 function temperature() {
 return current 
} 
hot = function hot() {
 alert('Hot.') 
} 
cold = function cold() {
alert('Cold.') 
} 
current = hot function swap() {
     if(current == hot) {
       current = cold 
    } else { 
    current = hot } 
} 
</script> 
</head> 
<body>
 <button onclick="funct = temperature()();">Temperature</button>
 <button onclick="swap();">Swap</button>
 </body>

 

这个例子解决了一个常见问题:如何将更改中的行为附加到用户接口事件?通过高阶函数,这很容易做到。temperature 高阶函数返回 current 的值,而 current 又可以有 hot 或 cold 函数。看一下这个有些陈旧的函数调用:temperature()()。第一组括号用于调用 temperature 函数。第二组括号调用由 temperature 返回 的函数。如下显示了输出:

高阶函数是函数式编程的基础,对比面向对象编程,函数式编程代表了更高级别的抽象。但 JavaScript 的实力并不仅限于高阶函数。JavaScript 的动态类型就极为适合 UI 开发。

10.2.3 动态类型

通过静态类型,编译器可以检查参数和变量的值或针对一个给定操作所允许的返回值。其优势是编译器可以做额外的错误检查。而且静态类型还可以为诸如 IDE 这样的工具提供更多信息,带来其他一些特性,比如更好的代码完成功能。但静态类型也存在着如下一些劣势:

 1. 必须提前声明意图,这常常会导致灵活性降低。例如,更改一个 Java 类就会更改类的类型,因而必须重新编译。对比之下,Ruby 允许开放的类,但更改一个 Java 类还是会更改类的类型。

2. 要实现相同的功能,必须输入更多的代码。例如,必须用参数形式包括进类型信息,必须用函数形式返回值和所有变量的类型。另外,还必须声明所有变量并显式地转化类型。

3. 静态语言的编译-部署周期要比动态语言的部署周期长,尽管一些工具可被用来在某种程度上缓解这一问题。

静态类型更适合用于构建中间件或操作系统的语言中。UI 开发常常需要更高的效率和灵活性,所以更适合采用动态类型。我深知这种做法存在危险。相信使用过 JavaScript 的 Web 开发人员都曾经为编译器本应检测到的错误类型的变量而绞尽脑汁。但它所带来的优势同样不可否认。下面将举例加以说明。 首先,考虑一个对象的情况。在清单 5 中,创建一个新对象,并访问一个不存在的属性,名为 color:

 

<script type='text/javascript'> 
    blank_object = new Object(); 
    blank_object.color = 'blue' 
   alert('The color is ' + blank_object.color) 
</script>

 当加载并执行此应用程序时,会得到如所示的结果:

 JavaScript 并不会报告 blue 属性不存在的错误。静态类型的拥护者大都会被本例所吓倒,因为本例中的错误被很好地隐匿了。虽然这种做法多少会让您感觉有些不正当,但您也不能否认它巨大的诱惑力。您可以很快引入属性。如果将本例和本文之前的例子结合起来,还可以引入行为。记住,变量可以保存函数!所以,基于动态类型和高阶函数,您可以在任何时候向类中引入任意的行为。

<script type='text/javascript'>
    blank_object = new Object();
    blank_object.color = function() {return 'blue'} 
    alert('The color is ' + blank_object.color())
 </script>

 从上例可以看出,在 JavaScript 的不同概念之间可以如此轻松地来回变换,其含义上的变化很大 —— 比如,是引入行为还是引入数据 —— 但语法上的变化却很小。该语言很好的延展性是它的一种优势,但同样也是其缺点所在。实际上,该语言本身的对象模型就是 JavaScript 延展程度的一种体现。

10.2.4 灵活的对象模型

到目前为止,您应该对 JavaScript 有一个正确的评价了,它绝非只如一个玩具那么简单。事实上,很多人都使用过其对象模型创建过极为复杂、设计良好的面向对象软件。但对象模型尤其是用于继承的对象模型又非您一贯认为的那样。

 Java 语言是基于类的。当构建应用程序时,也同时构建了可以作为所有对象的模板的新类。然后调用 new 来实例化该模板,创建一个新对象。而在 JavaScript 中,所创建的是一个原型,此原型是一个实例,可以创建所有未来的对象。

 现在先暂且放下这些抽象的概念,去查看一些实际代码。比如, 创建了一个简单的 Animal,它具有 name 属性和 speak 动作。其他动物会从这个基础继承。

1. 构造函数

创建一个构造函数

<script type='text/javascript'> 
Animal = function() { 
     this.name = "nobody" 
      this.speak = function () { 
         return "Who am I?" 
  } 
} 
myAnimal = new Animal(); 
alert('The animal named ' + myAnimal.name + ' says ' + myAnimal.speak()); 
</script>

 

对于 Java 开发人员而言,清单 7 中的代码看起来多少有点生疏和奇怪。实际上对于没有亲自构建过对象的许多 JavaScript 开发人员来说,这些代码同样看起来有点生疏和奇怪。也许,下面的解释可以让大家能够更好地理解这段代码。

实际上,您只需重点关注其中三段信息。首先,JavaScript 用嵌套函数表示对象。这意味着清单 7 中的 Animal 的定义是一种有效的语法。第二,JavaScript 基于原型或现有的对象的实例来构造对象,而非基于类模板。funct() 是一种调用,但 new Animal() 却基于 Animal 内的原型构造一个对象。最后,在 JavaScript 中,对象只是函数和变量的集合。每个对象并不与类型相关,所以可以自由地修改这种结构。

 如您所见,JavaScript 基于在 Animal 中指定的原型定义一个新对象:myAnimal。继而可以使用原型中的属性和函数,甚或重定义函数和属性。这种灵活性可能会让 Java 开发人员受不了,因为他们不习惯这种行为,但它的确是一种十分强大的模型。

2. 继承

现在我还要更深入一步。您还可以使用名为 prototype 实例变量来指定对象的基础。方法是设置 prototype 实例变量使其指向继承链的父。如此设置 prototype 之后,您所创建的对象会为未指定的那些对象继承属性和函数。这样一来,您就可以模仿面向对象的继承概念。

 

<script type='text/javascript'> 
Animal = function() { 
   this.name = "nobody" 
   this.speak = function () { return "Who am I?" } 
} 
Dog = function() { 
    this.speak = function() { return "Woof!" } 
} 
Dog.prototype = new Animal(); 
     myAnimal = new Dog(); 
     alert('The animal named ' + myAnimal.name + ' says ' + myAnimal.speak());
 </script>

 

创建了一个 Dog 原型。此原型基于 Animal。Dog 重定义 speak() 方法但却不会对 name() 方法做任何改动。随后,将原型 Dog 设置成 Animal。图 7 显示了其结果:

这也展示了 JavaScript 是如何解决到属性或方法的引用问题的:

1.JavaScript 基于原始的原型创建实例,该原型在构造函数中定义。任何对方法或属性的引用都会使用所生成的原始副本。

2.您可以在对象内像定义其他任何变量一样重新定义这些变量。这样做必然会更改此对象。所以您显式定义的任何属性或函数都将比在原始的原型中定义的那些属性或函数优先级要高。

3.如果您显式设置了名为 prototype 的实例变量,JavaScript 就会在此实例中寻找任何未定义的实例变量或属性。这种查找是递归的:如果 在 prototype 内定义的实例不能找到属性或函数,它就会在其 原型中查找,依此类推。

那么,JavaScript 的继承模型到底是什么样的?这取决于您如何对它进行定义。您需要定义继承行为以便可以覆盖它。然而,从本质上讲,JavaScript 更像是一种函数式语言,而非面向对象的语言,它使用一些智能的语法和语义来仿真高度复杂的行为。其对象模型极为灵活、开放和强大,具有全部的反射性。有些人可能会说它太过灵活。而我的忠告则是,按具体作业的需要选择合适的工具。

10.2.5 本节总结

JavaScript 对象模型构建在该语言的其他功能之上来支持大量的库,比如 Dojo。这种灵活性让每个框架能够以一种精细的方式更改对象模型。在某种程度上,这种灵活性是一种极大的缺点。它可以导致可怕的互操作性问题(尽管该语言的灵活性可以部分缓解这些问题)。

而另一方面,灵活性又是一种巨大的优势。Java 语言一直苦于无法充分增强其灵活性,原因是它的基本对象模型还未灵活到可以被扩展的程度。一个典型的企业级开发人员为能够成功使用 Java 语言必须要学习很多东西,而新出现的一些优秀的开放源码项目和新技术,比如面向方面编程、Spring 编程框架和字节码增强库,则带来了大量要学的代码。

最后,JavaScript 优秀的灵活性的确让您体会到了一些高阶语言的强大功能。当然您无需选择为每个项目或大多数项目都做这样的权衡和折衷。但了解一种语言的优势和劣势 —— 通过参考大量信息,而不仅仅基于广告宣传或公众意见 —— 会让您可以更好地控制何时需要使用以及何时不能使用这种语言。当您在修改 JavaScript Web 小部件时,您至少知道该如何让此语言发挥它最大的优势。

 

分享到:
评论

相关推荐

    DWR中文文档v0.9PDF

    DWR中文文档v0.9

    DWR中文文档v0.9

    DWR中文文档v0.9 DWR2.0 方佳玮 编著 部分原创/部分整理/部分翻译

    DWR中文文档v0.9+DWR.jar+JS

    DWR中文文档v0.9+DWR.jar+JS

    DWR2.0中文文档V0.9

    资源名称:DWR 2.0中文文档 V0.9内容简介: Ajax向我们袭来的时候,很多写代码的程序员看到了Ajax的发展前景,但并不是每一个程序员都能将页面与代码完美整合在一起,DOM、CSS、javascript让人眼花缭乱,不知...

    DWR中文文档和dwr.jar包

    DWR中文文档和dwr.jar包 DWR中文文档v0.9Ajax向我们袭来的时候,很多写代码的程序员看到了Ajax的发展前景,但并不是每一个程序员都能将页面与代码完美整合在一起,DOM、CSS、javascript让人眼花缭乱,不知从何下手。...

    DWR中文官方文档

    DWR的中文官方文档,以及V0.9的文档一共两份 在网站不容易找到合适的说明.这个包里是整合网站的dwr所有帮助信息下载下来的,因为时间缘故没有及时做成电子文档,希望有时间了在做一份. 如果还是看着不方便建议到...

    dwr框架简介PDF

    本文件介绍了一些dwr框架的知识,对初学者有一定的帮助.

Global site tag (gtag.js) - Google Analytics