仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2685|回复: 19
打印 上一主题 下一主题

[学习教程] JAVA网页设计使用GWT开辟高功能Ajax使用仓酷云

[复制链接]
小魔女 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:35:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
没有那个大公司会傻了吧唧用.net网页编程开发大型项目,开发了,那等于自己一半的生命线被微软握着呢。而.net网页编程不行,限制在window系统,又是捆绑,鄙视微软之!克日,InfoQ宣布了RyanDewsbury所著的GoogleWebToolkitApplication》书中的"IntegratingwithaGWT-RPCServlet"一章。
对功能的提拔是Ajax受接待的次要缘故原由。我们一般觉得那些所谓的眩目变更关于用户来讲是Ajax最吸惹人的中央,大概用户也的确因为这个缘故原由而对Ajax独占情钟。假如你转头往看那些传统的web使用,会发明它们几近静态到使人恶感,以是说用户仅仅出于这些眩目变更而选择Ajax不无事理。但是,假如说眩目标变更真得年夜年夜改良了用户体验的话,那末静态的gif图片应当遭到更普遍的使用才是。谢天谢地,Web使用早已走过这类稚嫩的时期。Ajax不会再反复静态gif图片的老路,它不会再把重点放在这类眩目标变更上了。因而,不管人们是不是感觉或是意想到,Ajax真正改良用户体验的中央仍是在对功能的提拔上。
这篇文章的重点并不是要申明Ajax生成在哪些方面比传统Web使用优异。关于这个成绩,只需将Google舆图与其他Web舆图大概将Gmail与Hotmail举行对照,天然就能够得出结论。固然,使用Ajax切实其实能明显改良功能和用户体验。但在此,我要向人人展现的是怎样将Ajax使用的功能进步到一个新的条理——从而使您的使用锋芒毕露。
选择GWT的来由

GoogleWebToolkit(GWT)将Ajax的开辟促进了一年夜步,但是面临当下品种单一的Ajax办理计划,此类新手艺的推行不免碰到各种应战。但无能否认,在Ajax开辟方面,GWT给开辟者供应了其他办理计划无与伦比的便当。假如你还没有遭到任何开辟框架束厄局促的话,其实没有甚么来由不选择GWT,由于GWT可以无偿的使使用的全体功能失掉年夜幅度提拔。
我所说的“无偿”是指在开辟中能够抛开功能成绩不思索,而将次要精神会合在营业逻辑方面,由于GWT自己已能使功能失掉优化。GWT带有一个能将Java代码编译成JavaScript的编译器。假如熟习编译言语(C、Java等等)的话,你必定懂得平台自力性是此类言语寻求的一个方针,因而其编译器可以针对特定平台对代码举行优化,如许程序员就能够将重点放在代码的布局构造和可读性上。GWT编译器也做了相似的事变,它将Java代码编译成一些高度优化的JavaScript文件,每一个文件对应于一种特定的扫瞄器,个中的优化步骤还使用了一般编译器中的优化办法,往失落了没有被挪用的函数和内联代码。此种体例失掉的代码绝对间接编写的JavaScript代码要小的多并且做到了扫瞄器自力,因而实行效力较高。本色上GWT已将JavaScript看做web中的汇编代码来处置。在扫瞄器加载JavaScript代码的时分,仅仅加载针对该扫瞄器所需的代码罢了。利用GWT的使用比任何间接用JavaScript完成的使用要来得更精华精辟更快。对行将公布的GWT1.5版本,GWT开辟团队深信其编译器天生的代码会比其他任何手工编写的代码都要快。以上这些应当足以压服人人选用GWT作为Ajax的办理计划,假如还不敷,另有很多其他充实的来由,好比你能够在开辟GWT程序时使用某些Java开辟工具(能用Eclipse来调试Ajax程序在我看来的确是一个十分有份量的砝码)。
如虎添翼

还远不止这些呢!Ajax已比传统web使用要杰出很多,而GWT又远超一样平常的Ajax手艺。只复杂地做些手艺决意就可以让你将年夜部分精神放在营业功效上,到达事半功倍的效果,开辟出完善的使用。固然,GWT并不是平空就可以做到这些,上面我将报告几种进一步提拔GWT功能办法。
1、一直做好缓存

当你将GWT的Java代码编译成JavaScript后,对应于每一个扫瞄器版本城市有天生一个响应的文件,该文件接纳独一标识的文件名。这些就是你的使用程序的代码文件,间接把它们放到一个web服务器上就可以公布你的使用了。因为文件名是经由过程对你的代码举行Hash函数盘算而得,以是文件名自己就已包括了版本信息。假如你修正了代码后从头编译,天生的文件会有新的文件名。这意味着要末文件已被下载到了当地扫瞄器,要末历来没有被哀求过,因而就没有需要用反省文件修正日期(HTTP的If-Modified-Since头)的办法来决意是不是必要版本更新。如许能够削减良多不用要的HTTP哀求历程,固然这些哀求历程独自大概很微乎其微,可是当用户量到达必定水平,它们就会酿成不能不思索的要素。这类哀求对客户端来讲也是一种拖累,由于对统一个使用,每一个扫瞄器最多只能有两个举动的哀求。良多对Ajax下载工夫的优化都是从削减向服务器发送的哀求量动手的。
为了不扫瞄器对版本的哀求,你能够经由过程设置web服务器来向客户端发送ExpiresHTTP头。这个ExpiresHTTP头包括页面过时的工夫,如许就能够制止扫瞄器在页面过时工夫之前发送版本反省的哀求。在Apache中设置这些十分简单,只必要将以下内容到场到.htaccess文件便可:
  1. ExpiresDefault"nowplus1year"
复制代码
Apache会给一切切合*.cache.*形式的文件加上expires头,设置其生效日期为一年后,此形式将婚配一切GWT使用文件。假如你利用的是Tomcat,也可间接经由过程servlet过滤器来增加头部。增添一个servlet过滤器十分复杂,只必要在WEB_INF/web.xml文件中增加此过滤器的声明,比方:
  1. CacheFiltercom.rdews.cms.filters.CacheFilterCacheFilter/gwt/*
复制代码
如许tomcat就晓得在那里找到此过滤器、晓得哪些文件能够经由过程该过滤器。本例中,/gwt/*形式暗示gwt文件夹下的一切文件。这个过滤器的完成类将经由过程doFilter办法来增加Expires头。对GWT使用来讲,我们必要在每一个不切合*.nocache.*形式的文件里增加此Expires头。nocache文件是不必要缓存的,由于个中含有版本选择的逻辑。以下是这个过滤器的完成代码:
  1. publicclassCacheFilterimplementsFilter{privateFilterConfigfilterConfig;publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainfilterChain)throwsIOException,ServletException{HttpServletRequesthttpRequest=(HttpServletRequest)request;StringrequestURI=httpRequest.getRequestURI();if(!requestURI.contains(".nocache.")){longtoday=newDate().getTime();HttpServletResponsehttpResponse=(HttpServletResponse)response;httpResponse.setDateHeader("Expires",today+31536000000L);}filterChain.doFilter(request,response);}publicvoidinit(FilterConfigfilterConfig)throwsServletException{this.filterConfig=filterConfig;}publicvoiddestroy(){this.filterConfig=null;}}
复制代码
2.程序紧缩

经由过程往失落未被挪用的办法和晦涩的代码、利用冗长的变量名和办法名等体例,GWT编译器在削减代码量方面体现得十分杰出,可是最初失掉的代码文本仍旧是未经紧缩的。因而能够经由过程gzip紧缩必要部署的使用程序的办法进一步减小代码文件的巨细。gzip能够将使用程序紧缩到本来的70%摆布,从而进步使用的下载速率。
侥幸的是,文件紧缩也能够复杂地经由过程设置服务器来完成,独一要做的只是在Apache服务器的.htaccess文件中加上以下语句:
  1. SetOutputFilterDEFLATE
复制代码
Apache起首会主动与扫瞄器举行相同,依据扫瞄器的撑持情形从而决意是不是发送紧缩版本,不外今朝一切支流扫瞄器都撑持gzip紧缩。
假如利用的是Tomcat,那末能够间接使用server.xml文件中Connector元素,只需加上以下的属性就能够举行程叙文件的紧缩了:
  1. compression="on"
复制代码
3.图片打包

Ajax使用借助于扫瞄器和HTTP协定壮大的散布力气,但是扫瞄器和HTTP协定自己对散布Ajax使用没有出格的优化。Ajax使用是必要部署的,在这一点上它跟桌面使用程序有些相象,而传统的web程序利用的是共享资本散布模子(sharedresourcedistributionmodel),在程序运转过程当中扫瞄器和服务器间会不休举行交互,从而对页面所必要的资本举行办理。这类体例使资本可以在页面间共享弛缓存,从而包管翻开新页面所需的下载量到达最小化。在Ajax使用中,资本一样平常不会散布在页面间,因而不必要独自对其举行下载缓存。不外,关于Ajax使用,鄙人载使用程序资本时接纳传统的散布式模子也并不是不成行,很多Ajax使用也恰是这么做的。
但是,你能够选择将程序顶用到的一切图片兼并到一个文件中,以削减HTTP哀求的次数。如许能够冲破统一工夫只能发送两个哀求的限定,一次性地下载一切图片。
GWT从1.4版本入手下手撑持ImageBundle接口。在这个接口中能够为每个图片创建一个办法,编译器会将一切的图片组合到一个文件中,并将图片数据的Hash做为新文件的文件名(象程序代码一样永世缓存这个文件)。一次性打包兼并的图片数目是没无限制的,一切这些图片只必要一次哀求就能够全体下载。
在已完成的几个GWT项目中我一向相沿将基础图片打包的做法,以下是示例代码:
  1. publicinterfaceImagesextendsImageBundle{/***@gwt.resourcemembersm.png*/AbstractImagePrototypemember();/***@gwt.resourceaway.png*/AbstractImagePrototypeaway();/***@gwt.resourcestarsm.gif*/AbstractImagePrototypestar();/***@gwt.resourceturn.png*/AbstractImagePrototypeturn();/***@gwt.resourceuser_add.png*/AbstractImagePrototypeaddFavorite();}
复制代码
NoticethateachmethodhasacommentannotationspecifyingtheimagefiletouseandamethodthatreturnsanAbstractImagePrototype.TheAbstractImagePrototypehasacreateImagemethodthatreturnsanImagewidgetthatcanbeusedintheapplication"sinterface.Thefollowingcodeillustrateshowtousethisimagebundle:
  1. Imagesimages=(Images)GWT.create(Images.class);mainPanel.add(images.turn().createImage());
复制代码
必要注重的是每一个办法都有一个大众注解来指明图片的文件名,办法的前往范例都是AbstractImagePrototype。AbstractImagePrototype类的createImage办法将前往一个能够在程序接口中利用的图片widget。以下的代码展现了怎样利用该图片包:
  1. Imagesimages=(Images)GWT.create(Images.class);mainPanel.add(images.turn().createImage());
复制代码
这统统看上往很复杂,不外恰是这些看似复杂的工具开启了GWT功能提拔之门。
4.利用StyleInjector

我们又该怎样处置CSS文件和CSS图片等使用程序资本呢?在传统的web散布模子中,这些都作为内部资本而被自力下载弛缓存。在Ajax使用中,如许做意味着分外的HTTP哀求弛缓慢的程序加载。今朝,GWT对此还没有供应任何优化,但在GWT的官方孵化项目中有一些很成心思的GWT代码,这些代码极可能会包括在GWT的将来版本中,个中特别值得存眷的是ImmutableResourceBundle和StyleInjector两个类。
ImmutableResourceBundle的功效和ImageBundle很类似,可是它能够用于包含CSS和CSS图片在内的任何范例的资本。这个类的目标在于为程序资本供应一个笼统,使得处置它们的体例对扫瞄器来讲到达最优化。上面这个类便是一个可用于加载CSS文件及其相干资本的例子:
  1. publicinterfaceResourcesextendsImmutableResourceBundle{/***@gwt.resourcemain.css*/publicTextResourcemainCss();/***@gwt.resourceback.gif*/publicDataResourcebackground();/***@gwt.resourcetitlebar.gif*/publicDataResourcetitleBar();/***@gwt.resourcedialog-header.png*/publicDataResourcedialogHeader();}
复制代码
这个类会为每一个资本指定一个文件和办法,这一点和ImageBundle十分相似,但它的前往范例是DataResource或TextResource。关于TextResource类,我们能够经由过程其getText办法失掉指定文件中的内容,而关于DataResource类,我们能够用getUrl办法来失掉资本的援用(比方对图片大概IFRAME的援用)。分歧的扫瞄器对这些数据的加载体例各不不异,但我们不必忧虑这些。年夜多半情形下,数据会经由过程利用URL前缀之内联URL的体例呈现。这个类的用处很普遍,可是最间接的使用大概仍是将CSS与其他程叙文件一块打包利用。
能够注重到,在这个接口中援用了一个CSS文件及其一些图片。在这类情形下,该接口被拿来将CSS及其图片与程叙文件举行打包,从而削减HTTP哀求的次数和延长使用启动工夫。在CSS文件中一样平常会指定一些背景图片,但会利用占位符(placeholder)来代替实在的图片URL。这些占位符被用来援用打包的文件中其他一些元素,特别是图片。比方,main.css文件有如许一个名为gwt-DialogBox的CSS划定规矩:
  1. .gwt-DialogBox{background-image:url("%background%")repeat-x;}
复制代码
假如要在程序中使用此CSS文件和图片,你必要用到孵化项目中的StyleInjector类。StyleInjector会将CSS文件中的占位符婚配到打包文件中的特定资本,然后再将CSS文件注进到扫瞄器中供给用程序利用。这听起是挺庞大,但实践利用仍是对照便利的,重点是它能改良使用的功能。上面这段代码是利用StyleInjector将CSS从资本包注进到使用程序中的一个例子:
  1. CacheFiltercom.rdews.cms.filters.CacheFilterCacheFilter/gwt/*0
复制代码
必要注重的是以上这些今朝仍是孵化项目标一部分,在正式公布前随时都有大概做调剂。
结论

总之,Ajax使用相对传统web使用在利用性上有质的奔腾,同时GWT所供应的工具能使你的Ajax功能无偿地失掉年夜幅度提拔。关于这一点,你能够将GWTmailsample的启动速率跟其他Ajax使用典范做个对照。假如再在传统web使用和Ajax使用间在部署差别加以存眷的话,我们还能够进一步进步使用的功能。关于下一代的Ajax使用,我充斥了等候。
作者先容

RyanDewsbury精晓C++和Java言语,1998年从业以来分离处置历程序员、架构师和征询参谋等多种脚色的事情。后来几年Ryan在帮忙一个半导体系体例造公司构建体系框架。比来他次要使用前沿软件为一些创业型互联网公司改良用户体验。别的,这些年Ryan还处置过一些自力软件项目标开辟事情,包含2004年的EasyMessage,和比来的两个基于GWT的web游戏网站Gpokr(gpokr.com)和KDice(kdice.com)。
注:文中的代码大概笔墨其实不触及平安或非常处置。
本文内容摘自《GoogleWebToolkitApplications》一书,作者RyanDewsbury,PrenticeHallProfessional2007年11月出书,版权一切,PearsonEducation,Inc2008,ISBN:0321501969。更多信息请扫瞄www.informit.com/title/0321501969
检察英文原文:HighPerformanceAjaxwithGWT
来自:http://www.infoq.com/cn/articles/gwt-high-ajax

专门做了这个例子;而java的这个例子好像就是为了教学而写的,很多教学目的的例子是不考虑优化、性能的。
爱飞 该用户已被删除
沙发
发表于 2015-1-21 10:39:58 | 只看该作者
是一种使网页(Web Page)由静态(Static)转变为动态(Dynamic)的语言
乐观 该用户已被删除
板凳
发表于 2015-1-24 14:24:43 | 只看该作者
Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。
兰色精灵 该用户已被删除
地板
发表于 2015-2-1 16:49:32 | 只看该作者
其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。
深爱那片海 该用户已被删除
5#
发表于 2015-2-7 09:47:14 | 只看该作者
你一定会高兴地说,哈哈,原来成为Java高手就这么简单啊!记得Tomjava也曾碰到过一个项目经理,号称Java很简单,只要三个月就可以学会。
柔情似水 该用户已被删除
6#
发表于 2015-2-21 12:35:11 | 只看该作者
你快去找一份Java的编程工作来做吧(如果是在校学生可以去做兼职啊),在实践中提高自己,那才是最快的。不过你得祈祷在公司里碰到一个高手,而且他 还愿意不厌其烦地教你,这样好象有点难哦!还有一个办法就是读开放源码的程序了。我们知道开放源码大都出自高手,他们设计合理,考虑周到,再加上有广大的程序员参与,代码的价值自然是字字珠叽,铿锵有力(对不起,偶最近《金装四大才子》看多了)。
老尸 该用户已被删除
7#
发表于 2015-2-27 07:42:58 | 只看该作者
一般学编程语言都是从C语开始学的,我也不例外,但还是可能不学过程语言而直接学面向对象语言的,你是刚接触语言,还是从C开始学比较好,基础会很深点,如果你直接学习JAVA也能上手,一般大家在学语言的时候都记一些语言的关键词,常有的包和接口等。再去做逻辑代码的编写,以后的学习过程都是从逻辑代码编写中提升的,所以这方面都是经验积累的。你要开始学习就从
透明 该用户已被删除
8#
发表于 2015-3-8 23:21:38 | 只看该作者
Java是一种计算机编程语言,拥有跨平台、面向对java
海妖 该用户已被删除
9#
发表于 2015-3-16 17:40:42 | 只看该作者
Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。
小魔女 该用户已被删除
10#
 楼主| 发表于 2015-3-22 23:28:17 | 只看该作者
其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。
简单生活 该用户已被删除
11#
发表于 2015-3-28 12:46:25 | 只看该作者
关于设计模式的资料,还是向大家推荐banq的网站 [url]http://www.jdon.com/[/url],他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。
飘灵儿 该用户已被删除
12#
发表于 2015-3-31 05:50:19 | 只看该作者
学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。
飘飘悠悠 该用户已被删除
13#
发表于 2015-4-4 14:59:11 | 只看该作者
是一种语言,用以产生「小应用程序(Applet(s))
精灵巫婆 该用户已被删除
14#
发表于 2015-4-14 16:53:59 | 只看该作者
那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?当然没那么简单,这只是万里长征走完了第一步。不信?那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧!
莫相离 该用户已被删除
15#
发表于 2015-5-8 09:18:11 | 只看该作者
关于设计模式的资料,还是向大家推荐banq的网站 [url]http://www.jdon.com/[/url],他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。
第二个灵魂 该用户已被删除
16#
发表于 2015-5-10 16:06:22 | 只看该作者
关于设计模式的资料,还是向大家推荐banq的网站 [url]http://www.jdon.com/[/url],他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。
再见西城 该用户已被删除
17#
发表于 2015-5-11 10:09:34 | 只看该作者
吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧
不帅 该用户已被删除
18#
发表于 2015-6-3 21:55:22 | 只看该作者
Java是一个纯的面向对象的程序设计语言,它继承了 C++语言面向对象技术的核心。Java舍弃了C ++语言中容易引起错误的指针(以引用取代)、运算符重载(operator overloading)
谁可相欹 该用户已被删除
19#
发表于 2015-7-9 21:28:34 | 只看该作者
Pet Store.(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要 错过了。
若相依 该用户已被删除
20#
发表于 2015-7-12 16:31:20 | 只看该作者
还好,SUN提供了Javabean可以把你的JSP中的 Java代码封装起来,便于调用也便于重用。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 02:22

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表