互动出版网 China-Pub. com 专业图书网上第一专营店 独家提供样章 32DwR应用程序的错误处理84 <security-constraint> Kweb-resource-collection> <web-resource-name>dwr-admin-collection</web-resource-name> <url-pattern>/dwradmin/*</url-pattern> </web-resource. collection> <auth-constraint </auth-constraint> /security-constraint> <web-resource-collection> <web-resource-name>dwr-user-collection</we eb -resource <url-pattern>/dwruser/*</url-pattern> </web- e-collection> auth-constraint /auth-constraint> </security-constraint> 现在,只有管理用户才能访问dwr- admin.xm1文件所定义的类,并且通过/ dwradmin/*URL 模式进行访问。类似地,一般用户只能够访问dwx-user.xm1文件中所定义的类,并且通过 / dwradmin/*URL模式进行访问。这样,借助于标准的容器管理安全机制,可以有效地保护允许 程访问的对象 2.保护单独的方法 还可以保护指定的远程可访问类中单独的方法。要实现这一点看起来更容易:只需要在 web.xm1文件以及DWR配置文件中定义相应的角色,同时在DWR配置文件中需要给希望保护的 类的< create>元素添加一个<auth>元素。下面是范例代码 <create creator="new javascript="RemotableClass"> <param name="class"value="com, myapp. RemotableClass"/> 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配置文件中需要给希望保护的 类的<create>元素添加一个<auth>元素。下面是范例代码: 现在,我们声明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