仓酷云

标题: JAVA网站制作之Remote scripting using a servlet [打印本页]

作者: 若天明    时间: 2015-1-18 11:48
标题: JAVA网站制作之Remote scripting using a servlet
j2EE和asp比较,其实也没什么比的,原因和我上面说那些比较差不了多少,也是稳定性,安全性,J2EE比asp高,速度上比不过asp,asp也是延续着它的拖拽控件的方法,提高速度。servlet
ErikHatcher(erik@hatcher.net)President,eHatcherSolutions,Inc.01Feb2001
TheusersofWebapplicationshavesufferedadramaticshiftinexperiencesfromtheworldofdesktopapplications.ManyWebapplicationsdonotatallmimictheusability,interactivity,anddynamicnaturethatisavailableintypicalstandaloneorclient-serverdesktopapplicationsbecauseoftheconstraintsthatHTMLandHTTPimpose.Here,ErikHatcherexplainshowremotescriptingcanbeusedtoenhancetheinteractivityanddynamicnatureofaWebapplicationexperience.
OneofthemajordrawbackstoWebapplicationsisthattheuserexperienceistypicallyinferiortothatofdesktopapplications.MostcurrentWebapplicationslackininteractivitybecauseoncethebrowserreceivesaresponsetoitsURLrequestitisonitsown,failingtocommunicatebacktotheserveruntilahyperlinkisclickedoraformissubmitted.TechniquessuchasusingJavaScriptandDHTMLcanbeusedtomakethebrowserfeelmorelikeadesktopapplication;fanciertechniqueslikeusingFlash,ActiveX,andJavaappletscanalsoaccomplishthisend.

Butevenwiththesenewertechniquesandtechnologies,theclientisstillmostlyonitsownafteritreceivesthecontentfromtheWebserver.ThetechniquedescribedinthisarticleoffersasolutionthatallowsthebrowserandWebservertocommunicatebehindthescenes.ThebrowsercaninvokeremoteJavaservletmethodsthatenabletheuserexperiencetoresemblethatofadesktopapplication,suchaspopulatingadrop-downboxdynamicallybasedontheselectionofarelateddrop-downbox(thatis,category/subcategory),orpollingtheserverformessagesandrefreshingthedisplaydynamicallywithcontinuouslyupdatedcontent.

ClientsideTherearetwopopularwaysofaccomplishingremotemethodinvocationfromaWebbrowser:Microsoftremotescripting(MSRS)andBrentAshleysJavaScriptremotescripting(JSRS).Thegoalofbothisthesame:toinvokeremotemethodsandreturntheresultstothebrowser.BothmethodswereoriginallydesignedtocommunicatewithremotemethodsdefinedinMicrosoftsActiveServerPages.ThisarticleprovidesawayforbothofthesemethodstocommunicatewithaJavaservletontheserverside.Letsgetintothearchitecturedetailsofeachofthesetechniques.

RedmondscriptingMicrosoftsremotescriptingispartoftheVisualInterDevdevelopmentenvironment.Itconsistsofthreepieces:aninvisibleJavaapplet,client-sideJavaScript,andserver-sideJavaScriptrunninginActiveServerPages.TheJavaapplethandlesthecommunicationswiththeserver.Theclient-sideJavaScriptcommunicateswiththeapplet.Theserver-sideJavaScriptdealswithtakingtherequestedparametersanddispatchingthemtothespecifiedserver-sidemethod.ThecommunicationsaresimplyHTTPGETrequestsandresponses,withthedetailsofthemethodcallsentasqueryparameterstotheserver-sidescript.ThereismuchmoretobesaidaboutMicrosoftsremotescriptingarchitecture,butthatisbeyondthescopeofthisarticle(seeResources).

Figure1showsthearchitectureofMicrosoftremotescriptingusingaservletontheserver-side.

StepsinvolvedininvokingaremotemethodusingMicrosoftremotescripting:
ThebrowserexecutesaJavaScriptcalltoRSExecute(thisresidesinanincludedJavaScriptframeworkprovidedbyMicrosoftVisualInterDev).TheremotescriptingappletusesHTTPGETtoaccessaspecialservletURLontheserver,completewithmethodnameandparameters.TheservletreturnsitsXML-likeresponseandtheappletreceivesit.TheresponseisinterpretedbytheremotescriptingJavaScriptandreturnedtothecallingcode.Acallobjectisreturned,andtheactualreturnvalueisthe.return_valuepropertyifthemethodisreturnedsuccessfully.


Figure1.MicrosoftRemoteScriptingArchitecture

JSRSArchitectureBrentAshleysJavaScriptremotescriptingaccomplishesthesamegoalusinganiftyDHTMLtrickofinjectingahidden<IFRAME>or<LAYER>(dependingonthebrowsertype)foreachconcurrentremotescriptingcallmade.ThehiddenpieceisnavigatedtotheremotescriptingURLusingHTTPGET.TheresultreturnedfromtheserverisHTMLwithanonLoadJavaScriptcalltothemainwindowcallbackfunction.

Figure2showsthearchitectureofJavaScriptremotescriptingusingaservletontheserver-side.

StepsinvolvedininvokingaremotemethodusingJavaScriptremotescripting:
ThebrowserexecutesaJavaScriptcalltojsrsExecute(thisresidesintheexternaljsrsClient.jsfile[seeResourcestoobtainJSRS]).CodeinjsrsClient.jscreatesan<IFRAME>or<LAYER>(orre-usesanexistingone)andnavigatesittoaURLwiththeappropriateparameters.TheservletreturnsitsHTMLresponseandtheclientreceivesit.The<BODY>onLoadofthereturnedHTMLinvokesthespecifiedcallbackwiththereturnedvalue.


Note:TheexampleinthisarticleshowsMicrosoftsremotescriptingbeingusedsynchronously,butitcouldalsobeusedasynchronouslywithacallbackliketheJSRSexample.However,JSRSisnotcapableofmakingsynchronousmethodinvocations.

Figure2.BrentAshleysJavaScriptremotescriptingarchitecture

LetsseesomecodeTheservletdescribedbelowhasbeendesignedtosupportbothMSRSandJSRS.Thisflexibilitywillbedemonstratedbyallowingtheclienttotogglebetweenusingeithermethod.AsingleHTMLpageiscreatedwithboththeMSRSpieces(JavaScriptandapplet)andtheJSRS(asingleexternalJavaScript)piece.Usingthecategory/subcategoryidea,thegoalistohaveacategoryselectionwhichthendetermineswhichsubcategoryselectionsareavailable.HereistheHTML<BODY>:
Listing1.Categoryselection
<BODYonLoad="javascript:categoryChanged()"><FORMname="form1"><TABLE><TR><TH>RemoteScriptingType:</TH><TD><inputtype="radio"name="clientType"value="MSRS">MSRS<br/><inputtype="radio"name="clientType"value="JSRS"CHECKED>JSRS</TD></TR><TR><TH>Category:</TH><TD><SELECTname="category"onChange="javascript:categoryChanged()"><OPTIONvalue="0"SELECTED>Category0</OPTION><OPTIONvalue="1">Category1</OPTION><OPTIONvalue="2">Category2</OPTION><OPTIONvalue="3">ErrorTest</OPTION></SELECT></TD></TR><TR><TH>Subcategory:</TH><TD><SELECTname="subcategory"><!--Needaplaceholderuntilitcangetloaded--><OPTIONvalue="-1"SELECTED>---------------------</OPTION></SELECT></TD></TR></TABLE></FORM></BODY>

EverythingabouttheHTMLisstraightforward.NotethatcategoryChangediscalledwhenthedocumentisloadedandwhenthecategoryfieldischangedbytheuser.ThecategoryChangedmethodisdefinedas:
Listing2.categoryChangedmethod
functioncategoryChanged(){if(document.form1.clientType[0].checked){//MSRSvarco=RSExecute("/servlet/RSExample","getSubcategories",document.form1.category.options[document.form1.category.selectedIndex].value);if(co.status!=0){return;}varsubcatstr=co.return_value;populateDropDown(subcatstr);}else{//JSRSjsrsExecute("/servlet/RSExample",populateDropDown,"getSubcategories",document.form1.category.options[document.form1.category.selectedIndex].value);}}

RemotescriptingnowcomesintoplaybycallingtheremotemethodgetSubcategories.RefertotheMicrosoftremotescriptingdocumentationfordetailsoftheremotescripting"callobject"returnedfromRSExecute(seeResources).ThecalltojsrsExecutespecifiesthatpopulateDropDownwillbecalledwhentheasynchronouscallcompletes.RefertoResourcesforthedetailsofpopulateDropDown.

Ontheserverside,theservletisdefinedasinListing3.

RSExampleservlethasastaticpublicmethodnamed,notcoincidentally,getSubcategories.Thisimplementationis,ofcourse,simplyaproof-of-concept,butitcouldeasilybeextendedtodoadatabaselookupofthesubcategoriesrelatingtoacategory.NotethatthegetSubcategoriesfunctioncanonlydealwithacatidof0,1,or2.Thesamplecodeincludesademonstrationofinvokingthismethodwithaninvalidvalueof3("ErrorTest"inthecategorydrop-down).Usingremotescriptingisusefulwhenthecategory/subcategorycombinationsaretoonumeroustosendtothebrowserasJavaScriptobjects.Anynumberofmethodscouldbedefinedinthisservletandcalledsimilarlyfromtheclient.

Thesubcategoriesarereturnedtotheclientintheformat"index,value;index,value...."Ideally,thiskindofinformationshouldbepassedusingXML,butinordertomakethisschemebeascross-browserfriendlyaspossible,XMLisnottherightchoice.IftheapplicationenvironmentisconfinedtoInternetExplorer5browsers,thenXMLwouldbeaveryelegantwaytopassinformationwithremotescripting.

Inordertomaketheservletarchitectureasextensibleaspossible,anabstractclassthatextendsHttpServletwaswrittentodispatchthemethodinvocationgenericallyandpackagethereturnvalueinawaytheremotescriptingclient-sidecodeisbuilttohandle.TheHTTPGETmadebyMSRSandJSRSlookslikethecodeinListing4.

BecausetheURLsareuniqueenoughtoallowtheservlettodistinguishbetweenthetwodifferentclient-sidetechniques,asingleabstractservletclasswascreatedthatdynamicallyhandlesbothmethods.Toshowabitofthedetailsofhowthetwoclient-sideremotescriptingmethodsworkinternally;Listing5showstheformatthattheMicrosoftclient-sideremotescriptingpieceisexpectingastheresponsetothatrequest.

AtfirstglanceitwouldappearthatXMLisbeingusedbehindthescenes,butnotethatthevalueoftheTYPEattributeoftheRETURN_VALUEelementisnotdouble-quotedandthereforedoesnotfollowtheXMLspecification.Welljustshakeourheadsatthatapparentoversightandmoveon.TheVERSIONattributeoftheMETHODelementisignoredbytheclient-sidecode,butitwasleftinjusttokeepthingsconsistentwiththereturnvaluesfromMicrosoftsserver-sideimplementationinASP.ThevalueoftheRETURN_VALUEelementisURL-encoded.Thisvalueisunescapedintheclient-sideframeworkautomatically(notespacesreplacedby"%20"ratherthan"+,"asthatishowtheJavaScriptunescapefunctionrequires).Theclient-sideJavaScriptjustusestextfunctionstofindthenecessaryinformationintheresponseandbuildsthe"callobject"accordingly,whichisthenreturnedfromRSExecutetothecallingcode.

TheservletsimilarlybuildstheresponsetoJSRScallsintheformatthatitexpects.ThereturnvalueisshowninListing6.

TheheartofthemethodinvocationoccursinthedoGetmethodofRemoteScriptingServlet(asubclassofHttpServlet).HereistherelevantpartofdoGet:
Listing7.doGet
Stringmethod;intpcount=0;callbackName=request.getParameter("C");if(callbackName!=null){//clientisJSRS-itpassesa"C"parameterclientType=JSRS;method=request.getParameter("F");//JSRSdoesnttellushowmanyparameters,socountthemwhile(request.getParameter("P"+pcount)!=null)pcount++;}else{clientType=MSRS;method=request.getParameter("_method");pcount=Integer.parseInt(request.getParameter("pcount"));}//...somecodeomitted,refertothefullcodeincluded//findandinvoketheappropriatestaticmethodintheconcreteclassClassc=this.getClass();Methodm=c.getMethod(method,paramSpec);returnValue=(String)m.invoke(null,params);

RefertotheincludedcodeforthefullRemoteScriptingServletclass(seeListing8).Firsttheclienttypeisdetermined,keyedoffthe"C"parameterthatispresentforJSRS,butnotforMSRS.ThentheideaistogetareferencetotheClassoftheservletbeinginvoked(RSExample,inthiscase),getareferencetotheMethodbeinginvoked(getSubcategories)basedonthenumberofparameters,andtheninvokethatmethodwiththeappropriateparameters.Theparameterstothedispatchedmethodsmustmatchinnumberwiththecallfromtheclient,andmustallbeoftypeString(internallytothatmethod,theStringscanbeconvertedtoothertypesifnecessary).Dispatchingtostaticmethodswaschosenarbitrarily,butitcouldeasilydispatchtoinstancemethodsratherthanclassmethodsbyspecifying"this"asthefirstparametertoinvoke.Theentirecodeaboveiswrappedinsideatry/catchblock,andanyexceptionthrownwillbegracefullysentbacktotheclient.MSRSerrorsarereturnedbysettingtheTYPEattributeofRETURN_VALUEtoERROR,andspecifyingtheescapederrortextasthevalueofRETURN_VALUE.JSRSerrorsarereturnedasHTMLthatexecutesjsrsErrorintheonLoad.

Nowwhat?Thereareallkindsofinterestingthingsthatcanbeaccomplishedusingremotescripting.TakingadvantageoftheasynchronousfeatureofremotescriptingandJavaScriptwindowtimers,amessagingsystemcouldbebuilttoallowabrowsertopolltheserverformessages,content,orothertypesofupdateinformation.

IssuesBecauseofthetechnologiesusedinremotescripting,therearelimitationsonthenumberofbrowsersitwillworkwith.TouseMSRS,JavaScriptmustcommunicatewiththehiddenapplettoperformtheremotecall.TheJavaVirtualMachine(JVM)isonly"scriptable"(suchthatJavaScriptandJavaappletscancommunicate)onalimitednumberofbrowsers,meaningonlyNetscapeandInternetExploreronWin32(andpossiblyonotherplatforms)cansupportMSRS.BecauseallparametersareencodedintheURLforanHTTPGETrequest,thereisalimitationtothesizeoftheparameters.AmodifiedappletexiststhatdoesHTTPPOSTratherthanGETtoeliminatethislimitation.BrentAshleyssitehasthePOSTversionoftheappletavailablefordownload(seeResources.

Scalabilityissuesariseifremotescriptingisusedforcontinuouspolling.Dependingonanapplicationsneeds,thefrequencyofrequestscanbereducedorevenmadedynamicsuchthatitpollslessfrequentlyifitreceivesfewermessagesandincreasesthefrequencywhenlargersetsofmessagesarereceived.SinceHTTPGETisusedforthemethodcall,thesizeofthedatasenttothemethodisrestricted.Theresponsetoaremotemethodhasnoexplicitsizerestrictionsonsize;however,iflargeamountsofdataperrequestarebeingpassedtoorfromtheserver,thismessagingarchitectureisnotappropriate.

Thesecurityoftheremotescriptingmethodsshouldbeconsidered.BysimplyopeningtheappropriateURLalongwithitsnecessaryparametersinaWebbrowser,theremotemethodisbeingcalledanditsresultsarebeingsentback.Itmaybenecessarytoassurethattheuserisloggedintotheapplicationbeforereturninganyresults.Therearesecurityrestrictionsthatdonotallowabrowsertousecross-hostscripting,sothatthehostforthemainHTMLpagemustbethesameasthehostfortheremotescriptingservlet.

FirewallsarenotanissueforcommunicationsbecauseHTTPisused,althoughinsomeenvironmentsJavaappletsareblockedbyfirewallsthatwouldpreventMicrosoftsremotescriptingfromworking.HTTPSwillalsoworkfinewithbothclient-sidemethods.

ConclusionRemotescriptingisagreattechniqueforcreatingamoredesktop-likefeelforWebbrowser-basedapplications.TheRemoteScriptingServletbaseclassprovidedwiththisarticleopensthedoorforserver-sideJavaapplicationstousetrickspreviouslyonlyavailabletoActiveServerPageapplications.

Resources
ReadMicrosoftsdocumentationonremotescripting.DownloadBrentAshleysJSRS.GetthedetailsofpopulateDropDownDownloadwiththisexamplecode(includingtheRemoteScriptingServletclass).LearnthebeautyofJavasreflectionAPI.ApachesTomcatwasusedtotestthisservlet.

AbouttheauthorErikisthePresidentofeHatcherSolutions,Inc.HealsorecentlyjoinedPromoFuelastheirHighOctaneSiteArchitect.BeingactivelyinvolvedinsoftwaredeveloperorganizationsinTucson,AZ,hehaspresentedonWindowsNTsecurityanalysisattheBackOfficeAdministratorsConferenceandonXMLfortheTucsonDeveloperSeries.Youcanreachhimaterik@hatcher.net.
而学习JAVA我觉得最应该避免的就是:只学习,不思考,只记忆,不实践!
作者: 冷月葬花魂    时间: 2015-1-20 09:47
吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧
作者: 不帅    时间: 2015-1-29 06:38
Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。
作者: 小妖女    时间: 2015-2-5 20:49
[url]http://www.jdon.com/[/url]去下载,或到同济技术论坛的服务器[url]ftp://nro.shtdu.edu.cn[/url]去下,安装上有什么问题,可以到论坛上去提问。
作者: 愤怒的大鸟    时间: 2015-2-13 08:47
是一种将安全性(Security)列为第一优先考虑的语言
作者: 柔情似水    时间: 2015-3-3 18:17
你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢?
作者: 灵魂腐蚀    时间: 2015-3-11 12:14
是一种由美国SUN计算机公司(Sun Microsystems, Inc.)所研究而成的语言
作者: 活着的死人    时间: 2015-3-12 16:35
当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢?
作者: 深爱那片海    时间: 2015-3-19 23:57
那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?当然没那么简单,这只是万里长征走完了第一步。不信?那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧!
作者: 简单生活    时间: 2015-3-21 19:59
Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站
作者: 分手快乐    时间: 2015-4-15 11:40
Java 编程语言的风格十分接近C、C++语言。
作者: 第二个灵魂    时间: 2015-4-16 08:11
Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。
作者: 飘飘悠悠    时间: 2015-4-21 05:23
不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。
作者: 变相怪杰    时间: 2015-5-4 04:05
是一种使网页(Web Page)产生生动活泼画面的语言
作者: 谁可相欹    时间: 2015-5-11 20:00
我大二,Java也只学了一年,觉得还是看thinking in java好,有能力的话看英文原版(中文版翻的不怎么好),还能提高英文文档阅读能力。
作者: 精灵巫婆    时间: 2015-6-11 10:02
是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能
作者: admin    时间: 2015-6-19 21:59
Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站
作者: 山那边是海    时间: 2015-7-2 03:58
如果要向java web方向发展也要吧看看《Java web从入门到精通》学完再到《Struts2.0入门到精通》这样你差不多就把代码给学完了。有兴趣可以看一些设计模块和框架的包等等。
作者: 若天明    时间: 2015-7-3 04:59
有时间再研究一下MVC结构(把Model-View-Control分离开的设计思想)
作者: 莫相离    时间: 2015-7-4 15:30
所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。
作者: 乐观    时间: 2015-7-10 12:08
《JAVA语言程序设计》或《JAVA从入门到精通》这两本书开始学,等你编程有感觉的时候也可以回看一下。《JAVA读书笔记》这本书,因为讲的代码很多,也很容易看懂,涉及到面也到位。是你学习技术巩固的好书,学完后就看看《JAVA编程思想》这本书,找找一个自己写的代码跟书上的代码有什么不一样。




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2