DWR :
开发过程中,你主要做:
1. 开发Java类。 -- 没有任何新的东西。
2. 配置Java类。
-- 配置时候,使用了<create .../>元素。
<create.../>元素用于将Java类创建成JS对象。
其中<create.../>元素里creator指定所使用的创建器。
3. 在浏览器的JS代码中远程调用Java方法。
1 。 远程、异步调用Java方法时需要额外地传入一个参数。
参数就是一个形如function(data){}的回调函数。
其中data就代表被调用的返回值。
2 。 当Java方法参数、返回值是标量值(基本类型、字符串、Date)时,JS都有对应的类型。
但Java方法的参数、返回值是复合类型时,比如Person、Cat等等VO、或集合等等...
此时就涉及到 Java类型 ←→ JS类型 相互转换。这就需要使用转换器。
Ajax框架可以分为3类:
-轻量级的JS库:Prototype、jQuery。
-复杂的JS库+UI库:Ext js 、 Dojo。
-远程RPC风格:DWR
2. 调用jQuery的方法来修改jQuery对象。
修改内容。html()/html(内容) / val()/val(内容)
修改CSS:height() width() css()
修改普通属性 attr()/attr(属性名 , 属性值)
增加 append()/appendTo prepend/prependTo insertBefore/before insertAfter/after
删除
替换
包裹
------------DWR------------
远程RPC风格的Ajax框架
安装DWR
a. 复制JAR包。
b. 在web.xml文件中配置核心控制器(DwrServlet)。
c. 增加dwr.xml配置文件。
开发过程中,你甚至无需了解异步请求、响应的概念,只需按如下方法进行:
1. 开发Java类。
2. 配置Java类。
1. 创建器:负责把Java类、Java对象创建成允许远程调用的JS对象。
<create creator="new/spring/ejb" javascript="">
<param name="" /> 不同的创建器需要的参数是不同的。
</create>
2. 转换器:负责完成服务器端Java类型和浏览器端JS类型之间的转换。
只有bean 、object转换器需要显式打开并配置。
<convert converter="bean/object" match="需要转换的类型">
黑名单
白名单
</convert>
3. 以异步的方式调用Java的方法。
a. 简单回调。调用时额外的多传入一个形如function(data){}的函数。
data就是被调用方法的返回值。
b. 复杂回调:调用时额外的多传入一个形如{callback: , timeout: }的JS对象。
通过该JS对象就可为DWR调用指定更多自定义选项。
DWR的两个JS库
1 . engine.js :主要用于控制DWR的全局选项。
当使用复杂回调时,可以通过JSON对象为异步调用设置一些选项,例如下面
timeout
exceptionHandler
errorHandler
preHook
postHook
...
但这些选项它们只对单次调用有效,于是可以通过
dwr.engine.setXxx来设置一些全局选项,这些全局选项是所有的Ajax调用都起作用。
两个额外的功能:
a. 控制调用顺序。
b. 进行批处理调用:一次与服务器的交互完成多次调用,从而提高性能。
2 . util.js :用于简化DOM操作。
$() 可认为是document.getElementById()的缩写。
当我们把DWR的util.js和jQuery同时使用时,$()函数就会冲突了。
解决方法:为jQuery的$()起另一个别名。
------------------------------
处理列表
removeAllOptions() 删除所有选项。
addOptions(DOM节点的ID , 数组);
addOptions(DOM节点的ID , 对象数组 , 属性名);
addOptions(DOM节点的ID , 对象数组 , 属性名 , 属性名);
addOptions(DOM节点的ID , 对象 , true/false);
------------------------------
处理表格
它不仅用于操作表格,它可用于操作表格的<tbody>(于是就可以只操作表格某个部分)
removeAllRows(tableId/tbodyId) 删除所有行。
addRows(tableId/tbodyId , 数组 , 函数数组 , [option])
--------------------------------
访问表单控件的值
getValue/getValues()
setValue/setValues()
util.js的工具函数:
onReturn
toDescriptiveString()
selectRange('text' , n , m)
=======================
DWR访问Servlet API
比如用户登录,用户登录成功后,是否应该将用户信息存入session。
比如用户想调用某个受保护的页面,
你是否应该通过session先检查用户是否已经登录,是否有足够的权限。
DWR本质上属于前端Web层框架,所以它必然需要访问Servlet API。
1. 借助于WebContext工具类。
WebContextFactory.get().getXxx()
好处:简单、明了、易用。
坏处:有一点代码污染。
2. 直接访问Servlet API
在处理方法中增加额外的、Servlet API类型的形参。
在浏览器的JS里调用该处理方法时,完全不需要理会这个Servlet API类型的形参。
DWR的异常处理
DWR与Struts 2共存
//这条代码取消jQuery的$(),并给$()起了一个新名字:j$()。 防止与util.js冲突
var j$ = jQuery.noConflict();
Callback
Timeout
ExceptionHandler
ErrorHandler
PreHook
PostHook
dwr.engine.setErrorHandler(function(msg , ex)
{
alert("远程服务异常:" + msg);
alert(ex);
});