`
kobexing933
  • 浏览: 120355 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

第十四章 集成Dojotoolkit(Ajax框架)

阅读更多

第十四章 集成DojotoolkitAjax框架)

Struts2内置对dojotoolkit的支持

@TODO 基于Ajax标签做更详细的使用讲解,由于dojo ajax标签在struts2中还处于试验阶段,所以我们主要讲解dojo在不使用struts2内置功能的情况下怎么和struts2结合使用。

Dojotoolkit介绍

Dojotoolkit是当前比较流行的JavaScript框架,dojo主要提供了以下功能:Java Script Web组件(例如TreeGridButtonMenu等),事件处理框架,Ajax异步调用等功能,非常好用。

Dojo现在主要有两个版本:

<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False"><span lang="EN-US">0.4.3</span></chsdate> 现在流行的版本,优点是,功能非常强大,非常稳定,缺点是类库本身比较低,执行效率较低

0.9 beta是新的版本,是为了保留<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False"><span lang="EN-US">0.4.3</span></chsdate>的有点同时提升性能而重写的一个版本,但是现在还处在beta阶段,bug相会还比较多。但是0.9系列绝对是将来的发展方向。

我们主要以0.9 beta版本为讲解对象,主要讲解以下内容:Widget组件,事件处理,Ajax等功能。但是情大家注意,dojo的功能远不止这么多。

Dojo安装

1 从下述网站下载dojo0.9 beta压缩文件

http://dojotoolkit.org/downloads

2 在你的Web项目目录中建立一个名字叫做js的目录(名字任意,这里叫js

3 将压缩文件在上面建立的目录中解压缩,得到如下文件结构:


4 打开浏览器,在地址栏中输入如下内容:

http://hostname:port/js/dojo-<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">0.9.0</chsdate>beta/dijit/themes/themeTester.html

如果看到如下页面说明安装成功:

<!--[if gte vml 1]><v:shape id="_x0000_i1026" type="#_x0000_t75" alt="themeTester.png" title="&quot;View: themeTester.png&quot;" style='width:414pt;height:291.75pt' o:button="t"> <v:imagedata src="file:///C:\DOCUME~1\mazhao\LOCALS~1\Temp\msohtml1\01\clip_image003.png" o:href="http://dojotoolkit.org/files/themeTester.png" /> </v:shape><![endif]--><!--[if !vml]-->themeTester.png<!--[endif]-->

Dojo Widget 组件

我们回头看/themeTester.html 画面,上面的组件要比HTML默认的组件漂亮很多。他们都是使用dojowidget(又叫dijit)来完成的。

Dojo widget在目录dijit中。

下面我们使用一个小例子还逐步的说明dijit的使用方法,通过如下步骤,我们将todoinsert画面改编为dijit组件。

我们有一个小小的Todo输入的页面,静态的效果如下:


<!--[if gte vml 1]><v:shape id="_x0000_i1027" type="#_x0000_t75" style='width:414.75pt;height:301.5pt'> <v:imagedata src="file:///C:\DOCUME~1\mazhao\LOCALS~1\Temp\msohtml1\01\clip_image005.png" o:title="" /> </v:shape><![endif]--><!--[if !vml]--><!--[endif]-->

这里有很多地方不是很方便,例如:

1 日期能不能出现一个日历选择对话框,只要选择就好?

2 日期能不能自动校验,例如如果输入,2007/02/29可以判断为错误日期?

3 时间需要校验,需要校验格式(HH:mm:ss)和数字内容例如不会有25:89:60

4 下拉列表能不能支持手工编写?能不能支持根据已经输入的值自动过滤选择项?

5 能否让系统提示必须填入项目?

通过使用dojodijit组件这些都可以做到,并且dijit组件有两种使用方式:标签和JS编程动态实现。

无论那种方式实现都需要了解一些基本的步骤:

第一步,由于dojoJavaScript编写的,所以第一步必须首先引用dojo框架的JavaScript,同时dojo提供了一些初始化配置,可以在引用dojo的时候同时配置,代码如下:

<script type="text/javascript"

src="<%= request.getContextPath()%>/dojo-<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">0.9.0</chsdate>beta/dojo/dojo.js"

djConfig="isDebug: true, parseOnLoad: true">

</script>

其中src指向的是dojoweb项目中的存放路径。

djConfigdojo追加的自定义属性,在HTML标准里并没有。使用djConfig可以做一些基本的配置,isDebug表示了当前页面中使用的dojo内容是否处在调试状态,在调试状态可以输出更多的内容,一般开发的时候我么选择trueparseOnLoad表示所有的dijit组件是否在html页面装载的时候自动的做展现(Render)处理,使用dijit组件的时候我们选择true,没有使用的时候使用false可以获得更好的性能。

第二步,引用需要使用的dojo类,这一步有些像Java中的import,注意添加引用的类会增加页面加载是JavaScript的下载量,所以应该尽量的精简引用的dojo对象。代码为:

<script type="text/javascript">
 dojo.require("dijit.form.ValidationTextbox");
 dojo.require("dijit.form.DateTextbox");
 dojo.require("dijit.form.ComboBox");
 dojo.require("dijit.form.Button");
 dojo.require("dijit.form.Textbox");
 dojo.require("dijit.form.NumberTextbox");
 dojo.require("dijit.form.CurrencyTextbox");
 dojo.require("dojo.currency");
 dojo.require("dojo.date.locale");
 dojo.require("dojo.parser");
</script>

上述的代码说明了我们需要在后续的代码中使用的dojo组件。

第三步,引用需要使用的CSS文件,由于dojo使用CSS实现了主题的概念,所以我们在使用dojo的时候一定要选择合适的主题。代码为:

<style type="text/css">
@import "/teamware/dojo-<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">0.9.0</chsdate>beta/dojo/resources/dojo.css";
@import "/teamware/dojo-<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">0.9.0</chsdate>beta/dijit/themes/dijit.css";
@import "/teamware/dojo-<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">0.9.0</chsdate>beta/dijit/themes/tundra/tundra.css";
</style>

当然,也可以加入自己的内容,自定以主题。默认的主题时tundra主题。

另外需要注意,使用主题的时候需要在htmlbody元素上使用class属性,代码为:

<body class="tundra">

第四步(标签),使用dojodijit组件。

所有的组件都有一个dojo自定义的属性dojoTypedojoType决定了这个组件的dijit类型。例如:

日期组件
<input id="startDate" type="text" name="todo.startDate" 

 class="medium" value="<chsdate w:st="on" year="2005" month="12" day="30" islunardate="False" isrocdate="False">2005-12-30</chsdate>"

 dojoType="dijit.form.DateTextbox"

 constraints={min:'<chsdate w:st="on" year="2004" month="1" day="1" islunardate="False" isrocdate="False">2004-01-01</chsdate>',max:'<chsdate w:st="on" year="2006" month="12" day="31" islunardate="False" isrocdate="False">2006-12-31</chsdate>'}

 required="true"

 promptMessage="mm/dd/yyyy"

 invalidMessage="Invalid date. Use mm/dd/yyyy format." />

这里dojoType=”dijit.form.DateTextbox”,表示这个组件的类型为DateTextbox类型,具体表现形式为:

<!--[if gte vml 1]><v:shape id="_x0000_i1028" type="#_x0000_t75" style='width:212.25pt;height:241.5pt'> <v:imagedata src="file:///C:\DOCUME~1\mazhao\LOCALS~1\Temp\msohtml1\01\clip_image007.png" o:title="" /> </v:shape><![endif]--><!--[if !vml]--><!--[endif]-->

时间组件:

<input id="startTime" type="text" name="todo.startTime" 

 class="medium" value="5:45:00 pm"  dojoType="dijit.form.ValidationTextbox"

 validator="dojo.date.locale.parse"

 constraints={formatLength:'medium',selector:'time'}

 trim="true"

 required="true"

 invalidMessage="Invalid time." />

具体表现形式为:

<!--[if gte vml 1]><v:shape id="_x0000_i1029" type="#_x0000_t75" style='width:273.75pt;height:57pt'> <v:imagedata src="file:///C:\DOCUME~1\mazhao\LOCALS~1\Temp\msohtml1\01\clip_image009.png" o:title="" /> </v:shape><![endif]--><!--[if !vml]--><!--[endif]-->

第四步(JS编程动态实现),使用dojodijit组件。

在使用Struts2的过程中,为了方便操作,我们一般使用Struts2的内置标签,例如:<s:text/>等。但是使用这些标签有一个问题,这些标签都是Struts2的标签,在定制这些标签的时候没有考虑到dojo,所以这些标签中不能使用dojoType属性,所以要想在Struts2中要想使用dojo,就得:要么放弃这些好用的Struts2标签,要么,就是我们要讲的使用JS动态的使用dojo

例如,我们有了如下的JSP页面(只讲述form部分),其中使用了struts2标签:

<s:form action="insert" namespace="/todo">

<s:textfield id="startDate"

name="todo.startDate" label="Start Date" />

<s:textfield id="startTime"

name="todo.startTime" label="Start Time" />

<s:textfield id="endDate"

name="todo.endDate" label="End Date" />

<s:textfield id="endTime"

name="todo.endTime" label="Emd Time" />

<s:select list="%{#{'完成':'完成','未完成':'未完成'}}"

name="status" id="status" label="Status">

</s:select>

<s:select list="%{#{'':'','':'','':''}}"

name="priority"

id="priority" label="Priority">

</s:select>

<s:select list="%{#{'个人':'个人','商务':'商务'}}"

name="category"

id="category" label="Category"></s:select>

<s:textfield id="title"

name="todo.title" label="Title"></s:textfield>

<s:textarea id="content"

name="todo.content" label="Content" cols="20"

rows="10"></s:textarea>

<s:submit id="insertButton" label="insert" />

</s:form>

那么我们如何使用JavaScript来动态的使用Dojo呢?

基本原理如下:

<!--[if !supportLists]-->(1) <!--[endif]-->构造组件需要使用的dojo属性

<!--[if !supportLists]-->(2) <!--[endif]-->找到需要套用dojo组件的HTML 元素,使用前面定义的属性建立新的替代组件,

例如,现在要将

<s:textfield id="startDate"

name="todo.startDate" label="Start Date" />

替换为dijit.form.DateTextbox类型,代码为:

var paramsStartDate = {

required: "true",

constraints: {selector: "date", formatLength: "short",

datePattern: "yyyy-MM-dd", timePattern: "HH:mm:ss", locale: "zh-cn"}

}

var startDateText = new dijit.form.DateTextbox(paramsStartDate,

document.getElementById("startDate"));

首先我们定义了一个Map型的对象paramsStartDate用来存储我们在构建dijit组件时使用的属性和值。之后我们使用dijit.form.DateTextbox的构造方法来创建dojo类型的组件。

但是需要注意一点,上述代码必须在HTML页面load的时候执行,否则无法正常创建dojo组件,这里我们使用了dojo对象的addOnLoad方法吧这段代码加入到HTML页面load时运行的代码中。全部的JavaScript代码如下:

<script type="text/javascript">

dojo.addOnLoad(

function () {

var paramsStartDate = {

required: "true",

constraints: {selector: "date", formatLength: "short",

datePattern: "yyyy-MM-dd", timePattern: "HH:mm:ss",

locale: "zh-cn"}

}

var startDateText = new dijit.form.DateTextbox(paramsStartDate,

document.getElementById("startDate"));

/* init start time */

var paramsStartTime = {

value: "08:30:00",

validator: dojo.date.locale.parse,

constraints: {formatLength: "short", selector: "time",

timePattern: "HH:mm:ss"},

trim: "true",

required: "true",

invalidMessage: "Invalid time. Use HH:mm:ss where HH is 00 - 23 hours."

}

var startTimeText =

new dijit.form.ValidationTextbox(paramsStartTime,

document.getElementById("startTime"));

/* init title */

var paramsTitleText = {

required: "true",

promptMessage: "Enter a Title"

}

var titleText =

new dijit.form.ValidationTextbox(paramsTitleText,

document.getElementById("title"));

}

);

</script>

Dojo事件处理
传统的使用JavaScript Event的方式和dojo.connect的方式
JavaScript中使用事件的方式为:
<script type="text/javascript">
function foo() {
alert("Hello!");
}
</script>
<button id="firstButton" onclick="foo();" >Hello!</button>
上述代码表示firstButton被点击(onclick)的时候,触发foo()方法。
使用上述方式很简单,但是存在不好的地方,所有的画面表示内容(例如<button>标签)会和事件处理(onclick=”foo();”)关联起来。当画面事件处理比较简单的时候,这个缺点体现不出来,但是当画面时间比较多,并且经常需要调整JavaScript方法和表示内容的时候就会暴露出来修改比较困难的问题。
Dojo.connect方法
可以使用connectJavaScript方法和表示组件联合起来,例如:
dojo.addOnLoad(
function() {
dojo.connect(dojo.byId("firstButton"), "onclick", foo);
}
);
上述的代码表示将firstButtononclick事件和foo方法联系起来,当firstButton被点击的时候会触发foo方法。
这里就解决了画面表示内容(例如<button>标签)和事件处理之间关联的问题。我们可以在onLoad方法内部将所有的关联链接起来。
Event Object 说明
我们接着dojo.connect方法说,能不能在JavaScript方法内部看到事件的详细信息?
我们把事件的相关信息认为Event Object</
分享到:
评论

相关推荐

    几种流行的AJAX框架介绍pdf格式

    ### 几种流行的AJAX框架介绍 #### 一、引言 随着Web 2.0技术的发展,异步JavaScript和XML(简称AJAX)成为构建动态网页应用的关键技术之一。AJAX框架则大大简化了这一过程,使得开发者能够更加轻松地创建高性能、...

    四种流行的AJAX框架jQuery_Mootools_Dojo_ExtJS的对比

    ### 四种流行的AJAX框架对比分析:jQuery, Mootools, Dojo, ExtJS #### 一、jQuery **主页**: **设计思想**: - **简洁性**: 几乎所有操作都始于选择DOM元素,并对其进行操作(支持Chaining等特性)。 **优点**:...

    ajax资源

    【Ajax资源】这一压缩包包含了丰富的Ajax技术相关的学习资料,主要涵盖了各种Ajax框架和技术文档,旨在帮助用户深入了解和掌握Ajax技术。以下是对每个文件的详细解读: 1. **DojoToolkit.pdf** 和 **DojoToolkit_...

    Ajax技术简介——处于尖端的技术

    对于像CartoWeb这样的地图框架而言,合理地集成AJAX技术将有助于提升其竞争力和用户体验。 ### 参考文献 - [Jesse James Garrett, “Ajax: A New Approach to Web Applications,” Adaptive Path, 2005]...

    AJAX架构之Dojo篇

    一、前言自去年开始,AJAX一下成了关注的技术热点,各种AJAX框架迅速的发展了起来,其中又分为客户端AJAX架构,服务器端AJAX架构等,其中DojoToolkit做为一个优秀的客户端AJAX架构,被越来越多的人所关注,学习。...

    Ajax Development With Grails Dojo

    ### Ajax Development with Grails and Dojo #### 一、引言 在当今的Web开发领域,Ajax技术已经成为了提升用户体验的重要手段之一。它允许网页在不重新加载整个页面的情况下更新部分数据,从而提供了更加流畅的交互...

    应用最广的十大Javascript框架下载地址

    根据给定的部分内容,第十个框架没有明确提到名称和相关信息。可以推测这可能是指另一个知名的 JavaScript 框架,但具体名称需要进一步确认。 综上所述,这些框架不仅推动了 Web 开发的进步,也为开发人员提供了更...

    dojotoolkit svn版本20130630 分卷1/2

    dojotoolkit svn版本20130630 分卷1/2

    dojotoolkit svn版本20130630 分卷2/2

    dojotoolkit svn版本20130630 分卷1/2

    找到一款不错的基于AJAX留言板源码(PHP版、ASP版)提供下载了

    一、说明 大家好,现将51... 要下载完整的Dojo框架,请点击这里下载:http://download.dojotoolkit.org/release-0.3.1/dojo-0.3.1-ajax.zip。 关于Dojo的更多信息,请点击这里查看:http://www.51ajax.com/blog/?p=31

    自己编写的一个struts2.1 基于dojo的ajax标签的即时验证小程序

    Struts2.1是一个流行的Java Web开发框架,它在MVC设计模式的基础上提供了一种组织应用程序的方式,使得开发者能够更高效地构建动态、数据驱动的Web应用。Ajax(Asynchronous JavaScript and XML)技术则允许页面在不...

    JotSpot开发的Dojo框架

    Dojo框架最新版(压缩版) 官方地址:http://dojotoolkit.org/downloads

    dojo toolkit

    总之,Dojo Toolkit是一个功能全面且强大的JavaScript框架,它通过Dijit、DojoX和Dojo Core提供了丰富的功能,帮助开发者构建高性能、易维护的Web应用。"dojo-0.4.1-ajax"这个文件展示了Dojo在Ajax通信方面的早期...

    struts结合dojo

    Dojotoolkit是当前比较流行的JavaScript框架,dojo主要提供了以下功能:JavaScript Web组件(例如Tree,Grid,Button,Menu等),事件处理框架,Ajax异步调用等功能,非常好用。 Dojo现在主要有两个版本: 0.4.3 ...

    Creating_AJAX-Powered_Forms_with_the_Dojo_Toolkit

    在构建现代化的Web应用时,Ajax(异步JavaScript和XML)技术被广泛应用于提升用户体验,尤其是在表单交互中。Dojo Toolkit是一个强大的JavaScript库,它提供了丰富的功能来创建Ajax驱动的表单,使得数据验证、交互性...

    dojo-release-1.2.1-demos

    Dojo 自带了测试框架`dojotoolkit/dojo/test`,可以帮助开发者编写单元测试和集成测试,保证代码质量。 通过"dojo-release-1.2.1-demos"中的示例,你可以深入学习这些功能,理解Dojo如何提升Web应用的效率和用户...

    com.springsource.org.dojotoolkit.shrinksafe-1.3.2.jar

    jar包,官方版本,自测可用

    dojo工具包及API

    2. **DOH测试框架**:DOH(Dojo Objective Harness)是Dojo内置的单元测试框架,用于确保代码的质量和稳定性。 3. **Widget系统**:Dojo提供了丰富的可复用UI组件,如按钮、表单控件、布局容器等,这些组件支持主题...

    com.springsource.org.dojotoolkit.shrinksafe-sources-1.3.2.jar

    jar包,官方版本,自测可用

    14款NodeJS Web框架推荐

    根据提供的文件内容,我们将详细介绍其中提到的14款基于Node.js的Web框架,它们在帮助开发者构建高效Web应用方面各有特色。 1. Primus:Primus框架是Transformer的创造者,提供了通用的低级别接口用于各个实时框架...

Global site tag (gtag.js) - Google Analytics