刘文涛

Flex3,Struts2,Hibernate3,Spring2,UML,Oracle,mysql,tomcat,compass,lucene

   :: 首页 ::  ::  ::  :: 管理 ::

2006年8月21日 #

WebWork是一个Java web-application开发框架(development framework). 它专注于提高开发者的生产效率并简化代码. WebWork构建在XWork之上, 

1 XWork提供了普通的(generic)命令模式(command pattern)框架
2 同时也是一个反转控制(Inversion of Control, IoC)容器.

 除了上述特性外, WebWork还为其它功能如

1 创建可复用的用户界面模版(UI template)
2 表单(form)控制
3 用户界面主题(UI theme)
4 国际化
5 表单参数与JavaBean的动态映射
6 健壮的客户端及服务器端校验(validation)

提供了强有力的支持.

WebWork 2 : 什么是WebWork

WebWork是一个强大的基于Web的MVC框架, 它构建在一个命令模式框架XWork之上. WebWork的特性包括

1  :用于处理或代理 请求的分发器(Dispatcher)

2  :支持多种视图技术(JSP, Velocity, JasperReports, XML, FreeMarker)的结果类型

3  :一个小而强大的JSP标签库和Velocity宏定义

4  :分发器调用XWork活动来访问和操作模型(Model)并为视图显示模型数据提供方便的途径.

 WebWork真正的优势在于它强调简洁和协作能力的根本理念. 使用WebWork将有助于

1 :最小化代码

2 :允许开发人员更多的关注业务逻辑(business logic)和建模(modeling)

3 :不是诸如编写Servlet之类的事情. 

一 :特性

1 :灵活的校验(validation)框架, 允许使用XML文件定义校验并通过截取器(Interceptor)在运行时自动应用到活动类(Action class), 从而达到校验与活动类之间的完全解藕(decoupled). 新版本还支持客户端校验. 

2 :类型转化(Type conversion)可以很容易的将对象从一个类转换成另一个类型。
 
3 :强大的表达式语言(Expression Language, EL)建立在OGNL基础之上, 允许:

1 遍历动态对象图
2 执行对象方法
3 使用值栈(ValueStack)实现对多个JavaBean属性的透明访问
4 Webwork也可以使用JSTL. 

4 :使用反转控制(Inversion of Control, IoC)管理组件(component)生命周期依赖关系, 不需要编写注册类创建组件, 组件客户也不需要主动获取组件实例(instance). 

5 :Velocity模版, 使得开发人员可以很容易的定制Web页面的外观(look & feel). 

6 :截取器(Interceptors)可以动态截取活动(Action)执行前后的处理过程, 这

1 简化了活动的代码
2 提高了代码复用能力

7 :支持国际化(I18n). 

8 :可以方便的与其他第三方软件集成, 包括Hibernate, Spring, Pico, Sitemesh. 

9 :支持多种视图技术如: 

1 JSP
2 Velocity
3 FreeMarker
4 JasperReports
5 XML


10 :使用包(Packages)和名空间(Namespaces)管理数以百计的活动. 


二 :背景与目的
WebWork是一个开放源代码项目, 目标是为在短时间内构建复杂网站提供易于理解和维护的工具及开发框架. Java是一个平台以及基于该平台的语言, 尽管他支持although it supports many others as the language in which systems are built, such as JavaScript and XML.

WebWork在构架上基于最佳实践和那些已被证实有价值的设计模式. 它还基于一个强烈的动机: 尽可能的简单, 并具有维护上的灵活性(这实际上是一个困难的平衡).

它也鼓励用户使用恰当的, 符合需要的方式工作. [It also encourages you, as a user, to do things the way you seem fit for your needs.] WebWork能以多种方式配置和使用, 哪种方式更适合于你依赖于使用环境. 下面是一个例子, WebWork支持多种不同的HTML生成技术如:

1 JSP
2 Velocity模版引擎
3 XSLT

它们之间在理念上和技术上都存在很大的差别, 但都能为WebWork所用, 同时, 不同的用户确实需要这些不同的方式. "你不能那么做"是我们尽可能避免的一句话, 而"我们不能"往往是因为有另一个更好, 更适合的工具.

三 :WebWork对MVC Model-1和Model-2的支持

Web应用开发框架的最重要的一个任务是支持

1 逻辑
2 内容
3 表现

相分离的理念. 如果没有做到这一点, 通常会导致维护上的问题, 如果开发团队结构复杂(因为每一个团队成员通常只负责应用的某一方面(aspect)), 还会使应用的开发变得更加困难. 达到分离目的的一般方法是采用MVC(Model-View-Controller)设计模式. 该模式鼓励使用分离的代码来处理:

1 模型(model, 即 " 业务逻辑 " )
2 控制器(controller, 即 " 应用逻辑 " )
3 视图(view). 

这样分离之后, 下一个问题是:

控制器的代码与表现部分如何交互

 有两种常用的设计模型可以做到这一点, 它们分别被称为Model-1和Model-2. 这两种模型将在下文描述.

Model-1 :
Model-1方式的基本想法是在表示层(presentation layer)如JSP或模版中调用控制器代码. 如果你正在使用JSP, 这意味着你可以通过两种方式执行你的WebWork活动:

1 使用 " webwork:action " 标签调用执行
2 使用 " webwork:bean " 标签像调用JavaBeans一样执行活动.

Model-2 :
在Model-2方式中

1 哪些代码调用控制器
2 哪些视图进行展示

由第三方决定, 通常是一个servlet分发器. 分发器解码HTTP请求中的URL, 然后决定执行哪些代码. 一个包含控制器代码的Java对象被获取并执行, 从而完成对某个应用逻辑和业务逻辑的处理. 当执行结束后, 分发器将请求转交(forward)给一个视图处理器(如一个JSP), 它使用前一个处理的数据绘制结果视图.

四 :如何选择使用?
由于

1 控制器逻辑
2 表现生成

完全解藕, 使得根据执行情况来显示不同结果页面成为可能. 例如, 如果处理出现错误就可以显示一个错误页面而不显示正常的结果页面.

Model-1方式的优点如下.

1 :不需要建立代码与表示之间的映射关系. 
2 :易于察看JSP或模版中执行了哪些代码. 
3 :如果页面中的一部分要求某个处理过程只允许成功(否则系统失灵), 
          那么这些代码调用和表现部分的代码(如JSP标签库和HTML)不必分离到新的活动和JSP页面中处理过程. 这样可以提高性能和可读性. 

Model-2方式的优点如下.

1 :代码和表现彻底分离. 同一个表现页面可以被多个不同的活动复用, 
      这些活动可以访问不同的数据但使用相同的方式展示. 

2 :如果一个活动可能导致多种状态, 如 " 成功 " " 需要重新输入 " , 或 " 出现错误 "
      那么使用Model
- 2方式可以很容易的将这些状态映射到不同的页面. 

 

选择使用的首要原则是:

当代码仅仅是获取并显示数据(这被称为read - type code)时使用Model - 1

只要当模型是由活动或一个处理流程所改变时就应当使用Model
- 2


OGNL是WebWork,XWork中的底层支持组件.非常强大的函数库.

posted @ 2006-08-21 19:49 刘文涛| 编辑 收藏

序 :

我以前是用struts现在改用webwork,感觉这个要比我以往接触的MVC更优越些,没有那么多的taglib,并且用一个拦截器就能实现一个多文件的上传功能比struts容易多了,文件得到了更好控制。感觉webwork的拦截器是个很好的东西,i like。还有它的ioc思想,通过

1webwork-spring.jar


很好的和spring结合,给它的表示层提供更简单的业务层的接口,能够让我更好的专注于业务层的开发。让写程序变very easy.还有模版功能够自己写些简单的tag,只用做网页的功夫,就能够实现你自己以后可以复用的taglib.

不喜欢struts,支持webwork,刚开发了一个项目webwork+spring+hibernate十天访问量过500万.性能没话说.



正文开始 :


WebWork是由OpenSymphony组织开发的,致力于组件化代码重用拉出式MVC模式J2EE Web框架。WebWork目前最新版本是2.2,现在的WebWork2.x前身是Rickard Oberg开发的WebWork,但现在WebWork已经被拆分成了Xwork1和WebWork2两个项目。

Xwork简洁、灵活功能强大,它是一个标准的Command模式实现,并且完全从web层脱离出来。Xwork提供了很多核心功能:
1前端拦截机(interceptor)
2运行时表单属性验证
3类型转换
4强大的表达式语言(OGNL – the Object Graph Notation Language)
5IoC(Inversion of Control倒置控制)容器等


WebWork2建立在Xwork之上,处理HTTP的响应和请求。
WebWork2使用ServletDispatcher将HTTP请求的变成Action(业务层Action类), session(会话)application(应用程序)范围的映射,request请求参数映射。
WebWork2支持多视图表示,视图部分可以使用

1JSP
2Velocity
3FreeMarker
4JasperReports
5XML等。


下面我们提到的WebWork将为WebWork2,使用的版本是2.2。

1、首先从https://webwork.dev.java.net/servlets/ProjectDocumentList下载最新的WebWork压缩包,并将其解压开来。打开解压目录,你将看到以下的文件和目录:

1webwork-2.x.jar 当然就是WebWrok最新发布的Jar包 
2webwork-example.war 是WebWrok自带的很有代表性的功能演示例子,掌握它是提高你的WebWork技术水平的捷径 
3webwork-migration.jar 提供快速将1.x版本移植到2.x版本所用的类文件 
4docs目录 WebWrok的使用文档,包括api文档、clover文档、单元测试(Junit)文档等 
5lib目录 WebWork在运行或编译时所用到的所有.jar包 
6src目录 源程序目录 


2、WebWork是J2EE Web框架,当然要运行在Web容器中,我用的是稳定的Tomcat 5.028,关于tomcat的安装和部署请自己搞定。


3、用WebWork当然要将它的运行时用到的Jar包放到Web容器可以找到的ClassPath中,将步骤1介绍的webwork-2.x.jar放到你部署目录下WEB-INF\lib目录里,同时将WebWrok解压目录lib\core下的所有.jar文件也拷贝到WEB-INF\lib目录,这些是运行WebWork必需要用到的jar包。


4、了解Web框架的朋友都知道,一般Web框架都是通过一个JavaServlet控制器提供统一的请求入口,解析请求的url,再去调用相应的Action进行业务处理。WebWork也不例外,它要求你在web.xml文件里配置一个派遣器

1ServletDispatcher

它初始化WebWrok的一些配置信息,解析XWork的Action配置信息,根据请求去组装和调用执行相应的

1拦截器(Interceptor)
2Action
3Action Result(Action执行结果的输出)等

具体配置如下:

1<servlet>
2    <servlet-name>action</servlet-name>
3    <servlet-class>com.opensymphony.webwork.dispatcher.ServletDispatcher</servlet-class>
4    <load-on-startup>2</load-on-startup>
5</servlet>


1<servlet-mapping>
2    <servlet-name>action</servlet-name>
3    <url-pattern>*.html</url-pattern>
4</servlet-mapping>


这样,.html结尾的所有url请求将直接有ServletDispatcher去调度。下面我们写一个经典的HelloWorld,跑一个简单实例来验证你运行环境是否可用,并感受一下简单、功能强大的WebWork的开发。

注意:如果使用WebWork自带的标签库,除了配置相应的标签库以外,还须将com.opensymphony.webwork.views.velocity.WebWorkVelocityServlet配置到web.xml,具体可以参考webwork-example里面的配置。

HelloWorld

首先看下面这个程序HelloWorldAction.java:

package helloWorld

import com.opensymphony.xwork.Action;

public class HelloWorldAction implements Action{

String greeting;

public String getGreeting() {

return greeting;

}

public String execute() throws Exception {

greeting = "Hello World!";

return SUCCESS;

}

}

HelloWorldAction是一个普通的Java类,它实现了Action这个接口。Action是一个非常简单的接口,只有一个方法:public String execute() throws Exception; ,Action类介绍见下一节。HelloWorldAction有一个String类型字段greeting,在execute()方法中,greeting被赋值“Hello World!”,并返回String型常量SUCCESS,SUCCESS的定义详见Action接口,这个常量代表了execute()方法执行成功,将返回成功页面。

返回的页面greetings.jsp代码如下:

]]>

greetings.jsp很简单的jsp页面,它使用了WebWork自带的标签库。它的作用是输出变量“greeting”的值。这个语句,相当于调用相应Action(HelloWorldAction)的getGreeting()方法,取得变量“greeting”的值。

我们的HelloWorld代码就这么多,完了。可是,HelloWorldAction怎么去调用、执行?执行成功它又怎么知道返回到greetings.jsp?XWork的配置文件xwork.xml会负责将要执行的Action和展现的视图连接起来,见xwork.xml的如下片断:

/greetings.jsp

我们先看action标签:name=”hello”,表示我们调用这个Action的标识是hello,这样我们可以通过下面的url访问这个Action:…/hello.action,

例如:http://localhost:8080/webwork/hello.action;class=" helloWorld .HelloWorldAction"很好理解,这是真正调用执行的类。我们在看看result标签:name="success",记得前面HelloWorldAction返回的字符常量SUCCESS吗?它的值其实就是“success”,它表示Action执行成功返回success就转向这个结果;type="dispatcher"表示执行完Action,转向结果页面的方式;param参数指定了结果页面的位置:/greetings.jsp。

代码写完,剩下的当然是编译、部署。启动tomcat服务器之后我们就可以执行了:

在浏览器里输入你的地址:http://localhost:8080/webwork/hello.action

你将会看到如下结果:Hello World!

]]>

]]>

]]>

posted @ 2006-08-21 17:00 刘文涛| 编辑 收藏

ajax架构中主要涉及的技术:

client: 用 javascript的DOM 操作 server端返回的xml文件

server:  servlet 
+ DAO,用于生成client端所需的xml文件并返回
 
下面主要介绍client的代码:
 
 1 //先假设server传过来如下的xml文件内容:
 2 <? xml version="1.0" encoding="gb2312" ?>
 3 < students >
 4       < student  name ="木鱼子" >
 5            < job > Programmer </ job >
 6            < salary > 3000 </ salary >
 7       </ student >
 8       < student  name ="丁磊" >
 9            < job > 网易CEO </ job >
10            < salary > 100000 </ salary >
11       </ student >
12       < student  name ="陈天桥" >
13            < job > 盛大CEO </ job >
14            < salary > 120000 </ salary >
15       </ student >
16 </ students >
 
1 //类的构造,传入xml文档和需要处理的标签名称
2 function DataSet(xmldoc, tagLabel) {
3  this.rootObj = xmldoc.getElementsByTagName(tagLabel)
4  
5 //3个方法定向,方便调用
6  this.getCount = getCount
7  this.getData = getData
8  this.getAttribute = getAttribute
9 }
 
 
 1 //3个方法函数定义
 2 function getCount(){
 3  return this.rootObj.length
 4 }
 5
 6 function getData(index, tagName){
 7   if (index >= this.count){
 8         return "index overflow"
 9    }
10  var node = this.rootObj[index]
11  var str = node.getElementsByTagName(tagName)[0].firstChild.data
12  return str
13 }
14
15 function getAttribute(index, tagName) {
16    if (index >= this.count){
17         return "index overflow"
18    }
19  var node = this.rootObj[index]
20  var str = node.getAttribute(tagName)
21  return str
22 }


//使用DataSet类获取所需标签集合

 1 function updateByXML(xmlDoc) { 
 2       var studentDS = new DataSet(xmlDoc,"student");
 3       var count = studentDS.getCount()
 4       for(i=0;i < count ;i++) {
 5           var name  = studentDS.getAttribute(i,"name")
 6            var job  = studentDS.getData(i,"job")
 7            var salary  = studentDS.getData(i,"salary")  
 8            alert(name + "," + job + "," + salary)
 9       }
10  }

//操纵DOM,创建table,显示获得的数据,用这种方法显示数据,容易让用户接受!~^_^

 1 // 首先要确定document对象中,有没有定义table
 2 function  deleteOldTable()  {
 3      delRow  =  document.getElementsByTagName( " table " ).length
 4
 5       if (delRow  == 0 {
 6             return  ;
 7        }

 8
 9       var  node  =  document.getElementsByTagName( " table " )[delRow - 1 ];  // 表格
10       var  c  =  node.childNodes.length
11
12       for (i = 0 ;i < c;i ++ ) {
13        node.removeChild(node.childNodes[ 0 ]);  // 删除全部单元行
14      }

15
16 }

 

 1 // 传入DataSet的一个实例即可
 2 function  makeTable(m_ds)  {
 3      deleteOldTable()      // 先清除以前的结果
 4
 5       var  table  =  document.createElement( " table " );
 6      table.setAttribute( " border " , " 1 " );
 7      table.setAttribute( " width " , " 100% " );
 8
 9      document.body.appendChild(table);
10       var  header  =  table.createTHead();
11       var  headerrow  =  header.insertRow( 0 );
12      headerrow.insertCell( 0 ).appendChild(document.createTextNode( " 姓名 " ));
13      headerrow.insertCell( 1 ).appendChild(document.createTextNode( " 职业 " ));
14      headerrow.insertCell( 2 ).appendChild(document.createTextNode( " 工资 " ));
15
16       for ( var  i = 0 ;i < m_ds.getCount();i ++ {  
17            var  name  =  m_ds.getAttribute(i, " name " )
18            var  job  =  m_ds.getData(i, " job " )
19            var  salary  =  m_ds.getData(i, " salary " )      
20            var  row  =  table.insertRow(i + 1 );
21           row.insertCell( 0 ).appendChild(document.createTextNode(name));
22           row.insertCell( 1 ).appendChild(document.createTextNode(job));
23           row.insertCell( 2 ).appendChild(document.createTextNode(salary));
24      }

25 }

以上就是javascript的DOM的基本使用方法,作为ajax的基础,掌握这个是非常重要滴!~

posted @ 2006-08-21 15:42 刘文涛| 编辑 收藏

 Prototype.js 是Javascript编写者的一把小军刀,提供了Ruby风格的简写语法和实效的函数,更难得的是完全跨浏览器,让大家舒舒服服写出又精简又不用愁心兼容的的JS代码,springside 已经离不开它了。  Prototype.js最重要的文档有:

Developer Notes for Prototype.js 中文版 (英文原版)
script.aculo.us的wiki
文档集合:http://www.prototypedoc.com/

1.1 最爱$系列
我最喜欢是可以用${"bookDiv"} 等价于通用的document.getElementByID("bookDiv")

值得留意的还有和CSS一样的批量选择语法$$(),如

$$('div#left_books).each(.)
Element系列有很多实用的函数: 

$('bookdiv').update(' < p >  </ p > ');  // 更新innerHtml 
$('bookdiv').show();
$('bookdiv').hide();
$('bookdiv').toggle();   // 切换visiable
$('bookdiv').visiable();   // 返回是否visiable
$('bookdiv').scrollTo();
  .....还有很多

1.2 传统的Ajax
传统的基于URL的ajax函数简单实用。

   new  Ajax.Updater('bookdiv', "foo .jsp " );
此函数的还有很多可选的参数,参数列表见此:

 

new Ajax.Updater('bookdiv',"foo.jsp", {onComplete: initObserve});

比如需要异步执行ajax, 更新bookdiv后需要重新执行initObserve, onComplete的设置就刚好满足你的要求。

另有可定时执行Ajax的PeriodicalUpdater。

1.3 Form系列函数也不错
Form.serialize   将Form中所有Input对象的值转化为一个URL String,方便把Form转为用 URL Get方式的Ajax提交,最经典的用Ajax提交Form的例子:


  < form action = " /action/here "  method = " post " 
   onsubmi = " new Ajax.Updater('div_to_be_updated', '/action/here', {parameters:Form.serialize(this)});
              return false; " >  
  另外,Form.focusFirstElement , Form.getInputs等函数也很实用。 

1.4 Event系列
除了后述的Observe模式外,还有下列保证兼容IE和FF的事件函数:

1.Event.element(event),找出触发事件的element.

2.Event.findElement(event,tagName),搜索DOM tree里事件的响应链里的第一个符合tagName的element.

3.pointerX(event),pointerY(event)等.

还定义了一些标准KeyCode,见:http://www.sergiopereira.com/articles/prototype.js.html#Reference.Extensions.Event

1.5 Ruby风格
1.循环函数


elements.each(  function (element){
        alert(element);
       });
2.不定参数


new  Ajax.Updater('mydiv', ' / foo / bar', {asynchronous: true });

2. Observe模式达到搜索引擎Friendly
Observe模式,就是连接仍然以<a href="foo.jsp">形式编写,用Observe为其加入onClick事件的侦听。 这样,当搜索引擎访问时,就会访问传统的URL;而用户使用IE访问时,就会被Observe转为使用onClick事件的Ajax效果。

见SpringSide中的/home/index.jsp 图书详情察看--通过selector查找需要处理的链接(a),循环为每个链接添加观察者,为click事件,添加handle函数。  
 

$$('div#left_books  *  a[href]').each( function (element){
Event.observe(element,'click',handlerCilckEvent, false );
});

function  handlerCilckEvent(event){
     var  element  =  Event.element(event);
     new  Ajax.Updater('bookdiv',element.href);
    Event.stop(event);
    $('bookdiv').show();
}
3.script.aculo.us的DomBuilder
script.aculo.us语法超简洁的Builder, 相比之下W3c的Dom Builder语法简直是噩梦。html片断不复杂时如果用JSTemplate有点大炮打蚊子,用script.aculo.us的Builder就够了。
Builder很有Ruby的风格,请看下面一句 :

foo =  Builder.node('a', {href: " foo.jsp " },categorys[i].name)
第1个参数是element类型,第2个是可选的attribbute,第3个是节点内的子节点。
如果要换成W3c的Dom函数写法,善哉善哉。

下面这段更明显,直接照元素的页面顺序来生成对象,而不是像W3C Dom Builder很逻辑抽象的,先生成对象,然后append到父元素。

div  =  Builder.node('div',{className:linkDiv},[
                       Builder.node('a', {href: " foo.jsp " }, categorys[i].name)  ]
         );

 

当然了,还是没有JS Template清晰,所以Builder只作为html片断非常短时使用。

 


Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1036306

 

posted @ 2006-08-21 15:32 刘文涛| 编辑 收藏

先简单介绍一下什么是DWR

DWR - Direct Web Remoting

  ajax是一种提高web站点吸引力和实用性的书写web页面的方法。它从服务器端更新web页面的特殊区域,从而增强用户的交互性。它允许信息在短时间的延迟或不用刷新页面的情况下更新。

  DWR减少了开发时间,也减少了一些可能的错误,这些错误是在提供常用的方法函数并消除一些与高交互性  web站点有关的重复性代码的时候产生的。

  DWR是作为开源软件(ASL verssion 2.0)而可以免费得到的。它凭借它的广阔的库、例子和指南非常易于实现。把它结合到一个现有的站点是非常简单的,同样它也可以简单地与大多数java框架结合。 

util.js
  util.js包含了一些使用的方法,从而帮助你利用javascript(可能)从服务器端更新你的web数据。

  你可以在DWR之外的地方使用它,因为它并不依赖与DWR而实现。

  它包含四个页面处理函数:

1 getText()作用于select lists。
2 getValue[s]()、setValue[s]()作用于除tables、lists和images以外的大多数html元素。
3 addRows()和removeAllRows()用于编辑tables。
4 addOptions()和removeAllOptions()用于编辑lists(如:select lists、ul、ol)。


$() :
 $函数(在javascript中,他的名字是合法的)的思想是从prototype引进的。一般说来,$ = document.getElementById。在以后你花大量时间进行ajax编程的时候,在合适的地方使用这种格式是很有益的。

  '$'通过给定的ID在当前HTML页面找到元素,如果多于一个的参数被提交,它就会返回一个包含已找到元素的数组。这个函数从prototype的library中得到的灵感,而且,它还能更好的工作在不同的浏览器中。 

一  :Generating Lists
DWR的一个功能可以给一个下拉列表(select list)添加选项,只需使用

1 DWRUtil.addOptions()

  如果你在更新列表之前,希望保留一些选项,你需要写以下一些代码:

1 var sel  =  DWRUtil.getValue(id);
2 DWRUtil.removeAllOptions(id);
3 DWRUtil.addOptions(id, );
4 DWRUtil.setValue(id, sel);

  如果你想有个初始化选项,如:“please select”,你可以直接使用:     

1 DWRUtil.addOptions(id, [ " Please select " ]);


二 :DWRUtil.addOptions 有5种调用方法:

1 :Array: DWRUtil.addOptions(selectid, array) 。selectid为目标ID,array为每一项的text。

2 :Array of objects (option text = option value): 
      DWRUtil.addOptions(selectid, data, prop) 用text和value的集合来为每一个数组元素创建一个选项,
      pro参数指定text和value的值。

3:Array of objects (with differing option text and value): 
      DWRUtil.addOptions(selectid, array, valueprop, textprop) 用text和value的集合来为每一个数组元素创建一个选项,
      valueprop确定value,textprop确定text。

4:Object: DWRUtil.addOptions(selectid, map, reverse) 为map中每一个属性(property)创建一个选项,
      属性名作为选项的value,属性的value作为选项的text。这样做看起来是错的,但实际上这种做法的确是正确的。
      如果reverse参数被设置为true,则属性的value还是被用做选项的value。

5:Map of objects: DWRUtil.addOptions(selectid, map, valueprop, textprop) 为map中的每一个对象创建一个选项,
      valueprop指定选项的value,textprop指定选项的text。


三 :Generating Tables

DWRUtil.addRows() 从一个数组(第二个参数)取得值,创建table的每一行。从另一个数组(第三个参数)去得值,为table的每一行创建若干列。

 

四 :DWRUtil.getText(id)

可以根据id取得text的值,这个方法只能用于select list

五 :DWRUtil.getValue(id)

可以根据id取得value,使用这个方法,你不必在意div和select list的不同。

六 :DWRUtil.getValues()

getValues() is similar to getValue() except that the input is a Javascript object that contains name/value pairs. The names are assumed to be the IDs of HTML elements, and the values are altered to reflect the contents of those IDs. This method does not return the object in question, it alters the value that you pass to it.

这个方法和getValue()一样,只是它传入的是一个包含名字和数值的javascript对象.这个名字就是HTML元素的ID。这个方法不会返回任何对象,它只会将ID的value映射给传入的value。例:

 1