<!----><!---->
<!--
/* Font Definitions */
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;
mso-font-alt:SimSun;
mso-font-charset:134;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:3 135135232 16 0 262145 0;}
@font-face
{font-family:"\@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;
mso-font-charset:134;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:3 135135232 16 0 262145 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
mso-pagination:none;
font-size:10.5pt;
mso-bidi-font-size:12.0pt;
font-family:"Times New Roman";
mso-fareast-font-family:宋体;
mso-font-kerning:1.0pt;}
/* Page Definitions */
@page
{mso-page-border-surround-header:no;
mso-page-border-surround-footer:no;}
@page Section1
{size:595.3pt 841.9pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;
mso-header-margin:42.55pt;
mso-footer-margin:49.6pt;
mso-paper-source:0;
layout-grid:15.6pt;}
div.Section1
{page:Section1;}
/* List Definitions */
@list l0
{mso-list-id:1421486094;
mso-list-type:hybrid;
mso-list-template-ids:1575242980 1091747032 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;}
@list l0:level1
{mso-level-text:(%1);
mso-level-tab-stop:36.0pt;
mso-level-number-position:left;
text-indent:-36.0pt;}
@list l1
{mso-list-id:1974869880;
mso-list-type:hybrid;
mso-list-template-ids:-1813847398 -1256026074 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;}
@list l1:level1
{mso-level-text:%1.;
mso-level-tab-stop:18.0pt;
mso-level-number-position:left;
margin-left:18.0pt;
text-indent:-18.0pt;}
ol
{margin-bottom:0cm;}
ul
{margin-bottom:0cm;}
-->
<!---->
本来
ajax
与
struts2
并没有什么冲突,但在页面的渲染方面,作为开发者来说,还是有的选择的。下面各来看一下它们的工作情况:
<!---->1.
<!---->Ajax
方面,由于大量的开发包,使得浏览器端的
DOM
变化莫测,并没有什么一定之规。
<!---->(1)
<!---->用
Ajax
对数据进行渲染。
由
DWR
之类,或
servlet
或
struts2
的
JSON
插件,向浏览器端提供数据的
JSON
,以纯数据形式交互,再由
Ajax
在页面对
JSON
进行渲染。现在的开发包,
EXT
等都有绑定
JSON
的功能,渲染形式可以任意调整,可以说达到页面级的
MVC
的最高境界。缺点可能是,由于发展太快,开发人员对这些开发包的了解还是有限的,而且各个开发包的书写风格并不统一,也是由于
javascript
的书写风格可以很个性决定的,一方面,你可以尽量展开想像,另一方面,写得精采的代码不是那么易于理解。
<!---->(2)
<!---->用
Ajax
对
HTML
元素进行渲染
Ajax
开发包也提供这样的功能,以
HTML
元素作为最小的单位进行渲染,如:加入动作、加入
style
等。页面可以变得很干净并易于理解:
<table><tr><td>…….</td></tr></table>
而,如隔行变色的渲染,完全无需写入
HTML
代码,
$$('#result
li:nth-child(2n)').invoke('addClassName', 'alternate');
(《
Prototype and script.aculo.us
》)以
prototype
来说,这样就可以了。当然,也可以由(
1
)的方法,先生成
HTML
代码,第二步再进行渲染,这个问题后面再说。
<!---->(3)
<!---->用
Ajax
进行布局
这也是一个比较有意思的功能,利有
Ajax
的异步请求功能,将大块的
HTML
代码以
CSS+DIV
的控制方式放到页面的不责骂位置,而达到布局的目的。有点像
portallet
的方式,好处是进行单块刷新时,既无需全页面刷新,也无需以
FRAME
方式处理页面。再加上“拖拽”功能的实现,可以很方便地达到个性化页面效果。
2
.
STRUTS2
方面,加入了很多
TAG
标记,再结合
sitemesh
,利用
velocity
或
freemark
的模板功能来实现页面在服务器端的整合。
(
1
)
struts2
标记以
component
方式出现
Struts2
以传入的
entitybean
(
POJO
对像)为基础,对数据(实际上是对这个对像)进行渲染,对于
FORM
、
CHECKBOX
等有比较成熟的用例。而且甚至也有一部分开始结合
script
来做,比如
validator
的使用,结果倒是在头部加了
JS
来完成信息的反馈。在实现方面,
struts2
还是比较开放的,允许
jsp/velocity/freemark
的方式来实现
tag
,而且还可以自定义开发,在使用
component
标记时,可以任意开发。但总觉得还是有些限制在里头,回头想想,“自由是在有条件下的自由”,这样未必不好,标准化的开发对于软件工程和效益角度来讲,都是有利的。
(
2
)
struts2
以
sitmesh
方式布局渲染页面
作为一个
struts2
的“装饰”拦截器出现的
sitmesh
,实际可能倒像是在
struts2
的外面,可解析返回的
HTML
流,重新进行“装饰”。好处是有点“无侵入”的意思,和
component
结合使用的话,确实只是装饰的作用,并不要求对业务部分进行多大的变化。可重用性提高了不少,比高耦合的
include
的方式要好得多,而且也支持
velocity
和
freemark
的模板功能。其实模板功能
velocity
已经完成得不错了,
sitmesh
只是采取了结合类似“路由”和拦截器的用法,标准化了一些。
3.Ajax
方式与
sturts2
的方式结合
正所谓此消彼长,都想干这活儿,得看应用的环境和意图来取长补短。
Ajax
的长处在我看来有两点,一是比较“绚”,页面的交互人性化,另一点是页面的
MVC
,使得页面与服务器之间的数据交流效率最高。缺点也不少,就开发而言,浏览器差异是最难面对的一个问题,当然,有三方开发包在,可以以面板或代理模式解决大部分问题,但开发包本身也不一定是规范的,或者说不是标准的。这样就有一个问题,开发者需要学习如何使用开发包,而现在真正对页面
MVC
了解的开发人员,不是很多,成本效率都有点问题。
Struts2
的长处,其实是其标准性,从
JSP
的角度来讲,开发成本和效率以及人员选择都好一些,二次开发或修改的时候,比较容易理解。而从
IDE
角度来说,更是有先天的方便。“虽然僵硬,但比较简单”。缺点是交互性差,或者说比较简单,如果自制的成本过高的话,重用和变化就比较难。而且一些工具看似方便,其实是可有可无的,因为可能由其它应用服务器以外的工具来完成更好。如:
sitmesh
的路由功能,如果是集群工作,由
apache
或其它的
WEB
服务器来完成性能好一些。(这里其实是有故事的,暂不提了,但谁也不相信可以由单个
tomcat
来面对公网的高并发访问)。再就是渲染的灵活性,如:写一个
<td class=<%....
来隔行换色,比起
ajax
的“
….nth-child(2n)').invoke('addClassName….'
来,逊色不少,耦合性也高了些。
所以,如果从性能本身来讲,在渲染页面这个问题上,
Ajax
自是高
struts2
一层
;
但从项目开发效率和成本角度看,
struts2
似乎更易被接受(不要高估开发人员对新事物的接受能力)
;
从长远的复用性和开发平台角度看,
Ajax
是早晚的趋势,只是要注意,不要跑到趋势的前头,趋势不代表主流,从现实角度看,完全的
Ajax
渲染存在很多问题,即使可用,维护上也成问题,即使可维护,更新的速度过快,很大程度上降低了稳定性。关键是没有标准,你可以以
EXT
或
mootools
或
DOJO
为基础标准,但谁又知道它们以后发展的情况,会不会停止更新,会不会收费,就连文档方面也是很少的。而
struts2
呢,从
struts1
的过渡似乎正在进行中,有人说至少
1-2
年内还是
S2S2H3
当道,我看也是可行的。从长远的角度考虑,技术的先进性并不占多大比重,开发人员的熟练度和开发平台(包括测试)的成熟度要更重要一些。真正的可重用性,还是要以项目的情况来决定的,相当于有一个投资的回报期和利润平衡点,要达到一定的量才有建立开发平台和固定架构或是解决方案的可能。从真正使用角度来看,
struts2
基本具备升级的条件,特别是它开发的架构,使开发人员有更多选择的余地,使建立平台的成本随着时间的流逝,仍可以保留一些价值,不至于一次性推倒重来。另外,还有一个渲染粒度的问题,从哪一个层面进行,开发人员的分工能否够细,接口是否清晰,都是间接的选择条件。但并不是说
Ajax
用不上,如果不及早地介入
Ajax
的历程,在真的技术升级换代时,会比较困难的,何况
Ajax
也并不那么难,甚至可以说很简单。它也提供开发人员不同的选择余地,你既可以对
JSON
或
XML
数据进行渲染,也可以对已有的
HTML
元素进行渲染,至少也能够根据
CSS+DIV
对页面进行布局。
4
.最佳实践
我不知道怎样才算是最合适的,就业界的整体情况而言,我不得不说,还是要适度的使用
Ajax
。那些以纯
script
为基础的整系统框架
framework
,在我看来都不是那么的完备和稳定。
RIA
从某个侧面确实减少了
C/S
的那种更新发布的痛苦,也在表现层面上给予了尽量多的支持,但从安全等层面上来说,还是有欠缺的,在一个特定的环境下使用还是有利的。
选择组合的环境大约有两种:一种是公网下、高并发、页面交互复杂、页面表现要求较高的情况
;
另一种是
B/S
结构下、类
MIS
内网应用系统、页面要求标准、有利于二次开发或扩展或第三方产品介入等要求、业务流程
/
数据结构复杂但表现规律的情况。
对于环境一,显然要求与服务器交互数据越少越好,而且大部都会形成静态页,所以动态效果不能做到服务器端(虽然方便或者可以集群,但这仍是主要设计原则之一),只能做到浏览器端,也就是“静态页面中的动态效果”。当然
Ajax
是首选,从项目团队角度来讲,只要人员素质能达到,越细粒度的渲染越好(有点过于夸大了,普遍地说吧),甚至服务器端的应用开发都可以以不同方式开发
(
可以用
java
也可以用
PHP
也可以用
.net)
。现有的架构中,
DWR
可能用的最极至的,而且也对原来用
java
的开发者转到
javascript
是一个比较容易的过度(虽然没真用它开发过,但想来是如此的)。
Struts2
的
JSON
插件或其它三方产品也可以,只不过业务逻辑放到服务器端而不是浏览器端,个人认为还是这样比较好,将表现逻辑和业务逻辑从物理上就分开,
EXT
等框架已经比较支持这种方式了。当然,如果达不到素质,仍可以在局部使用
Ajax
的效果,如无刷新更新页面、拖拽等。
对于环境二,团队开发的情形更多一些,一些以
struts2
为基础的自制开发平台是团队的首选。无论是对平台的开发,还是应用平台的二次开发,标准化和复用是项目获利的关键。所以,依我之见,宁可死板和重复一些,不要过份要求代码的完美(但逻辑要清晰,数据结构要好,
SQL
要效率高)。
Ajax
的使用要比较局部,一些开源如
GT-Grid
(原来是基于自定义标签的,现在好像基于
sript
渲染
JSON
了)等,在表单增删改查的这个局部做的相当不错,在
ss2
中可见一斑(
ss3
中还未见例子),借助
struts2
的开放性,并不需要在所有地方都使用,一些地方仍可沿用原来的服务器组装页面的模式(
sitmesh
)。但这个我没有也不好比较,是
Ajax
来还是由
sitmesh
进行页面大布局中各个子部分内容的载入,因为本来以为用
Ajax
的异步请求载入子部分内容的用户体验是最好的,但使用
Ajax
的建议中倒认为应尽量减少请求数量(但这里好像指高并发的情况下),而且如何载入,需要自己写代码(我是写成
XML
,再由
script
读入后找到各部人的
URL
再载入的)。而
sitmesh
也是写配置文件,代码都缩到
jar
里面,再结合
struts2
,代码量比较小,感觉也比较可靠和灵活。也就是说,一个是将布局定义放到浏览器端执行,一个是将布局定义在服务器端执行。相比之下,如果要改模板,还是
sitmesh
好一些,如果要拖拽和个性化,还是
Ajax
效果更好。其它的普通页面,我认为以
struts2
的标签为基础,生成一些标准
HTML
元素,再以
Ajax
渲染
HTML
元素的方式是比较好的选择,而
Ajax
的渲染部分可以放到头部,由
sitmesh
配置,小的也可以放到自定义的标签代码中,这样页面代码(模块)比较标准和统一,要变化页面组合或渲染方式时只在配置上做文章。另外,纯以
struts2
的标准标签进行渲染,我并不赞成,除非是有非常固定的页面,又没有开发新样式的成本,否则页面太
DEMO
了,不具有实用性。
总之,
Ajax
和
struts2
各都有开放的特性,可以以不同粒度渲染页面,依据环境的不同,比较平衡的组合,依据开发人员层次,细分对数据逻辑的渲染和对表现逻辑的渲染,举个例子:用土做砖,用砖盖房,细化为不同流程,如果说用土盖房,将做砖的业务合到盖房的业务中,看起来是有问题的。专业一些的比方:我们为提高开发效率把美工和应用开发分开。以松耦合高内聚为前提的细化分工,是提高效率的基础。
分享到:
相关推荐
2.如何使用示例代码 3.我为什么要学习Wicket? 3.1。我们都喜欢意大利面:-) ... 3.2。面向组件的框架 - 概述 3.3。面向组件的Web开发框架的优点 3.4。Wicket与其他面向组件的框架相比 威克特说“你好世界!” 4.1。...
基于struts2+spring+springjdbc开发的代码分享网,所有源码已开源。 网站功能介绍: 1、邮件注册(采用阿里云企业邮箱),为了让大家体验一下邮箱注册功能。我已经在分享的源码中,为大家配置好了测试账户,大家可以...
16.2 协同使用Spring和WebWork 2/Struts 2 16.3 集成Spring和Tapestry 16.3.1 集成Spring和Tapestry 3 16.3.2 集成Spring和Tapestry 4 16.4 协同使用Spring和JSF 16.4.1 解析JSF管理的属性 16.4.2 解析Spring...
16.2 协同使用Spring和WebWork 2/Struts 2 16.3 集成Spring和Tapestry 16.3.1 集成Spring和Tapestry 3 16.3.2 集成Spring和Tapestry 4 16.4 协同使用Spring和JSF 16.4.1 解析JSF管理的属性 16.4.2 解析Spring...
16.2协同使用spring和webwork2/struts2 16.3集成spring和tapestry 16.3.1集成spring和tapestry3 16.3.2集成spring和tapestry4 16.4协同使用spring和jsf 16.4.1解析jsf管理的属性 16.4.2解析springbean 16.4.3...
2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...
8、增强的语法,如#ajax局部渲染,for-elsefor, select-case,安全输出符号! 等,这些语法特别适合模板开发。9、性能超高,具有最快的模板解释引擎,同时,又有较低的CPU消耗。适合各类模板引用,如CMS系统,超高...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...