📄 毕设的翻译 -- 使用direct web remoting的ajax - 学习历程 - 独败.htm
字号:
expression from the search field</DIV>
<DIV align=left> var searchexp =
$("searchbox").value;</DIV>
<DIV align=left> </DIV>
<DIV align=left> // Call remoted DAO
method, and specify callback function</DIV>
<DIV align=left>
catalog.findItems(searchexp,
displayItems);</DIV>
<DIV align=left> </DIV>
<DIV align=left> // Return false to
suppress form submission</DIV>
<DIV align=left> return false;</DIV>
<DIV align=left>}</DIV>
<DIV
align=left>
</DIV>
<DIV align=left>/*</DIV>
<DIV align=left> * Displays a list of
catalog items</DIV>
<DIV align=left> */</DIV>
<DIV align=left>function displayItems(items)
{</DIV>
<DIV align=left> </DIV>
<DIV align=left> // Remove the currently
displayed search results</DIV>
<DIV align=left>
DWRUtil.removeAllRows("items");</DIV>
<DIV align=left> </DIV>
<DIV align=left> if (items.length == 0)
{</DIV>
<DIV align=left> alert("No
matching products found");</DIV>
<DIV align=left>
$("catalog").style.visibility = "hidden";</DIV>
<DIV align=left> } else {</DIV>
<DIV align=left> </DIV>
<DIV align=left>
DWRUtil.addRows("items",items,cellFunctions);</DIV>
<DIV align=left>
$("catalog").style.visibility = "visible";</DIV>
<DIV align=left> }</DIV>
<DIV align=left>}</DIV></TD></TR></TBODY></TABLE>
<DIV> </DIV>
<DIV>在上面的searchFormSubmitHandler()函数中,有意思的代码显然是catalog.findItems(searchexp,
displayItems);。这一行代码就是所有用来发送XMLHttpRequest给DWR
servlet并在远程对象的响应中调用displayItems()函数的代码了。</DIV>
<DIV>displayItems()回调函数被调用时有个Item数组参数。这个数组跟放置物品的表格ID和一组函数一起被传给DWRUtil.addRows()函数。在这个数组中的函数数量跟表格中每行的单元数量一样。每个函数都和数组中的Item一起轮流被调用,返回相应的单元格中要填充的内容。</DIV>
<DIV>在这个例子中,我让表格中关于物品的每行都要显示物品的名字、描述和价格,在最后一列还有一个<B>Add
to Cart</B>按钮。列表4显示了实现这个功能的单元函数数组:</DIV>
<DIV><A name=listing4><B>列表</B></A><B> 4.</B><B>
</B><B>放置</B><B>item</B><B>表格的单元函数数组</B><B></B></DIV>
<TABLE cellSpacing=0 cellPadding=0 width="100%"
border=1>
<TBODY>
<TR>
<TD>
<DIV align=left> </DIV>
<DIV align=left> </DIV>
<DIV align=left>/*</DIV>
<DIV align=left> * Array of functions to
populate a row of the items table</DIV>
<DIV align=left> * using DWRUtil's addRows
function</DIV>
<DIV align=left> */</DIV>
<DIV align=left>var cellFunctions = [</DIV>
<DIV align=left> function(item) { return
item.name; },</DIV>
<DIV align=left> function(item) { return
item.description; },</DIV>
<DIV align=left> function(item) { return
item.formattedPrice; },</DIV>
<DIV align=left> function(item) {</DIV>
<DIV align=left> var btn =
document.createElement("button");</DIV>
<DIV align=left> btn.innerHTML
= "Add to cart";</DIV>
<DIV align=left> btn.itemId =
item.id;</DIV>
<DIV align=left> btn.onclick =
addToCartButtonHandler;</DIV>
<DIV align=left> return
btn;</DIV>
<DIV align=left> }</DIV>
<DIV align=left>];</DIV></TD></TR></TBODY></TABLE>
<DIV> </DIV>
<DIV>前三个函数简单地返回dwr.xml中的Item的convertor说明的成员。最后的一个函数创建了一个按钮,把Item的ID赋值给它,并说明了当按钮被点击时需要调用一个叫addToCartButtonHandler的函数。这个函数是第二个用例的入口:将一个物品加入到购物车中。</DIV>
<DIV><FONT face=Arial size=3></FONT> </DIV>
<DIV><B>实现购物车</B></DIV>
<TABLE cellSpacing=0 cellPadding=0 align=left
border=1>
<TBODY>
<TR>
<TD width="100%">
<DIV align=left><B>DWR</B><B>的安全性</B></DIV>
<DIV
align=left>DWR在设计时就考虑了安全问题。在dwr.xml中只把把想暴露给远程的类和方法加入到白名单中,这样避免了不经意地暴露可能被策划用来攻击的功能。另外,在调试测试模式下,很容易就能审核暴露给Web的所有类和方法。</DIV>
<DIV align=left>DWR还支持基于角色的安全机制。通过bean的
creator配置,可以指定只有某个J2EE角色才能访问这个bean。通过部署多个安全DWR
Servlet实例的多个URL(每个Servlet都有自己的dwr.xml配置文件),你可以定义有不同远程功能调用的用户集合。</DIV></TD></TR></TBODY></TABLE>
<DIV><FONT face=Arial></FONT> </DIV>
<DIV> </DIV>
<DIV> </DIV>
<DIV> </DIV>
<DIV> </DIV>
<DIV> </DIV>
<DIV> </DIV>
<DIV> </DIV>
<DIV> </DIV>
<DIV> </DIV>
<DIV> </DIV>
<DIV> </DIV>
<DIV> </DIV>
<DIV>用户的购物车的Java表示是基于一个映射的。当一个物品加到车中时,物品就被插入到映射中作为关键字。映射中有个相应的整型值表示车中物品的数量。因此Cart.java有个成员被声明为Map<Item,Integer>。</DIV>
<DIV>
使用复杂类型当作杂凑关键字给DWR提了一个难题——在Javascript中,数组的索引必须是直接量。于是,内容映射不能被DWR转化成它自己的样子。但不管怎样,为了完成购物车的用户界面。用户需要看到的所有东西只是车中物品的名字和数量。所以给Cart加一个方法叫getSimpleContents(),它接受内容映射,按照它建立一个简单的映射<String,Integer>,仅仅表示每个物品的名字和数量。这个字符串索引的映射表示能很容易地被DWR的内建转换器转成Javascript。</DIV>
<DIV>Cart的另一个客户关心的字段是总价格totalPrice,表示购物车中所有物品的价格总和。跟物品Item在一起,我提供了一个合成的成员formattedTotalPrice,它是一个预定义了格式的字符串,表示数字总和。</DIV>
<DIV> </DIV>
<DIV align=right> </DIV>
<DIV align=right> </DIV>
<DIV align=right> </DIV>
<DIV><B>购物车的转化</B></DIV>
<DIV>对于在客户端使用两个Cart的调用(一个用来得到内容,一个用来得到总价格),我更想一次就把所有数据都送到客户端。为了达到这个目的,我加了一个看上去很奇怪的方法,如下面列表5显示的:</DIV>
<DIV><A name=listing5><B>列表</B></A><B> 5.
Cart.getCart() </B><B>方法</B><B></B></DIV>
<TABLE cellSpacing=0 cellPadding=0 width="100%"
border=1>
<TBODY>
<TR>
<TD>
<DIV align=left> </DIV>
<DIV align=left> </DIV>
<DIV align=left>/**</DIV>
<DIV align=left> * Returns the cart itself
- for DWR</DIV>
<DIV align=left> * @return the cart</DIV>
<DIV align=left> */ </DIV>
<DIV align=left>public Cart getCart() {</DIV>
<DIV align=left> return this;</DIV>
<DIV align=left>}</DIV></TD></TR></TBODY></TABLE>
<DIV> </DIV>
<DIV>在普通的Java代码中这个方法是完全多余的(因为你调用这个方法的时候你已经有一个Cart的引用了)。这个方法使得DWR客户可以把Cart它自己序列化为JavaScript。</DIV>
<DIV>除getCart()以外,另一个需要远程调用的方法是addItemToCart()。这个方法有一个字符串参数表示物品的ID,它把物品加到购物车中,更新总价格。这个方法也返回Cart,以便客户端代码可以更新车的内容并在一个操作中得到它的新状态。</DIV>
<DIV>
列表6是扩展的dwr.xml配置文件,它包括关于远程类Cart的额外配置:</DIV>
<DIV><A name=listing6><B>列表</B></A><B> 6.
</B><B>修改过的包含了</B><B>Cart</B><B>类的</B><B> dwr.xml
</B><B></B></DIV>
<TABLE cellSpacing=0 cellPadding=0 width="100%"
border=1>
<TBODY>
<TR>
<TD>
<DIV align=left> </DIV>
<DIV align=left> </DIV>
<DIV align=left><!DOCTYPE dwr PUBLIC</DIV>
<DIV align=left> "-//GetAhead
Limited//DTD Direct Web Remoting 1.0//EN"</DIV>
<DIV align=left>
"http://www.getahead.ltd.uk/dwr/dwr10.dtd"></DIV>
<DIV align=left><dwr></DIV>
<DIV align=left> </allow></DIV>
<DIV align=left> </create
creator="new" javascript="catalog"></DIV>
<DIV align=left>
</param name="class" </DIV>
<DIV
align=left>
value="developerworks.ajax.store.CatalogDAO"/></DIV>
<DIV align=left>
</include method="getItem"/></DIV>
<DIV align=left>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -