互动出版网 专业图书网上第一专营店 独家提供样章 第3章 DWR高级主题 在 上一章中,我们第一次讨论DwR,了解了如何在应用程序中配置DWR,如何与客户 端和服务器端的DWR交互,以及日常使用的一些基本知识。在本章中,我们将进一步 深入了解、学习DWR所提供的“高级”主题。对“高级”使用引号的原因是,严格说来,本章 内容并不比前面所讨论的内容更复杂,只是不常用罢了。在本章中,我们将讨论安全性、错误处 理、访问其他URL、反向Aax、与其他框架集成,以及DWR中的Java5注解支持。 3.1DWR安全机制 这是一个众所周知的事实,当自己的Web应用程序在因特网上露面时,各种形式的不友好行 动就会立即靠拢过来。有大批黑客已经准备好攻击你的应用程序。这些人这样做的目的不外乎盗 窃金钱、获取你的资产、破坏你的声誉、让应用程序变慢等。如果放任这种行为,他们会占有你 的网站,把它变成进一步犯罪的工具,就好像僵尸攻击那些频临灭绝的特殊鸟种,只有神圣的 DMCA才能保护它们。这个场景就像“ Weird A1”歌曲中所唱的那样。 (有时候,别人会认为我喜欢夸大事实!) 从某种角度来说,这可能有点滑稽。但是,要注意非常关键的一点,在任何Web开发项目中, 安全性都是非常重要的考虑因素。在Ajax世界如此,在DWR世界也是如此! 但是,坦白地讲,很多其他Ajax工具对安全性考虑不够,让你直面安全威胁(如图3-1所示)。 DwWR提供一些安全机制,你也许会发现它非常适合自己的需求 DWR使用多层安全保障方法,但是,至少有一个机制必须始终启用。下面我们首先讨论这 种机制 DMCA是《数字千年版权法案》的缩写词,是美国的一部法律,约束非法制造软件的人和行为,比如制造软件或 者设备以实现非法访问控制(经常被称为DRM,即数字版权管理)。这部法律也规定了对在 Internet上违反版权行为 的处罚。DMCA是人类历史上最受争议的法案之一,因为很多人认为这个法案涉及面太广、不公平(例如,由于版 权所有者从网站删除内容非常容易,因此侵权的事件在很多时候也存在法律疑问)。有些人甚至认为,这本身就是 不合法的标准。不幸的是,到目前为止,在法庭上尚未出现成功申辩的案例 在2006年专辑 Straight Outta Lynwood中,“ Weird A” Yankovic发布了一首新歌“ Virus alert'”。这首歌说明如何在自 己的计算机上检测病毒,并消除它。如果你想了解这首歌,可以访问www.answers.com/topic/virus-alert
DWR高级主题 第3章 上一章中,我们第一次讨论DWR,了解了如何在应用程序中配置DWR,如何与客户 端和服务器端的DWR交互,以及日常使用的一些基本知识。在本章中,我们将进一步 深入了解、学习DWR所提供的“高级”主题。对“高级”使用引号的原因是,严格说来,本章 内容并不比前面所讨论的内容更复杂,只是不常用罢了。在本章中,我们将讨论安全性、错误处 理、访问其他URL、反向Ajax、与其他框架集成,以及DWR中的Java 5注解支持。 在 3.1 DWR 安全机制 这是一个众所周知的事实,当自己的Web应用程序在因特网上露面时,各种形式的不友好行 动就会立即靠拢过来。有大批黑客已经准备好攻击你的应用程序。这些人这样做的目的不外乎盗 窃金钱、获取你的资产、破坏你的声誉、让应用程序变慢等。如果放任这种行为,他们会占有你 的网站,把它变成进一步犯罪的工具,就好像僵尸攻击那些频临灭绝的特殊鸟种,只有神圣的 DMCA①才能保护它们。这个场景就像“Weird A1”②歌曲中所唱的那样。 (有时候,别人会认为我喜欢夸大事实!) 从某种角度来说,这可能有点滑稽。但是,要注意非常关键的一点,在任何Web开发项目中, 安全性都是非常重要的考虑因素。在Ajax世界如此,在DWR世界也是如此! 但是,坦白地讲,很多其他Ajax工具对安全性考虑不够,让你直面安全威胁(如图3-1所示)。 DWR提供一些安全机制,你也许会发现它非常适合自己的需求。 DWR使用多层安全保障方法,但是,至少有一个机制必须始终启用。下面我们首先讨论这 种机制。 ① DMCA是《数字千年版权法案》的缩写词,是美国的一部法律,约束非法制造软件的人和行为,比如制造软件或 者设备以实现非法访问控制(经常被称为DRM,即数字版权管理)。这部法律也规定了对在Internet上违反版权行为 的处罚。DMCA是人类历史上最受争议的法案之一,因为很多人认为这个法案涉及面太广、不公平(例如,由于版 权所有者从网站删除内容非常容易,因此侵权的事件在很多时候也存在法律疑问)。有些人甚至认为,这本身就是 不合法的标准。不幸的是,到目前为止,在法庭上尚未出现成功申辩的案例。 ② 在2006年专辑Straight Outta Lynwood中,“Weird A1”Yankovic发布了一首新歌“Virus Alert”。这首歌说明如何在自 己的计算机上检测病毒,并消除它。如果你想了解这首歌,可以访问www.answers.com/ topic/ virus-alert
互动出版网 China-Pub. com 专业图书网上第一专营店 独家提供样章 3.1DWR安全机制80 图3-1尽管安全威胁不像有些电影中展示的那么可怕,但是 在现实世界中所带来的危害有时也是极其严重的 3.1.1默认拒绝 无须做任何设置,DWR会自动采用“默认拒绝”方法。这意味着,在默认情况下,DWR不 允许任何类被远程访问。回想一下希望远程访问的每个类,必须在配置文件中添加元 素。好像仅仅这样做还不够,这个元素还应该被嵌套在元素中。通过添加这 种信息条目,可以告诉DWR,指定类的远程调用被授权了。但是,如果没有在这个配置文件中 添加相应的信息条目,则远程调用会被禁止 聪明的读者肯定会认识到,这种措施实际上还存在一个潜在的安全漏洞:在默认情况下,被 授权类的所有方法都可以通过远程调用来访问。在通常情况下,这样做就可以了,因为我们平常 的代码组织习惯是一个类始终包含可以远程调用的所有“安全”方法。设计这样一个类可能并不 难,类中部分方法可以安全地远程调用,部分方法不允许远程调用。当然,也有人为这种做法辩 护,他们认为在这种情况下,DWR会提供更好的配置灵活性。 下面考虑代码清单3-1中的配置。 代码清单3-1范例文件dwr,xm1的配置
3.1 DWR 安全机制 80 图3-1 尽管安全威胁不像有些电影中展示的那么可怕,但是 在现实世界中所带来的危害有时也是极其严重的 3.1.1 默认拒绝 无须做任何设置,DWR会自动采用“默认拒绝”方法。这意味着,在默认情况下,DWR不 允许任何类被远程访问。回想一下希望远程访问的每个类,必须在配置文件中添加元 素。好像仅仅这样做还不够,这个元素还应该被嵌套在元素中。通过添加这 种信息条目,可以告诉DWR,指定类的远程调用被授权了。但是,如果没有在这个配置文件中 添加相应的信息条目,则远程调用会被禁止。 聪明的读者肯定会认识到,这种措施实际上还存在一个潜在的安全漏洞:在默认情况下,被 授权类的所有方法都可以通过远程调用来访问。在通常情况下,这样做就可以了,因为我们平常 的代码组织习惯是一个类始终包含可以远程调用的所有“安全”方法。设计这样一个类可能并不 难,类中部分方法可以安全地远程调用,部分方法不允许远程调用。当然,也有人为这种做法辩 护,他们认为在这种情况下,DWR会提供更好的配置灵活性。 下面考虑代码清单3-1中的配置。 代码清单3-1 范例文件dwr.xml的配置
互动出版网 China-Pub. com 专业图书网上第一专营店 独家提供样章 3.1DWR安全机制81 =1.encoding="UTF-8?> aram name="class"value="app. MathDelegate"/> /allow> 这个dwr.xm文件取自于本书第2章的 firstdwr范例程序。在这种情况下,我们希望 MathDelegate类的所有方法都可以远程调用。但是,为了演示需要,假设不希望远程调用 divide()方法。我们可以简单地添加一个元素,在上一章已经简单说明过这个元素。 现在,存在一个元素和一个元素的子元素元素。这两个元素是 互斥的,也就是说,可以使用元素来指定能够远程调用的方法列表(没有列出来的方 法都是不可以远程调用的),或者使用元素来指定不允许远程调用的方法列表(没有 列出来的任何方法都是可以访问的)。在代码清单3-2中,可以看到更新后的dwx.xm1文件,已经 排除了 divide()方法。 代码清单3-2排除 divide()方法的dwr,xm1配置 > param name="class"value="app. MathDelegate"/> exclude method= divide"/ reate 和元素都接收一个以逗号分隔的列表作为 method的属性值,这样可以按 照自己的需求指定任意多个方法。 请注意,DWR从来不允许自己的内部类被远程访问,因此可以降低攻击者破坏DWR内部机
3.1 DWR 安全机制 81 这个dwr.xml文件取自于本书第2章的firstdwr范例程序。在这种情况下,我们希望 MathDelegate类的所有方法都可以远程调用。但是,为了演示需要,假设不希望远程调用 divide()方法。我们可以简单地添加一个元素,在上一章已经简单说明过这个元素。 现在,存在一个元素和一个元素的子元素元素。这两个元素是 互斥的,也就是说,可以使用元素来指定能够远程调用的方法列表(没有列出来的方 法都是不可以远程调用的),或者使用元素来指定不允许远程调用的方法列表(没有 列出来的任何方法都是可以访问的)。在代码清单3-2中,可以看到更新后的dwr.xml文件,已经 排除了divide()方法。 代码清单3-2 排除divide()方法的dwr.xml配置 和元素都接收一个以逗号分隔的列表作为method的属性值,这样可以按 照自己的需求指定任意多个方法。 请注意,DWR从来不允许自己的内部类被远程访问,因此可以降低攻击者破坏DWR内部机
互动出版网 China-Pub. com 专业图书网上第一专营店 独家提供样章 3.1DWR安全机制8 制的概率,进一步增强应用程序的安全性 1.2J2EE安全性和DWR 如果执著地希望进一步加强web应用程序的安全性,可以采取其他措施把JEE安全性和 DwR集成到一起。借助于这种能力,可以指定只有特定的安全角色才能访问特定的远程类,或 者特定角色可以访问某远程对象的特定方法 什么是J2EE安全性 通常,术语]E安全性指的是EE平台和实现平台的容器等提供的安全模型。这种机制 定义角色,然后每个用户会分配指定角色。资源是“受限的”,因为只有特定角色,也就是特 定用户才可以访问。这种机制是由容器而不是应用程序代码管理的,这样就免除了自己编写所 有的安全代码。自己编写的安全代码其实很难保证安全性,也难以审计。安全控制能力都是采 用声明的形式,这意味着只需要在配置文件中创建合适的信息条目(或者创建合适的文件,根 据容器不同可能有差异)。尽管存在与这种机制相关的编程方式,但通常并不要求它们真正实 现安全性,仅仅去提升应用程序的能力而已。 保护 DWRServlet 第一个需要注意的事情是,使用基于]2EE角色的安全机制,保证 DWRServ1et自身的安全性。 为实现这一点,我们必须引入其他配置选项:多个dwr.xm1文件。 回想一下,在dwr.xm1文件中,代码可能类似于: dwr-invoker ukItd getahead dwr. DWRServlet 你是否注意到没有指定dwx,xm1文件呢?这是因为,在默认情况下,DWR会在Web应用程序 的WEB-INF日录中查找一个名为dwr.xm1的文件,所以不必再实施任何其他修改。但是,如果希 望在其他地方放置这个配置文件,需要向 serve添加一个init参数,类似于: param-name>config configFiles/dwrConfig xml 现在,DWR会加载 configFiles目录(相对于Web应用程序的根目录)中的文件 dwrconfig.xm1。 另一个方便的技巧是,你可以指定多个配置文件。为实现这一点,只需要添加多个init参 数,参数名称的格式为 configXXXX,其中XXXX可以是任何内容。每个init参数的名称必须是 不同的,使用XXXX的目的仅仅是保证唯一性。例如,可以设置如下参数
3.1 DWR 安全机制 82 制的概率,进一步增强应用程序的安全性。 3.1.2 J2EE 安全性和 DWR 如果执著地希望进一步加强Web应用程序的安全性,可以采取其他措施把J2EE安全性和 DWR集成到一起。借助于这种能力,可以指定只有特定的安全角色才能访问特定的远程类,或 者特定角色可以访问某远程对象的特定方法。 什么是J2EE安全性 通常,术语J2EE安全性指的是J2EE平台和实现平台的容器等提供的安全模型。这种机制 定义角色,然后每个用户会分配指定角色。资源是“受限的”,因为只有特定角色,也就是特 定用户才可以访问。这种机制是由容器而不是应用程序代码管理的,这样就免除了自己编写所 有的安全代码。自己编写的安全代码其实很难保证安全性,也难以审计。安全控制能力都是采 用声明的形式,这意味着只需要在配置文件中创建合适的信息条目(或者创建合适的文件,根 据容器不同可能有差异)。尽管存在与这种机制相关的编程方式,但通常并不要求它们真正实 现安全性,仅仅去提升应用程序的能力而已。 1. 保护DWRServlet 第一个需要注意的事情是,使用基于J2EE角色的安全机制,保证DWRServlet自身的安全性。 为实现这一点,我们必须引入其他配置选项:多个dwr.xml文件。 回想一下,在dwr.xml文件中,代码可能类似于: 你是否注意到没有指定dwr.xml文件呢?这是因为,在默认情况下,DWR会在Web应用程序 的WEB-INF目录中查找一个名为dwr.xml的文件,所以不必再实施任何其他修改。但是,如果希 望在其他地方放置这个配置文件,需要向servlet添加一个init参数,类似于: 现在,DWR会加载configFiles目录(相对于Web应用程序的根目录)中的文件 dwrConfig.xml。 另一个方便的技巧是,你可以指定多个配置文件。为实现这一点,只需要添加多个init参 数,参数名称的格式为configXXXX,其中XXXX可以是任何内容。每个init参数的名称必须是 不同的,使用XXXX的目的仅仅是保证唯一性。例如,可以设置如下参数:
互动出版网 China-Pub. com 专业图书网上第一专营店 独家提供样章 3.1DWR安全机制83 dwr-invoker/servlet vlet-classuk ltd getah rvlet/servlet-class> config1234 configFiles/dwrConfig1234 xml init-param param-name>config5678 这也是一个非常方便的技巧,因为使用它可以把自己的配置组织为逻辑组,例如,每个包或 者其他结构分别使用一个配置文件。DWR会加载所有的配置文件,并把这些配置文件合并为 个主配置—不需要自己做任何其他配置! 如何把这些集成到安全性方面呢?你还需要做的事情是定义 DWRSery1et的多个实例 下所示 dwr-user-invoker ukItd getahead dwr. DWRServlet config-user wEB-INF/dwr-user xml ukltd getahead dwr. DWRServlet config-admin wE B-INF/dwI-admin xml /init-param> dwr-admin ker /dwradmin/* dwr-user-invoker /dwruser/* 目前实际上存在两类用户:一般用户和管理用户。每类用户拥有不同的配置文件,而且更重 要的是,每类用户使用不同的URL映射。这样做很重要,原因是可以充分利用J2EE安全机制,以 根据角色来保护 servlet。例如
3.1 DWR 安全机制 83 这也是一个非常方便的技巧,因为使用它可以把自己的配置组织为逻辑组,例如,每个包或 者其他结构分别使用一个配置文件。DWR会加载所有的配置文件,并把这些配置文件合并为一 个主配置——不需要自己做任何其他配置! 如何把这些集成到安全性方面呢?你还需要做的事情是定义DWRServlet的多个实例,如 下所示: 目前实际上存在两类用户:一般用户和管理用户。每类用户拥有不同的配置文件,而且更重 要的是,每类用户使用不同的URL映射。这样做很重要,原因是可以充分利用J2EE安全机制,以 根据角色来保护servlet。例如:
互动出版网 China-Pub. com 专业图书网上第一专营店 独家提供样章 32DwR应用程序的错误处理84 Kweb-resource-collection> dwr-admin-collection /dwradmin/* /security-constraint> dwr-user-collection/dwruser/* auth-constraint /auth-constraint> 现在,只有管理用户才能访问dwr- admin.xm1文件所定义的类,并且通过/ dwradmin/*URL 模式进行访问。类似地,一般用户只能够访问dwx-user.xm1文件中所定义的类,并且通过 / dwradmin/*URL模式进行访问。这样,借助于标准的容器管理安全机制,可以有效地保护允许 程访问的对象 2.保护单独的方法 还可以保护指定的远程可访问类中单独的方法。要实现这一点看起来更容易:只需要在 web.xm1文件以及DWR配置文件中定义相应的角色,同时在DWR配置文件中需要给希望保护的 类的元素添加一个元素。下面是范例代码 uth method=" delete role="admin"/> 现在,我们声明 Remotableclass类的 delete()方法只能被管理用户所调用。请注意,所 有其他方法都不会被相应地保护,因为这是DWR的默认行为。借助于这种细微的控制能力,可 以更灵活地应用容器管理安全性,以及设计希望远程访问的类。 本书第5章的项目演示了DWR的JEE安全支持,所以不要担心,很快就可以看到真实的例子 了。(以DWR为主题的图书有时候很难编写,因为DWR的实现方法非常简单和容易,导致无法大 书特书。我感觉应该可以阐述更多内容,但是实际上这些内容就足够了!) .2DWR应用程序的错误处理 据说,那些以编码为生的人都擅长转移用户对代码稳定性的注意,但是往往事与愿违,百分 之十工作时间的出错率,对于用户而言这就是百分之九十,甚至更多! 当然,没有人承认自己所编代码的强壮性不够,但是很多人都遇到过类似的尴尬情况
3.2 DWR 应用程序的错误处理 84 现在,只有管理用户才能访问dwr-admin.xml文件所定义的类,并且通过/dwradmin/* URL 模式进行访问。类似地,一般用户只能够访问dwr-user.xml文件中所定义的类,并且通过 /dwradmin/* URL模式进行访问。这样,借助于标准的容器管理安全机制,可以有效地保护允许 远程访问的对象。 2. 保护单独的方法 还可以保护指定的远程可访问类中单独的方法。要实现这一点看起来更容易:只需要在 web.xml文件以及DWR配置文件中定义相应的角色,同时在DWR配置文件中需要给希望保护的 类的元素添加一个元素。下面是范例代码: 现在,我们声明RemotableClass类的delete()方法只能被管理用户所调用。请注意,所 有其他方法都不会被相应地保护,因为这是DWR的默认行为。借助于这种细微的控制能力,可 以更灵活地应用容器管理安全性,以及设计希望远程访问的类。 本书第5章的项目演示了DWR的J2EE安全支持,所以不要担心,很快就可以看到真实的例子 了。(以DWR为主题的图书有时候很难编写,因为DWR的实现方法非常简单和容易,导致无法大 书特书。我感觉应该可以阐述更多内容,但是实际上这些内容就足够了!) 3.2 DWR 应用程序的错误处理 据说,那些以编码为生的人都擅长转移用户对代码稳定性的注意,但是往往事与愿违,百分 之十工作时间的出错率,对于用户而言这就是百分之九十,甚至更多! 当然,没有人承认自己所编代码的强壮性不够,但是很多人都遇到过类似的尴尬情况
互动出版网 China-Pub. com 专业图书网上第一专营店 独家提供样章 32DwR应用程序的错误处理85 这就说明以编码为生的人不可能摆脱程序错误的阴霾,必须善于处理错误,处理在代码运行 时最不合时机的经常出现的异常情况。这时候,你需要花费大量时间和精力尽自己最大努力来解 决问题 错误和运行时的问题无处不在(如图3-2所示),破坏自我感觉良好的代码!在这方面,DWR 与其他事物一样 图3-2错误和运行时的问题无处不在,破坏程序代码 幸好,DWR并不是对程序员不闻不问。实际上,DWR提供一个非常强壮的错误/异常处理系 统,让程序员能够在环境许可的情况下按照最恰当的方式处理问题。实现这种系统的方式是,允 许为可能出现的各种类型异常设置处理程序,而且可以在很多层级设置。首先,我们讨论DWR 对异常环境进行分类的方式 321处理警告 首先,从概念上讲,DWR把通常所说的例外状态分成三类,其中第一类就是警告。 警告可能表示或者不表示我们所关注的某种情形。在有些情况下,某些事情看起来出现故障 了,但是实际上可能并没有。在DWR文档中,所说的这种情形之一就与 Firefox有关。在有些条 件下,在发出请求的 XmlhTtpreqUest对象已经被销毁之后,该Ajax请求的答复才返回。例如 发出请求后,并在答复返回之前转换到一个新页面,就可能出现这个问题。对于这种情况,你无 能为力,甚至不想或者不需要为之编码。 因为这个原因,在默认情况下,DwR不给警告条件提供处理程序,通常会忽略警告。 322处理错误 比警告更严重的情形是错误。错误就是出现运行故障的地方,同时DWR可以明确地确定到 底发生了什么事情。这类错误通常在客户端就会解决,而不会让服务器端处理。应用程序服务器 在处理某DWR请求过程中发生宕机,就是一个类似的例子。这种情形会导致一个HITP错误,并
3.2 DWR 应用程序的错误处理 85 这就说明以编码为生的人不可能摆脱程序错误的阴霾,必须善于处理错误,处理在代码运行 时最不合时机的经常出现的异常情况。这时候,你需要花费大量时间和精力尽自己最大努力来解 决问题。 错误和运行时的问题无处不在(如图3-2所示),破坏自我感觉良好的代码!在这方面,DWR 与其他事物一样。 图3-2 错误和运行时的问题无处不在,破坏程序代码 幸好,DWR并不是对程序员不闻不问。实际上,DWR提供一个非常强壮的错误/异常处理系 统,让程序员能够在环境许可的情况下按照最恰当的方式处理问题。实现这种系统的方式是,允 许为可能出现的各种类型异常设置处理程序,而且可以在很多层级设置。首先,我们讨论DWR 对异常环境进行分类的方式。 3.2.1 处理警告 首先,从概念上讲,DWR把通常所说的例外状态分成三类,其中第一类就是警告。 警告可能表示或者不表示我们所关注的某种情形。在有些情况下,某些事情看起来出现故障 了,但是实际上可能并没有。在DWR文档中,所说的这种情形之一就与Firefox有关。在有些条 件下,在发出请求的XMLHttpRequest对象已经被销毁之后,该Ajax请求的答复才返回。例如, 发出请求后,并在答复返回之前转换到一个新页面,就可能出现这个问题。对于这种情况,你无 能为力,甚至不想或者不需要为之编码。 因为这个原因,在默认情况下,DWR不给警告条件提供处理程序,通常会忽略警告。 3.2.2 处理错误 比警告更严重的情形是错误。错误就是出现运行故障的地方,同时DWR可以明确地确定到 底发生了什么事情。这类错误通常在客户端就会解决,而不会让服务器端处理。应用程序服务器 在处理某DWR请求过程中发生宕机,就是一个类似的例子。这种情形会导致一个HTTP错误,并
互动出版网 China-Pub. com 专业图书网上第一专营店 独家提供样章 32DwR应用程序的错误处理86 且DWR可以处理它,因为DWR可以看到错误代码,并采取相应的行动。 3处理异常 最后一类情况是异常。这类情况发生在服务器端,并传播到客户端。当影响客户端时,异常 确实可以视为错误,但是两者从概念上讲是完全不同的。不过,两种可以被视作是相同的,甚至 可以交给相同的处理程序来处理,因为,在实际过程中会发现所存在的差别极小。 4极端情况:不正确响应 除了上述三种分类之外,还存在一种分类,但在理解这种情况之前,需要理解DWR如何实 现客户端和服务器端之间的数据传递 当发出一个请求时,这是一个相当典型的HTTP请求。通过为Firefox使用方便的Firebug扩展 可以看到所发出的DWR请求,如图3-3所示。 你可以看到,这是一个非常典型的 ThTtp Pos操作。可以看到刚传入的两个数字、所调用远 程对象的方法(本例中的add())、 JavaScript对象( MathDelegate),以及DWR内部使用的其 他信息。 借助于 Firebug,可以非常容易地看到响应,并且响应可能非常接近你的期望,如图3-4 所示。 Informaton.t, MNHLaneos·Ote·; ResueTook-p ww souro.oobe·x e Result: 12+5=17 条 Plase emer two nmbers. sledt m operaton, and ck the由t Hd Do1 Net c 0125155171,4575M6m1001Aot1O@9甲0MB/217/244s 图3-3解析DWR的Ajax请求
3.2 DWR 应用程序的错误处理 86 且DWR可以处理它,因为DWR可以看到错误代码,并采取相应的行动。 3.2.3 处理异常 最后一类情况是异常。这类情况发生在服务器端,并传播到客户端。当影响客户端时,异常 确实可以视为错误,但是两者从概念上讲是完全不同的。不过,两种可以被视作是相同的,甚至 可以交给相同的处理程序来处理,因为,在实际过程中会发现所存在的差别极小。 3.2.4 极端情况:不正确响应 除了上述三种分类之外,还存在一种分类,但在理解这种情况之前,需要理解DWR如何实 现客户端和服务器端之间的数据传递。 当发出一个请求时,这是一个相当典型的HTTP请求。通过为Firefox使用方便的Firebug扩展, 可以看到所发出的DWR请求,如图3-3所示。 你可以看到,这是一个非常典型的HTTP POST操作。可以看到刚传入的两个数字、所调用远 程对象的方法(本例中的add())、JavaScript对象(MathDelegate),以及DWR内部使用的其 他信息。 借助于Firebug,可以非常容易地看到响应,并且响应可能非常接近你的期望,如图3-4 所示。 图3-3 解析DWR的Ajax请求
互动出版网 China-Pub. com 专业图书网上第一专营店 独家提供样章 32DwR应用程序的错误处理87 Outine.Resue·lolw e Result: 12+5=17 Doei Hrt 171x Dm.1215m4786m·0 n1 Apache CY10。号0湘/44 图3-4解析DWR的Ajax响应 传回的响应其实是对某些DWR客户端代码的一个 JavaScript调用。在完成预计的处理工作之 后,这部分代码会负责调用所指定的回调函数。可以看到,如何把最初的参数传入函数中,以及 远程方法调用的结果。你还会注意到,上面有些代码行仅仅是 JavaScript注释。但是很快我们又会 发现,这些代码行非常重要。 在详细讨论之前,你也许发现DWR还传回一个响应,实际上这是所传回的bean。图3-5就是 这样的响应
3.2 DWR 应用程序的错误处理 87 图3-4 解析DWR的Ajax响应 传回的响应其实是对某些DWR客户端代码的一个JavaScript调用。在完成预计的处理工作之 后,这部分代码会负责调用所指定的回调函数。可以看到,如何把最初的参数传入函数中,以及 远程方法调用的结果。你还会注意到,上面有些代码行仅仅是JavaScript注释。但是很快我们又会 发现,这些代码行非常重要。 在详细讨论之前,你也许发现DWR还传回一个响应,实际上这是所传回的bean。图3-5就是 这样的响应
互动出版网 China-Pub. com 专业图书网上第一专营店 独家提供样章 32DwR应用程序的错误处理88 tee tdt yw Itor Bookmark Ioh tsrb ouh·: Resue.y Took·gw a Cbca MatDelegate adap)) M CClcbcal Rem [Cleat teatbetchcoling Doei Het cou110@0爷0/2随176/244 图3-5DWR的Ajax请求所返回的对象 这个响应是本书第2章中 seconddwr应用程序的简单修改版本所产生的。我仅仅向 student- Req讠stry类添加一∧ getstudent()方法,这个方法返回一个已经填充的 Student对象。然后 在JSP中添加一个按钮,以调用这个方法。我希望这些概念能够给你留下深刻印象。我想,自己 重新做相同的修改工作(因为上述修改代码没有包含在可下载代码包中)是值得的。 你可以看到,实际上差别并不大,但是需要关注的要点是所传回的bean使用JSON形式。这 就是使用Ajax在客户端和服务器端实现大量数据交换的方法,而使用DWR也是如此。 所说的JSON到底是什么 SON( JavaScript Object Notation, JavaScrip对象表示法)是一种简单的数据交换格式, 非常类似于大多数与C语言类似的语言中的数组。更准确地说,JSON是 JavaScript,用于定义对 象的对象字面值注释的子集 firstName:" frank",1 astname:" Zanetti"}是JSON的简单范例。如果希望执行var p=eval(json);其中json是上面给出的JSON范例,那么就会使用具有两个域( firstName
3.2 DWR 应用程序的错误处理 88 图3-5 DWR的Ajax请求所返回的对象 这个响应是本书第2章中seconddwr应用程序的简单修改版本所产生的。我仅仅向StudentRegistry类添加一个getStudent()方法,这个方法返回一个已经填充的Student对象。然后 在JSP中添加一个按钮,以调用这个方法。我希望这些概念能够给你留下深刻印象。我想,自己 重新做相同的修改工作(因为上述修改代码没有包含在可下载代码包中)是值得的。 你可以看到,实际上差别并不大,但是需要关注的要点是所传回的bean使用JSON形式。这 就是使用Ajax在客户端和服务器端实现大量数据交换的方法,而使用DWR也是如此。 所说的JSON到底是什么 JSON(JavaScript Object Notation,JavaScript对象表示法)是一种简单的数据交换格式, 非常类似于大多数与C语言类似的语言中的数组。更准确地说,JSON是JavaScript用于定义对 象的对象字面值注释的子集。 { firstName:"frank", lastName:"Zammetti" }是JSON的简单范例。如果希望执行var p= eval(json);,其中json是上面给出的JSON范例,那么就会使用具有两个域(firstName