`
shishi11
  • 浏览: 116900 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

页面渲染 ajax vs struts2

阅读更多

<!----><!----> <!-- /* 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 各都有开放的特性,可以以不同粒度渲染页面,依据环境的不同,比较平衡的组合,依据开发人员层次,细分对数据逻辑的渲染和对表现逻辑的渲染,举个例子:用土做砖,用砖盖房,细化为不同流程,如果说用土盖房,将做砖的业务合到盖房的业务中,看起来是有问题的。专业一些的比方:我们为提高开发效率把美工和应用开发分开。以松耦合高内聚为前提的细化分工,是提高效率的基础。

分享到:
评论

相关推荐

    struts-ajax.rar_ajax struts _struts ajax_struts ajax war

    Struts和Ajax是两种在Web开发中...此外,通过分析项目中的JSP页面,还可以了解如何在页面上动态渲染从服务器获取的数据。这是一个非常有价值的资源,对于想要提升Struts应用性能和用户体验的开发者来说,尤其有价值。

    Struts 2及AJAX框架的详细介绍

    Struts 2提供了多种与AJAX集成的方式,如使用Struts2的AJAX插件,或者直接利用jQuery等库来实现AJAX请求。 在"从Struts应用开发框架转移到Struts 2 WEB框架 教程.doc"中,可能详细讲解了以下几个方面: 1. **...

    ZTree+Struts2+ajax+json实现checkbox权限树

    【标题】"ZTree+Struts2+ajax+json实现checkbox权限树"涉及的技术栈主要集中在前端的ZTree,后端的Struts2框架,以及数据交互中的Ajax和JSON。这个项目的核心目标是构建一个可复选的权限树形结构,用户通过勾选节点...

    Jquery_Ajax_Struts2_Action_JSP_Json

    在Struts2框架中,JSP通常用作展示模板,将Action返回的数据渲染成页面。 5. JSON(JavaScript Object Notation):JSON是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。在本例中,JSON...

    ajax + struts2 jar 包 java开发者必备的jar包 项目中刚使用

    Struts2可以通过配置Action和Result来定义请求的处理路径和响应格式,而Ajax则负责异步处理这些响应,更新页面元素。 在Java开发者的工作环境中,常常会使用到一系列的jar包来支持Ajax和Struts2的整合。这些jar包...

    ajax+struts2无刷新取后台

    在IT行业中,Ajax(Asynchronous JavaScript and XML)与Struts2框架的结合使用,是实现Web应用程序无刷新交互的关键技术。这种技术允许用户在不重新加载整个网页的情况下,与服务器交换数据并局部更新页面,极大地...

    Ajax和Struts的个人笔记

    Ajax和Struts2在实际开发中的结合使用,通常是为了提升用户体验。例如,当用户在前端填写表单时,可以使用Ajax发送异步请求,Struts2后端接收请求并处理业务逻辑,然后返回JSON数据。前端JavaScript接收到响应后,...

    ajax,struts2,jsp,java验证用户名是否存在

    在用户名验证中,Struts2处理前端AJAX请求,调用后台Action类的方法进行数据库查询,并将结果以JSON或XML格式返回给前端。 **JSP(JavaServer Pages)**: JSP是动态生成HTML页面的Java技术。在本实例中,JSP可能...

    Struts2+Spring+Hibernate+Ajax框架整合

    Struts2+Spring+Hibernate+Ajax框架整合是一个常见的企业级应用开发模式,也被称为SSH2框架。这个项目展示了如何将这四个强大的技术组件融合在一起,以实现高效、灵活且易于维护的Web应用程序。 Struts2作为MVC...

    精通JAVA Web整合开发jsp+ajax+struts+hibernate 第07章 Java EE应用中的异步通信技术AJAX

    本章将深入探讨AJAX(Asynchronous JavaScript and XML)技术,它是实现Web页面无刷新更新的关键技术,广泛用于现代网页应用中。AJAX允许在不重新加载整个网页的情况下,与服务器交换数据并局部更新页面,从而极大地...

    struts2+ajaxForm

    Struts2提供了一套完整的生命周期管理,包括Action的创建、执行和销毁,以及结果的渲染。其配置文件(struts.xml)用于定义Action和Result的映射,可以灵活地控制应用程序的行为。 2. **Ajax**:Ajax(Asynchronous...

    Ajax 验证和Struts2

    ### Ajax 验证与 Struts2 的深度融合 #### 原文解读与核心知识点提炼 **原文题目**:“Ajax 验证和 Struts2” **作者**:Oleg Mikheev **来源**:JavaWorld.com **链接**:...

    jQuery+Struts+Ajax无刷新分页

    本项目采用jQuery、Struts2和Ajax技术实现了这样一个功能,用户可以在不重新加载整个页面的情况下查看不同页的数据,提高了交互效率。 ### 1. jQuery jQuery是一个强大的JavaScript库,简化了JavaScript的DOM操作...

    用案例学Java Web整合开发:Java+Eclipse+Struts 2+Ajax

    Java Web整合开发是构建Web应用程序的关键技术,涵盖了Java语言、Eclipse集成开发环境(IDE)、Struts 2框架以及Ajax异步JavaScript和XML技术。这个主题深入探讨了这些技术如何协同工作,创建出高效、用户友好的Web...

    ajax、Struts、spring整合工程

    4. **视图层整合**:视图层通常由JSP页面构成,可以使用Struts2的标签库进行渲染。Ajax请求通常会返回JSON数据,通过JavaScript处理响应并更新DOM。 5. **配置Ajax**:在客户端,可以使用jQuery或者其他JavaScript库...

    Ajax using XMLHttpRequest and Struts

    2. **异步通信**:利用XMLHttpRequest进行后台数据的异步加载,Struts框架负责处理数据并返回结果,Ajax则负责前端的动态渲染,实现流畅的用户体验。 3. **表单验证**:在表单提交前,使用Ajax进行预验证,减少...

    Ajax+Struts+HIbernate实现省市联动

    2. 配置Struts:定义Action类来处理Ajax请求,根据省份ID获取城市列表,并将其转化为JSON格式,以便Ajax能理解。 3. 使用Ajax:在前端页面上,当用户选择省份时,触发Ajax请求,向服务器发送省份ID。 4. Hibernate...

    struts2+hibernate(文件批量上传至数据库+Ajax分页显示)

    总之,这个项目展示了如何将Struts2和Hibernate结合使用,以实现文件批量上传到数据库以及Ajax分页显示的功能。通过学习这个项目,开发者可以深入理解Java Web开发中的MVC模式、ORM框架以及前端动态加载技术。

    Struts+Hibernate+Ajax注册示例

    Struts、Hibernate和Ajax是Java Web开发中的三个关键框架,它们各自解决不同的问题,并且可以协同工作以构建高效、功能丰富的应用程序。在这个“Struts+Hibernate+Ajax注册示例”中,我们将深入探讨这三个技术如何...

    struts2+json

    这个资源"struts2+json"显然涉及到在Struts2框架下实现JSON(JavaScript Object Notation)数据交换,这是一种轻量级的数据交换格式,广泛用于前后端交互,特别是AJAX(Asynchronous JavaScript and XML)请求。...

Global site tag (gtag.js) - Google Analytics