o'reilly : java servlet and jsp cookbookdl.booktolearn.com/ebooks2/computer/programming/... ·...

1236
Table of Contents Index Reviews Reader Reviews Errata Academic Java Servlet & JSP Cookbook By Bruce W. Perry Publisher : O'Reilly Pub Date : January 2004 ISBN : 0-596-00572-5 Pages : 746 With literally hundreds of examples and thousands of lines of code, the Java Servlet and JSP Cookbook yields tips and techniques that any Java web developer who uses JavaServer Pages or servlets will use every day, along with full-fledged solutions to significant web application development problems that developers can insert directly into

Upload: others

Post on 02-Jun-2020

97 views

Category:

Documents


12 download

TRANSCRIPT

Page 1: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

• TableofContents• Index• Reviews• ReaderReviews• Errata• Academic

JavaServlet&JSPCookbookByBruceW.Perry

Publisher :O'ReillyPubDate :January2004

ISBN :0-596-00572-5Pages :746

Withliterallyhundredsofexamplesandthousandsoflinesofcode,theJavaServletandJSPCookbookyieldstipsandtechniquesthatanyJavawebdeveloperwhousesJavaServerPagesorservletswilluseeveryday,alongwithfull-fledgedsolutionstosignificantwebapplicationdevelopmentproblemsthatdeveloperscaninsertdirectlyinto

Page 2: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

theirownapplications.

Page 3: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

• TableofContents• Index• Reviews• ReaderReviews• Errata• Academic

JavaServlet&JSPCookbookByBruceW.Perry

Publisher :O'ReillyPubDate :January2004

ISBN :0-596-00572-5Pages :746

Copyright Preface What'sintheBook

Audience

Organization

ConventionsUsedinThisBook

UsingCodeExamples

CommentsandQuestions

Acknowledgments

Chapter1.WritingServletsandJSPs Introduction

Recipe1.1.WritingaServlet

Page 4: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe1.2.WritingaJSP

Recipe1.3.CompilingaServlet

Recipe1.4.PackagingServletsandJSPs

Recipe1.5.CreatingtheDeploymentDescriptor

Chapter2.DeployingServletsandJSPs Introduction

Recipe2.1.DeployinganIndividualServletonTomcat

Recipe2.2.UsingaContextElementinTomcat'sserver.xml

Recipe2.3.DeployinganIndividualServletonWebLogic

Recipe2.4.DeployinganIndividualJSPonTomcat

Recipe2.5.DeployinganIndividualJSPonWebLogic

Recipe2.6.DeployingaWebApplicationonTomcat

Recipe2.7.DeployingaWebApplicationonWebLogicUsingAnt

Recipe2.8.UsingtheWebLogicAdministrationConsole

Recipe2.9.UsingWebLogicBuildertoDeployaWebApplication

Recipe2.10.Usingtheweblogic.DeployerCommand-LineTool

Chapter3.NamingYourServlets Introduction

Recipe3.1.MappingaServlettoaNameinweb.xml

Recipe3.2.CreatingMoreThanOneMappingtoaServlet

Recipe3.3.CreatingaJSP-TypeURLforaServlet

Recipe3.4.MappingStaticContenttoaServlet

Recipe3.5.InvokingaServletWithoutaweb.xmlMapping

Recipe3.6.MappingAllRequestsWithinaWebApplicationtoaServlet

Recipe3.7.MappingRequeststoaControllerandPreservingServletMappings

Recipe3.8.CreatingWelcomeFilesforaWebApplication

Recipe3.9.RestrictingRequestsforCertainServlets

Recipe3.10.GivingOnlytheControllerAccesstoCertainServlets

Chapter4.UsingApacheAnt Introduction

Recipe4.1.ObtainingandSettingUpAnt

Recipe4.2.UsingAntTargets

Recipe4.3.IncludingTomcatJARfilesintheBuildFileClasspath

Recipe4.4.CompilingaServletwithanAntBuildFile

Recipe4.5.CreatingaWARFilewithAnt

Recipe4.6.CreatingaJARFilewithAnt

Recipe4.7.StartingaTomcatApplicationwithAnt

Recipe4.8.StoppingaTomcatApplicationwithAnt

Page 5: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Chapter5.AlteringtheFormatofJSPs

Introduction

Recipe5.1.PrecompilingaJSPinTomcat

Recipe5.2.PrecompilingaJSPinWebLogic

Recipe5.3.PrecompilingJSPswiththePrecompilationProtocol

Recipe5.4.MappingaJSPtoItsPageImplementationClass

Recipe5.5.CreatingaJSPfromScratchasaJSPDocument

Recipe5.6.GeneratinganXMLViewfromaJSP

Chapter6.DynamicallyIncludingContentinServletsandJSPs Introduction

Recipe6.1.IncludingaResourceEachTimeaServletHandlesaRequest

Recipe6.2.UsinganExternalConfigurationtoIncludeaResourceinaServlet

Recipe6.3.IncludingResourcesNestedatMultipleLevelsinaServlet

Recipe6.4.IncludingaResourcethatSeldomChangesintoaJSP

Recipe6.5.IncludingContentinaJSPEachTimetheJSPHandlesaRequest

Recipe6.6.UsinganExternalConfigurationFiletoIncludeaResourceinaJSP

Recipe6.7.IncludinganXMLFragmentinaJSPDocument

Recipe6.8.IncludingContentfromOutsideaContextinaJSP

Chapter7.HandlingWebFormDatainServletsandJSPs Introduction

Recipe7.1.HandlingaPOSTHTTPRequestinaServlet

Recipe7.2.HandlingaPOSTHTTPRequestinaJSP

Recipe7.3.SettingthePropertiesofaJavaBeaninaJSP

Recipe7.4.SettingaScopedAttributeinaJSPtotheValueofaFormParameter

Recipe7.5.PostingDatafromaServlet

Recipe7.6.PostingDatafromaJSP

Recipe7.7.UsingaServlettoAddaParametertoaQueryString

Recipe7.8.UsingaJSPtoAddaParametertoaQueryString

Recipe7.9.UsingaFiltertoReadParameterValues

Chapter8.UploadingFiles Introduction

Recipe8.1.PreparingtheHTMLPageforFileUploads

Recipe8.2.Usingthecom.oreilly.servletLibrary

Recipe8.3.UploadingOneFileataTime

Recipe8.4.UploadingMultipleFiles

Recipe8.5.RenamingFiles

Recipe8.6.UsingaJSPtoHandleaFileUpload

Chapter9.HandlingExceptionsinWebApplications

Page 6: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Introduction

Recipe9.1.DeclaringExceptionHandlersinweb.xml

Recipe9.2.CreatinganException-HandlingServlet

Recipe9.3.SendinganErrorfromaServlet

Recipe9.4.SendinganErrorfromaJSP

Recipe9.5.CreatinganError-HandlingJSP

Recipe9.6.DeclaringaSpecialException-HandlingJSPforOtherJSPs

Chapter10.ReadingandSettingCookies Introduction

Recipe10.1.SettingaCookiewithaServlet

Recipe10.2.CreatinganArrayfromAlloftheRequest'sCookies

Recipe10.3.SettingaCookiewithaJSP

Recipe10.4.ReadingCookieValueswithaServlet

Recipe10.5.ReadingCookieValueswithaJSP

Recipe10.6.AlteringorRemovingaCookieThatHasAlreadyBeenSet

Chapter11.SessionTracking Introduction

Recipe11.1.SettingtheSessionTimeoutinweb.xml

Recipe11.2.SettingtheSessionTimeoutinAllTomcatWebApplications

Recipe11.3.SettingtheSessionTimeoutProgrammatically

Recipe11.4.CheckingifaSessionExistsinanHttpServletRequest

Recipe11.5.TrackingSessionActivityinServlets

Recipe11.6.TrackingSessionActivityinJSPs

Recipe11.7.UsingURLRewritinginaJSP

Recipe11.8.UsingURLRewritinginaServlet

Recipe11.9.UsingaListenertoTracktheSessionLifecycle

Recipe11.10.UsingaListenertoMonitorSessionAttributes

Recipe11.11.UsingaFiltertoMonitorSessionAttributes

Chapter12.IntegratingJavaScriptwithServletsandJSPs Introduction

Recipe12.1.IncludingJavaScriptModulesinaServlet

Recipe12.2.IncludingJavaScriptModulesinaJSP

Recipe12.3.CreatingaNewWindowwithJavaScriptinaServlet

Recipe12.4.CreatingaNewWindowwithJavaScriptinaJSP

Recipe12.5.UsingJavaScripttoValidateFormValuesinaServlet

Recipe12.6.UsingJavaScripttoValidateFormValuesinaJSP

Chapter13.SendingNon-HTMLContent Introduction

Recipe13.1.SendingaPDFFile

Page 7: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe13.2.SendingaWordProcessingFile

Recipe13.3.SendinganXMLfile

Recipe13.4.SendinganAudioFile

Recipe13.5.ViewingInternalResourcesinaServlet

Chapter14.LoggingMessagesfromServletsandJSPs Introduction

Recipe14.1.LoggingWithoutLog4j

Recipe14.2.SettingUpLog4j

Recipe14.3.UsingaLoggerWithoutaConfigurationFile

Recipe14.4.AddinganAppendertotheRootLogger

Recipe14.5.UsingaPatternwithaLogger'sAppender

Recipe14.6.Usinglog4jinaJSP

Recipe14.7.LoggingMessagesUsingaServletContextEventListener

Recipe14.8.LoggingMessagesUsingaSessionEventListener

Chapter15.AuthenticatingClients Introduction

Recipe15.1.CreatingUsersandPasswordswithTomcat

Recipe15.2.SettingUpSSLonTomcat

Recipe15.3.UsingBASICAuthentication

Recipe15.4.UsingForm-BasedAuthentication

Recipe15.5.LoggingOutaUser

Recipe15.6.UsingJAAStoCreateaLoginModule

Recipe15.7.CreatingtheJAASConfigurationFile

Recipe15.8.UsingJAASinaServlet

Recipe15.9.UsingJAASinaJSP

Chapter16.Binding,Accessing,andRemovingAttributesinWebApplications Introduction

Recipe16.1.SettingServletContextAttributesinServlets

Recipe16.2.SettingServletContextAttributesinJSPs

Recipe16.3.AccessingorRemovingServletContextAttributesinServlets

Recipe16.4.AccessingorRemovingServletContextAttributesinJSPs

Recipe16.5.SettingSessionAttributesinServlets

Recipe16.6.SettingSessionAttributesinJSPs

Recipe16.7.AccessingorRemovingSessionAttributesinServlets

Recipe16.8.AccessingorRemovingSessionAttributesinJSPs

Recipe16.9.SettingRequestAttributesinServlets

Recipe16.10.SettingRequestAttributesinJSPs

Recipe16.11.AccessingorRemovingRequestAttributesinServlets

Recipe16.12.AccessingorRemovingRequestAttributesinJSPs

Page 8: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Chapter17.EmbeddingMultimediainJSPs Introduction

Recipe17.1.EmbeddinganAppletinaJSPUsingjsp:plugin

Recipe17.2.EmbeddinganAppletinaJSPUsingtheHTMLConverter

Recipe17.3.AutomaticallyCreatingHTMLTemplateforIncludingFlashFiles

Recipe17.4.WritingHTMLTemplatetoEmbedaFlashFile

Recipe17.5.EmbeddingFlashinaServlet

Recipe17.6.EmbeddingaQuickTimeMovieinaJSP

Recipe17.7.EmbeddinganSVGFileinaJSP

Recipe17.8.EmbeddingaBackgroundSoundtrackinaJSP

Chapter18.WorkingWiththeClientRequest Introduction

Recipe18.1.ExaminingHTTPRequestHeadersinaServlet

Recipe18.2.ExaminingHTTPRequestHeadersinaJSP

Recipe18.3.UsingaFiltertoAlterRequestHeaders

Recipe18.4.AutomaticallyRefreshingaServlet

Recipe18.5.AutomaticallyRefreshingaJSP

Recipe18.6.CountingtheNumberofWebApplicationRequests

Chapter19.FilteringRequestsandResponses Introduction

Recipe19.1.MappingaFiltertoaServlet

Recipe19.2.MappingaFiltertoaJSP

Recipe19.3.MappingMoreThanOneFiltertoaServlet

Recipe19.4.ChangingtheOrderinWhichFiltersareAppliedtoServlets

Recipe19.5.ConfiguringInitializationParametersforaFilter

Recipe19.6.OptionallyBlockingaRequestwithaFilter

Recipe19.7.FilteringtheHTTPResponse

Recipe19.8.UsingFilterswithRequestDispatcherObjects

Recipe19.9.CheckingFormParameterswithaFilter

Recipe19.10.BlockingIPAddresseswithaFilter

Chapter20.ManagingEmailinServletsandJSPs Introduction

Recipe20.1.PlacingtheEmail-RelatedClassesonyourClasspath

Recipe20.2.SendingEmailfromaServlet

Recipe20.3.SendingEmailfromaServletUsingaJavaBean

Recipe20.4.AccessingEmailfromaServlet

Recipe20.5.AccessingEmailfromaServletUsingaJavaBean

Recipe20.6.HandlingAttachmentsfromanEmailReceivedinaServlet

Recipe20.7.AddingAttachmentstoanEmailinaServlet

Page 9: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe20.8.ReadingaReceivedEmail'sHeadersfromaServlet

Chapter21.AccessingDatabases Introduction

Recipe21.1.AccessingaDatabasefromaServletWithoutDataSource

Recipe21.2.ConfiguringaDataSourceinTomcat

Recipe21.3.UsingaDataSourceinaServletwithTomcat

Recipe21.4.CreatingaDataSourceonWebLogic

Recipe21.5.UsingaJNDILookuptogetaDataSourcefromWebLogic

Recipe21.6.UsingaDataSourcefromWebLogicinaJSP

Recipe21.7.CallingaStoredProcedurefromaServlet

Recipe21.8.CallingaStoredProcedurefromaJSP

Recipe21.9.ConvertingaResultSettoaResultObject

Recipe21.10.ExecutingSeveralSQLStatementsWithinaSingleTransaction

Recipe21.11.UsingTransactionswithJSPs

Recipe21.12.FindingInformationaboutaResultSet

Chapter22.UsingCustomTagLibraries Introduction

Recipe22.1.CreatingaClassicTagHandler

Recipe22.2.CreatingaJSP1.2TLDforaClassicTagHandler

Recipe22.3.CreatingaJSP2.0TLDforaClassicTagHandler

Recipe22.4.PackagingaTagLibraryinaWebApplication

Recipe22.5.PackagingtheTagLibraryinaJARFile

Recipe22.6.UsingtheCustomTaginaJSP

Recipe22.7.HandlingExceptionsinaCustomTagClass

Recipe22.8.CreatingaSimpleTagHandler

Recipe22.9.CreatingaTLDforaSimpleTagHandler

Recipe22.10.UsingaSimpleTagHandlerinaJSP

Recipe22.11.CreatingaJSPTagFile

Recipe22.12.PackagingtheJSPTagFileinaWebApplication

Recipe22.13.PackagingtheJSPTagFileinaJAR

Recipe22.14.UsingaCustomTagAssociatedwithaTagFile

Recipe22.15.AddingaListenerClasstoaTagLibrary

Chapter23.UsingtheJSTL Introduction

Recipe23.1.DownloadingtheJSTL1.0andUsingtheJSTLTagsinJSPs

Recipe23.2.DownloadingtheJavaWebServicesDeveloperPack

Recipe23.3.UsingtheCoreJSTLTags

Recipe23.4.UsingtheXMLCoreJSTLTags

Recipe23.5.UsingtheXMLTransformTags

Page 10: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe23.6.UsingtheFormattingJSTLTags

Recipe23.7.UsingASQLJSTLTagwithaDataSourceConfiguration

Recipe23.8.UsingASQLJSTLTagWithoutaDataSourceConfiguration

Recipe23.9.AccessingScopedVariableswiththeEL

Recipe23.10.AccessingRequestParameterswiththeEL

Recipe23.11.UsingtheELtoAccessRequestHeaders

Recipe23.12.UsingtheELtoAccessOneRequestHeader

Recipe23.13.AccessingCookieswiththeEL

Recipe23.14.UsingtheELtoAccessJavaBeanProperties

Recipe23.15.UsingJSTLFunctions

Chapter24.Internationalization Introduction

Recipe24.1.DetectingtheClientLocaleinaServlet

Recipe24.2.DetectingtheClient'sLocalesinaJSP

Recipe24.3.CreatingaResourceBundleasaPropertiesFile

Recipe24.4.CreatingaResourceBundleasaJavaClass

Recipe24.5.UsingtheResourceBundleinaServlet

Recipe24.6.UsingtheResourceBundleinaJSP

Recipe24.7.FormattingDatesinaServlet

Recipe24.8.FormattingDatesinaJSP

Recipe24.9.FormattingCurrenciesinaServlet

Recipe24.10.FormattingCurrenciesinaJSP

Recipe24.11.FormattingPercentagesinaServlet

Recipe24.12.FormattingPercentagesinaJSP

Recipe24.13.SettingtheLocalizationContextintheDeploymentDescriptor

Chapter25.UsingJNDIandEnterpriseJavaBeans Introduction

Recipe25.1.ConfiguringaJNDIObjectinTomcat

Recipe25.2.AccessingtheTomcatJNDIResourcefromaServlet

Recipe25.3.AccessingtheTomcatJNDIResourcefromaJSP

Recipe25.4.ConfiguringaJNDIResourceinWebLogic

Recipe25.5.ViewingtheJNDITreeinWebLogic

Recipe25.6.AccessingtheWebLogicJNDIResourcefromaServlet

Recipe25.7.AccessingtheWebLogicJNDIResourcefromaJSP

Recipe25.8.AccessinganEJBUsingtheWebLogicJNDITree

Chapter26.HarvestingWebInformation Introduction

Recipe26.1.ParsinganHTMLPageUsingthejavax.swing.textSubpackages

Recipe26.2.UsingaServlettoHarvestWebData

Page 11: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe26.3.CreatingaJavaBeanasaWebPageParser

Recipe26.4.UsingtheWebPageParsingJavaBeaninaServlet

Recipe26.5.UsingtheWebPageParsingJavaBeaninaJSP

Chapter27.UsingtheGoogleandAmazonWebAPIs Introduction

Recipe27.1.GettingSetUpwithGoogle'sWebAPI

Recipe27.2.CreatingaJavaBeantoConnectwithGoogle

Recipe27.3.UsingaServlettoConnectwithGoogle

Recipe27.4.UsingaJSPtoConnectwithGoogle

Recipe27.5.GettingSetUpwithAmazon'sWebServicesAPI

Recipe27.6.CreatingaJavaBeantoConnectwithAmazon

Recipe27.7.UsingaServlettoConnectwithAmazon

Recipe27.8.UsingaJSPtoConnectwithAmazon

Colophon Index

Page 12: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Copyright

Copyright©2004O'ReillyMedia,Inc.

PrintedintheUnitedStatesofAmerica.

PublishedbyO'ReillyMediaInc.,1005GravensteinHighwayNorth,Sebastopol,CA95472.

O'Reilly&Associatesbooksmaybepurchasedforeducational,business,orsalespromotionaluse.Onlineeditionsarealsoavailableformosttitles(http://safari.oreilly.com).Formoreinformation,contactourcorporate/institutionalsalesdepartment:(800)[email protected].

NutshellHandbook,theNutshellHandbooklogo,andtheO'ReillylogoareregisteredtrademarksofO'ReillyMedia,IncTheCookbookseriesdesignations,JavaServletandJSPCookbook,theimageofafennecfox,andrelatedtradedressaretrademarksofO'Reilly&Associates,Inc.

JavaandallJava-basedtrademarksandlogosaretrademarksorregisteredtrademarksofSunMicrosystems,Inc.,intheUnitedStatesandothercountries.O'ReillyMedia,Inc.isindependentofSunMicrosystems,Inc.

Manyofthedesignationsusedbymanufacturersandsellerstodistinguishtheirproductsareclaimedastrademarks.Wherethosedesignationsappearinthisbook,andO'Reilly&Associateswasawareofatrademarkclaim,thedesignationshavebeenprintedincapsorinitialcaps.

Whileeveryprecautionhasbeentakeninthepreparationofthisbook,thepublisherandauthorsassumenoresponsibilityforerrorsoromissions,orfordamagesresultingfromtheuseoftheinformationcontainedherein.

Page 13: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

PrefaceOnahistoricaltimeline,thesagaofJavaasaserver-sideprogrammer'stoolofchoicebeganinearly1997whenSunMicrosystemsreleasedthe"Java™WebServer"betaandJavaServletDevelopersKit.[1]ServletsareatypeofJavaclassthatexecutesonaserver.Servletsdynamicallyhandlenetworkedrequestsandresponses,mostlyusingtheHypertextTransferProtocol(HTTP).InJune1999,SunintroducedJavaServerPages(JSPs),whichintermingledJavacodewithJavaScriptandHTMLtemplatetext.

[1]SeeSunMicrosystemsJavamilestonesandhistoryat:http://java.sun.com/features/2000/06/time-line.html.

JSPs,astheyarenowevolving(withJSPVersion2.0),aredesignedtoencapsulatedomainlogicinstandardandcustomtags,andseparatethisdomainlayerfromtheJSPcomponent'spresentationlogic.Thelatterconceptmeans"thestuffthatpeoplesee"whentheyinteractwithawebapplication,suchasHTML-relatedscreenwidgets.Ideally,aJSPusestagstointeractwithdatabasesandencapsulatedomainrules,andstaticordynamicallygeneratedtemplatetext,suchasXMLorXHTML,tocreatethevisualpagefortheuser.

Duringthelate1990s,Iwasafreelance,backendwebdeveloperusinganumberofdifferentlanguages.Whenserver-sideJavaappearedonthescene,Igreetedthenewswithasmuchreliefasjoy.Designedfromthebottomupasobject-orientedandmodular,Javarepresentedareassuringalternativetotheadhoc,ill-designed,albeitwell-intentionedmassesofweb-relatedcodeIwouldoftenencounterwhenanorganizationbroughtmeintothemidstofaproject.

Notonlycanyoueasilycreateyourownreusablecomponentsfor,say,sendingemailsimplybydesigninganduploadingtoyourwebapplicationoneormoreJavaclasses,[2]butyouhavetheentireJavaAPIatyourdisposalfordealingwithessential,low-levelitemssuchasString-

Page 14: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

handling,fileI/O,andMathcalculations.Whatadeal!

[2]Forexample,theinstallationofabinaryActiveServerPages(ASP)componentoftenrequiredthescrutinyandpermissionofthehostingInternetServiceProvider(ISP),becauseabadlywrittenormaliciousASPcomponentcouldwreakhavocontheservermachine.

TheotherbigbenefitJavaprovidesisitscross-platformnature.Webdeveloperscandesigntheirwebapplications,neatlypackagetheminaspecialJARfileforwebcomponentscalledaWebApplicationArchivefile,theninstalltheWARsonvariousservershostedbydifferentoperatingsystems(OSes).JavawebcomponentsarenotboundtoasingleOSortoaparticularvendor'sserversoftwarelikeotherweb-relatedsoftwaretechnologies.

Jumpaheadtothepresent.Bylate2003,Javahasachievedstatusasthegranddaddyofserver-sidedevelopment.ServletsandJSPsareincludedintheJava2EnterpriseEdition(J2EE),awidelyacceptedenterprisetechnologyfornetwork-basedanddistributedcomputing.Hundredsofthousandsofdevelopersthroughouttheworldworkonthe"webtier"ofJ2EE-basedtechnologies,usingservlets,JSPs,andsometimesspecialwebframeworkssuchasStruts.

Infact,manywebdevelopersnowspendafairamountoftimegettingtoknowvarious"applicationservers"likeBEAWebLogic,JBoss,orIBM'sWebSpherethatpulltogetherthewebtier,businessordomainobjects(suchascomponentsthathandleweatherdataoracustomer'sfinancialaccounts),andEnterpriseInformationSystems(EIS).TheseapplicationserversrepresentthesoftwarehostforservletsandJSPs.Manywebdevelopers,includingmyself,spendalotoftimeworkingonwebcomponentsthatarehostedonTomcat,apopularopensource(http://www.opensource.org)servletengineand"referenceimplementation"forthenewservletandJSPAPIs.[3]

[3]Areferenceimplementationissoftwarethatisbasedonacommonlyagreeduponspecification,andisfreelyavailabletosoftwaredevelopersandothersasademonstrationofhowthespecifiedsoftwaresystemisdesignedtofunction.

Page 15: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Therapidmaturationandwell-establishednatureofJavahasnaturallyledtoa"cookbook"approachforourbook.Thiscookbookfocusesonhowtoinitiatecertainweb-relatedtasksinJava,ratherthantutoringthereaderonhowtousetheJavalanguage,orexplainingtheservletandJSPAPIsinfinelygraineddetail.Countlesstutorial-orientedJavabooksstillexist,however,inneworreissuedform,whichatteststothepopularityofJavaasaweb-developmentplatform.

Page 16: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

What'sintheBook

Increatingtherecipesforthisbook,ItriedtocoverasmanycommonandadvancedwebdevelopertasksasIcouldpracticallyfitintoonebook.Thisamountstoabout230differentrecipes.Eachrecipeshowshowtoimplementaparticulartaskusingservlets,JSPs,and,inmanycases,oneormoresupportingJavaclasses.

Therecipesshowhowto:

Authenticatewebclients

Interactwithdatabases

Sendemail

Handlesubmitteddatafromawebform

Readandset"cookies"

Uploadfilesfromtheclient

IntegrateJavaScriptwithservletsandJSPs

EmbedmultimediafileslikedigitalmoviesandmusicinJSPsandservlets

Handlewebclientswhoseusersspeakdifferentlanguages(internationalization)

LogmessagesfromservletsandJSPs

Dynamicallyincludechunksofcontent,asintraditionalserver-side

Page 17: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

include(SSI)code

InteractwithEnterpriseJavaBeans(EJBs)fromaJSPandservlet

UseAmazon.com'sandGoogle.com'sWebServicesAPIsfromaservletorJSP

Ihavealsoincludednumeroustechnology-specificrecipes,suchas:

Using"sessions"inyourJavawebapplications(aconceptthatrepresentsthetrackingofauser'sprogressthroughawebsite)

Workingwith"filters"

UsingtheopensourceANTtooltobuildwebapplications

BindingJavaobjectstoasessionorwebapplicationsotheycanbeusedasinformationordatacontainers

CreatingyourowncustomtagsforJSPs

UsingtheJavaServerPagesStandardTagLibrary(JSTL),whichisalargesetofprebuilttagsyoucanuseinJSPs

Inshort,thebookisdesignedtohelpguideJavawebdevelopersintheireverydaytasks,andtoprovidequicksolutionstotypicalweb-relatedproblems.

BEAWebLogicRecipes

BecauseJavawebdeveloperstendtoworkwithbothTomcatandaproprietaryapplicationserver,I'veincludedanumberofdifferentrecipestoshowhowtoimplementcommontaskswithBEAWebLogic.Asa

Page 18: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

practicalmatter,Icouldnotcovertheseveralotherapplicationserversthatareavailable,suchasIBM'sWebSphere,JBoss,Jetty,Oracle9iapplicationserver,orcommercialservletenginessuchasNewAtlantaServletExecandCauchoResin.ButIwantedtoincluderecipescovering"howtheotherhalflives"intermsofusingvariousvendortoolsformanagingeverydayweb-applicationtasks.SolutionsinvolvingthedeploymentorrevisionofwebcomponentsanddeploymentdescriptorsusingvisualinterfacessuchasWebLogic'sAdministrationConsoleorWebLogicBuildercanbequitedifferentfromthoseusedwithTomcat.

Asaresult,thisbookincludesacollectionofbasicWebLogic-relatedrecipes,suchasdeployingwebapplicationsonWebLogic,andusingaservlettoaccessaWebLogicDataSource.Chapter25showshowaservletcaninteractwithanEJBinstalledonWebLogic.

Page 19: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Audience

Therecipesaremainlydesignedforexperienceddeveloperswhodesign,build,deploy,andreviseJava-basedwebapplications.ThisincludesJSP,servlet,andJavaBeandevelopers.

ThebookisalsoappropriateforexperiencedwebdeveloperswhoarejustlearningJavaandmigratingfromanotherwebprogrammingplatform,suchasActiveServerPages,PHP,orPerl.Thesedevelopersareusuallyknowledgableabouttheunderlyingmechanisms,suchassessions,cookies,fileuploads,loginauthentication,andhandlingHTTPPOSTrequests,butmaynotyetknowhowtoimplementthesetasksinJava.Thecookbookallowsthemtoquicklylookupasolutiontoaproblemthattheyhaveprobablyalreadydealtwithusinganotherlanguage.

JavadeveloperswhoneedtoknowhowtoimplementnewservletAPI2.4andJSP2.0features(suchassomeofthenewweb.xmlfilter-mappingelementsforrequestdispatchersandembeddingtheExpressionLanguage[EL]inaJSP'stemplatetext)willalsofindthecookbookhandy.

WhatYouNeedtoKnow

ReadersshouldknowthebasicsoftheJavalanguageorbelearninghowtoprogramwithJava.

Chapter1,includesbriefintroductionstoservlets,JSPs,anddeploymentdescriptorsforreaderswhoarenotyetuptospeedontheseconcepts.However,sincethecookbook'sfocusisonconcisesolutionstospecificproblems,itdoesnotincludelongtutorialsontheservletandJSPAPIs.Eachrecipeincludesanintroductionthatprovidesenoughinformationtogetstartedwiththevarioustechnologiesandcodesamples.Therecipesalsoincludenumerousreferencestoonlineinformationresources,suchasJavadocpagesandtutorials,forreaderswhoneedtoexploreatopic

Page 20: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

ingreaterdepth.

ReaderswillbenefitfromhavingalreadybeenintroducedtovariousJ2EEsubjectareassuchasJavaDatabaseConnectivity(JDBC),theJavaNamingandDirectoryInterface(JNDI),andEnterpriseJavaBeans(IhaveincludedonerecipethatinvolvesconnectingawebcomponentwithEJBsusingJNDI).

Finally,aworkingknowledgeofXMLisalsohelpful,asJavawebdevelopmentinvolvesXML-baseddeploymentdescriptorsandconfigurationfiles.

Page 21: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Organization

ThebookbeginswiththreechaptersthatcoverthenutsandboltsofwritingservletsandJSPs,deployingservletsandJSPs,namingorregisteringyourservlets,andusingtheAnttool.

Ithenexploreseveralbasictopicsonwebdevelopment,suchasdynamicallyincludingcontentinwebpages,uploadingfiles,handlingdatathathasbeenpostedfromanHTMLform,readingandsettingcookies,trackingsessions,andintegratingJavaScriptwithJSPsandservlets.

Next,thebookincludessomemoreadvancedrecipes,suchasloggingmessages,authenticatingclients,bindingattributes,workingwiththeclientrequest,andcreatingservletfilters.Chapter20,andChapter21,covertwocommonandcomplexweb-developmenttaskswith20differentrecipes.

Chapter22,andChapter23describecustomtagsandtheJSTL.Chapter24,discussesthecrucialtopicofinternationalizingyourwebapplicationswithservletsandJSPs.

ForwebdeveloperswhosewebcomponentsmustinteractwithEJBsusingtheJavaJNDI,Chapter25,showshowtoconfigureJNDIinbothTomcatandWebLogic,aswellashowtoaccessJNDIobjectsusingbothservers.

ThebookconcludeswithtwochaptersthatdescribedifferentstrategiesforextractingdatafromwebsitesusingJavawebcomponents.Chapter26,hasrecipesonharvestingor"scraping"datafromwebpages.Chapter27,describeshowtouseGoogle'sandAmazon.com'swebservicesAPIs.

Page 22: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

ConventionsUsedinThisBook

Thefollowingtypographicalconventionsareusedinthisbook:

Italic

Indicatesnewterms,exampleURLs,emailaddresses,filenames,fileextensions,pathnames,directories,andUnixutilities.

Constantwidth

Indicatescommands,options,switches,variables,attributes,keys,functions,types,classes,namespaces,methods,modules,properties,parameters,values,objects,events,eventhandlers,XMLtags,HTMLtags,macros,thecontentsoffiles,ortheoutputfromcommands.

Constantwidthbold

Showscommandsorothertextthatshouldbetypedliterallybytheuser,andisusedtoemphasizecodeinexamples.

Constantwidthitalic

Showstextthatshouldbereplacedwithuser-suppliedvalues.Insomecaseswheretextisalreadyitalicized,user-suppliedvaluesareshowninangledbrackets(<>)

Thisiconsignifiesatip,suggestion,orgeneralnote.

Page 23: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Thisiconindicatesawarningorcaution.

Page 24: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

UsingCodeExamples

Thisbookisheretohelpyougetyourjobdone.Ingeneral,youmayusethecodeinthisbookinyourprogramsanddocumentation.Youdonotneedtocontactusforpermissionunlessyou'rereproducingasignificantportionofthecode.Forexample,writingaprogramthatusesseveralchunksofcodefromthisbookdoesnotrequirepermission.SellingordistributingaCD-ROMofexamplesfromO'Reillybooksdoesrequirepermission.Answeringaquestionbycitingthisbookandquotingexamplecodedoesnotrequirepermission.Incorporatingasignificantamountofexamplecodefromthisbookintoyourproduct'sdocumentationdoesrequirepermission.

O'Reilly&Associatesandtheauthorbothappreciate,butdonotrequire,attribution.Anattributionusuallyincludesthetitle,author,publisher,andISBN.Forexample:"JavaServletandJSPCookbook,byBrucePerry.Copyright2004O'Reilly&Associates,Inc.,0-596-00572-5."

Ifyoufeelyouruseofcodeexamplesfallsoutsidefairuseorthepermissiongivenabove,[email protected].

Page 25: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

CommentsandQuestions

Pleaseaddresscommentsandquestionsconcerningthisbooktothepublisher:

O'Reilly&Associates,Inc.1005GravensteinHighwayNorthSebastopol,CA95472(800)998-9938(intheUnitedStatesorCanada)(707)829-0515(internationalorlocal)(707)829-0104(fax)

O'Reillyhasawebpageforthisbook,whereerrata,examples,andanyadditionalinformationislisted.Youcanaccessthispageat:

http://www.oreilly.com/catalog/jsvltjspckbk

Tocommentorasktechnicalquestionsaboutthisbook,sendemailto:

[email protected]

FormoreinformationaboutO'Reillybooks,conferences,ResourceCenters,andtheO'ReillyNetwork,seeourwebsiteat:

http://www.oreilly.com

Page 26: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Acknowledgments

Onenight,morethanayearago,IdispatchedanemailtoO'Reillywithanideaforabook.Atthattime,thelikelihoodthatthiscasualemailwouldeventuallygiverisetoapublishedbookseemedveryremote.Afternumerousemailed"backandforths"betweenmeandacoupleofO'ReillyJavaeditors,andthenseveralmonthsofgentlenudging,solidediting,occasionalreconceptualizations,and(ofcourse)writing,writing,andmorewriting,theseedofthebookideagerminatedandreachedfruition.Voilá,acookbookisborn!

Theshapingofabookisalwaysacollaborationamongseveralpeople.ThisbookprobablywouldnothaveleftthelaunchingpadwithoutmyeditorBrettMcLaughlin'ssuccinctandcontinuousremindersaboutwhatdifferentiatesacookbookfromotherbooktypes.Brettisalsoafine"wordbyword"copyeditor,andhavinganeditorialbackgroundmyself,Iappreciatedhiseffortsfromthewriter'sside.Also,Brett'sknowledgeofJavaisdeep,andhiscommentshelpedmeavoidsomeawkwardcodedesigndecisions.

IamveryfortunatetohaveJasonHunterandSangShinastechnicaleditors.Theyarebothwell-knownJavaexperts,andthisisamuchbetterbooksincetheyhavereadandcommentedonlargechunksofit.Theirreviewhadareallyshortdeadline,andthisisabigbook.Iwasamazedatthecomprehensivecoveragewithsuchashortturnaround.Asatechnicalwriter,Iamindebtedtothosewhorescuemefromembarrassingmistakes!

Someofussaveourfamilymembersforlastinacknowledgingthosewhohelpus.Maybethatisbecausethelastparagraphisthefoundationonwhichtherestofthelanguagesits,justasthefamilyiseverywriter'sfoundation,givingthemsupportandshieldingthemfromdistractionsastheyimmersethemselvesinproseandtechnology.ThisbookwouldnothavebeencreatedwithoutthehelpfrommywifeStacy,daughterRachel,andevenScott,whoinspiresmefromthetendervantagepointofbeinglessthanoneyearold.I'llalsorepeatwhatIsaidinmyAppleScriptbook;

Page 27: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

IthankmyparentsRobertandAnnePerryforinstallinginmealoveofwritingandbooks.

Page 28: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Chapter1.WritingServletsandJSPs

Introduction

Recipe1.1.WritingaServlet

Recipe1.2.WritingaJSP

Recipe1.3.CompilingaServlet

Recipe1.4.PackagingServletsandJSPs

Recipe1.5.CreatingtheDeploymentDescriptor

Page 29: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Introduction

Thepurposeofthischapteristobringrelativenewcomersuptospeedinwriting,compiling,andpackagingservletsandJSPs.IfyouhaveneverdevelopedaservletorJSPbefore,orjustneedtobrushuponthetechnologytojumpstartyourdevelopment,thentheupcomingrecipesprovidesimpleprogrammingexamplesandanoverviewofthecomponentsthatyourequireontheuserclasspathtocompileservlets.

Recipe1.1andRecipe1.2provideabriefintroductiontoservletsandJSPs,respectively.AcomprehensivedescriptionofaservletorJSP'sroleintheJava2Platform,EnterpriseEdition(J2EE),isbeyondthescopeoftheserecipes.However,informationthatrelatesdirectlytoJ2EEtechnology,suchasdatabasesandJDBC;usingservletswiththeJavaNamingandDirectoryInterface(JNDI);andusingservletswithJavaMail(oremail)isdistributedthroughoutthebook(andindex!).

The"SeeAlso"sectionsconcludingeachrecipeprovidepointerstocloselyrelatedchapters,anonlinetutorialmanagedbySunMicrosystems,andotherO'Reillybooksthatcoverthesetopicsindepth.

Page 30: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe1.1WritingaServlet

Problem

Youwanttowriteaservletthatispartofawebapplication.

Solution

CreateaJavaclassthatextendsjavax.servlet.http.HttpServlet.Makesuretoimporttheclassesfromservlet.jar(orservlet-api.jar)you'llneedthemtocompiletheservlet.

Discussion

AservletisaJavaclassthatisdesignedtorespondwithdynamiccontenttoclientrequestsoveranetwork.IfyouarefamiliarwithCommonGatewayInterface(CGI)programs,thenservletsareaJavatechnologythatcanreplaceCGIprograms.Oftencalledawebcomponent(alongwithJSPs),aservletisexecutedwithinaruntimeenvironmentprovidedbyaservletcontainerorwebcontainersuchasJakartaTomcatorBEAWebLogic.

Awebcontainercanbeanadd-oncomponenttoanHTTPserver,oritcanbeastandaloneserversuchasTomcat,whichiscapableofmanagingHTTPrequestsforbothstaticcontent(HTMLfiles)aswellasforservletsandJSPs.

Servletsareinstalledinwebcontainersaspartofwebapplications.

Page 31: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

TheseapplicationsarecollectionsofwebresourcessuchasHTMLpages,images,multimediacontent,servlets,JavaServerPages,XMLconfigurationfiles,Javasupportclasses,andJavasupportlibraries.Whenawebapplicationisdeployedinawebcontainer,thecontainercreatesandloadsinstancesoftheJavaservletclassintoitsJavaVirtualMachine(JVM)tohandlerequestsfortheservlet.

Aservlethandleseachrequestasaseparatethread.Therefore,servletdevelopershavetoconsiderwhethertosynchronizeaccesstoinstancevariables,classvariables,orsharedresourcessuchasadatabaseconnection,dependingonhowtheseresourcesareused.

Allservletsimplementthejavax.servlet.Servletinterface.Webapplicationdeveloperstypicallywriteservletsthatextendjavax.servlet.http.HttpServlet,anabstractclassthatimplementstheServletinterfaceandisspeciallydesignedtohandleHTTPrequests.

Thefollowingbasicsequenceoccurswhenthewebcontainercreatesaservletinstance:

1. Theservletcontainercallstheservlet'sinit()method,whichisdesignedtoinitializeresourcesthattheservletmightuse,suchasalogger(seeChapter14).Theinit()methodgetscalledonlyonceduringtheservlet'slifetime.

Theinit()methodinitializesanobjectthatimplementsthejavax.servlet.ServletConfiginterface.Thisobjectgivestheservletaccesstoinitializationparametersdeclaredinthedeploymentdescriptor(seeRecipe1.5).ServletConfigalsogivestheservletaccesstoajavax.servlet.ServletContextobject,withwhichtheservletcanlogmessages,dispatchrequeststootherwebcomponents,andgetaccesstootherwebresourcesinthesameapplication(seeRecipe13.5).

Page 32: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Servletdevelopersarenotrequiredtoimplementtheinit()methodintheirHttpServletsubclasses.

3. Theservletcontainercallstheservlet'sservice()methodinresponsetoservletrequests.IntermsofHttpServlets,service()automaticallycallstheappropriateHTTPmethodtohandletherequestbycalling(generally)theservlet'sdoGet()ordoPost()methods.Forexample,theservletrespondstoausersendingaPOSTHTTPrequestwithadoPost()methodexecution.

WhencallingthetwoprincipalHttpServletmethods,doGet()ordoPost(),theservletcontainercreatesjavax.servlet.http.HttpServletRequestandHttpServletResponseobjectsandpassestheminasparameterstotheserequesthandlermethods.HttpServletRequestrepresentstherequest;HttpServletResponseencapsulatestheservlet'sresponsetotherequest.

Example1-1showsthetypicalusesoftherequestandresponseobjects.ItisagoodideatoreadtheservletAPIdocumentation(athttp://java.sun.com/j2ee/1.4/docs/api/javax/servlet/http/package-summary.html),asmanyofthemethodnames(e.g.,request.getContextPath())areself-explanatory.

5. Theservletorwebcontainer,notthedeveloper,managestheservlet'slifecycle,orhowlonganinstanceoftheservletexistsintheJVMtohandlerequests.Whentheservletcontainerissettoremovetheservletfromservice,itcallstheservlet'sdestroy()method,inwhichtheservletcanreleaseany

Page 33: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

resources,suchasadatabaseconnection.

Example1-1showsatypicalservletidiomforhandlinganHTMLform.ThedoGet()methoddisplaystheformitself.ThedoPost()methodhandlesthesubmittedformdata,sinceindoGet(),theHTMLformtagspecifiestheservlet'sownaddressasthetargetfortheformdata.

Theservlet(namedFirstServlet)specifiesthatthedeclaredclassispartofthecom.jspservletcookbookpackage.Itisimportanttocreatepackagesforyourservletsandutilityclasses,andthentostoreyourclassesinadirectorystructurebeneathWEB-INFthatmatchesthesepackagenames.

TheFirstServletclassimportsthenecessaryclassesforcompilingabasicservlet,whicharetheemphasizedimportstatementsinExample1-1.TheJavaclassextendsHttpServlet.TheonlydefinedmethodsaredoGet(),whichdisplaystheHTMLforminresponsetoaGETHTTPrequest,anddoPost(),whichhandlestheposteddata.

Example1-1.AtypicalHttpServletusedforhandlinganHTMLform

packagecom.jspservletcookbook;

importjava.io.IOException;

importjava.io.PrintWriter;

importjava.util.Enumeration;

importjavax.servlet.ServletException;

importjavax.servlet.http.HttpServlet;

importjavax.servlet.http.HttpServletRequest;

importjavax.servlet.http.HttpServletResponse;

Page 34: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

publicclassFirstServletextendsHttpServlet{

publicvoiddoGet(HttpServletRequestrequest,

HttpServletResponseresponse)throwsServletException,

java.io.IOException{

//settheMIMEtypeoftheresponse,"text/html"

response.setContentType("text/html");

//useaPrintWritertosendtextdatatotheclientwhohasrequestedthe

//servlet

java.io.PrintWriterout=response.getWriter();

//BeginassemblingtheHTMLcontent

out.println("<html><head>");

out.println("<title>HelpPage</title></head><body>");

out.println("<h2>Pleasesubmityourinformation</h2>");

//makesuremethod="post"sothattheservletservicemethod

//callsdoPostintheresponsetothisformsubmit

out.println(

"<formmethod=\"post\"action=\""+request.getContextPath()+

"/firstservlet\">");

out.println("<tableborder=\"0\"><tr><tdvalign=\"top\">");

out.println("Yourfirstname:</td><tdvalign=\"top\">");

out.println("<inputtype=\"text\"name=\"firstname\"size=\"20\">");

out.println("</td></tr><tr><tdvalign=\"top\">");

out.println("Yourlastname:</td><tdvalign=\"top\">");

out.println("<inputtype=\"text\"name=\"lastname\"size=\"20\">");

out.println("</td></tr><tr><tdvalign=\"top\">");

out.println("Youremail:</td><tdvalign=\"top\">");

out.println("<inputtype=\"text\"name=\"email\"size=\"20\">");

out.println("</td></tr><tr><tdvalign=\"top\">");

out.println("<inputtype=\"submit\"value=\"SubmitInfo\"></td></tr>");

Page 35: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

out.println("</table></form>");

out.println("</body></html>");

}//doGet

publicvoiddoPost(HttpServletRequestrequest,

HttpServletResponseresponse)throwsServletException,

java.io.IOException{

//displaytheparameternamesandvalues

EnumerationparamNames=request.getParameterNames();

StringparName;//thiswillholdthenameoftheparameter

booleanemptyEnum=false;

if(!paramNames.hasMoreElements())

emptyEnum=true;

//settheMIMEtypeoftheresponse,"text/html"

response.setContentType("text/html");

//useaPrintWritertosendtextdatatotheclient

java.io.PrintWriterout=response.getWriter();

//BeginassemblingtheHTMLcontent

out.println("<html><head>");

out.println("<title>SubmittedParameters</title></head><body>");

if(emptyEnum){

out.println(

"<h2>Sorry,therequestdoesnotcontainanyparameters</h2>");

}else{

out.println(

"<h2>Herearethesubmittedparametervalues</h2>");

}

Page 36: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

while(paramNames.hasMoreElements()){

parName=(String)paramNames.nextElement();

out.println(

"<strong>"+parName+"</strong>:"+

request.getParameter(parName));

out.println("<br/>");

}//while

out.println("</body></html>");

}//doPost

}

YoumighthavenoticedthatdoGet()anddoPost()eachthrowServletExceptionandIOException.TheservletthrowsIOExceptionbecausetheresponse.getWriter()(aswellasPrintWriter.close())methodcallcanthrowanIOException.ThedoPost()anddoGet()methodscanthrowaServletExceptiontoindicatethataproblemoccurredwhenhandlingtherequest.Forexample,iftheservletdetectedasecurityviolationorsomeotherrequestproblem,thenitcouldincludethefollowingcodewithindoGet()ordoPost():

//detectsaproblemthatpreventsproperrequesthandling...

thrownewServletException("Theservletcannothandlethisrequest.");

Figure1-1showstheoutputdisplayedbytheservlet'sdoGet()methodinabrowser.

Figure1-1.Theservlet'soutputfordoGet()method

Page 37: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Figure1-2showstheservlet'soutputforthedoPost()method.

Figure1-2.Theservlet'soutputforthedoPost()method

SeeAlso

Recipe1.3oncompilingaservlet;Recipe1.4onpackagingservletsandJSPs;Recipe1.5oncreatingthedeploymentdescriptor;Chapter2on

Page 38: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

deployingservletsandJSPs;Chapter3onnamingservlets;thejavax.servlet.httppackageJavaDoc:http://java.sun.com/j2ee/1.4/docs/api/javax/servlet/http/package-summary.html;theJ2EEtutorialfromSunMicrosystems:http://java.sun.com/j2ee/tutorial/1_3-fcs/doc/J2eeTutorialTOC.html;JasonHunter'sJavaServletProgramming(O'Reilly).

Page 39: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe1.2WritingaJSP

Problem

YouwanttocreateaJSPandincludeitinawebapplication.

Solution

CreatetheJSPasatextfileusingHTMLtemplatetextasneeded.StoretheJSPfileatthetoplevelofthewebapplication.

Discussion

AJavaServerPages(JSP)componentisatypeofJavaservletthatisdesignedtofulfilltheroleofauserinterfaceforaJavawebapplication.WebdeveloperswriteJSPsastextfilesthatcombineHTMLorXHTMLcode,XMLelements,andembeddedJSPactionsandcommands.JSPswereoriginallydesignedaroundthemodelofembeddedserver-sidescriptingtoolssuchasMicrosoftCorporation'sASPtechnology;however,JSPshaveevolvedtofocusonXMLelements,includingcustom-designedelements,orcustomtags,astheprincipalmethodofgeneratingdynamicwebcontent.

JSPfilestypicallyhavea.jspextension,asinmypage.jsp.WhenaclientrequeststheJSPpageforthefirsttime,orifthedeveloperprecompilestheJSP(seeChapter5),thewebcontainertranslatesthetextualdocumentintoaservlet.

TheJSP2.0specificationreferstotheconversionofaJSPintoaservletasthetranslationphase.WhentheJSP(nowaservletclass)respondstorequests,thespecificationcallsthisstagetherequestphase.Theresultingservletinstanceis

Page 40: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

calledthepageimplementationobject.

AJSPcompiler(suchasTomcat'sJaspercomponent)automaticallyconvertsthetext-baseddocumentintoaservlet.Thewebcontainercreatesaninstanceoftheservletandmakestheservletavailabletohandlerequests.Thesetasksaretransparenttothedeveloper,whoneverhastohandlethetranslatedservletsourcecode(althoughtheycanexaminethecodetofindoutwhat'shappeningbehindthescenes,whichisalwaysinstructive).

ThedeveloperfocusesontheJSP'sdynamicbehaviorandwhichJSPelementsorcustom-designedtagssheusestogeneratetheresponse.DevelopingtheJSPasatext-baseddocumentratherthanJavasourcecodeallowsaprofessionaldesignertoworkonthegraphics,HTML,ordynamicHTML,leavingtheXMLtagsanddynamiccontenttoprogrammers.

Example1-2showsaJSPthatdisplaysthecurrentdateandtime.TheexampleJSPshowshowtoimportanduseacustomtaglibrary,whichChapter23describesingreatdetail.Thecodealsousesthejsp:useBeanstandardaction,abuilt-inXMLelementthatyoucanusetocreateanewJavaobjectforuseintheJSPpage.HerearethebasicstepsforwritingaJSP:

1. Openupatexteditor,oraprogrammer'seditorthatoffersJSPsyntaxhighlighting.

IfyouaredevelopingaJSPforhandlingHTTPrequests,theninputtheHTMLcodejustasyouwouldforanHTMLfile.

IncludeanynecessaryJSPdirectives,suchasthetaglibdirectiveinExample1-2,atthetopofthefile.Adirectivebeginswiththe<%@s.

Typeinthestandardactionsorcustomtagswherevertheyare

Page 41: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

needed.

Savethefilewitha.jspextensioninthedirectoryyouhavedesignatedforJSPs.Atypicallocationisthetop-leveldirectoryofawebapplicationthatyouaredevelopinginyourfilesystem.

SomeJSPsaredevelopedasXMLfiles,orJSPdocuments,consistingsolelyofwell-formedXMLelementsandtheirattributes.TheJSP2.0specificationrecommendsthatyougivethesefilesa.jspxextension.SeeRecipe5.5forfurtherdetailsonJSPdocuments.

Example1-2.AJSPfilethatdisplaysthedate

<%--usethe'taglib'directivetomaketheJSTL1.0coretagsavailable;usetheuri

"http://java.sun.com/jsp/jstl/core"forJSTL1.1--%>

<%@tagliburi="http://java.sun.com/jstl/core"prefix="c"%>

<%--usethe'jsp:useBean'standardactiontocreatetheDateobject;theobjectisset

asanattributeinpagescope

--%>

<jsp:useBeanid="date"class="java.util.Date"/>

<html>

<head><title>FirstJSP</title></head>

<body>

<h2>Hereistoday'sdate</h2>

<c:outvalue="${date}"/>

</body>

</html>

Toviewtheoutputofthisfileinabrowser,requestthefilebytypingthe

Page 42: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

URLintothebrowserlocationfield,asin:http://localhost:8080/home/firstJ.jsp.ThenameofthefileisfirstJ.jsp.IfthisisthefirsttimethatanyonehasrequestedtheJSP,thenyouwillnoticeadelayastheJSPcontainerconvertsyourtextfileintoJavasourcecode,thencompilesthesourceintoaservlet.

YoucanavoiddelaysbyprecompilingtheJSP.IfyourequesttheJSPwithajsp_precompile=trueparameter,TomcatconvertstheJSP,butdoesnotsendbackaresponse.Anexampleishttp://localhost:8080/home/firstJ.jsp?jsp_precompile=true.

Figure1-3showstheJSPoutputinabrowser.

Figure1-3.OutputfromthefirstJ.jsppage

Ifyouselect"ViewSource"fromthebrowsermenutoviewthepage'ssourcecode,youwon'tseeanyofthespecialJSPsyntax:thecommentcharacters(<%----%>),thetaglibdirective,thejsp:useBeanaction,orthec:outtag.Theservletsendsonlythetemplatetextandthegenerateddatestringtotheclient.

SeeAlso

Page 43: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe5.1-Recipe5.3onprecompilingJSPs;Chapter2ondeployingservletsandJSPs;Recipe1.1andRecipe1.3onwritingandcompilingaservlet;Recipe1.4onpackagingservletsandJSPs;Recipe1.5oncreatingthedeploymentdescriptor;theJ2EEtutorialfromSunMicrosystems:http://java.sun.com/j2ee/tutorial/1_3-fcs/doc/J2eeTutorialTOC.html;HansBergsten'sJavaServerPages(O'Reilly).

Page 44: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe1.3CompilingaServlet

Problem

Youhavewrittenaservlet,andnowyouwanttocompileitintoaclassfile.

Solution

Makesurethatservlet.jar(forTomcat4.1.24)orservlet-api.jar(forTomcat5)isonyouruserclasspath.UsejavacasyouwouldforanyotherJavasourcefile.

Discussion

Ataminimum,youhavetoplacetheservletclassesonyourclasspathinordertocompileaservlet.TheseclassesarelocatedintheseJavapackages:

javax.servlet

javax.servlet.http

Tomcat5supportstheservletAPI2.4;theJARfilethatyouneedontheclasspathislocatedat<Tomcat-5-installation-directory>/common/lib/servlet-api.jar.Tomcat4.1.24usestheservlet2.3API.Theservletclassesarelocatedat:<Tomcat-4-installation-directory>/common/lib/servlet.jar.

ForBEAWebLogic7.0,theservletclassesandmanyothersubpackages

Page 45: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

ofthejavaxpackage(e.g.,javax.ejb,javax.mail,javax.sql)arelocatedat:<WebLogic-installation-directory>/weblogic700/server/lib/weblogic.jar.

IfyouareusingAnttocompileservletclasses,thenproceedtoRecipe4.4,donotpassGo,donotcollect$200.ThatrecipeisdevotedspecificallytothetopicofusingAnttocompileaservlet.IfyouuseanIDE,followitsinstructionsforplacingaJARfileontheclasspath.

Thefollowingcommandlinecompilesaservletinthesrcdirectoryandplacesthecompiledclass,nestedwithinitspackage-relateddirectories,inthebuilddirectory:

javac-classpathK:\tomcat5\jakarta-tomcat-5\dist\common\lib\servlet-api.jar

-d./build./src/FirstServlet.java

Forthiscommandlinetorunsuccessfully,youmustchangetotheparentdirectoryofthesrcdirectory.

Recipe1.4explainsthetypicaldirectorystructure,includingthesrcdirectory,fordevelopingawebapplication.

Iftheservletdependsonanyotherlibraries,youhavetoincludethoseJARfilesonyourclasspathaswell.Ihaveincludedonlytheservlet-api.jarJARfileinthiscommandline.

YoualsohavetosubstitutethedirectorypathforyourowninstallationofTomcatforthislineofthepriorcommand-linesequence:

K:\tomcat5\jakarta-tomcat-5\dist\common\lib\servlet-api.jar

Thiscommandlineusesthebuilt-injavaccompilerthatcomeswiththe

Page 46: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

SunMicrosystemsJavaSoftwareDevelopmentKit(JDK).Forthiscommandtoworkproperly,youhavetoincludethelocationoftheJavaSDKthatyouareusinginthePATHenvironmentvariable.Forexample,onaUnix-basedMacOSX10.2system,thedirectorypath/usr/binmustbeincludedinthePATHvariable.OnmyWindowsNTmachine,thePATHincludesh:\j2sdk1.4.1_01\bin.

SeeAlso

Chapter2ondeployingservletsandJSPs;Chapter3onnamingservlets;Recipe1.4onpackagingservletsandJSPs;Recipe1.5oncreatingthedeploymentdescriptor;theJ2EEtutorialfromSunMicrosystems:http://java.sun.com/j2ee/tutorial/1_3-fcs/doc/J2eeTutorialTOC.html;JasonHunter'sJavaServletProgramming(O'Reilly).

Page 47: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe1.4PackagingServletsandJSPs

Problem

YouwanttosetupadirectorystructureforpackagingandcreatingaWebARchive(WAR)fileforservletsandJSPs.

Solution

Setupadirectorystructureinyourfilesystem,thenusethejartoolorAnttocreatetheWAR.

Discussion

Exceptintherarestofcircumstances,you'llusuallydevelopaservletorJSPaspartofawebapplication.Itisrelativelyeasytosetupadirectorystructureonyourfilesystemtoholdweb-applicationcomponents,whichincludeHTMLfiles,servlets,JSPs,graphics,JARlibraries,possiblymoviesandsoundfiles,aswellasXMLconfigurationfiles(suchasthedeploymentdescriptor;seeRecipe1.5).

Thesimplestorganizationforthisstructureistocreatetheexactlayoutofawebapplicationonyourfilesystem,thenusethejartooltocreateaWARfile.

AWARfileislikeaZIParchive.YoudeployyourwebapplicationintoawebcontainerbydeployingtheWAR.SeeChapter2forrecipesaboutvariousdeploymentscenarios.

Page 48: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

ThewebapplicationstructureinvolvingtheWEB-INFsubdirectoryisstandardtoallJavawebapplicationsandspecifiedbytheservletAPIspecification(inthesectionnamedWebApplications.Hereiswhatthisdirectorystructurelookslike,givenatop-leveldirectorynameofmyapp:

/myapp

/images

/WEB-INF

/classes

/lib

TheservletspecificationspecifiesaWEB-INFsubdirectoryandtwochilddirectories,classesandlib.TheWEB-INFsubdirectorycontainstheapplication'sdeploymentdescriptor,namedweb.xml.TheJSPfilesandHTMLliveinthetop-leveldirectory(myapp).Servletclasses,JavaBeanclasses,andanyotherutilityclassesarelocatedintheWEB-INF/classesdirectory,inastructurethatmatchestheirpackagename.Ifyouhaveafullyqualifiedclassnameofcom.myorg.MyServlet,thenthisservletclassmustbelocatedinWEB-INF/classes/com/myorg/MyServlet.class.

TheWEB-INF/libdirectorycontainsanyJARlibrariesthatyourwebapplicationrequires,suchasdatabasedrivers,thelog4j.jar,andtherequiredJARsforusingtheJavaServerPagesStandardTagLibrary(seeChapter23).

OnceyouarereadytotesttheapplicationinWARformat,changetothetop-leveldirectory.Typethefollowingcommand,namingtheWARfileafterthetop-leveldirectoryofyourapplication.Thesecommand-linephrasesworkonbothWindowsandUnixsystems(IusedthemwithWindowsNT4andMacOSX10.2):

jarcvfmyapp.war.

Don'tforgetthefinaldot(.)character,whichspecifiestothejartooltoincludethecurrentdirectory'scontentsanditssubdirectoriesintheWARfile.Thiscommandcreatesthemyapp.warfileinthecurrentdirectory.

Page 49: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

TheWARnamebecomestheapplicationnameandcontextpathforyourwebapplication.Forexample,myapp.waristypicallyassociatedwithacontextpathof/myappwhenyoudeploytheapplicationtoawebcontainer.

IfyouwanttoviewthecontentsoftheWARatthecommandline,typethis:

jartvfalpine-final.war

IftheWARfileisverylargeandyouwanttoviewitscontentsonepageatatime,usethiscommand:

jartvfalpine-final.war|more

Hereisexampleoutputfromthiscommand:

H:\classes\webservices\finalproj\dist>jartvfalpine-final.war

0MonNov1814:10:36EST2002META-INF/

48MonNov1814:10:36EST2002META-INF/MANIFEST.MF

555TueNov0517:08:16EST2002request.jsp

914MonNov1808:53:00EST2002response.jsp

0MonNov1814:10:36EST2002WEB-INF/

0MonNov1814:10:36EST2002WEB-INF/classes/

0TueNov0511:09:34EST2002WEB-INF/classes/com/

0TueNov0511:09:34EST2002WEB-INF/classes/com/parkerriver/

CONTINUED...

ManydevelopmentteamsareusingAnttocompileandcreateWARfilesfortheirservletsandJSPs.Recipe2.6describesusingAntfordevelopingandupdatingwebapplications.

Ijumpstartyourprogresstowardthatrecipebyshowingthekindofdirectorystructureyoumightuseforacomprehensivewebapplication,onethatcontainsnumerousservlets,JSPs,staticHTMLfiles,aswellasvariousgraphicsandmultimediacomponents.WhenusingAnttobuildaWARfilefromthiskindofdirectorystructure,youcanfilteroutthe

Page 50: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

directoriesthatyoudonotwanttoincludeinthefinalWAR,suchasthetop-levelsrc,dist,andmetadirectories.

myapp

/build

/dist

/lib

/meta

/src

/web

/images

/multimedia

/WEB-INF

/classes

/lib

/tlds

/jspf

TheWEB-INF/tldsandWEB-INF/jspfoptionaldirectoriesmaycontainTagLibraryDescriptorfilesandJSPfragments(chunksofJSPsthataredesignedtobeincludedinotherJSPs,suchasserver-sideincludes),respectively.

SeeAlso

Chapter2ondeployingservletsandJSPs;Chapter3onnamingservlets;ThedeploymentsectionsofTomcat:TheDefinitiveGuide,byBrittainandDarwin(O'Reilly);theJ2EEtutorialfromSunMicrosystems:http://java.sun.com/j2ee/tutorial/1_3-fcs/doc/J2eeTutorialTOC.html.

Page 51: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe1.5CreatingtheDeploymentDescriptor

Problem

Youwanttocreatethedeploymentdescriptorforyourapplication.

Solution

NametheXMLfileweb.xmlandplaceitintheWEB-INFdirectoryofyourwebapplication.Ifyoudonothaveanexistingexampleofweb.xml,thencutandpastetheexamplesgivenintheservletv2.3or2.4specificationsandstartfromthere.

Discussion

Thedeploymentdescriptorisaveryimportantpartofyourwebapplication.ItconveystherequirementsforyourwebapplicationinaconciseformatthatisreadablebymostXMLeditors.Theweb.xmlfileiswhereyou:

RegisterandcreateURLmappingsforyourservlets

Registerorspecifyanyoftheapplication'sfiltersandlisteners

Specifycontextinitparametername/valuepairs

Configureerrorpages

Specifyyourapplication'swelcomefiles

Page 52: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Configuresessiontimeouts

Specifiysecuritysettingsthatcontrolwhocanrequestwhichwebcomponents

Thisisjustasubsetoftheconfigurationsthatyoucanusewithweb.xml.Whileanumberofchaptersinthisbookcontaindetailedexamplesofweb.xml(refertothe"SeeAlso"section),thisrecipeshowssimplifiedversionsoftheservletv2.3andv2.4deploymentdescriptors.

Example1-3showsasimplewebapplicationwithaservlet,afilter,alistener,andasession-configelement,aswellasanerror-pageconfiguration.Theweb.xmlinExample1-3usestheservletv2.3DocumentTypeDefinition(DTD).Themaindifferencebetweenthedeploymentdescriptorsof2.3and2.4isthat2.3usesaDTDand2.4isbasedonanXMLschema.You'llnoticethattheoldversionofweb.xmlhastheDOCTYPEdeclarationatthetopofthefile,whilethe2.4versionusesthenamespaceattributesoftheweb-appelementtorefertotheXMLschema.TheXMLelementsofExample1-3havetobeinthesameorderasspecifiedbytheDTD.

Example1-3.ThedeploymentdescriptorforservletAPI2.3

<?xmlversion="1.0"encoding="ISO-8859-1"?>

<!DOCTYPEweb-app

PUBLIC"-//SunMicrosystems,Inc.//DTDWebApplication2.3//EN"

"http://java.sun.com/dtd/web-application_2_3.dtd"

>

<web-app>

<display-name>Servlet2.3deploymentdescriptor</display-name>

<filter>

<filter-name>RequestFilter</filter-name>

Page 53: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<filter-class>com.jspservletcookbook.RequestFilter</filter-class>

</filter>

<filter-mapping>

<filter-name>RequestFilter</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

<listener>

<listener-class>com.jspservletcookbook.ReqListener</listener-class>

</listener>

<servlet>

<servlet-name>MyServlet</servlet-name>

<servlet-class>com.jspservletcookbook.MyServlet</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>MyServlet</servlet-name>

<url-pattern>/myservlet</url-pattern>

</servlet-mapping>

<session-config>

<session-timeout>15</session-timeout>

</session-config>

<error-page>

<error-code>404</error-code>

<location>/err404.jsp</location>

</error-page>

</web-app>

Example1-3showstheweb.xmlfileforanapplicationthathasjustoneservlet,accessedatthepath<contextpath>/myservlet.Sessionstimeoutin15minuteswiththisapplication.IfaclientrequestsaURLthat

Page 54: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

cannotbefound,thewebcontainerforwardstherequesttothe/err404.jsppage,basedontheerror-pageconfiguration.ThefilternamedRequestFilterappliestoallrequestsforstaticanddynamiccontentinthiscontext.Atstartup,thewebcontainercreatesaninstanceofthelistenerclasscom.jspservletcookbook.ReqListener.

EverythingaboutExample1-4isthesameasExample1-3,exceptthattheweb-appelementatthetopofthefilereferstoanXMLschemawithitsnamespaceattributes.Inaddition,elementscanappearinarbitraryorderwiththeservletv2.4deploymentdescriptor.Forinstance,ifyouweresoinclinedyoucouldlistyourservletsandmappingsbeforeyourlistenersandfilters.

Example1-4.Aservletv2.4deploymentdescriptor

<?xmlversion="1.0"encoding="ISO-8859-1"?>

<web-appxmlns="http://java.sun.com/xml/ns/j2ee"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation=

"http://java.sun.com/xml/ns/j2ee

http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"version="2.4">

<!--therestofthefileisthesameasExample1-3aftertheweb-appopeningtag-->

</web-app>

Theservlet2.4versionofthedeploymentdescriptoralsocontainsdefinitionsforvariouselementsthatarenotincludedintheservlet2.3web.xmlversion:jsp-config,message-destination,message-destination-ref,andservice-ref.ThesyntaxfortheseelementsappearsinthespecificationsforJSPv2.0andJ2EEv1.4.

Page 55: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

SeeAlso

Chapter2ondeployingservletsandJSPs;Chapter3onnamingservlets;Chapter9onconfiguringthedeploymentdescriptorforerrorhandling;theJ2EEtutorialfromSunMicrosystems:http://java.sun.com/j2ee/tutorial/1_3-fcs/doc/J2eeTutorialTOC.html.

Page 56: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Chapter2.DeployingServletsandJSPs

Introduction

Recipe2.1.DeployinganIndividualServletonTomcat

Recipe2.2.UsingaContextElementinTomcat'sserver.xml

Recipe2.3.DeployinganIndividualServletonWebLogic

Recipe2.4.DeployinganIndividualJSPonTomcat

Recipe2.5.DeployinganIndividualJSPonWebLogic

Recipe2.6.DeployingaWebApplicationonTomcat

Recipe2.7.DeployingaWebApplicationonWebLogicUsingAnt

Recipe2.8.UsingtheWebLogicAdministrationConsole

Recipe2.9.UsingWebLogicBuildertoDeployaWebApplication

Recipe2.10.Usingtheweblogic.DeployerCommand-LineTool

Page 57: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Introduction

ThischapterdescribeshowtotakeservletsorJavaServerPages(JSPs)andmakethemavailabletoreceivewebrequestsonTomcat'sservletcontainerorBEAWebLogicServer7.0.ThisdiscussionbeginswithdeployingservletsandJSPs;inotherwords,gettingthemrunningonTomcatorWebLogic,eitheraloneoraspartofawebapplication.

DevelopingandcompilingaservletorJSPwithinanintegrateddevelopmentenvironment(IDE)isonething.HavingthewebcomponentrespondtoHTTPrequestsisanother.Thisiswhatdeploymentisallaboutwithweb-relatedsoftware:placingthesoftwareintoservicewithinawebcontainerlikeTomcatoranapplicationserversuchasBEAWebLogicServer7.0.ThefollowingrecipesdetaildeploymentofservletsandJSPsonthesewebcontainers,firstindividually,andthenaspartofawebapplication.

ThewonderfulopensourceJakartaAntbuildandautomationtooliscommonlyusedforthispurpose.Itismentionedwhereveritisrelevantinthefollowingrecipes,andChapter4iscompletelydevotedtoinstallingandusingAnt.

Page 58: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe2.1DeployinganIndividualServletonTomcat

Problem

YouwanttotakeacompiledservletandinstallitinTomcattofindoutifitisworking.Youaredoingapreliminarytestanddonotwanttotakethetimetobuildacompletewebapplicationfortheservlet.

Solution

CopyandpastetheclassfileintoTomcat'sdefaultwebapplication(orintoawebapplicationthatyouhavealreadyinstalled),thenrequestitusingtheinvokerservlet.OruseanAntbuild.xmlfiletomovethefiletemporarilyintotheTomcatdefaultwebapplication.

Discussion

Sometimesyoudesignaservletandareanxioustoseeiftheservletworks.Unlesstheservletdependsonotherservletsorcomponentsintheapplication,youcantestitonTomcatbypastingtheclassfile(includingitspackage-relateddirectories)intothedefaultTomcatwebapplication.Bydefault,thisapplicationislocatedatthepath<Tomcat-installation-directory>/webapps/ROOT.

Ifthefullyqualifiedclassnameoftheservletisjspservletcookbook.CookieServlet,thenhereistheentireprocessformanuallygettingasingleservletgoingonTomcat:

ShutdowntheTomcatserverbyexecutingtheshellscript<tomcat-

Page 59: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

installation-directory>/bin/shutdownorbyexecutingashellscriptyourserveradministratorhasprovided.Analternativeisto"stop"thedefaultapplicationbyrequestingthisURLinyourbrowser:http://localhost:8080/manager/stop?path=/.

Createthejspservletcookbookdirectoryinthe<Tomcat-installation-directory>/webapps/ROOT/WEB-INF/classesdirectory(maketheclassesdirectoryifitdoesnotalreadyexist).

PastetheCookieServletclassfileintothe<Tomcat-installation-directory>/webapps/ROOT/WEB-INF/classes/jspservletcookbookdirectory.

StartuptheTomcatserverbyexecutingtheshellscript<Tomcat-installation-directory>/bin/startuporashellscriptthatyourserveradministratorhasprovided.AnalternativeistostartthedefaultapplicationbyrequestingthisURLinyourbrowser:http://localhost:8080/manager/start?path=/.

RequesttheservletinyourbrowserwiththeURLhttp://localhost:8080/servlet/jspservletcookbook.CookieServlet.

Bynowyouareprobablysaying,"Theremustbeamoreelegantalternativetothisslow,manualinstallationofasingleservlet!"Youarecorrect,andcanuseJakartaAnttoconvertthismanualprocesstoanautomatedone.

Thebuild.xmlfileinExample2-1accomplishesthesametestingprocess,assumingyouhavedownloadedandinstalledAntasdescribedinChapter4.Placethisbuildfileinaconvenientdirectory.Createinthatdirectoryaglobal.propertiesfilethatiscustomizedaccordingtoyourneeds(seeExample2-2).Changetothatdirectoryinacommand-linewindowandtypeant.Anttakescareoftherestofthetasks,includingstartingandstoppingTomcat'sdefaultwebapplication.

Page 60: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Example2-1.Installingaservletinthedefaultwebapplication

<projectname="Cookbook"default="deploy-servlet"basedir=".">

<taskdefname="start"classname="org.apache.catalina.ant.StartTask"/>

<taskdefname="stop"classname="org.apache.catalina.ant.StopTask"/>

<!--Loadinsomeglobalproperties-->

<propertyfile="global.properties"/>

<targetname="init"description="Initializessomeproperties.">

<echomessage="Initializingproperties."/>

<propertyname="build"value=".\build"/>

<propertyname="src"value=".\src"/>

<!--Thecontext-pathisjustaslashcharacterwhenitistheROOTapplication;

seethestartandstoptargets,whichalreadyincludetheslashaspartof

theURLpattern-->

<propertyname="context-path"value=""/>

</target>

<targetname="prepare"depends="init">

<echomessage="Cleaningupthebuilddirectory."/>

<deletedir="${build}"/>

<mkdirdir="${build}"/>

</target>

<!--SettheCLASSPATHtovariousTomcat.jarfiles-->

<pathid="classpath">

<filesetdir="${tomcat.dir}/common/lib">

<includename="*.jar"/>

</fileset>

Page 61: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<filesetdir="${tomcat.dir}/common/endorsed">

<includename="*.jar"/>

</fileset>

</path>

<!--startthedefaultTomcatwebapplication-->

<targetname="start"

description="StartsthedefaultWebapplication">

<echomessage="Startingthedefaultapplication...."/>

<start

url="${url}"

username="${username}"

password="${password}"

path="/${context-path}"

/>

</target>

<!--stopthedefaultTomcatwebapplication-->

<targetname="stop"

description="StopsthedefaultWebapplication">

<echomessage="Stoppingtheapplication...."/>

<stop

url="${url}"

username="${username}"

password="${password}"

path="/${context-path}"

/>

</target>

<!--stopthedefaultTomcatwebapplication,compileyourservlet,addittothedefault

Webapplication,thenstartthedefaultwebapplication-->

<targetname="deploy-servlet"depends="prepare"

description=

"Compilethespecifiedservlet,thenmoveitintoTomcat'sdefault

Page 62: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Webapplication.">

<echomessage="StoppingthedefaultTomcatapplication...."/>

<antcalltarget="stop"/>

<echomessage="Compilingtheservlet...."/>

<javacsrcdir="${src}"destdir="${build}">

<includename="${compiled.servlet}.java"/>

<classpathrefid="classpath"/>

</javac>

<echomessage=

"CopyingtheservlettoTomcatROOTwebapplication..."/>

<copytodir="${tomcat.webapps}/WEB-INF/classes">

<filesetdir="${build}"/>

</copy>

<echomessage="Startingthedefaultapplication...."/>

<antcalltarget="start"/>

</target>

</project>

Theglobal.propertiesfilethatsitsinthesamedirectoryasbuild.xmllookslikeExample2-2.

Example2-2.global.propertiesfileforAnt

tomcat.webapps=k:/jakarta-tomcat-4.1.12/webapps/ROOT

tomcat.dir=k:/jakarta-tomcat-4.1.12

url=http://localhost:8080/manager

compiled.servlet=CookieServlet

username=tomcat

password=tomcat

global.propertiesisjustalistofproperty-name=valuepairs.Inotherwords,eachlineiscomposedofastringofcharactersthatrepresentsthepropertyname(optionallyincludingaperiodcharacter),followedbyan

Page 63: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

"="signandanotherbunchofcharactersthatrepresentsthevalue.

JakartaAnt'sonlinemanualislocatedat:http://jakarta.apache.org/ant/manual/index.html.

Hereiswhatbuild.xmldoes:

1. DefinestwotaskswithataskDefelement,calledstartandstop.Thesetaskswillbeusedbythetargetsstartandstoplateroninthebuild.xmlfile.ThesetasksallowyoutousetheTomcat"manager"application-deploymenttoolfromyourAntfiles.

Usesapropertytasktoloadinthesetofpropertiesthataredefinedintheglobal.propertiesfile.Thismeansthatthepropertynametomcat.dirisnowavailableforuselateroninthebuild.xmlfile.Thepathelementusesthetomcat.dirpropertybyincludingitsvalue(intheexample,"k:/jakarta-tomcat-4.1.12")aspartofaclasspathdefinition.Yougetthevalueoftheseimportedpropertiesbyusingareferencelike${tomcat.dir}.AnytimeyouwanttogivethepropertyadifferentvaluebeforeexecutinganAntfile,youcanjustchangethepropertiesfilebytypinginanewvalueinatexteditor.

Createsaninittargetthatechoesamessagetotheconsoleandcreatesthreeproperties(build,src,andcontext-path).Thevaluesofthesepropertiesareavailableonlyaftertheinittargethasbeenexecuted.Forexample,ifthepreparetargetdoesnothave"init"asthevalueofitsdependsattribute,thedeploy-servlettarget,whichdependsonprepare,cannotusethepropertyvaluesdefinedbyinit.

Definesatargetcalledprepare.

Page 64: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Buildsareusableclasspath(withtheID"classpath")outofalloftheJARfileslocatedinacoupleofTomcatdirectories.

Createsthestartandstoptargets.Thesetargetsechoamessagetotheconsoleandthencallthetasks(suchasstop)thatweredefinedwithtaskDefelementsatthetopofthebuild.xmlfile.Thestartandstoptargetsareactuallyinvokedbytheall-in-onetargetdeploy-servlet.

Createsthedeploy-servlettarget.Thistargetdoesallthemajorworkinsidethebuild.xmlfile.Noticethatitsdependsattributehasthevalue"prepare."Thismeansthatpriortoexecutingtheinstructionscontainedwithinthedeploy-servlettarget,Antfirstexecutestheinitandpreparetargets.Sincethepreparetargetdependsontheinittarget,deploy-servletcallsprepare,whichitselfcallsitowndependency,theinittarget.Sojustbylaunchingthedeploy-servlettarget,youhavetriggeredatargetchainthatlookslikeinit

prepare deploy-servlet.Usinganelementcalledantcallwithwhichatargetmayexplicitlycallanothertarget,deploy-servletcallsboththestopandstarttargets.Inthiswayitcan:

a. StopthedefaultTomcatapplication.

Compiletheservletusingthejavactask.Thejavactaskincludestheservletthatisspecifiedbythecompiled.servletproperty,whichissetinsidetheglobal.propertiesfile.

CopiesthecompiledservlettotheWEB-INF/classesdirectoryofTomcat'sdefaultwebapplication.Thecopytaskcreatesthisclassesdirectoryifitdoesnotalreadyexist.

Startsthedefaultwebapplicationsothatyoucanrequestyourservletinthebrowser.

Page 65: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

SeeAlso

ThedeploymentsectionsofTomcat:TheDefinitiveGuide,byBrittainandDarwin(O'Reilly);Recipe2.2,Recipe2.4,andRecipe2.6;theJakartaAntonlinemanualat:http://jakarta.apache.org/ant/manual/index.html

Page 66: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe2.2UsingaContextElementinTomcat'sserver.xml

Problem

YouwanttodeployandredeployaservletonTomcat4.1.xwithoutrestartingtheTomcatwebcontainer.

Solution

DeploytheservletaspartofaContextelementinTomcat'sserver.xmlfile.

Discussion

YoucanpastearecompiledservletclassoveranexistingservletclassandinvoketheservletwithoutrestartingTomcat:

1. LocatetheContextelementforyourwebapplicationorcreateanewContextelementinthe<tomcat-installation-directory>/conf/server.xmlfile.ContextelementsmustbenestedwithintheHostelementthatrepresentsthevirtualhostunderwhichyourwebapplicationisrunning.

SetthereloadableattributeofyourContextelementtotrue.ThissignalsTomcattomonitorthecontentsofWEB-INF/classesandWEB-INF/libforanychanges.Ifchangesaredetected,Tomcatautomaticallyreloadsthewebapplication.

TheContextelementinserver.xmllookslikethis:

Page 67: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<ContextclassName="org.apache.catalina.core.StandardContext"

crossContext="false"reloadable="true"

mapperClass="org.apache.catalina.core.StandardContextMapper"

useNaming="true"debug="0"swallowOutput="false"

privileged="false"displayName="HomeWebApp"

wrapperClass="org.apache.catalina.core.StandardWrapper"

docBase="h:\home"cookies="true"path="/home"

cachingAllowed="true"

charsetMapperClass="org.apache.catalina.util.CharsetMapper"

>

Thepathattributerepresentsthecontextpathfortheapplication.ThedocBaseattributepointstothedirectorythatrepresentsthetoplevelofthiswebapplication.Mostoftheexample'sotherattributeshavevaluesthataresharedbyotherContexts.Forexample,cookies="true"indicatesthattheContextwillusecookiesforthesessionidentifier,andcrossContext="false"preventstheservletsinthiswebapplicationfromobtainingrequestdispatchersforotherwebapplicationsrunninginthevirtualhost.

Settingthereloadableattributetotrueincurssignificantruntimeoverhead,sothisconfigurationisrecommendedonlyforwebapplicationsindevelopmentmode.

Underthisconfiguration,Tomcat4.1.xdisplaysaconsolemessageafteraslightdelaywhenyoupasteanewservletclassovertheoldoneinthewebapplication.Hereisanexampleofaconsolemessageinresponsetoadynamicservletreload:

WebappClassLoader:Resource'/WEB-INF/classes/com/jspservletcookbook/OracleTest.

class'wasmodified;

Dateisnow:SunFeb0222:17:41EST2003Was:SunFeb0221:38:52EST2003

Page 68: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

SeeAlso

ThedeploymentsectionsofTomcat:TheDefinitiveGuide,byBrittainandDarwin(O'Reilly);Recipe2.1,Recipe2.4,andRecipe2.6;JakartaTomcatdocumentationfortheContextelement:http://jakarta.apache.org/tomcat/tomcat-4.1-doc/config/context.html.

Page 69: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe2.3DeployinganIndividualServletonWebLogic

Problem

YouwanttotakeyourcompiledservletandinstallitinBEAWebLogicServer7.0tofindoutifitisworking.

Solution

CopyandpastetheclassfileintoWebLogic'sdefaultwebapplication(orintoawebapplicationthatyouhavealreadyinstalled).UsetheWebLogicAdministrationConsoletoaltertheweb.xmlfileandgivetheservletasensiblenamewithwhichtorequestitinabrowser,oruseanAntbuildfiletomovethefiletemporarilyintotheWebLogicdefaultwebapplication.

Discussion

WebLogic7.0'sdefaultwebapplicationislocatedonthefollowingpath:<WebLogic-installation-directory>/user_projects/<mydomain>/applications/DefaultWebApp.InthedefaultinstallationoftheWebLogic7.0server,notmuchexistsinthedefaultwebapplicationbutaweb.xmldeploymentdescriptor,andsomeimagefiles.Toaddaservlettothedefaultapplication,pasteyourservletclass,includingitspackage-relateddirectories,intotheDefaultWebApp/WEB-INF/classesdirectory.Youmighthavetocreateaclassesdirectorythefirsttimeyoudothis.Changetheweb.xmlfiletogivetheservletaname(whichiseasierthroughtheAdministrationConsole)beforeredeployingthewebapplicationasdescribedinRecipe2.4.

Page 70: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

UsetheAdministrationConsoletoedittheweb.xmlfileinordertogivethenewservletaregisterednameandservlet-mappingelement.Youcanalsouseanotheravailabletool,suchasWebLogicBuilder(Recipe2.9)oratexteditor.Figure2-1showstheDefaultWebAppintheAdministrationConsole.Clickon"EditWebApplicationDeploymentDescriptors...".

Figure2-1.WebLogicServerAdministrationConsole

ThisdisplaysthescreenshowninFigure2-2.Thisscreenprovidesaneasygraphicalmethodofeditingtheweb.xmlfileforanywebapplication(inthiscase,theWebLogicdefaultwebapplication).

Figure2-2.Editingtheweb.xmlfilegraphically

Page 71: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Withthisgraphicaleditor,createtheservletandservlet-mappingelementsfortheservletthatyoujustadded.Makesuretoclickonthe"WebDescriptor"buttonintheleftcolumnoftheFigure2-2windowandthenpersistthechangesthatyoumadeintheweb.xmlfile.Thisactionrewritestheweb.xmlfile,addingthenewservletandservlet-mappingelements.

Nowredeploythewebapplication,whichisjustamatterofclickingafewhypertextlinksintheConsole.ChoosethenameofyourwebapplicationintheleftcolumnoftheConsole,underthemydomain Deployments

WebApplicationsnodeofthetreenavigationstructureinthislefthandcolumn.Figure2-3showstheresultingwindow.

Figure2-3.UsingtheConsoletoredeployawebapplication

Page 72: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Clickonthe"Deploy"tab,thenclickthe"Undeploy"buttonintheresultingHTMLtable.Thewebapplicationisnowunavailableforservice.

Toredeploytheapplication,clickthe"Deploy"tab,thenselectthe"Deploy"button,asshowninFigure2-4.

Figure2-4.Graphicallydeployingaservlet

Page 73: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Iftheservletthatyouareworkingonalreadyexistsinthewebapplication,thenyoucanalsocopyandpasteanewservletclassovertheoldoneintheWEB-INF/classesdirectoryofthewebapplication.Thenewservletversionbecomesavailableimmediately,withoutusingtheConsoletoredeploytheentirewebapplication.

YoucanalsouseanAntfiletocompiletheservletandcopyitintoWebLogic'sdefaultwebapplication.ThebuildfileinExample2-3isverysimilartotheoneusedanddescribedinRecipe2.1;it'sjustrevisedforusewithWebLogic'swebcontainerinsteadofTomcat's.

Example2-3.UsinganAntfilewithaWebLogicservlet

<projectname="Cookbook"default="deploy-servlet"basedir=".">

<propertyfile="wl.properties"/>

<target

name="init"

description="Initializessomeproperties.">

<echomessage="Initializingproperties."/>

<propertyname="build"value=".\build"/>

<propertyname="src"value=".\src"/>

</target>

<targetname="prepare"depends="init">

<echomessage="Cleaningupthebuilddirectory."/>

<deletedir="${build}"/>

<mkdirdir="${build}"/>

</target>

<pathid="classpath">

<filesetdir="${wl.dir}\server\lib">

<includename="*.jar"/>

</fileset>

</path>

Page 74: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<targetname="deploy-servlet"depends="prepare"

description="Compilethespecifiedservlet,thenmoveitinto

WL'sdefaultWebapplication.">

<echomessage="Compilingtheservlet${compiled.servlet}...."/>

<javacsrcdir="${src}"destdir="${build}">

<includename="${compiled.servlet}.java"/>

<classpathrefid="classpath"/>

</javac>

<echomessage="CopyingtheservlettoWLdefaultwebapplication..."/>

<copytodir="${wl.webapp}/WEB-INF/classes">

<filesetdir="${build}"/>

</copy>

</target>

</project>

ThisAntbuildfilefirstloadsasetofpropertiescontainedinafilecalledwl.properties,whichislocatedinthesamedirectoryasthebuildfile.Thebuildfiletypicallyhasthenamebuild.xml;however,youcancallanotherbuildfileinthesamedirectorybyusingthe-buildfilecommand-lineoption,asinant-buildfilewl_build.xml.Thewl.propertiesfileforthisexampleisshowninExample2-4.

Example2-4.wl.propertiesforWebLogicAntbuildfile

wl.webapp=k:/bea/user_projects/bwpdomain/applications/DefaultWebApp

wl.dir=k:/bea/weblogic700

compiled.servlet=test

Thedeploy-servlettargetdependsonatargetnamedpreparethatisalsodefinedinthisbuildfile.Thepreparetargetinturnhas"init"asitsdependsattribute,whichmeansthattheinittargetexecutespriortothepreparetarget.Socallingthedeploy-servlettargetcreatesa

Page 75: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

chainofexecutingtargets:init prepare deploy-servlet.Inall,thisiswhatthebuildfileaccomplishes:

1. initcreatesacoupleofproperties(buildandsource)thatpointtodirectories.

Thepreparetargetdeletesandthenremakesthebuilddirectory,sothatyoustartwithacleanbuild.

deploy-servletcompilestheservletintothebuilddirectory,thencopiesitintothedirectoryspecifiedbythewl.webappproperty(whichcontainsitsvalueinthewl.propertiesfile).

ThepathelementcreatesaclasspathoutoftheJARfilesfoundinthek:/bea/weblogic700/server/libdirectory.ThisdirectorypathishowAntresolvesthephrase"${wl.dir}\server\lib,"whichisparsedbyattachingthevalueofthepropertywl.dirtothestring"\server\lib."

SeeAlso

Recipe2.5,Recipe2.7-Recipe2.10;thedeploymentsectionsofWebLogic:TheDefinitiveGuide,byMountjoyandChugh(O'Reilly);WebLogic'sServer7.0programmerdocumentation:http://e-docs.bea.com/wls/docs70/programming.html.

Page 76: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe2.4DeployinganIndividualJSPonTomcat

Problem

YouwanttoplaceaJSPfileintoawebapplication.

Solution

CopytheneworrevisedJSPfileintothetop-leveldirectoryofthedefaultTomcatwebapplicationorofanotherdeployedwebapplication.

Discussion

TheeasiestwaytotestanewJSPfileistoplaceitatthetoplevelofTomcat'sdefaultwebapplication.Thisapplicationislocatedinthe<Tomcat-installation-directory>/webapps/ROOT/directory.Tomcat4.1.xcompiles(orrecompiles,ifyouarepastinganewJSPfileoveranoldone)theJSPanddisplayitsresponseinawebpage.YoudonothavetostopandstartTomcatusingtheTomcatmanagerapplicationforthenewJSPfiletobeavailabletoyourwebapplication.

PlacingaJSPfileinadeployedwebapplicationwillnotworkiftheJSPdependsonapplication-specificresourcessuchasservlets,customtags,orotherJavaclasses,becausethereisnoguaranteethatthetemporaryhostwebapplicationyouareusingfortheJSPhasaccesstothoseresources.

IfyouhavetodeployaJSPseparatelyfromitswebapplication,youcan

Page 77: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

alsoplaceaJSPfileinadeployedwebapplicationotherthantheTomcatdefaultapplication.ThismakestheJSPpageavailabletoapplicationuserswithouthavingtostopandrestartTomcat.RememberthattheJSPfilesbelonginthetoplevelofthewebapplication,whichhasthefollowingdirectorystructure:

index.html

default.jsp

anotherJsp.jsp

images/logo.jpeg

WEB-INF/classes/jspservletcookbook/myservlet.class

WEB-INF/lib/helperclasses.jar

WEB-INF/lib/utilities.jar

WEB-INF/web.xml

WEB-INF/mytags.tld

Inotherwords,thetoplevelofthedirectorycontainstheHTMLandJSPfiles,aswellastheWEB-INFdirectory.TheWEB-INFdirectorycontains:

Theweb.xmldeploymentdescriptor

Theclassesdirectory,whichcontainspackage-relateddirectoriesandservletorsupportclasseslikeJavaBeans

Thelibdirectory,whichstoresanyJavaArchive(JAR)filescontainingutilityorhelperclassesthatyourwebapplicationuses

Optionally,anyTagLibraryDescriptorfiles(fileswith.tldsuffixes)

Anyoptionaldirectoriesforimages,videofiles,XMLfiles,orotherwebresources

SeeAlso

Page 78: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

ThedeploymentsectionsofTomcat:TheDefinitiveGuide(O'Reilly);Recipe2.1,Recipe2.2,andRecipe2.6.

Page 79: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe2.5DeployinganIndividualJSPonWebLogic

Problem

YouwanttoquicklytestaJSPwithoutdeployingitaspartofanewwebapplication.

Solution

CopyandpastetheJSPintothetop-leveldirectoryofBEAWebLogicServer7.0'sdefaultwebapplication,thenrequesttheJSPinabrowser.

Discussion

AJSPfilecanbe"hotdeployed"onWebLogic7.0'sdefaultwebapplicationwithouthavingtoredeploytheentirewebapplication.Thisdefaultwebapplicationislocatedat<WebLogic-installation-directory>/user_projects/<name-of-your-domain>/applications/DefaultWebApp.IfyoupasteyourJSPfileintothisdirectory(DefaultWebApp),itwillbeavailabletoreceiverequestswithoutredeployingthedefaultwebapplication.IfyourJSPfileisnamednewfile.jsp,thentheURLforrequeststothispagewouldbehttp://localhost:7001/newfile.jsp.NotetheabsenceofacontextpathorapplicationnameintheURL.Iftherequestisforthedefaultwebapplication,thentheJSPfilesappearfollowingtheforwardslash(/)afterthehost:portpartoftheURL(inotherwords,afterthelocalhost:7001/part).

Torepeatapriorcaveat:placingaJSPfileinadeployedwebapplicationinorder

Page 80: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

totestitwillnotworkiftheJSPdependsonapplication-specificresourcessuchasservlets,customtags,orotherJavaclasses,becausethereisnoguaranteethatthetemporaryhostwebapplicationyouareusingfortheJSPhasaccesstothoseresources.

Inmostcases,theJSPisalreadypartofawebapplication,andseveraltoolsexisttoredeployawebapplication,includingAnt,BEAWebLogicBuilder,andtheWebLogicAdministrationConsole.

Finally,youcanalsocopyandpasteaJSPfileintoanotherWebLogicwebapplication.However,thatapplicationmustbedeployedinexplodeddirectoryformat,meaningthattheapplicationhasnotbeendeployedinarchiveform(asaWARorEARfile).Therefore,placetheJSPfileintheapplication'stop-leveldirectory.Iftheapplicationisnamed"newapp,"thisdirectoryisnamed<WebLogic-installation-directory>/user_projects/<name-of-your-domain>/applications/newapp.

SeeAlso

Recipe2.3;Recipe2.7-Recipe2.10;WebLogic'sServer7.0programmerdocumentation:http://e-docs.bea.com/wls/docs70/programming.html.

Page 81: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe2.6DeployingaWebApplicationonTomcat

Problem

YouwanttodeployanentirewebapplicationonTomcat4.1.x.

Solution

CreateaJakartaAntbuildfile.Antcanautomaticallycompileyourservletclasses,createawebapplicationarchive(.war)file,thendeploytheWARtotheTomcat4.1.xserver.

Discussion

TherecommendedmethodforthecompilationanddeploymentofwebapplicationsistousetheJakartaAntautomationtool.Ifyouchangeanythingintheapplication(suchasalteringaservletorJSP),thenallittakesisasinglecommand-lineexecutionofanttocompile,package,andredeploytheapplicationonTomcat.Youdonothavetogotothetroubleofmanuallyrecompilingachangedservlet,creatinganewWARfile,startingandstoppingTomcat,andredeployingtheapplication.

AnothermethodofdeployingawebapplicationonTomcatistoplaceadirectorycontainingawebapplicationintherequireddirectorystructureintheTomcatwebappsfolder.Thenameofthewebapplicationdirectory(suchasmyapp)thenbecomesthecontextpathornameofthenewwebapplication.Thisdeploymentmethodisnotguaranteedtoworkwithotherapplicationservers,however,soitisanineffectivestrategyforcreatingportableapplications.Inaddition,sincethismanualmethodisnotautomatedinanymanner,itisawkwardtoreplaceandkeeptrackofany

Page 82: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

changedservletorJavaBeanclassesinthesewebapplicationdirectories.

TheendofthisdiscussiondescribeshowtoconfigureTomcat'sserver.xmlconfigurationfilesothatacontextpathpointstoanunpackedwebapplicationdirectoryelsewhereontheserver.Asanalternativetocreatinganarchivedapplication(aWARfile),Tomcatdeveloperscanusethismethodofdeploymentduringdevelopmentandtesting.

UsingAntfordeployment

UsingAnttocompileanddeployanapplicationinvolvesthefollowingsteps:

1. ChooseadirectorytoholdtheAntbuild.xmlfile,anybuild.propertiesfiles,andallofthecontentsofyourwebapplication.

CreatethedirectoriestoholdtheJavaservletsourcefiles,anyJSPorHTMLfiles,JavaArchive(JAR)filesforcomponents(suchasdatabasedrivers)andthewebapplicationarchivefile(WARfile).OnewaytocreatethisdirectorystructureisshowninFigure2-5.

Figure2-5.Webapplicationdirectorystructure

3. Inthisexample,thesrcdirectorycontainstheJavasourcefilesforservletsandJavaBeans.Thewebdirectorycontainsthefiles

Page 83: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

thatresideatthetoplevelofthewebapplication,suchasJSPandHTMLfiles.ThemetadirectoryholdsXMLdeploymentdescriptors(attheveryleast,web.xml).ThebuilddirectoryiswhereAntcompilestheJavasourcefiles.ThesefileswillendupintheWEB-INF/classesdirectoryofthewebapplication.ThelibdirectoryisforanyJARfilesthatyourwebapplicationuses,suchasdatabasedriversand/ortaglibraries.Finally,thedistdirectorycontainstheWARfile.

CreatetheJavasourcecodefortheapplicationandmoveanyotherrelatedfiles(likeJSPsandweb.xml)intotheirspecifieddirectories.

Createanynecessarypropertyvaluesinthebuild.propertiesfilethatbuild.xmlwilluseduringthecompilationanddeploymentprocess.Thesepropertieswillbedescribedinmoredetailintheupcomingdiscussion.

Runthebuild.xmlfileonthecommandlinebychangingtothedirectorycontainingthebuild.xmlfileandtypingant.

Example2-5isthebuild.propertiesfilethatisreferencedinstep5.

Thefiledoesnothavetobecalledbuild.properties;thisnameisusedpurelybyconvention.Youcouldcallitglobal.props,forinstance.

Example2-5.build.propertiesforwebapplicationdeployment

tomcat.webapps=k:/jakarta-tomcat-4.1.12/webapps/

tomcat.dir=k:/jakarta-tomcat-4.1.12

url=http://localhost:8080/manager

username=tomcat

Page 84: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

password=tomcat

manager.path=${tomcat.dir}/work/standalone/localhost/manager

Eachofthesepropertiesismadeavailabletoorimportedintothebuild.xmlfilebythefollowinglinewithinthisfile:

<propertyfile="build.properties"/>

ThislinerepresentsapropertytaskorXMLelementwithinthebuild.xmlXMLfile.Forexample,thevalueofthetomcat.dirpropertyinsidetheAntXMLfileis"k:/jakarta-tomcat-4.1.12."

Example2-6istheentirebuild.xmlfile.ItcanbeusedtocompileJavaclasses,createaWARfile,anddeployittoTomcatjustbyexecutingantonthecommandline.ThechiefadvantageofusingAntisthatitautomatesanotherwisecomplicatedprocess.Ifyouhavetochangeoraddaservletinthewebapplication,forinstance,youcanrecompileandredeploythewebapplicationsimplybyrunningAnt.Thisbuild.xmlfileisfairlycomplexandintroducessomeadvancedfeaturesofAnt.

Example2-6.AnAntbuildfilefordeployingawebapplication

<projectname="DeployProject"default="deploy-application">

<taskdefname="deploy"classname="org.apache.catalina.ant.DeployTask"/>

<taskdefname="undeploy"classname="org.apache.catalina.ant.UndeployTask"/>

<propertyfile="build.properties"/>

<pathid="classpath">

<filesetdir="${tomcat.dir}/common/lib">

<includename="*.jar"/>

</fileset>

<filesetdir="${tomcat.dir}/common/endorsed">

<includename="*.jar"/>

</fileset>

Page 85: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

</path>

<targetname="init"

description="Initializessomeproperties.">

<echomessage="Initializingproperties."/>

<propertyname="build"value=".\build"/>

<propertyname="src"value=".\src"/>

<propertyname="dist"value=".\dist"/>

<propertyname="lib"value=".\lib"/>

<propertyname="web"value=".\web"/>

<propertyname="meta"value=".\meta"/>

<propertyname="context-path"value="myapp"/>

</target>

<targetname="prepare"depends="init">

<echomessage="Cleaningupthebuildanddistdirectories."/>

<deletedir="${build}"/>

<mkdirdir="${build}"/>

<deletedir="${dist}"/>

<mkdirdir="${dist}"/>

</target>

<targetname="deploy"

description="DeploysaWebapplication">

<deployurl="${url}"username="${username}"password="${password}"

path="/${context-path}"war="file:${dist}/${context-path}.war"

/>

</target>

<targetname="undeploy"

description="UndeploysaWebapplication"if="already.deployed">

<undeployurl="${url}"username="${username}"password="${password}"

path="/${context-path}"/>

</target>

<targetname="create-war"description="createsawebapplicationarchivefile">

<wardestfile="${dist}/${context-path}.war"webxml="${meta}/web.xml">

Page 86: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<classesdir="${build}"/>

<libdir="${lib}"/>

<filesetdir="${web}"/>

</war>

</target>

<targetname="deploy-application"depends="prepare"

description="Compilethewebapplication....">

<echomessage="Undeployingtheapplicationonlyifit'sdeployed..."/>

<availablefile="${manager.path}/${context-path}.war"property="already.deployed"/>

<antcalltarget="undeploy"/>

<echomessage="Compilingtheapplicationfiles..."/>

<javacsrcdir="${src}"destdir="${build}">

<includename="*.java"/>

<classpathrefid="classpath"/>

</javac>

<echomessage="creatingtheWARfile...."/>

<antcalltarget="create-war"/>

<antcalltarget="deploy"/>

</target>

</project>

Thecreate-wartargetusesthewarAnttasktogeneratetheWARfile,basedoncertainattributevaluesandnestedelements.Forexample,theweb.xmlfilethatwillbeincludedintheWARisspecifiedasthevalueforthewartask'swebxmlattribute.Inaddition,theclassesthatwillbeincludedintheWARfile'sWEB-INF/classesdirectoryarespecifiedbythisnestedelementofthewartask:

<classesdir="${build}"/>

Thenicethingaboutthisclasseselement,alongwiththelibandfilesetnestedelements,isthatallofthenesteddirectoriesinsidethebuild,lib,andwebdirectoriesareautomaticallyincludedintheWAR.Forexample,thewebdirectoryincludesanimagesdirectorycontainingtheapplication'svariousGIFfiles.TheimagesdirectoryisincludedatthetopleveloftheWARfile,alongwithanyHTMLorJSPfilesthatarestoredin

Page 87: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

thewebdirectory,justbyincludingthisnestedelement:

<filesetdir="${web}"/>

Alsoexaminethedeploy-applicationtarget,whichembodiesthemeatofthisbuild.xmlfile.AslongasyouproperlysetthePATHenvironmentvariabletopointattheAntcomponent,thedeploy-applicationtargetiscalledbydefaultwhenyoutypeantatthecommandline.

First,thetargetfindsoutwhetherthewebapplicationhasalreadybeendeployedonTomcat.Thisfunctionisincludedbecausethisbuildfilewillpresumablyberunoverandoveragain,notjustthefirsttimethewebapplicationisdeployed.Thislineusesanavailabletask,whichsetsapropertytothevalue"true"onlyifthefilespecifiedinitsfileattributeexists:

<availablefile="${manager.path}/${context-path}.war"

property="already.deployed"/>

<antcalltarget="undeploy"/>

Ifthisparticularfileisfound,itmeansthattheTomcatManagerapplicationhasalreadydeployedtheWARfile,andthatthealready.deployedpropertyissettotrue.Thisallowsthebuild.xmlfiletoconditionallyundeploytheapplication,beforetheapplicationisredeployedafteranychanges.Inotherwords,itundeploystheapplicationonlyifthewebapplicationisalreadydeployed(otherwise,runningtheundeploytargetraisesanerrorandhaltsexecutionofthebuildfile).Theundeploytargetrunsonlyifthealready.deployedpropertyissettotrue:

<targetname="undeploy"

description="UndeploysaWebapplication"

if="already.deployed">

Thehandyantcalltaskcallsanothertargetinthefile,similartocallingamethod.Finally,thedeploy-applicationtargetusesthejavac

Page 88: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

tasktocompiletheapplication'sservletsintothebuilddirectory,thenusestheantcalltasktocreatetheWARfileanddeploytheneworchangedapplicationtoTomcat.Thetargetechoesvariousmessagestotheconsoletohelpindicatetothedeveloperwhatitisdoing:

<targetname="deploy-application"depends="prepare"

description="Compilethewebapplication....">

...

<echomessage="Compilingtheapplicationfiles..."/>

<javacsrcdir="${src}"destdir="${build}">

<includename="*.java"/>

<classpathrefid="classpath"/>

</javac>

<echomessage="creatingtheWARfile...."/>

<antcalltarget="create-war"/>

<antcalltarget="deploy"/>

</target>

Asanalternativetousingthepriordeploymentmethod,youcanconfigureTomcattopointtoanexternaldirectorythatcontainsavalidwebapplication.ThisstrategydeploysthewebapplicationthenexttimeTomcatisrestarted.Itisanacceptablestrategywhentheapplicationisunderdevelopment,becauseyoucanconfigureTomcattoautomaticallyreloadtheapplication(Recipe2.2)whenaservletischanged,orwhenaJARfileisaddedtoWEB-INF/lib.However,developersshoulddeployapplicationsasWARfileswhenthetimecomestoruntheapplicationonaproductionserver.

CreateafilethatcontainsaContextelementasthiselementwouldappearinserver.xml.Givethisfilea.xmlextension.Itissensibletocallthisfilethesamenameasthecontextpathorapplicationname(forexample,myapp.xml),butnotrequired.Yourfilecontentmightlooklikethis:

<ContextclassName="org.apache.catalina.core.StandardContext"

crossContext="false"reloadable="true"

mapperClass="org.apache.catalina.core.StandardContextMapper"

useNaming="true"debug="0"swallowOutput="false"

Page 89: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

privileged="false"

wrapperClass="org.apache.catalina.core.StandardWrapper"

docBase="h:\book\cookbook\sec1\sec1_1\dist"

cookies="true"path="/newapp"cachingAllowed="true"

charsetMapperClass="org.apache.catalina.util.CharsetMapper">

</Context>

Thereloadableattributevalueof"true"configuresTomcattomonitortheclassesinWEB-INF/classesandthecomponentsinWEB-INF/libforanychanges.Tomcatautomaticallyreloadsthewebapplicationifitdetectsanychanges.

ThevalueforthedocBaseattributecanbeanabsolutepathtothedirectorythatcontainsthewebapplication,orthecontextroot.ItcanalsobethepathtoaWARfile.ThedocBaseattributecanalsobeapathnamerelativetotheappBasedirectoryoftheenclosingHostelementinserver.xml,suchasrelativetothe<Tomcat-installation-directory>/webappsdirectory.Thepathattributedeclaresthecontextpathforthenewapplication,asinhttp://localhost:8080/newapp/(where/newappisthecontextpath).

Placethisfileinthe<Tomcat-installation-directory>/webappsdirectory(orwhicheverdirectoryisconfiguredastheappBaseintheenclosingHostelementinconf/server.xml)andrestartTomcat.ThiswebapplicationcannowbeinvokedonTomcat.

SeeAlso

ThedeploymentsectionsofTomcat:TheDefinitiveGuidebyBrittainandDarwin(O'Reilly);Recipe2.1,Recipe2.2,andRecipe2.4.

Page 90: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe2.7DeployingaWebApplicationonWebLogicUsingAnt

Problem

YouwanttodeployawebapplicationonWebLogicServer7.0usingJakartaAnt.

Solution

CreateaJakartaAntbuildfile.Antcanautomaticallycompileyourservletclasses,createaweb-applicationarchive(.war)file,andthendeploytheWARtoWebLogicServer7.0.

Discussion

YoucaneithermanuallycutandpastewebcomponentsintotheWebLogicapplicationsdirectory(asdescribedinthesidebar),oruseAnttoautomatetheprocessofcompiling,generatingaWARfile,andcopyingtheWARtothisdirectory.Anexampledirectorypathtoapplicationsisk:\bea\user_projects\bwpdomain\applications.Thismethodwouldentailaminoreditofthebuild.xmlandbuild.propertiesfilesdescribedinRecipe2.6.

Page 91: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

ManuallyDeployingaWebApplication

WhenBEAWebLogicServer7.0isrunningindevelopmentmode,ifaWARfile,anenterprisearchiveapplication(EAR)file,oradirectorythatcontainsavalidwebapplicationisplacedintheapplicationsdirectory,thenthoseapplicationsareautomaticallydeployedandbecomeavailableontheserver.

AvalidwebapplicationcontainsaWEB-INF/web.xmldeploymentdescriptorthatdoesnotgenerateanyparsingexceptions.Ifthedirectorythatyouplaceintheapplicationsfolderdoesnotcontainadeploymentdescriptor,thenWebLogicwillnotautomaticallydeploytheapplication,eveniftheserverisrunningindevelopmentmode.WebLogicraisesanexceptionsimilartothisoneintheconsoleinwhichtheserverwasstartedup:

<Unabletoactivateapplication,_appsdir_dist_dir,fromsource,K:\bea\user_

projects\bwpdomain\applications\dist.Reason:NoJ2EEdeploymentdescriptor

foundat"K:\bea\user_projects\bwpdomain\applications\dist".>

Thisdeploy-applicationAnttargetiseditedinbuild.xmltodeployonWebLogic7.0:

<targetname="deploy-application"depends="prepare"

description="Compilethewebapplication....">

<echomessage="Compilingtheapplicationfiles..."/>

<javacsrcdir="${src}"destdir="${build}">

<includename="*.java"/>

<classpathrefid="classpath"/>

</javac>

<echomessage="creatingtheWARfile...."/>

<antcalltarget="create-war"/>

<copytodir="${wl.applications}">

<filesetdir="${dist}"/>

</copy>

</target>

Inaddition,thebuild.propertiesfilecoulddefinethewl.applicationspropertywithavaluesuchas"k:\bea\user_projects\bwpdomain\applications".OncetheWARfileiscopiedtothisspecialdirectory,aWebLogicserverthatisstartedin

Page 92: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

developmentmodewillautomaticallydeployit.

Inthe\user_project\bwpdomaindirectory(dependingonyourserverdomainname)theWebLogicstartscriptiscalledstartWebLogic.cmdonWindowsandstartWebLogic.shonUnix.Tostarttheserverindevelopmentmode,thelineinthestartscriptshouldbesetSTARTMODE=(thevalueisanemptystringhere)orsetSTARTMODE=false.TheserverstartsinproductionmodeifitissetSTARTMODE=true.

SeeAlso

Recipe2.3;Recipe2.8-Recipe2.10;WebLogic'sServer7.0programmerdocumentation:http://e-docs.bea.com/wls/docs70/programming.html.

Page 93: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe2.8UsingtheWebLogicAdministrationConsole

Problem

YouwanttodeployawebapplicationusingWebLogic'sAdministrationConsole.

Solution

BringuptheAdministrationConsoleinyourwebbrowseranduseitsgraphicalinterfacetodeployeitheraWARfileoraweb-applicationdirectory.

Discussion

TheWebLogicAdministrationConsoleisaservlet-andbrowser-basedtoolformanagingWebLogicserverresourcesandJava2EnterpriseEdition(J2EE)applications.TousetheConsole,WebLogicServermustberunning.First,requesttheURLhttp://localhost:7001/console(orwhicheveryourserveraddressandportis,asinhttp://<weblogic-server-address>:<port>/console).Thenenteryourloginnameandpasswordtogainentrytothebrowser-basedtool.TheresultingscreenlookslikeFigure2-6,withahierarchicallistofchoicesinthelefthandcolumnandthecurrentscreenchoiceintherighthandcolumn.

Figure2-6.WebLogicAdministrationConsole

Page 94: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Intheleftcolumn,choosethenameofyourdomainbyclickingontheplussign(+),whichdisplaysthedomain'ssubnodes.ThesubnodesofthedomainincludeServers,Clusters,Machines,NetworkChannels,Deployments,Services,andSecurity.Thenchoosethe"Deployments"node,whichgivesyouthechoiceofselectingits"WebApplications"subnode.Openupthe"WebApplications"nodebyclickingonitsplussign.TheresultingscreenlookslikeFigure2-7.

Figure2-7.WebApplicationsnode

IntheWebApplicationswindow,clickthe"ConfigureaNewWebApplication..."hyperlink.ThenextscreengivesyoutheoptionofuploadingtheWebApplicationArchive(WAR)orEnterpriseApplication

Page 95: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Archive(EAR)filethroughyourbrowsertotheserver'sfilesystem,asshowninFigure2-8.

Figure2-8.DeployingawebapplicationasaWARorEARfile

Initiatethisuploadandthenclickonthe"select"linknexttotheWARfile.CompletethethreestepsthatFigureFigure2-9shows:clickthearrowbuttonstodeploytheapplicationfromthe"AvailableServers"columntothe"TargetServers"column,nametheapplication(leavethenamethesameastheWARfilenameminusthe.warsuffix),thenpressthe"ConfigureandDeploy"button.ThatisallittakestodeploytheWARfiletothetargetserver.

Figure2-9.FinalstepsfordeployingtheWARfile

Page 96: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Nowtestthedeploymentbyrequestingoneoftheservletsinthebrowser,usingthenamethatyougavetheapplicationasthecontextpath.AnexampleURLishttp://localhost:7001/cookbook/cookieservlet.ThisURLrequestsaservletthathasbeenmappedtothename"/cookieservlet."Theweb-applicationcontextpathis/cookbook.

RedeployingapreviouslyundeployedwebapplicationusingtheWebLogicAdministrationConsoleinvolvesthefollowingsteps:

1. SelectthenameofyourapplicationundertheWebApplicationsnodeintheConsole'slefthandcolumn.ThisshowsascreensimilartoFigure2-10.

Figure2-10.SelectingawebapplicationintheConsole

Page 97: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

2. Clickthe"Deploy"buttonintherighthandscreen.Thisreactivatestheapplication,sothatitcanreceiverequestsintheWebLogicwebcontainer.

IfyouwanttodeleteawebapplicationusingtheWebLogicAdministrationConsole,clickonthenameofyourdomaininthelefthandcolumnoftheConsolescreen,thenonthe"Deployments"and"WebApplications"nodes.Clickingthetrashcaniconassociatedwiththeapplication,asshowninFigure2-11,deletestheapplicationfromtheWebLogicserver.

Figure2-11.Deletingawebapplication

Page 98: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

DeletingawebapplicationinthismannermeansthattheapplicationisnolongeravailabletoreceiverequestsintheWebLogicwebcontainer.

SeeAlso

Recipe2.3andRecipe2.7;Recipe2.9andRecipe2.10;WebLogic'sServer7.0programmerdocumentation:http://e-docs.bea.com/wls/docs70/programming.html.

Page 99: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe2.9UsingWebLogicBuildertoDeployaWebApplication

Problem

YouwanttouseWebLogicBuildertodeployawebapplication.

Solution

WebLogicBuilderinstallswiththeWebLogic7.0Server,soyoucanlaunchtheBuilderapplicationanduseitsgraphicaltoolstodeploythewebapplication.

Discussion

WebLogicBuilderisagraphicaltoolthatinstallswithWebLogicServer7.Itcanbeusedtoeditdeploymentdescriptorfilessuchasweb.xmlandweblogic.xml,aswellasfordeployingwebapplicationstoaserver.UsingWebLogicBuilder,youcanopenup,edit,anddeploywebapplicationsthatexistaseitherWARfilesorinexplodeddirectoryformat.

Explodeddirectoryformatisaweb-applicationdirectorystructureasitwouldappearinyourfilesystem,butthatisnotinarchivedorinWARform.TobedeployedonWebLogicasawebapplication,therootdirectorymustcontaintheWEB-INF/web.xmldeploymentdescriptorandanyotherproperlystructuredapplicationcomponents,suchasatheWEB-INF/classesdirectorycontainingyourservlets(includinganypackage-relateddirectories).

Page 100: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

YoucanlaunchWebLogicBuilderonWindowsfromeitherthe"Start"menuorthecommandline.ThestartscriptforBuilderisat:<BEA_HOME>/weblogic700/server/bin/startWLBuilder.cmd(orstartWLBuilder.shonUnix).<BEA_HOME>isthedirectorywhereWebLogicServer7.0isinstalled.

ItiseasytoopenupandeditthedeploymentdescriptorforawebapplicationinWebLogicBuilder.GototheFile OpenmenuandnavigatetotheWARfileorrootdirectoryfortheapplication.

TheresultisthewindowdepictedinFigure2-12.Thenavigationtreeintheupper-leftwindowletsyouconfigurewebresources(suchasservlets)anddeploymentdescriptorelements(suchassecurityconstraints),thensavethechangestoweb.xml.

Figure2-12.OpeningaWARfileinWebLogicBuilder

Youcanaddordeleteelementsforservlets,servletmappings,andfilters,forinstance.ThechangesarepersistedtothedeploymentdescriptorifyoumakeandsavechangestotheapplicationfromwithinWebLogicBuilder.Youcanthenoptionallyconnecttotheserverfromthe"Tools"menu,anddeploytheapplication.

The"DeployModule"windowindicateswhethertheapplicationisalreadydeployed.Figure2-13showsthiswindow.Ifyouhavealreadydeployed

Page 101: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

theapplication,youcanstillmakedeployment-descriptorchangesinBuilder,thendeploytheapplicationagainfromthe"Tools"menu.WebLogicBuilderspecificallyundeploystheapplication,thenredeploysitwiththechangesthatyouincludedinweb.xml.

Figure2-13.WebLogicBuilder'sDeployModulewindow

WebLogicBuilderdoesnotshowanyJSPfilesthatmaybepartofthewebapplication.ItwillshowanyservletmappingsthatareassociatedwithJSPfiles.

SeeAlso

Recipe2.3,Recipe2.7,Recipe2.8,andRecipe2.10;WebLogic'sServer7.0programmerdocumentation:http://e-docs.bea.com/wls/docs70/programming.html;thelocalWebLogicBuilderHelpdocumentation:<BEA_HOME>\weblogic700\server\builder\index.html.

Page 102: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe2.10Usingtheweblogic.DeployerCommand-LineTool

Problem

YouwanttousethecommandlinetodeployawebapplicationonWebLogicServer7.0.

Solution

UsetheJava-basedweblogic.Deployercommand-lineutility,whichisinstalledwithWebLogicServer7.0.

Discussion

Fordevelopersoradministratorswhoneedtousethecommandlineorshellscriptsfordeployingandredeployingwebapplications,WebLogicServer7.0providestheJava-basedDeployerutility.ThisutilityaccomplishesthesametasksasusingthegraphicalinterfaceoftheWebLogicAdministrationConsoletodeployorredeployawebapplication.First,thisrecipedescribeshowtodeployandredeployawebapplicationonthecommandlineusingtheDeployerutility.ThentherecipeprovidesanexampleofaWindowsbatchfilethatinvokestheDeployerutility.

TheDeployerutilitycaninitiateothertasks,suchasredeployingindividualwebcomponentsinawebapplication.TheonlinedocumentationfortheDeployerutilitycanbefoundathttp://e-docs.bea.com/wls/docs70/programming/deploying.html#1094693.

Page 103: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

TheDeployerutilityisaJava-basedprogramthatrequiresthefollowingJARfileonyourclasspathbeforetheprogramcanrun:<BEA_HOME>\server\lib\weblogic.jar."><BEA_HOME>representsthedirectorywhereWebLogicServer7.0wasinstalled.Thefollowingcommand-linescriptonaWindowsNT4.0machineredeploysthecookbook.warwebapplicationonaservernamedbwpserver:

java-cpk:\bea\weblogic700\server\lib\weblogic.jar;

%CLASSPATH%weblogic.Deployer

-adminurlhttp://localhost:7001

-userbwperry-namecookbook-source.\dist\cookbook.war

-targetsbwpserver-activate

Thiscommand-lineinvocationdeploysthewebapplicationrepresentedbythearchivefilecookbook.war,sotheapplicationisnowavailabletoreceiverequestswiththecontextpath/cookbook.Whenrunonthecommandline,theprogrampromptstheuserforapasswordifyouhavenotincludeditinthescriptwiththe-passwordoption.The-sourceoptionspecifiesthelocationoftheWARfileorweb-applicationdirectory.The-targetsoptionspecifiesoneormoreserversonwhichtodeploythewebapplication.Thefinalcommandfordeployingtheapplicationis-activate.

Thiscommand-lineinvocationdeactivates(makesunavailable)anexistingwebapplicationontheserverbwpserver.Itpromptsfortheuserpasswordfirst,unlessyouaddthe-passwordoptiontothecommandline:

java-cpk:\bea\weblogic700\server\lib\weblogic.jar;

%CLASSPATH%weblogic.Deployer

-adminurlhttp://localhost:7001

-userbwperry-namecookbook

-targetsbwpserver-deactivate

The-cpoptionspecifiestheclasspathtouseforrunningtheDeployer

Page 104: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Javautility,andmustincludetheweblogic.jarJARfile.The-adminurlswitchspecifiestheadministrationserver(thedefaultvalueishttp://localhost:7001,soitdoesnothavetobeincludedhere).The-nameoptionspecifiesthenameoftheapplicationtobedeactivated,andthe-targetsoptionnamestheserverwheretheapplicationisrunning.Thefollowingcommand-lineinvocationredeploysthesame"cookbook"application:

java-cpk:\bea\weblogic700\server\lib\weblogic.jar;

%CLASSPATH%weblogic.Deployer

-userbwperry-namecookbook-activate

Thistime,the-adminurland-targetsoptionswereomitted.Thedefaultvaluesfortheseswitchesarehttp://localhost:7001andallcurrenttargets(ifthedeveloperisredeployinganexistingapplication),respectively.Iftheapplicationisbeingdeployedforthefirsttime,thedefaulttargetforthe-targetsoptionistheadministrationserver.

Itiseasiertorunshellcommandsfromabatchfile,becausethereislesstypingforcomplicatedcommand-lineprogramsandtheshellscriptscanbepermanentlysaved.Example2-7isthefirstexamplerewrittenasabatchfileonWindowsNT4.0.

Example2-7.Deployinganapplication

@echooff

setWL_HOME=K:\bea\weblogic700

setBEA_CLASSPATH=%WL_HOME%\server\lib\weblogic.jar;%CLASSPATH%

java-cp%BEA_CLASSPATH%weblogic.Deployer-adminurlhttp://localhost:7001-userbwperry

-namecookbook-source.\dist\cookbook.war-targetsbwpserver-activate

Thisbatchfilesetstwoenvironmentvariables:WL_HOMEandBEA_CLASSPATH.Theseareusedtomakesurethattheclasspathincludestheweblogic.jarfile,whichcontainstheDeployerutility.Ifthe

Page 105: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

scriptwassavedasdeploy.bat,thisishowitwouldberunonthecommandline:

H:\book\cookbook>deploy

Theresultingconsoleoutputlookslikethis.

Enterapasswordfortheuser"bwperry":bwpserver_1968

Operationstarted,waitingfornotifications...

....

#TaskIDActionStatusTargetTypeApplicationSource

15ActivateSuccessbwpserverServercookbookH:\book\

cookbook\.\dist\cook

SeeAlso

Recipe2.3andRecipe2.5;Recipe2.7-Recipe2.9;WebLogic'sServer7.0programmerdocumentation:http://e-docs.bea.com/wls/docs70/programming.html.

Page 106: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Chapter3.NamingYourServletsIntroduction

Recipe3.1.MappingaServlettoaNameinweb.xml

Recipe3.2.CreatingMoreThanOneMappingtoaServlet

Recipe3.3.CreatingaJSP-TypeURLforaServlet

Recipe3.4.MappingStaticContenttoaServlet

Recipe3.5.InvokingaServletWithoutaweb.xmlMapping

Recipe3.6.MappingAllRequestsWithinaWebApplicationtoaServlet

Recipe3.7.MappingRequeststoaControllerandPreservingServletMappings

Recipe3.8.CreatingWelcomeFilesforaWebApplication

Recipe3.9.RestrictingRequestsforCertainServlets

Recipe3.10.GivingOnlytheControllerAccesstoCertainServlets

Page 107: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Introduction

Animportantwebapplicationconfigurationtaskistocreatethepathbywhichyourservletisrequestedbywebusers.Thisiswhattheusertypesintotheaddressfieldofhisbrowserinordertomakearequesttotheservlet.Whilethisissometimesthefullnameoftheservlet,thatconventionoftenresultsinanawkwardURI.Forexample,awebsitemighthaveaservletthatdynamicallyassemblesa"Resources"page,insteadofastaticresources.htmlpage.Usingthefullservletname,therequestURLmightbehttp://www.myorganization.com/servlet/com.organization.servlets.resources.ResourceServletThisisquiteapathtotypein;itmakesmuchmoresensetomapthistoaservletpath,whichisanaliasfortheservlet.Usingtheservletpath,the(new)addressforthedynamicpagemightbehttp://www.myorganization.com/resources.Theservletpath,inthiscase,is/resources.

ThisservletpathisalsotheidentifierusedbyotherservletsorJSPsthatforwardrequeststothisparticularservlet,aswellastheaddressthatanHTMLformtagusesinitsactionattributetolaunchparameternamesandvaluestowardtheservlet.TheservletspecificationoffersanintuitiveandflexiblewaytomapHTTPrequeststoservletsintheweb.xmldeploymentdescriptor.

Thischapterdescribeshowyoucanusetheweb.xmldeploymentdescriptortocreateoneormorealiases(servletpaths)toyourservlet.ItalsodiscusseshowtoinvoketheservletwithothertypesofURLs,suchasonethatlookslikeaJSPpagerequest(e.g.,info.jsp)oronethatlookslikeanHTMLpagerequest(info.html).Recipe3.5alsodescribeshowtoaccessaservletwithoutamappinginweb.xml,forexample,forthedeveloperwhowantstodebugherservletwithoutmodifyingtheweb.xmlfile.

Finally,Recipe3.7,Recipe3.9,andRecipe3.10showhowtomapallrequeststoone"controller"servlet(Recipe3.7),restricttherequestsforcertainservletstoauthenticatedusers(Recipe3.9),andblockall

Page 108: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

requeststocertainservletsexceptthoseforwardedfromthecontroller(Recipe3.10).

Page 109: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe3.1MappingaServlettoaNameinweb.xml

Problem

Youwanttocreateanalias,orservletpath,toyourservlet.

Solution

Createservletandservlet-mappingelementsinweb.xml.

Discussion

Creatinganaliastotheservlettakesplaceinthedeploymentdescriptor'sservlet-mappingelement.Allservletelementsmustcomebeforeanyoftheservlet-mappingelementsintheservlet2.3web.xmldeploymentdescriptor.Theservlet-mappingelementreferstothenameoftheservletthatappearsintheservlet-nameelement,suchas:

<servlet><servlet-name>myservlet</servlet-name></servlet>

Thisisreferredtoastheservlet'sregisteredname.Theservlet-mappingthenprovidesthename,orURLpattern,whichwebapplicationuserscantypeintotheirbrowserstoaccesstheservlet.Example3-1showsaweb.xmlfilewithaservletandservlet-mappingelement.Theregisterednameinthiscaseis"CookieServlet".

Example3-1.servletandservlet-mappingelements

Page 110: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<?xmlversion="1.0"encoding="ISO-8859-1"?>

<!DOCTYPEweb-app

PUBLIC"-//SunMicrosystems,Inc.//DTDWebApplication2.3//EN"

"http://java.sun.com/dtd/web-application_2_3.dtd"

>

<web-app>

<servlet>

<servlet-name>CookieServlet</servlet-name>

<servlet-class>com.jspservletcookbook.CookieServlet</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>CookieServlet</servlet-name>

<url-pattern>/cookieservlet</url-pattern>

</servlet-mapping>

</web-app>

Inthisexample,theservletelementregistersthename"CookieServlet"byusingtheservlet-nameelement.Theclassnameisspecifiedbytheservlet-classelement.TheactuallocationofthisservletclassmaybeWEB-INF/classes/com/jspservletcookbook/,orinsideaJARfilethatresidesinWEB-INF/lib."CookieServlet"becomestheregisterednamebywhichtheservletcom.jspservletcookbook.CookieServletisreferredtointherestoftheweb.xmlfile.

Nowcreatetheservletpathbywhichthewebapplicationuserswillaccessthisservletintheirwebbrowsers.Thisaliasingisaccomplishedwiththeservlet-mappingelement.servlet-nameidentifiestheregisterednamebywhichtheservletisreferredtoinweb.xml,andtheurl-patternelementcreatestheURLthatisusedtoaccessthisservlet.The/characterinsidethe/cookieservletpatternmeans"beginattheweb-applicationroot."Forexample,ifthecontextpathforthesitehttp://www.mysite.orgis"cookbook,"thenthecompleteaddressforaccessingtheCookieServletservletishttp://www.mysite.org/cookbook/cookieservlet.The/cookbookpartofthe

Page 111: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

URListhecontextpathforyourwebapplication.Theservletisthenidentifiedwiththe/cookieservletpatternwithinthatcontext.

Lookingatthismoregenerally,youhavethefollowingURLforanygivenservlet:

http://<host>:<port>/<contextpath>/<servlet-path>

Mostservletcontainersallowforadefaultcontext,wherethecontextpathis/.Inthiscase,theURLisinthisform:

http://<host>:<port>/<servlet-path>

Forexample,ifyouareusingTomcat4.1.xonyourlocalmachineandhavecreatedanapplicationcalled"myapp"andaservletURLpatternof/myservlet,theentirewebaddressforthatservletlookslikehttp://localhost:8080/myapp/myservlet.

YoucanalsoaccessaservletwithaURLlikethis:

http://host:port/contextpath/servlet/registered-servlet-name

Soiftheregisteredservletnamewas"MyServlet,"thentherequestappearsashttp://localhost:8080/myapp/servlet/MyServlet.

Someservletenginesuseadifferentservletpaththan/servlet,andothersallowthispathtobechangedbyanadministrator.Youshouldconsultthedocumentationforyourservletcontainertoensurethecorrectpathforyoursetup.Whatiftheexampleservlet-mappingelementappearedintheweb.xmlfilefortheserver'sdefaultwebapplication,inwhichthecontextpathis/?Inthiscase,userswouldaccesstheCookieServletservletbyusingtheaddresshttp://www.mysite.org/cookieservlet.

Theurl-patternthatyoucreateforaservletinsideofaservlet-mappingelementiscase-sensitiveinTomcatandWebLogic.AccordingtoChapterSRV.11.1oftheservletv2.3specificationandv2.4proposedfinaldraft,"The

Page 112: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

containermustusecase-sensitivestringcomparisonsformatching."Iftheuserrequestshttp://www.mysite.org/cookbook/cookieSERVLETinsteadofhttp://www.mysite.org/cookbook/cookieservlet,thentherequestisnotdirectedtothemappedservlet(CookieServlet).InTomcat4.1.xandWebLogic7.0,therequestreturnsanHTTP404errorcode,whichisthe"Filenotfound"typeerrorreturnedbyawebserver.

Theurl-patterninsidetheservlet-mappingelementcantakeondifferentforms,whicharediscussedintheupcomingrecipes.

SeeAlso

Chapter1onweb.xml;Recipe3.2-Recipe3.8;Chapter11oftheServletv2.3and2.4specificationsonmappingrequeststoservlets.

Page 113: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe3.2CreatingMoreThanOneMappingtoaServlet

Problem

YouwanttocreateseveralnamesorURLpatternsthatwebuserscanusetorequestasingleservlet.

Solution

Associatetheservletelementwithmorethanoneservlet-mappingelementinthedeploymentdescriptor.

Discussion

Youcancreateanumberofservlet-mappingelementsforasingleservlet,asshowninExample3-2.Ausercanaccessthisservletbyusingoneoftwoaddresses:http://www.mysite.org/cookbook/cookieservletorhttp://www.mysite.org/cookbook/mycookie.

Example3-2.Twoservlet-mappingtags

<?xmlversion="1.0"encoding="ISO-8859-1"?>

<!DOCTYPEweb-app

PUBLIC"-//SunMicrosystems,Inc.//DTDWebApplication2.3//EN"

"http://java.sun.com/dtd/web-application_2_3.dtd"

>

<web-app>

Page 114: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<servlet>

<servlet-name>CookieServlet</servlet-name>

<servlet-class>com.parkerriver.cookbook.CookieServlet</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>CookieServlet</servlet-name>

<url-pattern>/cookieservlet</url-pattern>

</servlet-mapping>

<servlet-mapping>

<servlet-name>CookieServlet</servlet-name>

<url-pattern>/mycookie</url-pattern>

</servlet-mapping>

</web-app>

Rememberthattheservlet-mappingelementshavetoappearafteralloftheservletelementsintheservlet2.3deploymentdescriptor.

OnlyexactmatchestotheURLpatternwillwork.Ifauserrequests/cookieservlet/(notethefinalforwardslash)insteadof/cookieservlet,shereceivesanHTTPerrorcodeinsteadoftheservlet-generatedpageshewasexpecting.

Youcanuseawildcardcharacter(*)toextendyourmappingpattern.ThemappingsinExample3-3invoketheCookieServletforalloftheURLsthatbeginwith/cookie/,andthenoptionallyincludeanynamesaftertheforwardslash.Forexample,CookieServletcanbeinvokedwithaURLofhttp://www.mysite.org/cookbook/cookie/youusingthisdescriptor.Thisisbecausetheurl-patternmatchesanyHTTPrequestsendingwiththe"/cookie/"string.

Example3-3.UsinganasteriskintheURLpattern

<?xmlversion="1.0"encoding="ISO-8859-1"?>

Page 115: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<!DOCTYPEweb-app

PUBLIC"-//SunMicrosystems,Inc.//DTDWebApplication2.3//EN"

"http://java.sun.com/dtd/web-application_2_3.dtd"

>

<servlet>

<servlet-name>CookieServlet</servlet-name>

<servlet-class>com.jspservletcookbook.CookieServlet</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>CookieServlet</servlet-name>

<url-pattern>/cookie/*</url-pattern>

</servlet-mapping>

Youcannotusetheasteriskcharacterasawildcardsymbolinsidetheservlet-nameelement.Theasteriskcanbeusedonlyasawildcardsymbolintheurl-patternelement(asin<url-pattern>/cookie/*</url-pattern>),orinpatternsthatpointtoallfileswithacertainextensionorsuffix(asin<url-pattern>*.jsp</url-pattern>).Thelatterpatterniscalledanextensionmapping.

SeeAlso

Chapter1onweb.xml;Recipe3.1;Recipe3.3-Recipe3.8;Chapter11oftheServletv2.3and2.4specificationsonmappingrequeststoservlets.

Page 116: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe3.3CreatingaJSP-TypeURLforaServlet

Problem

YouwanttolinkaURLpatternthatlookslikeaJSPfilerequesttoaservlet.

Solution

Createaservlet-mappingelementthatincludesaJSP-styleURLpattern.

Discussion

Imentionedinthepreviousrecipesthatyouhavealotoflatitudewhencreatingaliasesthatpointtoservlets.Forinstance,arequestthatappearstoaccessaJSPfilecaneasilybemappedtoaservlet.ThedeploymentdescriptorinExample3-4mapstheURLpattern/info.jsptotheJspInfoservlet.

Example3-4.DeploymentdescriptorexampleofmappingaJSP-styleURLtoaservlet

<?xmlversion="1.0"encoding="ISO-8859-1"?>

<!DOCTYPEweb-app

PUBLIC"-//SunMicrosystems,Inc.//DTDWebApplication2.3//EN"

"http://java.sun.com/dtd/web-application_2_3.dtd"

>

Page 117: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<web-app>

<servlet>

<servlet-name>JspInfo</servlet-name>

<servlet-class>com.parkerriver.cookbook.JspInfo</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>JspInfo</servlet-name>

<url-pattern>/info.jsp</url-pattern>

</servlet-mapping>

</web-app>

TheforwardslashthatbeginstheURLpattern/info.jspmeans"beginattherootofthewebapplicationthatusesthisdeploymentdescriptor."SotheentireURLfortheJspInfoservletlookslikethisforthecookbookwebapplication:http://www.mysite.org/cookbook/info.jsp.

YoucanalsomapallreferencestoJSPpagestoasingleservlet,asshowninExample3-5,whichusesaweb.xmlentrywithanextensionmapping.

Example3-5.MappingallJSPURLstoasingleservlet

<?xmlversion="1.0"encoding="ISO-8859-1"?>

<!DOCTYPEweb-app

PUBLIC"-//SunMicrosystems,Inc.//DTDWebApplication2.3//EN"

"http://java.sun.com/dtd/web-application_2_3.dtd"

>

<web-app>

<servlet>

<servlet-name>JspInfo</servlet-name>

<servlet-class>com.parkerriver.cookbook.JspInfo</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>JspInfo</servlet-name>

<url-pattern>*.jsp</url-pattern>

Page 118: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

</servlet-mapping>

</web-app>

Makesuretoexcludetheslash(/)intheURLpattern,asanextensionmappingthatusesafileextensionsuffixbeginswithanasteriskandendswithaperiodandthesuffixitself,asin<url-pattern>*.jsp</url-pattern>.ThistypeofmappingmaybeusefulifyouweremigratinganapplicationfromoneversionthatusedalotofJSPpagestoanewversionthatreliedentirelyonservlets.ThistakescareofuserswhohavebookmarkedmanyURLsthatinvolveJSPfiles.

Tomcat4.1.xincludesanimplicitmappingtoitsownJSPpagecompilerandexecutionservletforanyrequestendingin.jsp.Ifyouincludeamappingsuchastheoneinthepreviousweb-appfragment,thenyourmappingwilloverrideTomcat'simplicitmapping.

SeeAlso

Chapter1onweb.xml;Recipe3.1andRecipe3.2;Recipe3.4-Recipe3.8;Chapter11oftheServletv2.3and2.4specificationsonmappingrequeststoservlets.

Page 119: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe3.4MappingStaticContenttoaServlet

Problem

YouwantrequestsforstaticcontentsuchasHTML-styleURLstorequestaservlet.

Solution

Useaservlet-mappingelementinweb.xmltomaptheservletnametothestaticcontent.

Discussion

Itoftenseemsoddtothecasualprogrammer,butyoucanhaveaservletrespondtoaURLthatappearstobestaticcontent,suchasanHTMLfile.Example3-6mapstheservletHtmlServlettoallURLsendinginthe.htmlsuffix.Anyrequestwithinthewebapplicationthatcontainsthisdeploymentdescriptorandspecifiesafileendingwith.htmlisdirectedtoHtmlServlet.

Example3-6.Mappingstaticcontenttoaservletinweb.xml

<?xmlversion="1.0"encoding="ISO-8859-1"?>

<!DOCTYPEweb-app

PUBLIC"-//SunMicrosystems,Inc.//DTDWebApplication2.3//EN"

"http://java.sun.com/dtd/web-application_2_3.dtd"

>

Page 120: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<web-app>

<servlet>

<servlet-name>HtmlServlet</servlet-name>

<servlet-class>com.jspservletcookbook.HtmlServlet</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>HtmlServlet</servlet-name>

<url-pattern>*.html</url-pattern>

</servlet-mapping>

</web-app>

Theservlet-mappingelementinthislistingcontainsanextension-mappingURLpattern:itbeginswithanasteriskandendswith.html.IfyouwanttomaptheservlettojustoneHTMLfile,useXMLthatlookslikethis:

<url-pattern>myfile.html</url-pattern>.

Usingthispattern,onlyrequestsforthemyfile.htmlfilearedirectedtoHtmlServlet.

MakesurethatURLpatternsneverbeginwithaslash(/)whenyouarecreatingextensionmappings.

SeeAlso

Chapter1onweb.xml;Recipe3.3;Recipe3.5-Recipe3.8;Chapter11oftheServletv2.3and2.4specificationsonmappingrequeststoservlets.

Page 121: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe3.5InvokingaServletWithoutaweb.xmlMapping

Problem

Youwanttorequestaservletthatdoesnothaveaservlet-mappingelementintheweb.xmldeploymentdescriptor.

Solution

Useaninvoker-styleURLoftheformhttp://www.mysite.org/mywebapp/servlet/com.jspservletcookbook.MyServlet

Discussion

Someservletsmaynothaveapathmappinginthewebapplication'sdeploymentdescriptor.Sohowcanauserrequestthisservlet?WhatnameandURLdotheyuse?

Tomcatandotherservletcontainersprovideamethodforinvokingservletsthatarenotmappedinweb.xml.YoucanuseaURLofthefollowingform:

http://www.mysite.org/mywebapp/servlet/<fullyqualifiedclassnameofservlet>

Aservletwiththeclassandpackagenameofjspservletcookbook.MyServletisinvokedashttp://www.mysite.org/mywebapp/servlet/jspservletcookbook.MyServlet.Ensurethatthepathsegmentfollowingthenameofyourwebapplicationis/servlet/andnot/servlets/.Iftheservletisstoredinthedefaultwebapplication(generallyatthetopleveloftheservletcontainer),theURL

Page 122: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

forinvokingitishttp://www.mysite.org/servlet/jspservletcookbook.MyServlet.

Theweb.xmlfilelocatedin<Tomcat_install_directory>/confincludesthisdefinitionandmappingfortheinvokerservlet:

<servlet>

<servlet-name>invoker</servlet-name>

<servlet-class>org.apache.catalina.servlets.InvokerServlet</servlet-class>

<init-param>

<param-name>debug</param-name>

<param-value>0</param-value>

</init-param>

<load-on-startup>2</load-on-startup>

</servlet>

<servlet-mapping>

<servlet-name>invoker</servlet-name>

<url-pattern>/servlet/*</url-pattern>

</servlet-mapping>

Theinvokerservletcanalsobeusedtoinvoketheservletsthatareregisteredinweb.xml.TheseURLslooklikehttp://www.mysite.org/cookbook/servlet/<RegisteredServletName>.Forinstance,imagineyouhaveaservletelementlikethis:

<servlet>

<servlet-name>myservlet</servlet-name>

<servlet-class>jspservletcookbook.MyServlet</servlet-class>

</servlet>

Considerthatthewebapplicationcontextpathis/cookbook.IftheTomcatinvokerservletisenabledinthisapplication,thenthisservletcanbeinvokedwithitsregisterednameathttp://www.mysite.org/cookbook/servlet/myservlet.

InTomcat4.1.x,theinvokerservletmappingmaybecommentedoutinsideofthe

Page 123: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<tomcat-installation-directory>/conf/web.xmlfile.Thepurposeofthusdisablingtheinvokeristoensurethatservletscanbeinvokedusingonlythepathsspecifiedbytheservlet-mappingelementsinweb.xml.

Ifaservletisrequestedusingtheformhttp://www.mysite.org/myapp/servlet/<fully-qualified-classname>,ratherthanusingtheservlet'sregisteredname,anyinitializationparametersprovidedforthatservletintheweb.xmlfilearenotavailable.Example3-7showsaregisteredservletwithinitparameters.

Example3-7.Aregisteredservletwithinitparameters

<servlet>

<servlet-name>Weather</servlet-name>

<servlet-class>home.Weather</servlet-class>

<init-param>

<param-name>region</param-name>

<param-value>NewEngland</param-value>

</init-param>

</servlet>

Becauseitistheregisterednameoftheservletthathastheregionparameterassignedtoit,onlyarequestforthatregisteredname(oraservletpathmappedtothatname)triggerstheregionparameters.AccessingtheservletthroughitsfullyqualifiednamewillnotresultintheregionparameterbeingpassedtotheWeatherservlet.

SeeAlso

Chapter1onweb.xml;Recipe3.1-Recipe3.4;Recipe3.6-Recipe3.8;Chapter11oftheServletv2.3and2.4specificationsonmappingrequeststoservlets.

Page 124: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe3.6MappingAllRequestsWithinaWebApplicationtoaServlet

Problem

Youwanttohaveallwebapplicationrequestsgotoasinglecontrollerservlet.

Solution

Useaservlet-mappingelementinyourdeploymentdescriptor,withaurl-patternelementof<url-pattern>/*</url-pattern>.

Discussion

Insomecases,youmightwanttohaveallrequestsrelatedtothewebapplicationtogoasingleservlet.Thisservletcontrollermaylogrequests,implementsecurity,orexamineandoptionallyaltertherequestobjectbeforeitforwardstherequesttoanotherlocation(usuallyanotherservletorJSP).

FortheSunMicrosystemsdescriptionoftheFrontControllerdesignpattern,whichisamethodforusingaservletasacentralprocessingpoint,seetheCoreJ2EEBlueprintspageathttp://java.sun.com/blueprints/corej2eepatterns/Patterns/FrontController.html.

Onceagain,web.xmlistheplacetoconfigureaservlettoreceiveallweb

Page 125: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

applicationrequests.Example3-8showshowtouseaURLpatterntoaimallrequestsatacontrollerservlet.

Example3-8.Aimingallrequestsatacontrollerservlet

<?xmlversion="1.0"encoding="ISO-8859-1"?>

<!DOCTYPEweb-app

PUBLIC"-//SunMicrosystems,Inc.//DTDWebApplication2.3//EN"

"http://java.sun.com/dtd/web-application_2_3.dtd"

>

<web-app>

<servlet>

<servlet-name>Interceptor</servlet-name>

<servlet-class>com.jspservletcookbook.Interceptor</servlet-class>

</servlet>

<!--ThemappingsfortheInterceptorservlet-->

<servlet-mapping>

<servlet-name>Interceptor</servlet-name>

<url-pattern>/*</url-pattern>

</servlet-mapping>

<servlet-mapping>

<servlet-name>Interceptor</servlet-name>

<url-pattern>/servlet/*</url-pattern>

</servlet-mapping>

</web-app>

Youmayalsohavetooverrideanydefaultinvokerservletwithyourownmapping:

<url-pattern>/servlet/*</url-pattern>

Maptheservletthatyouwanttoreceiveallwebapplicationrequeststo

Page 126: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

thisURLpatternaswell.Ifyoukeeptheinvokerservletthewayitis,userscouldbypassthecontrollerservletbyusingaURLlikehttp://www.mysite.org/myapp/servlet/com.jspservletcookbook.CookieServlet

InTomcat,youcanalsodisabletheinvokerservletinthetop-levelweb.xmlfile(in<Tomcat_install_directory>/conf)bycommentingouttheservlet-mappingelement.ThisaffectsallotherwebapplicationsrunningunderthatTomcatinstance,however,sothisdecisionshouldbemadecollectivelyamongadministratorswhodeployapplicationsonthatserver.

Youmustalsoremove,alter,orcommentoutotherservlet-mappingelementsthatallowservletrequeststobypassthecontrollerservlet.Ifamorespecificmapping(suchastheoneinExample3-9)isincludedinweb.xml,requestsfortheCookieServletwillbypasstheInterceptorservlet.

Example3-9.Specificmappingsoverridemappingsusingwildcardsymbols

<?xmlversion="1.0"encoding="ISO-8859-1"?>

<!DOCTYPEweb-app

PUBLIC"-//SunMicrosystems,Inc.//DTDWebApplication2.3//EN"

"http://java.sun.com/dtd/web-application_2_3.dtd"

>

<web-app>

<servlet>

<servlet-name>Interceptor</servlet-name>

<servlet-class>jspservletcookbook.Interceptor</servlet-class>

</servlet>

<servlet>

Page 127: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<servlet-name>CookieServlet</servlet-name>

<servlet-class>

com.jspservletcookbook.CookieServlet

</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>Interceptor</servlet-name>

<url-pattern>/*</url-pattern>

</servlet-mapping>

<servlet-mapping>

<servlet-name>CookieServlet</servlet-name>

<url-pattern>/CookieServlet</url-pattern>

</servlet-mapping>

</web-app>

Theservlet-mappingelementforCookieServletinthisexamplewouldcausetheservletpathof/CookieServlettobypasstheInterceptorservlet,becausetheservletpathof/CookieServlet(aspartofarequestthatlookslikehttp://host:port/context-path/CookieServlet)isamoreexactmatchtotheURLpatternof/CookieServletthanitisto/*.

Therequestsforstaticcontentsuchaswelcomefiles(e.g.,index.html)arealsointerceptedbytheURLpattern/*.Therequestsforthesestaticfileswillalsogotothecontrollerservlet.

SeeAlso

Chapter1onweb.xml;Recipe3.1-Recipe3.4;Recipe3.6-Recipe3.8;

Page 128: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Chapter11oftheServletv2.3and2.4specificationsonmappingrequeststoservlets;theCoreJ2EEBlueprintspage:http://java.sun.com/blueprints/corej2eepatterns/Patterns/FrontController.html

Page 129: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe3.7MappingRequeststoaControllerandPreservingServletMappings

Problem

Youwanttomapallrequeststoasinglecontrollerservlet,whilepreservingtheservletmappingsforotherservletsinasecuremanner.

Solution

Usesecurity-constraintelementsinweb.xmltopreventwebusersfrommakingrequeststothenoncontrollerservlets.

Discussion

Whatifthecontrollerservletthatreceivesallrequestswantstoconditionallyforwardtherequestalongtoanotherservletforspecializedprocessing?Ifalloftheotherservletmappingsareremovedfromweb.xmlandtheinvoker-styleURLpattern(/servlet/*)ismappedtothecontrollerservletitself,eventhecontrollerservletispreventedfromforwardingarequesttoanotherservlet!Howcanyougetaroundtheserestrictions?

Asolutionistoretaintheindividualservletmappingsinweb.xml.Thenyoucanusesecurity-constraintelementstopreventwebusersfrommakingrequeststothesenoncontrollerservlets.Whenthecontrollerservletwantstoforwardarequesttoanotherservlet,itusesanobjectthatimplementsthejavax.servlet.RequestDispatcherinterface.RequestDispatchersarenotrestrictedfromforwardingrequests(usingtheRequestDispatcher.forward(request,response)

Page 130: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

method)toURLpatternsthatarespecifiedbysecurity-constraintelements.Example3-10showsaservletnamedControllerthatusesaRequestDispatchertoforwardarequesttoanotherservlet.

Recipe3.9describeshowtoprotectservletsfromreceivinganyweb-userrequestswiththesecurity-constraintelement,soIwon'trepeatthatinformationhere.

Example3-10.UsingRequestDispatchertoforwardarequest

importjavax.servlet.*;

importjavax.servlet.http.*;

publicclassControllerextendsHttpServlet{

publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)

throwsServletException,java.io.IOException{

RequestDispatcherdispatcher=null;

Stringparam=request.getParameter("go");

if(param==null)

thrownewServletException("MissingparameterinController.");

elseif(param.equals("weather"))

dispatcher=request.getRequestDispatcher("/weather");

elseif(param.equals("maps"))

dispatcher=request.getRequestDispatcher("/maps");

else

thrownewServletException(

"ImproperparameterpassedtoController.");

//ifwegetthisfar,dispatchtherequesttothecorrectURL

if(dispatcher!=null)

dispatcher.forward(request,response);

Page 131: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

else

thrownewServletException(

"Controllerreceivedanulldispatcherfromrequestobject.");

}

}

Theservletchecksthegoparameterforitsvalue.Arequesttothisservletmightlooklike:

http://localhost:8080/home?go=weather

Inthisexample,theControllerservletismappedtoreceiveallwebrequeststothe"home"webapplication.Inotherwords,thecontroller'sservlet-mappinginweb.xmlhasaurl-patternof/*.

Basedonthegoparametervalue,ControllercreatesaRequestDispatcherobjectwithadifferentspecifiedURLforforwarding.TheservletgetsaRequestDispatcherobjectfirstbycallingtherequestobject'sgetRequestDispatcher(Stringpath)method.Thepathparametercanberelativetothecontextrootofthewebapplication,asitishere,butitcannotextendbeyondthecurrentservletcontext.SupposetheURLpattern/weatherismappedtotheregisteredservletname"Weather":

<servlet-mapping>

<servlet-name>Weather</servlet-name>

<url-pattern>/weather</url-pattern>

</servlet-mapping>

Inthiscase,thepathpassedtothegetRequestDispatcher()methodlookslikegetRequestDispatcher("/weather").Ifthegoparameteriseitherwrongormissing,theControllerthrowsaServletExceptionwithanappropriatemessage.TheWeatherservlet,though,cannotbeaccessedbywebusersdirectlybecauseitisrestrictedbyasecurity-constraintelementbuttheRequestDispatcher.forward(request,response)methodisnotlimitedbytheseconstraints.

Page 132: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Youcanalsousethejavax.servlet.ServletContext.getNamedDispatcher(String

name)methodtogetaRequestDispatcherobjectforforwarding.Usingthismethod,youdonothavetoincludeanyservlet-mappingelementsforthetargetservlet.ThegetNamedDispatcher()methodtakesasitsparametertheregisterednameoftheservletinweb.xml.Example3-11showsthepriorservletexamplealteredtousegetNamedDispatcher("Weather"),usingtheweatherservlet'sregisterednameinstead.

Example3-11.UsinggetNamedDispatcher()toforwardarequest

importjavax.servlet.*;

importjavax.servlet.http.*;

publicclassControllerextendsHttpServlet{

publicvoiddoGet(HttpServletRequestrequest,

HttpServletResponseresponse)

throwsServletException,java.io.IOException{

RequestDispatcherdispatcher=null;

Stringparam=request.getParameter("go");

if(param==null)

thrownew

ServletException("MissingparameterinController.");

elseif(param.equals("weather"))

dispatcher=getServletContext().

getNamedDispatcher("Weather");

elseif(param.equals("maps"))

dispatcher=getServletContext().

getNamedDispatcher("Maps");

else

Page 133: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

thrownewServletException(

"ImproperparameterpassedtoController.");

/*checkforanulldispatcher,then

dispatchtherequesttothecorrectURL*/

if(dispatcher!=null)

dispatcher.forward(request,response);

else

thrownewServletException(

"Controllerreceivedanulldispatcher.");

}

}

ThedoGet()methodhasbeenchangedtouseaRequestDispatcherreceivedfromtheServletContext.getNamedDispatcher(Stringregistered-servlet-name)method.Insteadofaservletpath,thedispatcherobjectusesthatservlet'sregisteredname("Weather")fromweb.xml,asin:

<servlet>

<servlet-name>Weather</servlet-name>

<servlet-class>com.jspservletcookbook.Weather

</servlet-class>

</servlet>

IftheServletContextreturnsanulldispatcherbecausesomeoneleftoutthenecessaryXMLelementinweb.xml,thendoGet()throwsaServletExceptionexplainingthatthedispatcherobjectisnull.

Analternatestrategyistousealistenertochecktherequestbeforeitfindsitswaytoaservlet.Chapter19describeshowtousealistenertoexamineanHTTPrequest.

Page 134: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

SeeAlso

Chapter1onweb.xml;Recipe3.1-Recipe3.5;Recipe3.8;Chapter19onusingalistenertoexaminetherequest;Chapter11oftheServletv2.3and2.4specificationsonmappingrequeststoservlets;theCoreJ2EEBlueprintspage:http://java.sun.com/blueprints/corej2eepatterns/Patterns/FrontController.html

Page 135: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe3.8CreatingWelcomeFilesforaWebApplication

Problem

Youwanttoconfigureoneormorewelcomefilesforawebapplication.

Solution

Useawelcome-file-listelementinyourdeploymentdescriptor.

Discussion

AwelcomefileisatraditionasoldasthehypertextualInternet.Manysiteshavehomepagesorotherwelcomefilesthataredesignedtobetheentrypageorfrontdoorfortheirwebsites.Thesepagesusuallyhavenameslikeindex.html,welcome.html,ordefault.html.Youcanconfigureyourwebapplicationtodirectrequeststowardthesepagesbyaddingawelcome-file-listelementtoyourwebapplication'sdeploymentdescriptor.Setupawelcomefilelistinweb.xmlinthemannerdemonstratedbyExample3-12.Thewelcome-file-listelementmustcomeafteranyservletandservlet-mappingelements,andprecedeanyerror-pageortaglibelementsintheservlet2.3deploymentdescriptor.

Example3-12.Settingupwelcomefilesinweb.xml

<?xmlversion="1.0"encoding="ISO-8859-1"?>

<!DOCTYPEweb-app

Page 136: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

PUBLIC"-//SunMicrosystems,Inc.//DTDWebApplication2.3//EN"

"http://java.sun.com/dtd/web-application_2_3.dtd"

>

<web-app>

<!--Defineservletsandservlet-mappingshere-->

<welcome-file-list>

<welcome-file>index.html</welcome-file>

<welcome-file>default.jsp</welcome-file>

</welcome-file-list>

</web-app>

WhenevertheservletcontainerencountersaURLforawebapplicationthatspecifiesonlyadirectory,notaparticularfilenameorservlet,thenitlooksforawelcome-file-listelementintheapplication'sdeploymentdescriptor.Theservletv2.3specificationcallsthesekindsofURLsvalidpartialrequests.Theservletcontainerattachesanywelcomefilenamesthatitfindsinweb.xmltotherequest(intheorderthattheyappearinweb.xml)andreturnsthosefilestotheclient.

Forexample,let'ssayTomcatreceivesarequestforhttp://www.mysite.org/cookbook/.Alsoimaginethattheweb.xmlfileforthecookbookwebapplicationcontainsthewelcome-file-listshowninExample3-12.Tomcatthenreturnshttp://www.mysite.org/cookbook/index.htmlifthatfileexists;ifitdoesnot,Tomcatlooksforthedefault.jspfileinthecookbookdirectoryandreturnsthatfileinstead.

Theservletcontainerinitiatesthissearchinresponsetoanydirectory-styleURLthatitreceives(suchashttp://www.mysite.org/cookbook/bookinfo/).Inotherwords,aslongasanindex.htmlordefault.jsp(orwhicheverfilenamesyouchoose)existsinawebapplication'srootdirectory,andthewebdeveloperhasproperlyconfiguredthewelcome-file-listelement,thenthosefilesare

Page 137: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

invokedbydefaultinresponsetodirectory-stylerequests.

SeeAlso

Chapter1onweb.xml;Recipe3.1-Recipe3.6;Recipe3.9;Chapter11oftheServletv2.3and2.4specificationsonmappingrequeststoservlets.

Page 138: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe3.9RestrictingRequestsforCertainServlets

Problem

Youwanttoallowonlyauthenticateduserstorequestcertainservlets.

Solution

Usethesecurity-constraintelementintheweb.xmldeploymentdescriptor.

Discussion

Somewebapplicationscontainservletsthatshouldnotbeinvokeddirectlybywebusers,becausetheyhandlesensitivedataandmayhavespecialjobs(suchasadministeringtheserverorwebapplication).Forexample,youcoulddesignaservletthatisaccessedonlybyserveradministrators.Howdoyouprotecttheseservletsfrombeinginvokedimproperlyorbyunauthorizedusers?

Inthelattercase,youcanusedeclarativesecurity,orcontainer-managedsecurity.Thisstrategyinvolvesconfiguringtheweb.xmldeploymentdescriptorwithyourapplication'ssecurityinformation,therebydecouplingsecurityinformationfromyourservlet'scode.AnysecuritychangesforawebapplicationcanthenbemadeintheXMLconfigurationfiles(orviatheWebLogicServer7.0AdministrationConsole)withoutmessingwiththeservlet'ssourcecode.Thesecurityconfigurationisthenloadedandimplementedbytheservletcontainer.

Youcanalsouseprogrammaticsecurity,whichinvolvesincluding

Page 139: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

security-relatedcodewithinservlets,suchascheckingtheHttpServletRequestobjecttoseeifauserisauthorizedtouseacertainwebresource.

ForTomcat,usingthesecurity-constraintelementinweb.xmlrequirescreatingausernameandpasswordintheXMLfilelocatedat<Tomcat-installation-directory>/conf/tomcat-users.xml.ThisisanXMLfileinwhichyoudefineinternalusersandpasswords.ItmightlooklikeExample3-13.

Example3-13.Atomcat-users.xmlfile

<?xmlversion='1.0'encoding='utf-8'?>

<tomcat-users>

<rolerolename="manager"/>

<rolerolename="tomcat"/>

<rolerolename="developer"/>

<userusername="tomcat"password="tomcat"roles="tomcat,manager"/>

<userusername="bruce"password="bruce1957"

roles="tomcat,manager,developer"/>

<userusername="stacy"password="stacy1986"roles="tomcat"/>

</tomcat-users>

ThisXMLfragmentincludesatomcat-usersrootelementcontainingoneormoreroleanduserelements,dependingonhowmanyusersaredefinedforthewebapplicationshandledbythatinstanceofTomcat.Thistomcat-users.xmlconfigurationfileisaccessiblebyallofthecontainedwebapplications.

Youthencreatesecurity-constraint,login-config,andsecurity-roleelementsinsideofthewebapplication'sdeploymentdescriptor,orweb.xml.

Ifyouarenotusingtheservletv2.4deploymentdescriptor,thesecurity-relatedelementshavetoappearinthisorderandfollowmostoftheotherelementsthatcanappearinweb.xml,oryourdeploymentdescriptorwillnotbeavalidXMLfile.

Page 140: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Specifically,theonlyelementsthatcancomeaftersecurity-roleareenv-entry,ejb-ref,andejb-local-ref.

Thesecurity-constraintelementlookslikeExample3-14,giventhattheprotectedURLpatterninthiscaseis<url-pattern>/CookieServlet</url-pattern>.

Example3-14.Thesecurity-constraintelement

<security-constraint>

<web-resource-collection>

<web-resource-name>CookieInfo</web-resource-name>

<url-pattern>/CookieServlet</url-pattern>

<http-method>GET</http-method>

<http-method>POST</http-method>

</web-resource-collection>

<auth-constraint>

<description>Thisappliesonlytothe

"developer"securityrole</description>

<role-name>developer</role-name>

</auth-constraint>

<user-data-constraint>

<transport-guarantee>NONE</transport-guarantee>

</user-data-constraint>

</security-constraint>

Thesecurity-constraintelementmustcontainoneormoreweb-resource-collectionelements.Theweb-resource-collectionelementdescribeswhichwebresourcesinthewebapplicationareprotectedbythespecifiedsecurityconstraint.Inotherwords,arequestovertheInternetforawebresource,suchasaservlet,triggersanysecurityconstraintthathasbeenmappedtotheresource.Inthisexample,thesecurityconstraintprotectsanyrequestthatfitstheURL

Page 141: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

pattern,<web-application-root-directory>/CookieServlet.Thehttp-methodelementsspecifytheHTTPmethodsthatthissecurityconstraintcovers.Intheexample,aGETorPOSTrequestfor/CookieServlettriggerstheconfiguredsecuritymechanism.Ifyoudonotincludeanyhttp-methodelementsunderthesecurity-constraintelement,theconstraintwillapplytoanyHTTPmethod(suchasPUTorDELETE,inadditiontoGETandPOST).

Theobjectsthatimplementthejavax.servlet.RequestDispatcherinterfacemayforwardHTTPrequestsfromoneservlettoaprotectedservletwithouttriggeringthesesecurityconstraints.

Theauth-constraintelementisdesignedtodescribethesecurityrolesthatpermitaccesstothewebcomponent.Asecurityroleisanamethatrepresentsthesecurityprivilegesauserorgroupofusershaveinrelationtoaparticularresource,suchasaservlet.Examplesofsecurityrolesareadmin,manager,ordeveloper.Inthecaseofthetomcat-users.xmlfile,usersareassignedtoroles.Withinthesecurity-constraintelementexample,onlyusersthataremappedtothedeveloperroleinthetomcat-users.xmlfilehaveaccesstoCookieServlet.

Howdoesawebapplicationauthenticateauserinthefirstplace?Forinstance,howcanthewebapplicationfindouttherequester'susernameandpassword,andtherebydetermineifhecanbegivenaccesstotheservlet?Incontainer-managedsecurity,thisiswhatthelogin-configelementisusedfor.Thiselementappearsafterthesecurity-constraintelementintheweb.xmlfile.BothelementsmightlooklikeExample3-15inawebapplication'sdeploymentdescriptor.

Example3-15.Usinglogin-configwithasecurity-constraintelement

Page 142: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<security-constraint>

<web-resource-collection>

<web-resource-name>CookieInfo</web-resource-name>

<url-pattern>/CookieServlet</url-pattern>

<http-method>GET</http-method>

<http-method>POST</http-method>

</web-resource-collection>

<auth-constraint>

<description>Thisappliesonlytothe

"developer"securityrole</description>

<role-name>developer</role-name>

</auth-constraint>

<user-data-constraint>

<transport-guarantee>NONE</transport-guarantee>

</user-data-constraint>

</security-constraint>

<login-config>

<auth-method>BASIC</auth-method>

</login-config>

<security-role>

<role-name>developer</role-name>

</security-role>

Thelogin-configelementspecifiestheauthenticationmethodthatisusedtoauthenticateanyuserrequestsforprotectedwebresources.Protectedwebresourcesarethosespecifiedbyaweb-resource-collectionelement,insidethesecurity-constraintelement.Intheexample,BASICauthenticationisusedforanyrequeststhatmatchtheURLpattern/CookieServlet.BASICisafamiliarformofwebauthenticationinwhichthebrowserpresentstheuserwithadialogwindowforenteringtheusernameandpassword.Tomcatcomparesthegivennameandpasswordwiththeuserinformationconfiguredinthetomcat-users.xmlfile,andthenusesthewebapplication'ssecurity-constraintconfigurationtodeterminewhethertheusercanaccesstheprotectedservlet.

Page 143: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Theauth-methodchildelementoflogin-configcanalsobegiventhevaluesFORM,CLIENT-CERT,orDIGEST.

Onemoreingredientisnecessarytocompletethisservletsecurityconfiguration:thesecurity-roleelement.Example3-15createsasecurityrolenameddeveloper.Thedevelopervaluealsoappearsinthesecurity-constraintchildelementauth-constraint.Thismeansthatonlyuserswhoaremappedtothesecurityroledeveloperareabletoaccesswebresourceswhichareprotectedbythesecurityconstraint(i.e.,thatareidentifiedbyaweb-resource-collectionchildelementofsecurity-constraint).Inotherwords,thisauthenticationmethodisactuallyatwo-stepprocess:

1. Checkiftheprovidedusernameandpasswordarecorrect.

Determineiftheuserismappedtothespecifiedsecurityrole.Forexample,theusermightprovideacorrectusernameandpassword,butshemaynotbemappedtothespecifiedsecurityrole.Inthiscase,sheispreventedfromaccessingthespecifiedwebresource.

TheusersaremappedtosecurityrolesinTomcatinthepreviouslymentionedtomcat-users.xmlfile.Hereisanexampleofwhatauserelementmightlooklikeinthetomcat-users.xmlfile:

<username="bwperry"password="bruce2002"

roles="developer,standard,manager"/>

Thisuserisassignedthreedifferentroles:developer,standard,andmanager.TheTomcatservletcontainerusestheseXMLelementsinthetomcat-users.xmlfiletodeterminewhethercertainusername/passwordcombinationshavebeenassignedparticularroles.Figure3-1isdesignedtounraveltheseconfusingcross-references.Justthinkofasecurityroleasawaytofurtherrefineagroupofapplicationusers,orgroupthemintermsoftheiruserprivileges.

Page 144: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Figure3-1.Usingasecurityconstraintelement

ThesecurityconfigurationdepictedbyExample3-15sXMLtextcanbeusedwithWebLogic7.0,buttheWebLogic-specificconfigurationfileiscalledweblogic.xml.

Theweblogic.xmlfileaccompaniestheweb.xmldeploymentdescriptorinsideyourwebapplication'sWEB-INFdirectory.

Example3-16showstheXMLwithintheweblogic.xmldeploymentdescriptor.

Example3-16.Securityroleinweblogic.xml

<!--weblogic.xmlsecurityrolemapping-->

<security-role-assignment>

<role-name>developer</role-name>

<principal-name>bwperry</principal-name>

Page 145: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

</security-role-assignment>

InWebLogic7.0,youcanalsoestablishusers,groups,andsecurityrolesthatareglobaltoaparticularWebLogicserverthroughtheAdministrativeConsole.

Thisrecipedescribedhowtorestricttherequestsforcertainservlets.Thenextrecipeshowsonewaytopreventallrequestsexceptthoseforwardedfromacontrollerservletfromreachingotherservlets.

SeeAlso

Chapter1onweb.xml;Recipe3.1-Recipe3.8;Chapter11oftheServletv2.3and2.4specificationsonmappingrequeststoservlets;theCoreJ2EEBlueprintspage:http://java.sun.com/blueprints/corej2eepatterns/Patterns/FrontController.html

Page 146: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe3.10GivingOnlytheControllerAccesstoCertainServlets

Problem

Youwanttosetupthewebapplicationsothatonlyacontrollerservlethasaccesstocertainservlets.

Solution

Createasecurity-rolethatdoesnothaveanyusersmappedtoit,thenspecifyinthesecurity-constraintelementtheservletsthatyouwanttopreserveforthecontroller.

Discussion

Thisrecipeshowshowyoucancreateasecurity-constraintelementthatforbidsanyrequestsfromreachingspecifiedURLpatterns.

TheservletsmappedtothoseURLpatternsareforwardedrequestsonlyfromoneormorecontrollerservletsthatuseanobjectthatimplementsthejavax.servlet.RequestDispatcherinterface.Recipe3.7includesanexamplecontrollerservletthatforwardsarequesttoanotherservletusingaRequestDispatcher.Example3-17showshowyoucansetupthesecurity-constraintelementforanexampleservletwiththeregisteredname"Weather".

Example3-17.Asecurity-constraintthatallowsonlyRequestDispatcher.forward-relatedrequests

Page 147: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<?xmlversion="1.0"encoding="ISO-8859-1"?>

<!DOCTYPEweb-app

PUBLIC"-//SunMicrosystems,Inc.//DTDWebApplication2.3//EN"

"http://java.sun.com/dtd/web-application_2_3.dtd">

<web-app>

<!--configuretheWeatherservlet;

itreceivesrequestsfroma

controllerservlet-->

<servlet>

<servlet-name>Weather</servlet-name>

<servlet-class>

com.jspservletcookbook.Weather

</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>Weather</servlet-name>

<url-pattern>/weatherurl-pattern>

</servlet-mapping>

<!--thiselementpreventstheWeatherservlet

fromdirectlyreceivingrequestsfromusers,

becausenousersaremappedtothe'nullrole'role-->

<security-constraint>

<web-resource-collection>

<web-resource-name>Weather

</web-resource-name>

<url-pattern>/weather</url-pattern>

<http-method>GET</http-method>

<http-method>POST</http-method>

</web-resource-collection>

<auth-constraint>

<role-name>nullrole</role-name>

</auth-constraint>

<user-data-constraint>

<transport-guarantee>NONE

</transport-guarantee>

Page 148: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

</user-data-constraint>

</security-constraint>

<login-config>

<auth-method>BASIC</auth-method>

</login-config>

<security-role>

<role-name>nullrole</role-name>

</security-role>

</web-app>

ThenextstepinprotectingtheWeatherservletistomakesurethatthetomcat-users.xmlfiledoesnotmapanyuserstothe"nullrole"securityrole.Thesecurity-roleelementlookslikethis:

<security-role>

<role-name>nullrole</role-name>

</security-role>

Hereiswhatatypical<Tomcat-installation-directory>/conf/tomcat-users.xmlfilelookslike:

<?xmlversion='1.0'encoding='utf-8'?>

<tomcat-users>

<rolerolename="manager"/>

<rolerolename="tomcat"/>

<rolerolename="developer"/>

<userusername="tomcat"password="tomcat"roles="tomcat,manager"/>

<userusername="bruce"password="bruce1957"

roles="tomcat,manager,developer"/>

</tomcat-users>

InwebapplicationsconfiguredinthemannerofExample3-17,anydirectrequesttotheURLpattern/weatherreceivesaresponseinthecategoryof"HTTPStatus403Accesstotherequestedresourcehasbeendenied."However,acontrollerservletcanstillusetheRequestDispatcher.forward(request,response)methodtoforwardarequesttothe/weatherURLforprocessing.Recipe3.7andExample3-10showaservletthatusesthisforwardmethod,soIwon't

Page 149: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

repeatthatcodehere.

Makesuretoconfigurefriendlyerrorpagesfortheuserswhomakerequeststorestrictedservlets.Chapter9describeshowtodesignateerrorpagesforcertainHTTPresponsecodesinthewebapplication'sdeploymentdescriptor.Youmaywanttoprovideautomaticrefreshesafteraspecifiedintervalfromtheerrorpagetothecontrolleroranyloginpages.

SeeAlso

Chapter1onweb.xml;Recipe3.1-Recipe3.9;Chapter11oftheServletv2.3and2.4specificationsonmappingrequeststoservlets;theCoreJ2EEBlueprintspage:http://java.sun.com/blueprints/corej2eepatterns/Patterns/FrontController.html

Page 150: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Chapter4.UsingApacheAnt

Introduction

Recipe4.1.ObtainingandSettingUpAnt

Recipe4.2.UsingAntTargets

Recipe4.3.IncludingTomcatJARfilesintheBuildFileClasspath

Recipe4.4.CompilingaServletwithanAntBuildFile

Recipe4.5.CreatingaWARFilewithAnt

Recipe4.6.CreatingaJARFilewithAnt

Recipe4.7.StartingaTomcatApplicationwithAnt

Recipe4.8.StoppingaTomcatApplicationwithAnt

Page 151: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Introduction

ApacheAnt(http://ant.apache.org/)isaJava-andXML-basedautomationtoolthatisavailableasopensourcesoftwarefromtheApacheSoftwareFoundation.AntbeganitslifeaspartoftheTomcatcodebase.Thetool'sfirstofficialreleaseasastandalonesoftwareproductwasinJuly2000,accordingtotheAntFAQ(http://ant.apache.org/faq.html).TheoriginalcreatorofbothAntandTomcatisJamesDuncanDavidson.

AnthasevolvedintothebuildtoolofchoiceforautomatingJavasoftwareprojects,whichmeansbuildingtheseprojectsfrombeginningtoend.ThisincludescompilingJavaclasses,creatingJARorWARfiles,andinitiatingfilesystem-relatedtaskssuchascreatingdirectoriesandmovingorcopyingfiles.AllofthesetasksarecontrolledbytheAntbuildfileforaspecificproject.

AnAntbuildfileisanXMLfilethatislaunchedfromthecommandlineandexecutesJavaclassesbehindthescenes.Antisalsoextensible;youcancustomizethistooltosuityourownpurposes.Inaddition,Antiscross-platformandveryportable,sinceitisbasedonXMLandJava.Oncewebdevelopersbecomefamiliarwiththishandyandpowerfultool,theyfindthatitgreatlyeasesthetaskofcompiling,packaging,andinevitablyalteringandredeployingtheirwebapplications.

ThischapterfirstdescribeshowtodownloadAntandsetituponyoursystem,andthenexplainsAnttargetsandtasksforthosewhoarenewtoAnt.TherestofyoucanmerrilymoveontootherrecipesdescribinghowtocreateaclasspaththatincludesthenecessaryTomcatJARfiles,createWARandJARfiles,anduseAnttoexecuteTomcat'sManagerapplication.

Page 152: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe4.1ObtainingandSettingUpAnt

Problem

YouwanttodownloadandsetupApacheAntonyourcomputer.

Solution

Pointyourbrowsertohttp://ant.apache.org/,downloadthebinaryorsourcedistributionofAnt,thenfollowtheinstructionsgiveninthisrecipeandontheAntsupportsite.

Discussion

ThebinarydistributionofApacheAntcanbedownloadedfromhttp://ant.apache.org/bindownload.cgi.Youcanalsodownloadthesourcedistribution,whichcontainstheJavasourcefilesforAnt,fromhttp://ant.apache.org/srcdownload.cgi.YoumusthavetheJavaSoftwareDevelopmentKit(SDK)installed.

Antv1.5.3willbethelastreleasethatsupportsJDK1.1.Antv1.5.1canrunwithJDK1.1,althoughsometasksworkonlyonJDK1.2.

TouseAnt,youmusthaveaJavaAPIforXMLProcessing(JAXP)-compliantXMLparseravailableonyourclasspath.ThebinaryAntdistributionincludestheApacheXerces2XMLparser.IfyouoptforadifferentJAXP-compliantparser,youshouldremovexercesImpl.jarand

Page 153: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

xmlParserAPIs.jarfromAnt'stop-level/libdirectory(asinjakarta-ant-1.5.1/lib)andputtheJARfile(s)forthealternativeparserintoAnt's/libdirectory.Youcanalsoaddthemdirectlytoyouruserclasspath.

TheuserclasspathistheclasspathrepresentedbytheCLASSPATHenvironmentvariableonyourmachine.Thisclasspathoverridesthedefaultvaluefortheuserclasspath(.,orthecurrentdirectory).Thejavacommand-linetool's-cpor-classpathswitchesoverridetheCLASSPATHenvironmentvariable.TheuserclasspathcanalsobesetbyaJARfilespecifiedbythejavatool's-jarswitch.Thisdesignationinturnoverridestheotherwaysofspecifyingaclasspath.Thebottomlineisthatitiseasiertoplaceyourparserofchoiceinthejakarta-ant-1.5.1/libdirectoryinsteadoffoolingaroundwiththeseclasspathissues.

ThecompleteinstallationdirectionsforAntandlinkstorelatedWebpagesareathttp://ant.apache.org/manual/index.html.

TakethefollowingstepstogetAntrunningonyourmachine:

1. Unpackthecompressedfile(inZIPorTARformat)containingtheAnttool.WithAntv1.5.1,unpackingthedistributionfilecreatesadirectorycalledjakarta-ant-1.5.1.

SettheANT_HOMEenvironmentvariabletothedirectorywhereyouinstalledAnt.OnUnix,thiscanbeaccomplishedbytypingacommand-linephrase:

exportANT_HOME=/usr/local/jakarta-ant-1.5.1

OnWindowstype:

setANT_HOME=h:\jakarta-ant-1.5.1

Addthe<Ant-installation-directory>/bindirectorytoyourPATHenvironmentvariable.Thisallowsthedevelopertochangetoanyworkingdirectorywithabuild.xmlfileandtypeanttorunthisfile(readthenextrecipeforadescriptionofexecutingabuild.xmlfile).The<Ant-

Page 154: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

installation-directory>/bindirectorycontainsthescriptswhichlaunchtheJavaclassesthatformthebasisofAnt.

Optionally,settheJAVA_HOMEenvironmentvariabletothedirectorywhereyourJDKisinstalled.YoumightaswellsettheJAVA_HOMEenvironmentvariable,becausethescriptsthatareprovidedwithAntinits/bindirectorycanthenautomaticallyaddtherequiredJDK-relatedclasseswhenyouwanttousethejavacorrmictasks.TasksareXMLelementsthatdocertainjobsinAntfiles,suchaswar(tocreateWebArchivefiles)andjavac(tocompileJavaclasseswithAnt).

Testyourinstallationbytypingant-version.Ifeverythinggoeswell,thiscommandproducesareturnvaluelikethis:

K:\>ant-version

ApacheAntversion1.5.1compiledonOctober22002

SeeAlso

Recipe4.2onusingAnttargets;Recipe4.3onincludingTomcatJARfilesintheAntclasspath;Recipe4.4oncompilingaservletwithAnt;Recipe4.5oncreatingaWARfilewithAnt;Recipe4.6onusingAnttocreateJARfiles;Recipe4.7andRecipe4.8onstartingandstoppingTomcatwithAnt;Recipe2.1andRecipe2.6ondeployingwebapplicationsusingAnt;theApacheAntmanual:http://ant.apache.org/manual/index.html;theApacheAntProject:http://ant.apache.org.

Page 155: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe4.2UsingAntTargets

Problem

YouwanttocreatetargetelementsfordevelopingwebapplicationswithanAntbuildfile.

Solution

Createoneormoretargetelementsaschildelementsofaprojectelement.Makesurethetargetshavetherequirednameattributeandvalue.

Discussion

AnAntbuildfileisanXMLfileinotherwords,aplaintextfilethatincludeselementsandattributes.Example4-1showsanAntfilethatechoesamessagetotheconsole.Asmentionedintheintroduction,AntfilesexecuteJavacodebehindthescenes.Thewayyoucontrolthedesiredactionsofyourbuildfileisbyarrangingoneormoretargetelementsinsidetheprojectrootelement.

Example4-1.AnAntbuildfilethatechoesaconsolemessage

<projectname="Cookbook"default="echo-message"basedir=".">

<targetname="echo-message"

description="Echoingamessagetotheconsole">

<echomessage="HellofromthefirstAntfile"/>

Page 156: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

</target>

</project>

Antfileshaveoneprojectrootelement,whichmusthaveadefaultattributeandvalue.Thedefaultattributespecifiesthetargetthatrunsifnoothertargetsareidentifiedonthecommandline.Thenameandbasedirattributesareoptional.Thenameattribute,asyoumighthaveguessed,givestheprojectelementadescriptivename.Thebasedirattributespecifiesthedirectorybywhichpathsthatarereferredtointhefilearecalculated.Itsdefaultvalueisthedirectorycontainingthebuildfile.

Whataretargets?Theyaregroupsoftasks,representedinAntbyatargetelement.Targetsgrouponeormoretasks(whichareinturnrepresentedbyataskelement)intologicalandnamedunitsofcontrol,similartoJavamethods.

TasksincludeactionsthatcompileJavafiles(thejavactask),copyfilesfromonelocationtoanother(copy),andcreateJARorWARfiles(aptlynamedjarandwar).Forinstance,theecho-messagetargetinExample4-1callstheechotask.

Thetarget'snameinExample4-1isecho-message,whichisjustanamethatIcreatedforit.Atarget'sdescriptionattributeisoptional,asarethreeotherattributes:depends,if,andunless.I'llexplainthepurposeofdependsshortly;theifandunlessattributesallowtheconditionalexecutionoftargets.

AslongasAntisproperlysetuponyourcomputer,hereiswhatthecommand-linesequenceforexecutingthisexamplebuild.xmlfilemightlooklike:

H:\book\cookbook\sec1\sec1_3>ant

Buildfile:build.xml

echo-message:

[echo]HellofromthefirstAntfile.

Page 157: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

BUILDSUCCESSFUL

Totaltime:3seconds

First,theXMLfilewiththeprojectrootelementissavedwiththefilenamebuild.xml.Thentheuserchangestothedirectorythatcontainsthisfileandtypesant,withoutanyoptions.Antthenlooksforafilecalledbuild.xmlinthecurrentdirectoryandrunstheproject'sdefaulttarget(inExample4-1,theecho-messagetarget).

Youcangivethebuildfileanameotherthanbuild.xml,butthenyouneedtorunAntwiththe-buildfileoption:

ant-buildfiledev.xml

MostbuildfilesinvolveseveraltargetsthatexecuteinacertainsequencetoinitiateJavadevelopmenttasks.Example4-2demonstratesthedependsattribute.Thisexampleshowshowtoexecuteseveraltargetsinaspecifiedsequence.

Example4-2.Usingthedependstargetattributetolaunchasequenceoftargets

<projectname="Cookbook"default="echo-message"basedir=".">

<targetname="init">

<propertyname="name"value="BrucePerry"/>

</target>

<targetname="show-props"depends="init">

<echomessage=

"The'name'propertyvalueis:${name}"/>

<echomessage=

"OSnameandversionis:${os.name}${os.version}"/>

<echomessage=

Page 158: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

"YourJavahomeis:${java.home}"/>

</target>

<targetname="echo-message"depends="show-props">

<echomessage=

"HellofromthefirstAntfileindirectory:${basedir}"/>

</target>

</project>

Thistime,insteadofjustonetarget,theprojectelementhasseveralnestedtargets.Theecho-messagetargetisstillthedefaulttarget,butitsbehaviorhaschangedduetothevalueofitsdependsattribute.ThisoptionalattributespecifiesthenameofoneormoreAnttargetsthatmustbeexecutedpriortothecurrenttarget.Inotherwords,theecho-messagetargetspecifies,"Idependontheshow-propstarget,soexecuteitbeforeme."Theshow-propstarget,however,alsohasadependsattributethatindicatesarelianceontheinittarget.Asaresult,thisbuildfileestablishesasequenceforexecutingitstargets:init show-props echo-message.

Theresultofrunningthepriorbuildfileatthecommandlineisshownhere:

H:\book\cookbook\sec1\sec1_3>ant

Buildfile:build.xml

init:

show-props:

[echo]The'name'propertyvalueis:BrucePerry

[echo]OSnameandversionis:WindowsNT4.0

[echo]YourJavahomeis:h:\jdk1.3.1_02\jre

echo-message:

[echo]HellofromthefirstAntfileindirectory:

H:\book\cookbook\sec1\sec1_3

Page 159: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

BUILDSUCCESSFUL

Totaltime:2seconds

Hereiswhatthisbuildfileaccomplishes:

1. Theinittargetfirstcreatesanamepropertythatcontainsthevalue"BrucePerry".Thetargetusesthepropertytasktoaccomplishthis.RecallthattasksdotherealworkinAnt;targetsaresimplygroupingelementsthatcalloneormoretasks.

Theshow-propstargetthenechoesthevaluesofthenameproperty(createdbytheinittarget)andthreebuilt-inproperties:os.name,os.version,andjava.home.

Theecho-messagetargetissuesitsmessagetotheconsoleandreturnsthevalueofthebasedirproperty.Allofthetargetsusetheechotasktodelivertheirmessages.

Notethatthenamepropertywouldnotbesetiftheinittargetwasneverexecuted.Iftheshow-propstargetisdefinedasseenhere,therewillbeproblems:

<targetname="show-props">

...</target>

However,itisproperlydefinedasfollows:

<targetname="show-props"depends="init">

...</target>

Withoutthedependsattribute,theinittargetwouldneverbeexecuted,becausethebuildfile'sexecutionsequencewouldlooklikeshow-props echo-message.Thenamepropertywouldneverbegivenavalue.

Page 160: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Antbuildfilesareusuallymuchmorecomplexthantheseexamples,whichismoreofatestamenttoAnt'spowerthanevidenceofpoordesign.Chapter2showshowtodeployindividualservletsandwebapplicationswithmoreextensiveAntfiles.

SeeAlso

Recipe4.1ondownloadingandsettingupAnt;Recipe4.3onincludingTomcatJARfilesintheAntclasspath;Recipe4.4oncompilingaservletwithAnt;Recipe4.5oncreatingaJARfilewithAnt;Recipe4.7andRecipe4.8onstartingandstoppingTomcatwithAnt;Recipe2.1andRecipe2.6ondeployingwebapplicationsusingAnt;theAntmanualsectiononthepropertytask:http://ant.apache.org/manual/CoreTasks/property.html;theAntmanualsegmentontargets:http://ant.apache.org/manual/using.html#targets;theApacheAntmanualindexpage:http://ant.apache.org/manual/index.html;theApacheAntProject:http://ant.apache.org.

Page 161: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe4.3IncludingTomcatJARfilesintheBuildFileClasspath

Problem

YouwanttoestablishanAntclasspaththatincludesvariousTomcatJARfiles.

Solution

Useapath-likestructuretodefinetheclasspath,thenrefertothisclasspathwheneveryouneedit.SpecifythedirectorieswherethenecessaryJARfilesarelocatedwithanexternalpropertiesfile.

Discussion

BeforeyoucancompileaservletusingAnt,youmustensurethattheservletAPIclassesareavailableontheclasspaththattheAntbuildfileisusingforcompilation.Forexample,the<Tomcat-installation-directory>/common/libdirectorycontainsservlet.jar,whichincludesthenecessaryclassesforcompilingaservlet.Inaddition,youmightwanttoincludethemail.jarcomponentfromthesamedirectorytocompileaservletthatusestheJavaMailAPI.Adifferentdirectory<Tomcat-installation-directory>/common/endorsedincludesthexmlParserAPIs.jarfile,whichyoumightspecifyontheclasspathtousetheassociatedSAXandDOMXMLprogrammingclasses.

Example4-3definesaclasspathusingapathXMLelement.Acompile-servlettargetfurtherdownintheXMLfilethenusesthedefinedclasspathtocompileaservlet.

Page 162: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Example4-3.DefiningaclasspathincludingTomcatJARfiles

<projectname="Cookbook"default="compile-servlet"basedir=".">

<!--includecompiled-servletandtomcat-dirproperties-->

<propertyfile="global.properties"/>

<pathid="servlet-classpath">

<filesetdir="${tomcat.dir}/common/lib">

<includename="*.jar"/>

</fileset>

<filesetdir="${tomcat.dir}/common/endorsed">

<includename="*.jar"/>

</fileset>

</path>

<targetname="compile-servlet">

<echomessage="Compilingtheservlet...."/>

<javacsrcdir="${src}"destdir="${build}">

<includename="${compiled.servlet}.java"/>

<classpathrefid="servlet-classpath"/>

</javac>

</target>

</project>

Usingthepathelement,theclasspathcanbedefinedsimilarlytoaninstancevariableofaJavaclass,anditsvaluecanthenbeusedthroughoutthebuildfile.Theadvantageofthisapproachisthattheclasspathmaybeverycomplex,butithastobedefinedonlyonce.WheneverthereisaneedforaclasspathinanAntfile,theclasspathelementanditsrefidattributecanbeusedtopullinthedefinedclasspath.InExample4-3,thepathelementisgivenauniqueID,"servlet-classpath."Thedevelopercreatesthisnametouniquelyidentifythepath-likestructure.

Page 163: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

AnothercoretypeofAnttaskisafileset.filesetsareelementsthatrepresentgroupsoffiles.ThetwonestedfilesetsintheexamplehavedirattributesthatspecifytwodirectoriesundertheTomcatinstallationdirectory:./common/liband./common/endorsed.ThesearedirectoriesthatcontainmanyimportantJavalibraries,suchasservlet.jarandmail.jar.Afilesetelement'snestedincludeelementcreatesapattern(withthenameattribute)thatspecifiesthetypesoffilestoincludeineachfileset.Theexampleincludesallfilesinthespecifieddirectoriesendingin".jar".

IfyouwantedtofurtherrefinethetypesofJARfilesthatareincludedinafileset,youcouldusethefileset'snestedexcludeelement:

<filesetdir="${tomcat.dir}/common/lib">

<includename="*.jar"/>

<excludename="commons*.jar"/>

</fileset>

Thepattern"commons*.jar"excludesalltheJARfilesfromtheclasspaththatbeginwiththeword"commons,"followedbyzeroormorecharactersanda".jar"suffix.

Thecompile.servlettargetinExample4-3echoesamessagetotheconsole,thenusesthejavactasktocompileaservlet.

ThiscodefromExample4-3makestwopropertiesthataredefinedinanotherfileavailabletotheAntbuildfile:

<propertyfile="global.properties"/>

Hereiswhattheglobal.propertiesfilelookslike:

tomcat.dir=k:/jakarta-tomcat-4.1.12

compiled.servlet=MyTask

src=.\src

build=.\build

Thepropertycompiled.servletevaluatestothenameoftheJava

Page 164: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

sourcefilethatisbeingcompiled.Thetomcat.dirfileisthefilepathtotheTomcatrootdirectory.

InExample4-3,theclasspathelementisnestedinsidethejavactask,asin:

<javacsrcdir="${src}"destdir="${build}">

<includename="${compiled.servlet}.java"/>

<classpathrefid="servlet-classpath"/>

</javac>

Theclasspathelement'srefidattributepullsintheclasspaththatwasdefinedearlierinthebuildfile(includingalltheTomcatJARsin./common/liband./common/endorsed).Thevalueoftherefidattributeistheidofthepathelement("servlet-classpath").Inotherwords,thepathelementinExample4-3representsaclasspath;theelement'sidornameis"servlet-classpath."

IfitisnecessarytoaddmoreclassesorJARstotheclasspaththatyouaredefininginanAntfile,thenaddanothernestedfilesettothepathelement.Example4-4addsallofthecontentsofthebuilddirectorytotheclasspathdefinedbyExample4-3(alongwiththeTomcat-relatedJARs)byaddingathirdnestedfileset.

Example4-4.Nestingthreefilesetsinapathstructure

<pathid="servlet-classpath">

<filesetdir="${tomcat.dir}/common/lib">

<includename="*.jar"/>

</fileset>

<filesetdir="${tomcat.dir}/common/endorsed">

<includename="*.jar"/>

</fileset>

Page 165: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<filesetdir="./build"/>

</path>

Anidiomthatoftenappearsinpath-relatedpatternsis**,whichmeanszeroormoredirectories.Forexample,thefollowingfilesettagincludesallofthefilescontainedinanynestedimagesfolders(srcisapropertynamepointingtothesourcedirectoryofthisfileset),nomatterhowdeeplytheyarenested:

<filesetdir="${src}">

<includename="**/images/*"/>

</fileset>

SeeAlso

Recipe4.1ondownloadingandsettingupAnt;Recipe4.2onwritingAnttargets;Recipe4.4oncompilingaservletwithAnt;Recipe4.5oncreatingaWARfilewithAnt;Recipe4.6onusingAnttocreateJARfiles;Recipe4.7andRecipe4.8onstartingandstoppingTomcatwithAnt;Recipe2.1andRecipe2.6ondeployingwebapplicationsusingAnt;theAntmanualsectiononthepropertytask:http://ant.apache.org/manual/CoreTasks/property.html;theAntmanualsegmentontargets:http://ant.apache.org/manual/using.html#targets;theApacheAntmanualindexpage:http://ant.apache.org/manual/index.html;theApacheAntProject:http://ant.apache.org.

Page 166: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe4.4CompilingaServletwithanAntBuildFile

Problem

Youwanttosetupasimplebuildfilethatyoucanusetocompileindividualservlets,withouthardcodingservletnames.

Solution

DesignabuildfilesothatthenameoftheJavaclasstocompilecanbesetfromanexternalpropertiesfileorfromthecommandline.

Discussion

IfyouarenotusinganIDEtodevelopandcompileyourservlets,anAntbuildfilecanautomatethecompilingofyoursourcefiles.Inordertomakethisbuildfilereusable,youshoulddesignittogetthenameofthefilefromanexternalpropertiesfileorfromthecommandline.

Ant'sadvantagescometotheforewhenitisusedtoautomatealloftheaspectsofbuilding,archiving,anddeployingawebapplication.However,youcanalsouseAntasakindofbatchprocessor.Inthisrecipe,IuseAnttodynamicallychooseaJavafiletocompile.

Thebuild.xmlfileinExample4-5importsacoupleofpropertiesfromabuild.propertiesfile,includingthenameoftheservlettobecompiled.OnewaytochooseadifferentJavafiletocompileistochangethevalueofthecompiled.servletpropertyinthisfile,withouttouchingthebuildfile:

Page 167: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

tomcat.dir=/users/bruceper/java/jakarta-tomcat-4.1.12

compiled.servlet=MyServlet

TorunExample4-5,changetothedirectorywherethebuild.xmlfileislocatedandtypeantwithoutanyoptions.

IfyouarerunninganAntbuildfilewithadifferentname,thenlaunchitwiththiscommandline:

ant-buildfileant_compiler.xml

First,thisfileimportsthetomcat.dirandcompiled.servletpropertiesfromabuild.propertiesfile.Thisfileislocatedinthesamedirectoryasthebuildfile.Thetomcat.dirpropertyisusedtocreateaclasspathcomposedoftheJARfilesintwodirectoriesthatareapartofTomcat'sdirectorytree(seeRecipe4.2).

Example4-5.CompilingaservletwithanAntbuildfile

<projectname="servletcompiler"default="compile"basedir=".">

<propertyfile="build.properties"/>

<pathid="servlet-classpath">

<filesetdir="${tomcat.dir}/common/lib">

<includename="*.jar"/>

</fileset>

<filesetdir="${tomcat.dir}/common/endorsed">

<includename="*.jar"/>

</fileset>

</path>

Page 168: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<targetname="init"

description="Initializessomeproperties.">

<echomessage="Initializingproperties."/>

<propertyname="build"value="./build"/>

<propertyname="src"value="./src"/>

</target>

<targetname="prepare"depends="init">

<echomessage="Cleaningupthebuilddirectory."/>

<deletedir="${build}"/>

<mkdirdir="${build}"/>

</target>

<targetname="compile"depends="prepare"

description="Compiletheservlet">

<echomessage="CompilingtheJavafile"/>

<echomessage="${compiled.servlet}.java..."/>

<javacsrcdir="${src}"destdir="${build}">

<includename="${compiled.servlet}.java"/>

<classpathrefid="servlet-classpath"/>

</javac>

</target>

</project>

Theinittargetcreatestwopropertiesrepresentingthesource(src)anddestination(build)directoriesofthetargetservlet.TheJavafilewaitingtobecompiledislocatedinansrcdirectory.Atypicalbuildfilealsohasaninittargetthatinitializesseveralmoreproperties.Sincethecompiletargethasadependsattributethatspecifiesthepreparetarget,andthepreparetargetdependsoninit,thenthebuildsequencelookslikeinit prepare compile.

Thepreparetargetjustcleansupthebuilddirectorytoensurethatthebuilddirectorycontainsthelatestcompiledclasses.

ThecompiletargetusesthejavactasktoactuallycompiletheJava

Page 169: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

file.javachasattributesthatspecifythesourceanddestinationdirectoriesoftheJavafile(s)thatitwillattempttocompile.Example4-5usesthesrcandbuildpropertiestoprovidevaluesfortheseattributes.Twonestedelementsofthejavactaskcompilethespecifiedservletfileandprovidetheclasspaththatthejavactaskuses(seeRecipe4.2).

Hereistheconsoleoutputafterrunningthisbuildfile(withsomeeditingforreadability):

init:

[echo]Initializingproperties.

prepare:

[echo]Cleaningupthebuilddirectory.

[delete]Deletingdirectory

/Users/bruceper/books/cookbook/sec1/sec1_3/build

[mkdir]Createddir:

/Users/bruceper/books/cookbook/sec1/sec1_3/build

compile:

[echo]CompilingtheJavafileMyServlet.java...

[javac]Compiling1sourcefileto

/Users/bruceper/books/cookbook/sec1/sec1_3/build

BUILDSUCCESSFUL

Totaltime:6seconds

Usingthecommandlinetodeclarethetargetservlet

Whatifyouwanttochangetheservletthatyouarecompiling,butarenotinclinedtotypethenewJavafilenameintothebuild.propertiesfile?Runningthebuild.xmlAntfilefromthecommandlineinthefollowingmannerwilloverridetheimportedcompiled.servletproperty:

ant-Dcompiled.servlet=AnotherServlet

Page 170: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

AnotherServlet.javaisthefilenameinthisexampleoftheJavafilethatawaitscompilationinthesrcdirectory.Thisfragmentofoutputshowsthatanypropertiespassedinfromthecommandlineoverridepropertiesofthesamenamecreatedwithinorimportedintothebuildfile:

compile:

[echo]CompilingtheJavafileAnotherServlet.java...

[javac]Compiling1sourcefileto

/Users/bruceper/books/cookbook/sec1/sec1_3/build

Thejavactaskcompilesonlyonlythejavafilesinthesrcdirectorythatdonothaveacorrespondingclassfile,orincaseswheretheclassfileisolderthanitscorresponding.javafile.Asalways,checktheAntmanualtofindoutaboutallthedifferentvariationsandattributesofjavac:http://ant.apache.org/manual/CoreTasks/javac.html.

Ifyouwanttocopythecompiledservletclasstoawebapplicationdirectory,youcouldaddadeploy-servlettargetthatusesthecopyAnttask:

<targetname="deploy-servlet"depends="compile">

<echomessage=

"CopyingtheservlettoTomcatwebapp"/>

<copytodir="${tomcat.webapps}/WEB-INF/classes">

<filesetdir="${build}"/>

</copy>

</target>

Thecopytasktakesitsnestedfileset,whichrepresentsthecontentsofthedirectorynamedbythebuildpropertyvalue,andcopiestheseclassfilestotheWEB-INF/classesdirectoryofTomcat'sdefaultwebapplication.

SeeAlso

Recipe4.1ondownloadingandsettingupAnt;Recipe4.2onwritingAnttargets;Recipe4.3oncreatingaclasspathforanAntfile;Recipe4.5oncreatingaWARfilewithAnt;Recipe4.6onusingAnttocreateJARfiles;Recipe4.7andRecipe4.8onstartingandstoppingTomcatwithAnt;Recipe2.1andRecipe2.6ondeployingwebapplicationsusingAnt;the

Page 171: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Antmanualsectiononthepropertytask:http://ant.apache.org/manual/CoreTasks/property.html;theAntmanualsegmentontargets:http://ant.apache.org/manual/using.html#targets;theApacheAntmanualindexpage:http://ant.apache.org/manual/index.html;theApacheAntProject,http://ant.apache.org.

Page 172: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe4.5CreatingaWARFilewithAnt

Problem

YouwanttouseAnttocreateaWebARchive(WAR)file.

Solution

UsetheAntwartask.

Discussion

AWARfileisawebapplicationarchivethatcontainsservletclasses,JSPfiles,HTMLfiles,imagedirectories,JARfiles,XMLconfigurationfiles,andotherresourcesthatawebapplicationdependson.TheWARisdeployedonawebcontainerlikeTomcatinordertomakethewebapplicationavailabletothecontainer'susers.AntincludesawartaskthatmakesiteasytogenerateaWARfromadirectorystructurethatcontainsthenecessarywebapplicationfiles.

Example4-6isastandalonebuildfilethatcreatesaWARfile.ItcouldeasilycompriseonetargetinacomplexbuildfilethatcompilesJavafiles,createstheWAR,anddeploystheapplication(seeRecipe2.6).

Thisexamplecreatesabuildsequenceofinit preparecreate-war.Theinittargetcreatesseveralpropertiesthatrefertodirectories,suchasthebuilddirectorycontainingtheservletclassfiles.Thecontext-pathpropertyprovidesthecontextpathforthewebapplication,andinthiscase,thenameoftheWARfile(myapp.war).

Youexecutethisbuildfilefromacommandpromptwhoseworking

Page 173: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

directoryisthewebapplication'srootortop-leveldirectory.

Example4-6.AnAntfileusingthewartask

<projectname="war-task"default="create-war"basedir=".">

<targetname="init"

description="Initializessomeproperties.">

<echomessage="Initializingproperties."/>

<propertyname="build"value=".\build"/>

<propertyname="src"value=".\src"/>

<propertyname="dist"value=".\dist"/>

<propertyname="lib"value=".\lib"/>

<propertyname="web"value=".\web"/>

<propertyname="meta"value=".\meta"/>

<propertyname="context-path"value="myapp"/>

</target>

<targetname="prepare"depends="init">

<echomessage=

"Cleaningupthebuildanddistdirectories."/>

<deletedir="${build}"/>

<mkdirdir="${build}"/>

<deletedir="${dist}"/>

<mkdirdir="${dist}"/>

</target>

<targetname="create-war"description=

"createsawebapplicationarchivefile"

depends="prepare">

Page 174: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<wardestfile="${dist}/${context-path}.war"

webxml="${meta}/web.xml">

<classesdir="${build}"/>

<libdir="${lib}"/>

<filesetdir="${web}"/>

</war>

</target>

</project>

Ifthebuildfilewascalledwar-task.xml,thentheAntfileisexecutedwiththiscommandline:

ant-buildfilewar-task.xml

Thecreate-wartargetcallsthewartask.

Thewartask'sdestfileattributeisrequired;itspecifiesthelocationoftheresultingWARfile.Example4-6createstheWARinthedistdirectory.Thewebxmlattributespecifiesthelocationofthewebapplication'sdeploymentdescriptor.Thiswebapplication'sweb.xmlfile(inthisexample)islocatedinthemetadirectory.

Theexamplewartaskhasthreenestedelements:classes,lib,andfileset.ThedirattributeoftheclasseselementpointstothedirectorythatcontainstheJavaclassesthatarelocatedintheWEB-INF/classesdirectory.ThewartaskautomaticallycreatestheWEB-INF/classesdirectoryintheWARfile.Thistaskalsoreproducesallthepackage-relateddirectoriesinthebuilddirectorywhenitcreatesWEB-INF/classes.Inotherwords,ifthebuilddirectoryincludesacom/jspservletcookbookdirectorystructure,thentheWARwillhavethesamestructureinWEB-INF/classes.

ThelibelementgrabsandstoresanyJARfilesthatwillbelocatedintheWARfile'sWEB-INF/libdirectory.Finally,thefilesetnested

Page 175: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

element,inthiscase,pullsinallthestaticfilesandanynestedimagedirectoriesthatarecontainedin/webandplacesthematthetopleveloftheWAR'sdirectorytree.Hereiswhattheoutputofthisbuildfilelookslike(withsomeeditingforreadability):

init:

[echo]Initializingproperties.

prepare:

[echo]Cleaningupthebuildanddistdirectories.

[delete]Deletingdirectory

/Users/bruceper/books/cookbook/build

[mkdir]Createddir:

/Users/bruceper/books/cookbook/build

[delete]Deletingdirectory

/Users/bruceper/books/cookbook/dist

[mkdir]Createddir:

/Users/bruceper/books/cookbook/dist

create-war:

[war]Buildingwar:

/Users/bruceper/books/cookbook/dist/myapp.war

ThewartaskhasnumerousotheroptionalattributesthatareexplainedintheAntmanualathttp://ant.apache.org/manual/CoreTasks/war.html.

SeeAlso

Recipe4.1ondownloadingandsettingupAnt;Recipe4.2onwritingAnttargets;Recipe4.3oncreatingaclasspathforanAntfile;Recipe4.4oncompilingaservletwithAnt;Recipe4.6onusingAnttocreateJARfiles;Recipe4.7andRecipe4.8onstartingandstoppingTomcatwithAnt;Recipe2.1andRecipe2.6ondeployingwebapplicationsusingAnt;theAntmanualsectiononthepropertytask:http://ant.apache.org/manual/CoreTasks/property.html;theAntmanualsegmentontargets:http://ant.apache.org/manual/using.html#targets;

Page 176: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

theApacheAntmanualindexpage:http://ant.apache.org/manual/index.html;theApacheAntProject:http://ant.apache.org.

Page 177: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe4.6CreatingaJARFilewithAnt

Problem

YouwanttocreateaJARfilewithAnt.

Solution

Usethebuilt-injartask.

Discussion

ThejartaskautomatesthecreationofJARfiles.LikethewartaskforWARs,thejartaskallowsyoutoautomatethecommand-linephrasesyouwouldhavetotypeinforcreatingJARs.Inthisway,buildfilesusingthejartaskaresomewhatlikeshellscriptsorbatchfilesforcreatingJARs.TheSunMicrosystemsJARfilespecificationcanbefoundathttp://java.sun.com/j2se/1.4/docs/guide/jar/jar.html.

Inwebapplications,JARfilesareusedtocontainseparatecodelibrariesthatthewebapplicationdependson,suchasadatabasedriver.Theyarelocatedinawebapplication'sWEB-INF/libdirectory.Example4-7showsanAnttargetthatusesthejartasktocreateaJAR,andthencopiestheJARfiletothelibdirectoryofawebapplication.TheseactionsprecedethearchivingofthewebapplicationintoaWARfile,whichcanbeincludedinthesamebuildfiletoautomateeverythingatonce(seeRecipe4.5oncreatingWARfiles).

Example4-7.CreatingaJARfilewithAnt

Page 178: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<projectname="jar-task"default="create-jar"basedir=".">

<targetname="init"

description="Initializessomeproperties.">

<echomessage="Initializingproperties."/>

<propertyname="dist"value="dist"/>

<propertyname="web"value="web"/>

<propertyname="meta"value="meta"/>

<propertyname="jar-name"value="myutils"/>

</target>

<targetname="prepare"depends="init">

<echomessage=

"Cleaningupthebuildanddistdirectories."/>

<deletedir="${dist}"/>

<mkdirdir="${dist}"/>

</target>

<targetname="create-jar"

description="createsaJARarchivefile"

depends="prepare">

<jardestfile="${dist}/${jar-name}.jar"

basedir="../../"

includes="**/*.class**/${web}/*.html">

<filesetdir="../../images"/>

</jar>

</target>

Page 179: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

</project>

Thisbuildfilecontainsthreetargetsinthebuildsequenceinitprepare create-jar.ThesetargetscreatesomepropertiesandcleanupadirectorycalleddistthatcontainstheresultantJARfile.Thecreate-jartargetcallsthejartask,whichlookslike:

<jardestfile="${dist}/${jar-name}.jar"basedir="../../"

includes="**/*.class**/${web}/*.html">

<filesetdir="../../images"/>

</jar>

ThedestfileattributeofthejarelementspecifiesthelocationandnameoftheJARfileafteritiscreated.Iusedapropertycalledjar-namehere,sothattheusercanrunthisAntfilefromthecommandlineandfeedanewJARfilenameintothebuildfileifneedbe,asin:

ant-Djar-name=mynewjar.jar

Rememberthatanypropertiesspecifiedwiththe-Dswitchoverridethepropertiesofthesamenamedefinedinsidethebuildfile.

Thebasedirattributeofthejartaskidentifiesthetop-leveldirectoryoffilesthatwillbeincludedintheJAR.Intheexample,thepattern../../means"gouptwodirectoriesfromthebasedirofthisproject";inotherwords,gouptwodirectoriesfromwheretheAntbuildfileislocated.

Theincludesattributehastwospace-separatedpatterns(youcanalsoseparatethemwithacomma).ThepatternsfurtherrefinethetypesoffilesthatwillbeincludedintheJARfile.Thefirstpatternspecifiesthe

Page 180: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

inclusionofallthefilesendingwiththe.classsuffixthatarelocatedinzeroormoredirectoriesbeneaththebasedirlocation.ThisJAR,asaresult,containsalloftheJavaclassfilesinalldirectoriesnestedbeneaththebasedirectory;theJARreproducesanynesteddirectoriesthatitfindswiththeclassfiles.Theotherpattern(**/${web}/*.html)takesalldirectoriesnestedbeneaththebasedirectorycalledwebandincludesanyfilesthatendwith.htmlintheJAR.Onceagain,thenesteddirectorieswillbeincludedwiththeJARandtheHTMLfiles.

Finally,afilesetelementnestedwithinthejartaskgrabsallthecontentsofthe../../imagesfolderandincludesthemintheJAR,butitdoesnotincludetheimagesfolderitself.AwaytoincludetheimagesfolderanditscontentsatthetopleveloftheJARistochangethejartaskto:

<jardestfile="${dist}/${jar-name}.jar"basedir="../../"

includes="**/*.class**/${web}/*.html**/images/*.gif

Thistaskaddsathirdpatterntotheincludesattribute(**/images/*.gif),whichgrabsalltheGIFfilescontainedbyanyimagesdirectoriesthatarenestedinthebasedirectory(thevalueofthejarelement'sbasedirattribute).AnimagesdirectorywillbeincludedintheJARifoneisfound.

The**patternisoftenusedinAntelements;itmeans"zeroormoredirectories."

Manifest

ThejartaskcreatesaMETA-INF/MANIFEST.MFfilefortheJARifthejartask'smanifestattributedoesnotappear.Thedefaultmanifestlookslikethis:

Page 181: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Manifest-Version:1.0

Created-By:ApacheAnt1.5.1

IfyouwanttospecifythelocationofyourownmanifestfileforreasonssuchassigningaJARfileorspecifyingthefilethatcontainsthemain()methodinanexecutableJAR,usethejartask'smanifestattribute.ThisoptionalattributecanbeeitherthefilelocationofthemanifestorthenameofanotherJARthathasbeenaddedbyusinganestedfilesetelement.IfitisaJAR,thetasklooksinthatJARfortheMETA-INF/MANIFEST.MFmanifest.

SeeAlso

Recipe4.1ondownloadingandsettingupAnt;Recipe4.2onwritingAnttargets;Recipe4.3oncreatingaclasspathforanAntfile;Recipe4.4oncompilingaservletwithAnt;Recipe4.7andRecipe4.8onstartingandstoppingTomcatwithAnt;Recipe2.1andRecipe2.6ondeployingwebapplicationsusingAnt;theAntmanualsectiononthepropertytask:http://ant.apache.org/manual/CoreTasks/property.html;theAntmanualsegmentontargets:http://ant.apache.org/manual/using.html#targets;theApacheAntmanualindexpage:http://ant.apache.org/manual/index.html;theApacheAntProject:http://ant.apache.org.

Page 182: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe4.7StartingaTomcatApplicationwithAnt

Problem

YouwanttostartawebapplicationonTomcatusinganAntfile.

Solution

UsetheTomcat-suppliedStartTasktasksothatAntcanmanageTomcat.

Discussion

TheTomcatservletandJSPcontainerincludesabuilt-inwebapplicationcalled"Manager"thatyoucanusetostart,stop,deploy,andinitiateotheradministrativetaskswithwebapplications.Tomcatmakesthisapplicationavailablefromthe/managercontextpath.

TomcatVersion4(andlater)includesJavaclassesthatallowdeveloperstousetheManagerapplicationfromtheirAntbuildfiles.TheadvantageofusingtheManagerapplicationfromAntisthatyoudonothavetoconfiguretheconf/server.xmlfiletomakethewebapplicationdynamicallyreloadable(seeRecipe2.2).Inaddition,youcanstartorstopasinglewebapplicationwithoutdisruptingotherTomcatapplications.

TheManagerdocumentationisfoundonlineathttp://jakarta.apache.org/tomcat/tomcat-4.1-doc/printer/manager-howto.html

Page 183: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

TakethesestepstostartTomcatfromAnt:

1. MakesureyouhavethenecessaryJARfilerequiredtousetheAnttaskforstartingTomcat:<Ant-installation-directory>/lib/catalina-ant.jar.CopythisJARfromthe<Tomcat-installation-directory>/server/libdirectorytoyour<Ant-installation-directory>/libdirectory(otherwiseknownasANT_HOME/lib).

MakesuretheTomcatuserdatabaseincludesausernamethatislinkedtothemanagerrole.OnlyadministrativeusersshouldbeauthorizedtostartandstopwebapplicationsusingtheManagertool.Theconf/tomcat-users.xmlfilemapsusersandpasswordstoroles.AuserhastobemappedtothemanagerroletobeabletousetheManagertool.Hereisanexampleofoneoftheseusermappingsintomcat-users.xml:

<userusername="doug"password="_1968dgw"roles="manager,dbadmin"/>

UsethetaskdefelementintheAntfiletodefinethecustomtaskandgiveitaname.Example4-8givesthetaskthenamestart,whichisusedbythetargetthatisresponsibleforstartingTomcat.

RuntheAntfileatthecommandlinebychangingtoitsdirectoryandtypingant.

Example4-8showsthetaskdefelementthatdefinesthestarttask,followedbythetargetthatstartsthespecifiedTomcatapplication.

Example4-8.StartingTomcatusinganAntfile

<projectname="MyProject"default="start-tomcat"basedir=".">

Page 184: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<taskdefname="start"classname="org.apache.catalina.ant.StartTask"/>

<!--importpropertiesspecifyingusername,password,url,andcontext-path-->

<propertyfile="global.properties"/>

<targetname="start-tomcat"

description="StartstheWebapplication">

<echomessage="Startingthedefaultapplication${context-path}..."/>

<start

url="${url}"

username="${username}"

password="${password}"

path="/${context-path}"/>

</target>

</project>

ThestarttaskhasfourattributesthatExample4-8setsusingaglobal.propertiesfile.Thisisatextfilecontainingfourname/valuepairs,whichareimportedintotheAntfileusingthepropertytask:

<propertyfile="global.properties"/>

Theglobal.propertiesfileislocatedinthesamedirectoryastheAntbuildfile.Herearethecontentsoftheglobal.propertiesfile:

url=http://localhost:8080/manager

username=bruce

password=bruce1957

context-path=home

TheurlpropertyspecifiestheTomcatManagerURL,theusernameandpasswordidentifytheuserwhoismappedintheTomcatuserdatabasetothemanagerrole,thecontext-pathpropertyspecifiesthecontextpathofthewebapplicationyouarestarting,andtheAntfileitselfspecifiestheopeningslash(/)characterforthecontextpath.

Page 185: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

AnotherwaytopasspropertiestoanAntfileisonthecommandline:

ant-Dusername=bruce-Dpassword=bruce1957

-Durl=http://localhost:8080/manager

-Dcontext-path=home

Propertiesaddedonthecommandlineoverridethosespecifiedbythepropertytask.

LaunchthisAntfilebychangingtoitsdirectoryatthecommandlineandtypingantorant-buildfilebuildfile-name.Hereisthecommand-lineoutput:

H:\book\cookbook\code\chap4>ant-buildfilestart.xml

Buildfile:start.xml

start-tomcat:

[echo]Startingthedefaultapplicationhome...

[start]OK-Startedapplicationatcontextpath/home

BUILDSUCCESSFUL

Totaltime:4seconds

Ifanapplicationisstopped,itisunavailabletowebusers(seeRecipe4.8).Whentheapplicationisstartedagain,itcanreceiverequestsnormally.

TheTomcatmanagerapplicationcaninitiatemanyothercommonadministrativetaskssuchasdeployingapplications(seeRecipe2.6).

SeeAlso

Page 186: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

TheTomcatManagerapplicationdescription:http://jakarta.apache.org/tomcat/tomcat-4.1-doc/manager-howto.html;Recipe4.1ondownloadingandsettingupAnt;Recipe4.2onwritingAnttargets;Recipe4.3oncreatingaclasspathforanAntfile;Recipe4.4oncompilingaservletwithAnt;Recipe4.5andRecipe4.6oncreatingWARandJARfiles;Recipe4.8onstoppingTomcatwithAnt;Recipe2.1andRecipe2.6ondeployingwebapplicationsusingAnt;theAntmanualsectiononthepropertytask:http://ant.apache.org/manual/CoreTasks/property.html;theAntmanualsegmentontargets:http://ant.apache.org/manual/using.html#targets;theApacheAntmanualindexpage:http://ant.apache.org/manual/index.html;theApacheAntProject:http://ant.apache.org.

Page 187: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe4.8StoppingaTomcatApplicationwithAnt

Problem

YouwanttouseAnttostopaspecificTomcatwebapplication.

Solution

DefineataskintheAntfileusingataskdefelementandtheJavaclassorg.apache.catalina.ant.StopTask.

Discussion

Duringdevelopment,youmightneedtostopaTomcatwebapplicationsothatyoucanaddnewservletsordeployment-descriptorentries,andthenrestarttheapplication,allowingthechangestotakeeffect.Intheabsenceofaconf/server.xmlconfigurationtomaketheapplicationdynamicallyreloadable(seeRecipe2.2),youcanuseanAnttargettostopaparticularwebapplicationwithoutdisruptingtheotherrunningwebapplications.Thisistheoppositeofstartinganapplication(Recipe4.7);theapplicationistakenoutofserviceuntilyoustartitagain.

Theorg.apache.catalina.ant.StopTaskclassprovidesaconnectionbetweenAntandtheTomcatManagerapplication.Managerisabuilt-inwebapplication(atcontextpath/manager)thatyoucanusetoadministerotherTomcatwebapplications.

ImplementthesamefourstepsdiscussedinRecipe4.7tousethisstoptask:

Page 188: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

1. MakesureyouhavethenecessaryJARfilerequiredtousetheAnttaskforstoppingTomcat:<Ant-installation-directory>/lib/catalina-ant.jar.CopythisJARfromthe<Tomcat-installation-directory>/server/libdirectorytoyour<Ant-installation-directory>/libdirectory(otherwiseknownasANT_HOME/lib).

MakesuretheTomcatuserdatabaseincludesausernamethatislinkedtothemanagerrole(seestep2ofRecipe4.7ifyouneedmoredetails).

Example4-9usesataskdefelementtogivethetaskthenamestop,whichisusedbythetargetthatisresponsibleforstoppingTomcat.

RuntheAntfileatthecommandlinebychangingtoitsdirectoryandtypingantorant-buildfilebuildfile-name.

Example4-9.UsingAnttostopawebapplication

<projectname="MyProject"default="stop-tomcat"basedir=".">

<taskdefname="stop"classname="org.apache.catalina.ant.StopTask"/>

<!--importpropertiesspecifyingusername,password,url,andcontext-path-->

<propertyfile="global.properties"/>

<targetname="stop-tomcat"

description="StopstheWebapplication">

<echomessage="Stoppingtheapplication${context-path}..."/>

<stop

url="${url}"

username="${username}"

password="${password}"

Page 189: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

path="/${context-path}"/>

</target>

</project>

Thetaskdefdefinesataskforthisbuildfilecalledstop.Thedefinedtaskisthenusedinthebuildfile:

<stopurl="${url}"username="${username}"password="${password}"

path="/${context-path}"/>

Example4-9getsitspropertyvaluesfromapropertytaskthatimportsglobal.properties(thepropertyfileislocatedinthesamedirectoryastheAntbuildfile).Thepropertiesrepresent:

Theusernameandpasswordofauserwhoismappedtothemanagerroleinconf/tomcat-users.xml

TheURLtotheManagerapplication,asinhttp://localhost:8080/manager

Thecontextpathforthewebapplicationthatyouarestopping

TheTomcatmanagerapplicationcaninitiatemanyothercommonadministrativetaskssuchasdeployingapplications(seeRecipe2.6).

SeeAlso

TheTomcatManagerapplicationdescription:http://jakarta.apache.org/tomcat/tomcat-4.1-doc/manager-howto.html;

Page 190: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe4.1ondownloadingandsettingupAnt;Recipe4.2onwritingAnttargets;Recipe4.3oncreatingaclasspathforanAntfile;Recipe4.4oncompilingaservletwithAnt;Recipe4.5andRecipe4.6oncreatingWARandJARfiles;Recipe4.7onstartingTomcatwithAnt;Recipe2.1andRecipe2.6ondeployingwebapplicationsusingAnt;theAntmanualsectiononthepropertytask:http://ant.apache.org/manual/CoreTasks/property.html;theAntmanualsegmentontargets:http://ant.apache.org/manual/using.html#targets;theApacheAntmanualindexpage:http://ant.apache.org/manual/index.html;theApacheAntProject:http://ant.apache.org.

Page 191: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Chapter5.AlteringtheFormatofJSPs

Introduction

Recipe5.1.PrecompilingaJSPinTomcat

Recipe5.2.PrecompilingaJSPinWebLogic

Recipe5.3.PrecompilingJSPswiththePrecompilationProtocol

Recipe5.4.MappingaJSPtoItsPageImplementationClass

Recipe5.5.CreatingaJSPfromScratchasaJSPDocument

Recipe5.6.GeneratinganXMLViewfromaJSP

Page 192: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Introduction

ThischaptercoverstwomeansofworkingwithJSPsthatfallslightlyoutsidethenorm.ThefirstmethodprecompilesJSPsandturnsthemintoservletsourcecode.TheseconddevelopsJSPsasXMLdocuments.

PrecompilingJSPs

PrecompilingaJSPinvolvesusingaserver-providedcommand-linetooltoconverttheJSPpageintoaservletclassfile.AJSPisconvertedintoaservlet,oftencalledaJavaServerPageimplementationclass,beforeithandlesanyHTTPrequests.TheJSPspecificationreferstothestagebywhichtheJSPcontainerconvertsJSPpagesyntaxintoaservletasthetranslationphase.InTomcat,ifyouwanttoexaminewhattheJSPpageimplementationclasslookslikeafterthisconversion,gotothisdirectory:

Tomcat-install-directory/work/Standalone/name-of-host/name-of-web-app

name-of-hostcouldbelocalhost,oranyotherhostnamethatreferstotheserverTomcatisinstalledon.Thenameofthewebapplicationisalsothenameofthecontext;thisisusuallysomethinglikeexamples,ROOT,orstorefront.

Theindicateddirectorycontains.javafiles,suchasdefault_jsp.java.ThesearetheJavasourcefilesthatarecompiledintoclassfiles,andthenexecutedasservletstorespondtorequests.

ThereasonswhyaJSPdevelopermaywanttoprecompileaJSPpageinclude:

1. AvoidingtheperceptibledelaycausedwhenaJSPisfirstrequestedfromthewebcontainer,duringwhichtheJSPcompilerconvertstheJSP'ssourcecodeintoaservlet.

Page 193: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

AllowingthedevelopertoexaminetheJavasourcecodefortheJSPpageimplementationclass,andoptionallyworkonthecodewiththeirservletIDE'ssourcecodeeditor.

InbothTomcatandWebLogic,acommand-linetoolcanbeusedtoprecompileaJSP.Recipe5.4coversthemappinginweb.xmlofaJSPpagetoitsservletimplementationclass.

JSPsasXMLDocuments

ThelaterrecipesinthischapterdescribecreatingJSPsasXMLfiles.BoththeJSPspecificationsv1.2and2.0describethegenerationanduseofJSPsaspureXMLdocuments.ThismeansthatratherthancreateJSPsintypicalJSPpagesyntax,theyareinsteadcodedaswell-formedXMLdocuments.AccordingtotheJSPspecification,aJSPdocumentisanamespace-awareXMLdocument.TheJSPcontainerdifferentiatesJSPdocumentsfromtraditionalJSPpagesinatleastoneofthreeways.

1. Ajsp-property-groupelementinweb.xmlspecifiesaJSPdocumentwiththeis-xmlchildelement.(Thejsp-property-groupelementisoneoftheJSPconfigurationelementsthattheJSP2.0specificationhasproposedaddingtoweb.xml.)

Thefilehasa.jspxextension.

TheJSPpagehasarootelementofjsp:root.

Recipe5.5showswhatthesefileslooklike.

TheJSPspecificationdescribesanXMLviewasadescriptionofaJSPpageinXMLform.AnXMLviewisgeneratedbytheJSPcontainerduringthetranslationphase.Asubclassofjavax.servlet.jsp.tagext.TagLibraryValidatorcanusetheXMLviewtoparseaJSPinordertovalidatethatcustomtagshavebeenusedcorrectly,beforethecontainerfinallyconvertstheJSPintoitspage

Page 194: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

implementationclass(aservlet).Recipe5.6showshowtogenerateXMLviewsforaJSP,andhowtosavetheresultingXMLfiles.

JSPscanbecreatedasXMLfilesforthefollowingreasons,amongothers:

WebcontainerscanacceptJSPdocumentsinwebapplications,meaningthatthewebapplicationcancontainXMLfilesinsteadofthepagesintraditionalJSPsyntax.JSPdocumentscanthusbeintegratedwithotherXMLcontent,suchasXHTMLfiles,ScalableVectorGraphics(SVG),andtheXMLfilesthatarepartofwebservicestransactions.

YoucanuseXMLeditorstoworkwithJSPdocuments.

YoucanuseotherXMLtechnologieswithJSPdocuments,suchasXSLT,SimpleObjectAccessProtocol(SOAP),SAX,andDOM.

Page 195: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe5.1PrecompilingaJSPinTomcat

Problem

YouwanttoconvertJSPsintoservletsusingTomcat4.1.x.

Solution

UsetheJspCcommand-linetoolfoundin<Tomcat-installation>/bin.

Discussion

UsingtheJspCcommand-linetoolisthefirststepinprecompilingTomcatJSPs.Thistoolisofferedintheformofashellscriptjspc.shonUnixsystemsandjspc.batonWindowsandcreatestheJavasourcefilesfortheJSPpageimplementationclasseswithwhichitissupplied.Theresultant.javafilesstillhavetobecompiledintoservletclassfiles,usingjavacoranotherJavacompiler.SinceprecompilingJSPsisatwo-stepprocess,Irecommendabatchfileforconvenience.However,let'sfirstexaminehowtousetheJspCutility.

TheWindowsshellscriptforrunningJspC(<Tomcat-install-directory>/bin/jspc.bat)requiresthataJASPER_HOMEenvironmentvariablebesettotheTomcatinstallationdirectory.Setthisenvironmentvariablewiththefollowingcommandline:

setJASPER_HOME=k:\jakarta-tomcat-4.1.12

RuntheJspCutilitybychangingtothe%JASPER_HOME%\bindirectoryandtypingthefollowingcommand(specifyyourowndirectorypathsandissuethecommandononeline):

Page 196: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

jspc-dH:\book\cookbook-webincH:\book\cookbook\map.xml

-webapph:\book\cookbook\dist

The-dswitchspecifiesthedirectorywhereyouwouldlikethesourcefilestobegenerated,andthe-webincswitchspecifiesthenameofanautomaticallygeneratedfilewhereJspCwillcreatetheservletandservlet-mappingelementsfortheservletfiles.IfyoucompileaJSPpagethatiscalledprecomp.jsp,themappingswouldlooklikeExample5-1.

Example5-1.ServletmappingforaprecompiledJSP

<servlet>

<servlet-name>org.apache.jsp.precomp_jsp</servlet-name>

<servlet-class>org.apache.jsp.precomp_jsp</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>org.apache.jsp.precomp_jsp</servlet-name>

<url-pattern>/precomp.jsp</url-pattern>

</servlet-mapping>

Youcanthencutandpastetheseservletandservlet-mappingelementsintotheweb.xmldeploymentdescriptorforyourwebapplication.

The-webappswitchspecifiesaweb-applicationdirectory,whichmustinturnhavea/WEB-INFsubdirectorycontainingyourapplication'sweb.xmlfile.JspCfindsallofthe.jspfilesatthetoplevelofthisweb-applicationdirectoryandtranslatesthemintoservletsourcefiles,alongwithanyJSPsinnestedsubdirectories.Theresulting.javafilesareplacedinthedirectoryspecifiedwiththe-dswitch.Unlike-webinc,the-webxmlswitchcreatesanentireweb.xmlfilethatincludesthenewservletsandservletmappings.SeveralotherJspCoptionsaredescribedhere:http://cvs.apache.org/viewcvs/~checkout~/jakarta-tomcat-4.0/jasper/doc/jspc.html.

Page 197: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

You'llthenneedtocompilethegeneratedsourcefiles.Irecommendusingabatchfiletotakecareofbothstepsatonce.TheWindowsbatchfileinExample5-2generatesthesourcefilesandusesthejavactooltocompiletheservlets.

Example5-2.UsingabatchfiletoprecompileJSPswithTomcat

@echooff

jspc-dH:\book\cookbook\classes-webincH:\book\cookbook\map.xml-webapph:\book\

cookbook\dist

setPRECLASSPATH=%CATALINA_HOME%\common\lib\servlet.jar;

%CATALINA_HOME%\common\lib\jasper-runtime.jar;%CLASSPATH%

javac-classpath%PRECLASSPATH%-d./classes*.java

Savethisfileinatextfilewithanamelikeprecomp.bat.Changetothedirectorycontainingthebatchfileandtypeprecomp.ThisbatchfilerunstheJspCcommandonall.jspfilesexistingbeneaththeh:\book\cookbook\distweb-applicationdirectory.Usingthe-webincswitch,thecommandcreatesanXMLfragmentofservletandservlet-mappingelementsasshownearlierinthisrecipe.Iftherearenoproblems,thecompiledfileswillbestoredintheh:\book\cookbook\classesdirectory.

ThecodethencreatesaPRECLASSPATHenvironmentvariablethatincludestheservlet.jarandjasper-runtime.jarcomponents,alongwithanydirectoriesorJARsthatarepartoftheexistingCLASSPATHenvironmentvariable.Theservlet.jarcomponentisnecessarytoimporttheseJavapackagesduringcompilation:

javax.servlet

javax.servlet.http

Page 198: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

javax.servlet.jsp

Addingthejasper-runtime.jarisnecessarytoimporttheorg.apache.jasper.runtimepackage.OnWindows,youmayhavetosetaJASPER_HOMEenvironmentvariabletotheTomcatinstallationdirectorybeforethisbatchfilerunsproperly.

Example5-3showsaUnixshellscriptthataccomplishesthesametask.Thisscriptexecutesthejspc.shfileinTomcat's/bindirectory,precompilingalloftheJSPfilesthattheJspCtoolfindsinthecurrentworkingdirectory.Thescriptstorestheresulting.javafilesinthe./classesdirectory.

Example5-3.AshellscriptforprecompilingJSPfiles

#!/bin/sh

$CATALINA_HOME/bin/jspc.sh-d./classes-webinc./map.xml-webapp./;

PRECLASSPATH=$CATALINA_HOME/common/lib/servlet.jar:$CATALINA_HOME/common/lib/jasper-

runtime.jar;

exportPRECLASSPATH;

javac-classpath$PRECLASSPATH-d./classes./classes/*.java

SeeAlso

Recipe5.3ontheprecompilationprotocol;Recipe5.4onmappingthecompiledJSP(s)inweb.xml;theJSPprecompilationsectionofJavaServerPagesbyHansBergsten(O'Reilly);ChapterJSP.11.4oftheJSP2.0specification.

Page 199: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe5.2PrecompilingaJSPinWebLogic

Problem

YouwanttoprecompileaJSPinWebLogic.

Solution

Usetheweblogic.jspcJavautilitythatinstallswithWebLogicServer7.0.

Discussion

WebLogicServer7.0installswithitsownJavautilityforprecompilingJSPs:weblogic.jspc.ThisutilityispartoftheJARfilethatcanbefoundatthislocation:<WebLogic-install-directory>/weblogic700/server/lib/weblogic.jar.WhenyouprecompileJSPsusingweblogic.jspc,itplacestheclassfilesinthespecifieddestinationdirectory.Example5-4showsasimplebatchfileonWindowsNTthatprecompilesanexample.jspJSPpageintoitsservletimplementationclass.

Example5-4.PrecompilingaJSPwithweblogic.jspc

@echooff

setWLCLASSPATH=k:\bea\weblogic700\server\lib\weblogic.jar;%CLASSPATH%

java-cp%WLCLASSPATH%weblogic.jspc-d.\classesexample.jsp

ThesecondlineofExample5-4setsanenvironmentvariable,WLCLASSPATH.Thisvariableprependsareferencetoweblogic.jartotheexistingCLASSPATHvariable.Thenextlineoftheexampleusesthis

Page 200: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

combinedclasspathtorunweblogic.jspc.The-dswitchtellstheprogramwheretostoretheresultingclassfiles,inthiscase,intheclassesdirectorybeneaththedirectorycontainingthebatchfileandexample.jsp.ThisprogramgeneratesaJavaclassfilenamedjsp_servlet.__example.class(includingthepackagename).Ifyoudonotspecifyapackageforthecompiledservlet,jsp_servletisusedasthedefaultpackagename(seeExample5-6).Example5-5showsashellscriptthatiswrittenonMacOSXforprecompilingaJSPwithWebLogic.

Example5-5.PrecompilingJSPswithweblogic.jspcandashellscript

#!/bin/sh

WLCLASSPATH=/Users/bruceper/java/weblogic_jar/weblogic.jar:$CLASSPATH;

exportWLCLASSPATH;

java-cp$WLCLASSPATHweblogic.jspc

-d/Users/bruceper/books/cookbook/code/chap5/classesnewfile.jsp

weblogic.jspcisdifferentfromTomcat'sJspCutilityinthatitcompilesafileinJSPpagesyntaxintotheservletclassfileinasingleoperation.UsingTomcat'sJspCfromthecommandlinerequirestheuseofacompiler,suchasjavac,tocompilethe.javafilesgeneratedbyJspCintoclassfiles.ThissecondcompilationstepwhenusingJspCishandledautomaticallywhenusingweblogic.jspc.

TheWindowsbatchfileinExample5-6specifiesajspservletcookbookpackageforalltheJSPpagesfoundinthewebapplicationspecifiedbythe-webappswitch.

Example5-6.Usingweblogic.jspctoprecompileallJSPpagesinawebapplication

Page 201: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

@echooff

setWLCLASSPATH=k:\bea\weblogic700\server\lib\weblogic.jar;%CLASSPATH%

java-cp%WLCLASSPATH%weblogic.jspc-d.\classes-packagejspservletcookbook-compileAll

-webapph:/home

Example5-7showsaUnixshellscriptthatdoesthesamething.

Example5-7.PrecompilingallJSPpagesinawebapplicationwithashellscript

#!/bin/sh

WLCLASSPATH=/Users/bruceper/java/weblogic_jar/weblogic.jar:$CLASSPATH;

exportWLCLASSPATH;

java-cp$WLCLASSPATHweblogic.jspc-d/Users/bruceper/books/cookbook/code/chap5/classes

-packagejspservletcookbook-compileAll-webapp/Users/bruceper/books/cookbook/code/chap5

Notethisportionoftheinstructionintheexample:

-compileAll-webapph:/home

The-compileAllswitch,alongwithanargumentto-webapp,tellsweblogic.jspctoprecompilealltheJSPfilesfoundinthewebapplicationconfiguredintheh:\homedirectory,includinganyJSPfilesnestedinsubdirectories.Thiswebapplicationisinexplodeddirectoryformat(notarchivedintoaWARfile).InExample5-6,thecompiledclassesarestoredinthe\classes\jspservletcookbookdirectorypath.

SeeAlso

Recipe5.3ontheprecompilationprotocol;Recipe5.4onmappingthecompiledJSP(s)inweb.xml;theJSPprecompilationsectionofJavaServerPagesbyHansBergsten(O'Reilly);ChapterJSP.11.4oftheJSP2.0specification.

Page 202: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe5.3PrecompilingJSPswiththePrecompilationProtocol

Problem

Youwanttousethe"precompilationprotocol"thatispartoftheJSPspecificationtoprecompileoneormoreJSPfiles.

Solution

SendarequesttotheJSPcontainerthatincludesajsp_precompileparameter.

Discussion

TheJSP1.2and2.0specificationsrequirecompliantJSPcontainerstosupporttheuseofthejsp_precompilerequestparameter.ThisparametersuggeststhatthecontainerprecompiletherequestedJSP.HereishowitworksinTomcat:

1. RequesttheJSPthatyouwantprecompiledwiththejsp_precompileparameteraddedtotheURL,asinhttp://localhost:8080/home/url_rewrite.jsp?jsp_precompile=true.

TheJSPcontainerisnotsupposedtoexecutetheJSPpage;itjustprecompilesit.Theresultoftherequest,ifyouweremakingitinawebbrowser,isablankpage.

IftheJSPfileinJSPpagesyntaxhasnotyetbeencompiled,oriftheJSPfilehasbeenchangedandhasalatermodificationdatethanany

Page 203: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

existingpageimplementationclass,TomcatcreatesanewJavasourceandclassfilefortheJSPinthe<Tomcat-install-directory>/workdirectory.IftheJSPfileisnamedurl_rewrite.jsp,TomcatcallstheJavasourceandclassfilesurl_rewrite_jsp.javaandurl_rewrite_jsp.class.

Supplyingtherequestparameterjsp_precompile(withoutthe"=true"part)isthesameasrequestingjsp_precompile=trueintheURL.

TheprecompilationprotocolinTomcatwillbothcreatethe.javafileandcompilethatfileintotheJSPpageimplementationclass.UsingtheJspCtoolasdescribedinRecipe5.1willgenerateonlya.javafile.

ThisprotocolisbestusedwithanautomatedtoolthatcanmakeHTTPrequests,suchastheJakartaCommonsHttpClientcomponent.UsingsuchatoolallowsyoutoautomatetheprecompilationofdozensofJSPsbysendingseveralHTTPrequestsfromasingleJavaprogram.

SeeAlso

Recipe5.1onusingTomcat'sJspCutility;Recipe5.2onprecompilingwithWebLogicServer;Recipe5.4onmappingthecompiledJSPsinweb.xml;Chapter7onsendingHTTPrequestsfromaservletoraJSP;theJakartaCommonsHttpClienthomepageathttp://jakarta.apache.org/commons/httpclient/;TheJSPprecompilationsectionofJavaServerPagesbyHansBergsten(O'Reilly);ChapterJSP.11.4oftheJSP2.0specification.

Page 204: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe5.4MappingaJSPtoItsPageImplementationClass

Problem

YouhavealreadyprecompiledaJSPandwanttospecifyamappingtotheJSPpageimplementationclassinyourdeploymentdescriptor.

Solution

Cutandpastetheservletandservlet-mappingelementsgeneratedautomaticallybyJspCintoweb.xml.Createtheproperpackage-relateddirectoriesintheWEB-INF/classesdirectoryofyourwebapplication,thenplacetheprecompiledJSPsintothatdirectory.

Discussion

PrecompilingJSPsallowsyoutoremovetheJSPpagesyntaxfilesfromyourwebapplicationandjustusetheresultingservletclassfiles.Youcanthenusetheservlet-mappingelementinweb.xmltomapaJSP-styleURL(e.g.,default.jsp)tothecompiledservletclass.Hereishowtoaccomplishthistask:

1. PrecompiletheJSP(s)asdescribedinRecipe5.1orRecipe5.2,includingthecompilationofJavasourcefilesintoclassfilesusingjavacoranothercompilertool.

Cutandpastetheservletandservlet-mappingelementsgeneratedautomaticallybyJspCintoyourdeploymentdescriptor(ifyouareusingTomcat),oraddthoseelementsmanuallytoweb.xml(ifyouare

Page 205: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

usingWebLogicoranothercontainer).

Makesuretheservlet-mapping'surl-patternelementpointstoaJSP-stylefilename,suchasdefault.jsp,oranextensionmappingsuchas*.jsp.

Placetheclassorclasses,includingthepackage-relateddirectories,inWEB-INF/classes,orinsideofaJARfilethatisstoredinWEB-INF/lib.

WhenthewebusersrequesttheURLspecifiedbytheservlet-mappingforthatJSPpageimplementationclass,thewebcontainerwillnowdirectthatrequesttothemappedservletclass.

Example5-8showsaservletconfigurationforaprecompiledJSP.

Example5-8.Aweb.xmlentryforaprecompiledJSP

<servlet>

<servlet-name>org.apache.jsp.precomp_jsp</servlet-name>

<servlet-class>org.apache.jsp.precomp_jsp</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>org.apache.jsp.precomp_jsp</servlet-name>

<url-pattern>/precomp.jsp</url-pattern>

</servlet-mapping>

Thedirectorystructureforthisclassinyourwebapplicationshouldbesomethinglike:/WEB-INF/classes/org/apache/jsp/precomp_jsp.class.Ifthecontextpathforyourwebapplicationis/home,userscanrequestthisJSP'simplementationclass(aservlet,behindthescenes)withaURLsimilartohttp://localhost:8080/home/precomp.jsp.

SeeAlso

Page 206: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe5.1-Recipe5.3;ChapterJSP.11.4oftheJSP2.0specification.

Page 207: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe5.5CreatingaJSPfromScratchasaJSPDocument

Problem

YouwanttocreateaJSPdocumentinanXMLeditor'stool.

Solution

OpenupyourXMLeditorofchoiceandcreatetheJSPusingonlyXMLelements.

Discussion

AJSPdocumentisanamespace-aware,well-formedXMLfilethatcontainsJSPstandardactions(suchasjsp:includeandjsp:useBean),customactions(suchasJSTLcustomtags),andtheXMLequivalentsofJSPdirectives.Table5-1specifiestheXMLequivalentsforcommonJSPdirectives.WritetheJSPdocumentinanXMLeditor,preferablyonewhereyoucancheckitswell-formedness.TheJSPdocumenthastobeawell-formedXMLdocumenttobeeligibleforplacementintoaJSPcontainerandexecution.

Table5-1.XMLequivalentsforJSPdirectives

Directive Example JSPdocumentequivalent

<page><%@pageimport="java.util.Date"%> <jsp:directive.pageimport="java.util.Date"/>

<include><%@includefile="footer.html"%> <jsp:directive.includefile="footer.html"/>

Page 208: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<taglib>

<%@tagliburi="WEB-INF/tlds/xml_gen.tld"prefix="t"%>

<jsp:rootjsp:id="0"xmlns:jsp="http://java.sun.com/JSP/Page"version="2.0"xmlns:t="urn:jsptld:/WEB-INF/tlds/xml_gen.tld">

InJSP1.2,theonlywaytoidentifyaJSPpageasXMLisbyhavingajsp:rootelementastheroot.However,JSP2.0offersseveralnewoptionstheJSP2.0specificationstatesthataJSPdocumentcanalsobedistinguishedfromaJSPinnon-XMLsyntaxbyajsp-property-groupelementinthedeploymentdescriptor,a.jspxfileextension,orajsp:rootrootelement.

ThisrecipeshowsasimpleJSPpageanditsXMLequivalent,thenrepeatsthecomparisonwiththeadditionofacustomtagandaruntimeexpressionforaJSPelementattribute.Example5-9isasimplefileinJSPpagesyntaxshowingthewebserver'slocaltime.

Example5-9.AsimpleJSPpage-syntaxfile

<%@pagecontentType="text/html"%>

<%@pageimport="java.util.Date"%>

<html>

<head><title>WelcometotheWeb</title></head>

<body>

<h2>WelcometotheWeb</h2>

Theserver'slocaltimeis<%=newDate()%>.

</body>

</html>

ThisJSPhastwopagedirectivesandaJSPexpressionthatdisplaysadateandtimestringonthebrowserpage.Figure5-1showstheexecutionofthispageinabrowser.

Figure5-1.SimpleJSPbeforeXMLconversion

Page 209: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

ThispagecanbeconvertedintoaJSPdocumentbycuttingandpastingthecodeintoanXMLeditorandreplacingnon-XMLconstructswithXMLelements.Example5-10istheJSPdocumentequivalentofExample5-9.

Example5-10.AsimpleJSPdocumentaswell-formedXML

<jsp:rootxmlns:jsp="http://java.sun.com/JSP/Page"version="2.0">

<jsp:directive.pagecontentType="text/html"/>

<jsp:directive.pageimport="java.util.Date"/>

<html>

<head><title>WelcometotheWeb</title></head>

<body>

<h2>WelcometotheWeb</h2>

Theserver'slocaltimeis<jsp:expression>newDate()</jsp:expression>.

</body>

</html>

</jsp:root>

Example5-10hasjsp:directive.pageelementsinsteadoftraditionalJSPdirectives,whicharenotvalidXMLelementsbecauseofthe<%@syntax.AnythinginaJSPpagethatuses<%-styledelimiterscannotbeusedtodistinguishJSPelements,becausethentheJSPdocumentwillnotpassanXMLwell-formednesstest.

Example5-11isamorecomplexJSPpagewithataglibdirectivethatspecifiesthecoretaglibraryfromJSTL1.0;thepagealsouses

Page 210: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

ExpressionLanguage(EL)code.Further,thepagehasajsp:useBeanelementthatsetsajava.util.DatevariabledateStringtopagescope.

Example5-11.AJSPpagepresentingacomplexXMLconversion

<%@pagecontentType="text/html"%>

<%@tagliburi="http://java.sun.com/jstl/core"prefix="c"%>

<html>

<head><title>WelcometotheWeb</title></head>

<body>

<h2>WelcometotheWeb</h2>

Hello,<c:outvalue="${param.firstName}${param.lastName}"/><br><br>

<jsp:useBeanid="dateString"class="java.util.Date"/>

Thetimeis<c:outvalue="${dateString}"/>.<br><br>

Thevalueof10+24+35=<c:outvalue="${10+24+35}"/>

</body>

</html>

Example5-12isthesameJSPpageconvertedtoaJSPdocument.

Example5-12.Referringtotaglibraries(taglibs)inaJSPdocument

<jsp:rootxmlns:jsp="http://java.sun.com/JSP/Page"

xmlns:c="http://java.sun.com/jstl/core"version="2.0">

<jsp:directive.pagecontentType="text/html"/>

<html>

<head><title>WelcometotheWeb</title></head>

<body>

<h2>WelcometotheWeb</h2>

<jsp:text>Hello</jsp:text>

<c:outvalue="${param.firstName}${param.lastName}"/><br></br><br></br>

Page 211: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<jsp:useBeanid="dateString"class="java.util.Date"/>

<jsp:text>Thetimeis</jsp:text><c:outvalue="${dateString}"/>.

<br></br><br></br>

<jsp:text>Thevalueof10+24+35=</jsp:text>

<c:outvalue="${10+24+35}"/>

</body>

</html>

</jsp:root>

InaJSPdocument,anytaglibrariescanbeincludedasnamespaceattributes,suchasinthejsp:rootelement,asshownhere:

<jsp:rootxmlns:jsp="http://java.sun.com/JSP/Page"

xmlns:c="http://java.sun.com/jstl/core"version="2.0">

Thejsp:textelementcanbeusedtocontainanytemplatedataintheJSPdocument.YoucanusetheJSPstandardactionssuchasjsp:useBeanandcustomtagslikec:outwiththesamesyntaxusedinaJSPpage.

Figure5-2showsthebrowseroutputoftheJSPdocumentinExample5-12.ThispagewasrequestedbyusingthisURL:http://localhost:8080/home/example_xml2.jsp?firstName=Bruce&lastName=Perry.

Figure5-2.OutputfromExample5-11

Page 212: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

HereiswhattheHTMLsourcecodelookslike,ifyouchose"ViewSource"fromthebrowsermenu(withsomecarriagereturnsaddedforreadability):

<html><head><title>WelcometotheWeb</title></head>

<body>

<h2>WelcometotheWeb</h2>

HelloBrucePerry<br/><br/>

ThetimeisMonFeb1016:20:05EST2003.<br/><br/>

Thevalueof10+24+35=69

</body></html>

SeeAlso

Recipe5.6ongeneratinganXMLviewfromaJSP;ChapterJSP.6(JSPdocuments)oftheJSP2.0specification;ChapterJSP.10(XMLviews)oftheJSP2.0specification.

Page 213: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe5.6GeneratinganXMLViewfromaJSP

Problem

YouwanttoautomaticallygenerateanXMLviewfromaJSPpage.

Solution

CreateacustomtagandaTagLibraryValidatorclass,fromwhichyoucanoutputtheXMLviewofaJSPtoafile.

Discussion

AnXMLviewisanXMLformofaJSPpagethattheJSPcontainergeneratesduringthetranslationphase,anintermediarystagebeforethecontainerconvertstheJSPtoitspageimplementationclass(aservlet).ATagLibraryValidatorclasscanusetheXMLviewtovalidatetheuseofcustomtagsintheJSPpriortotheJSP'sconversiontoaservlet.AnXMLviewisverysimilartoaJSPdocument,whichisanXMLformofaJSPpagethatJSPdeveloperscanwriteandaddtotheirwebapplications.ThedifferencesbetweenthetwoXMLfilesaccordingtotheJSPspecificationv2.0are:

AnXMLviewexpandsanyincludedirectivesthataJSPdocumentcontainsintotheircorrespondingJSPfragments.

AnXMLviewprovideseachXMLelementwithajsp:idattribute.

AnXMLviewaddsajsp:rootelementastherootelementofthedocumentifthedocumentdoesnotalreadyhaveajsp:root

Page 214: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

element.

AnXMLviewaddsajsp:directive.pageelementandpageEncodingattributeiftheydonotalreadyexist,andsetsthevalueofpageEncodingto"UTF-8".

AnXMLviewaddsajsp:directive.pageelementandcontentTypeattributeiftheydonotalreadyexist,andsetsthevalueofcontentTypeaccordingtoChapterJSP.4.2,"ResponseCharacterEncoding,"oftheJSP2.0specification(e.g.,"text/xml"foraJSPdocument).

Javadeveloperscanaddsubclassesofjavax.servlet.jsp.tagext.TagLibraryValidatortotheirwebapplicationsastoolsforvalidatingtheapplication'suseofcustomtags.TheJSPcontainer(JasperisthenameoftheTomcatJSPcontainer)makesavailabletotheTagLibraryValidatoranXMLviewofaJSPpageforthepurposeofparsingXMLelementsinthepageandvalidatingwhetherornottheyhavebeenusedcorrectly.

ItisusefultoexaminetheXMLviewofaJSPpageinordertodebugaTagLibraryValidatorclassthatyouareusinginacustomtaglibrary,ortoopenupyourJSPinanXMLeditorandevaluateitssyntaxfromanXMLperspective.Hereisaniceway(okay,abitofahack!)toautomaticallygenerateafilerepresentingtheXMLviewofaJSPpage.Thisrecipeusesajavax.servlet.jsp.tagext.PageDataobject,whichautomaticallyreturnstheXMLviewofaJSPpageasajava.io.InputStream.Hereishowitworks:

1. Createaclassthatextendsjavax.servlet.jsp.tagext.TagLibraryValidator.Theseclassesareusedtovalidatetheuseofcustomtags,andareexplainedinmoredetailinChapter23.

OverridetheTagLibraryValidator.validate(Stringprefix,Stringuri,PageDatapage)methodtowritetheXMLview

Page 215: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

informationfromthePageDataparametertoafile.

Createasimplecustomtagbyextendingjavax.servlet.jsp.tagext.TagSupport.Thistag"marks"aJSPpagesothatitsXMLviewcanbeoutputtoafile.Thetagincludesa"filename"attributefromwhichyourvalidatorclasswillgetthefilenamefortheXMLview.Thetaglookslikethis:

<t:toxmlfilename="myxml_view"/>

CreateaTagLibraryDescriptor(TLD)fileforthistaglibrary,specifyingtheTagLibraryValidatorclassyoucreatedasthevalidatorforthislibrary:

<validator>

<validator-class>

com.jspservletcookbook.ToXmlValidator

</validator-class>

<description>

SavesXMLviewsofJSPpagestothe

specifieddirectory.

</description>

</validator>

PlaceboththeTagLibraryValidatorandtheTagSupportclassesintheWEB-INF/classesdirectoryofthewebapplication,orinsideaJARfilethatisstoredinWEB-INF/lib(theexamplesinthisrecipeassumethisformat,ratherthanplacingtheclassesinaJAR).

PlacetheTLDfileintheWEB-INF/tldsdirectory.

AddataglibelementreferringtoyourtagsandTLDtotheWEB-INF/web.xmldeploymentdescriptor.

Thetaglibelementinweb.xmlisnotneededwithJSPVersion1.2and2.0,sincetheJSPcontainerautomaticallysearchesWEB-INF,aswellastheMETA-INF

Page 216: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

directoryofyourapplication'sJARfiles,foranyfilethatendswiththeextension.tld.

8. CreateapropertiesfilecontainingthedirectorypaththatyouwanttousefortheautomaticallygeneratedXMLview.StorethispropertiesfileinWEB-INF/classesusingtheappropriatepackagenames.Thispropertiesfileisusedtoavoidthehardcodingofanabsolutedirectoryinthevalidatorclass'scode.

UsethecustomtagintheJSPfile(s)forwhichyouwanttheXMLviewsgeneratedasfiles.

First,Example5-13showstheXMLview-relatedcustomtaginaJSPfile.

Example5-13.GeneratingtheXMLviewofaJSPpage

<%@tagliburi="/toxml_view"prefix="t"%>

<html>

<head>

<title>Testtld</title>

</head>

<bodybgcolor="#ffffff">

Hello,thispageisusingthetoxmltagtolookatitsXMLView.

<t:toxmlfilename="my_xmlview"/>

</body>

</html>

Thet:toxmltagisanemptyelementthatsignalsthevalidatorclasstogenerateafilecontaininganXMLview.Thefilewillbenamedmy_xmlview.xml(thevalidatorclassaddsthe.xmlextension).Thetag

Page 217: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

otherwisehasnoeffectontheappearanceorbehaviorofthisJSP.ThefollowingfragmentofthedeploymentdescriptorshowsthetaglibelementspecifyingtheURIthatisusedinExample5-11staglibdirective.ThetaglibelementinthedeploymentdescriptoralsospecifiesthelocationoftheTLDfile(WEB-INF/tlds/xml_gen.tld):

<taglib>

<taglib-uri>/toxml_view</taglib-uri>

<taglib-location>/WEB-INF/tlds/xml_gen.tld</taglib-location>

</taglib>

Example5-14showstheTLDfileforthistaglibrary,whichspecifiesthevalidatorclassandthesimplecustomtag(amarker)usedinExample5-11.Iamnotgoingtoshowthecodeforthetoxmltag,sinceitdoesnotcontainanycodeofinterest,beyondthefactthatithasoneStringmembervariablecalledfilename.Thesolepurposeofthetag'suseistoputthevalidatorclasstowork.TheJSPcontainercreatesonevalidatorinstanceforeachtaglibrarythatincludesavalidatorclass.

Example5-14.TheTLDfilefortheXMLviewcustomtag

<?xmlversion="1.0"encoding="ISO-8859-1"?>

<!DOCTYPEtaglib

PUBLIC"-//SunMicrosystems,Inc.//DTDJSPTagLibrary1.2//EN"

"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">

<taglib>

<tlib-version>1.0</tlib-version>

<jsp-version>1.2</jsp-version>

<short-name>Validatortest</short-name>

<description>Validatortest</description>

<validator>

<validator-class>

com.jspservletcookbook.ToXmlValidator

Page 218: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

</validator-class>

<description>

SavesXMLviewsofJSPpagestothespecified

directory.

</description>

</validator>

<tag>

<name>toxml</name>

<tag-class>com.jspservletcookbook.ToXml</tag-class>

<body-content>EMPTY</body-content>

<description>

ThistagdemonstratestheproductionofJSPXMLviewfiles.

</description>

<attribute>

<name>filename</name>

<required>true</required>

<rtexprvalue>false</rtexprvalue>

<description>

Thisattributeprovidesthefilename.</description>

</attribute>

</tag>

</taglib>

Thecom.jspservletcookbook.ToXmlValidatorclass,thelibrary'svalidator,executesitsvalidatemethodwhenaJSPpageusingthetoxmltagisloaded.HowdoesthevalidatorclassknowwheretosavethefilesrepresentingtheJSP'sXMLview?Thecom.jspservletcookbook.ToXmlValidatorclassderivesthedirectorypathforsavingitsgeneratedfilesfromthepropertiesfileshownbelow.ThisallowsanydeployerofthecustomtagtochangethedirectoryforthesavedXMLviews,withouttouchingthevalidatorclass'ssourcecode.Thepropertiesfileislocatedinthesamedirectoryasthevalidatorclass.ThepathtothispropertiesfileisWEB-INF/classes/com/jspservletcookbook/validator.properties:

directory=h:/home/xmlviews

Page 219: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Thefilenameisprovidedbythetagitself,asin:

<t:toxmlfilename="my_xmlview"/>

TheentirefilepathfortheXMLviewlookslike:h:/home/xmlviews/my_xmlview.xml.

Thevalidatorclassaddsthe.xmlextensionwhenitcreatestheXMLviewfile.ThevalidatorfirstextractsthefilenamefromthetoxmltagbyusingaSAXparsertoparsetheinputstreamfromthejavax.servlet.jsp.tagext.PageDataobject.

Younowhaveallofthepiecestogetherexceptfortheall-importantvalidatorclass,whichisshowninExample5-15.Thevalidatemethodreadsthedirectorypropertyvalueusingajava.util.ResourceBundleobject.ThevalidatemethodgetsthefilenamebyusingthehelperclassthatExample5-16shows.ThevalidatemethodthengeneratestheXMLviewoftheJSPpagebyusingthejava.io.InputStreamreturnedfromPageData.getInputStream().

Example5-15.AvalidatorclassforgeneratingXMLviewfiles

packagecom.jspservletcookbook;

importjavax.servlet.jsp.tagext.TagLibraryValidator;

importjavax.servlet.jsp.tagext.ValidationMessage;

importjavax.servlet.jsp.tagext.PageData;

importjava.io.*;

importjava.util.ResourceBundle;

importjava.util.MissingResourceException;

Page 220: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

importjava.util.Date;

publicclassToXmlValidatorextendsTagLibraryValidator{

/**CreatesnewToXmlValidator*/

publicToXmlValidator(){

}

publicValidationMessage[]validate(java.lang.Stringprefix,

java.lang.Stringuri,PageDatapage){

ValidationMessage[]vam=null;

try{

ResourceBundlebundle=

ResourceBundle.getBundle("com.jspservletcookbook.validator");

Stringdirectory=bundle.getString("directory");

StringfileName=getFilename(page);

//throwanExceptionifthedirectoryisinvalid

if(directory==null)

thrownewException(

"ReceivedanulldirectoryfortheXMLviewfile.");

//throwanExceptionifthefilenameisinvalid

if(fileName==null)

thrownewIOException(

"ReceivedanullfilenamefortheXMLviewfile.");

Filefile=newFile(directory+"/"+fileName+".xml");

FileWriterwriter=newFileWriter(file);

BufferedReaderin=newBufferedReader(

newInputStreamReader(page.getInputStream()));

Stringline="";

//writetheXMLviewtothespecifiedfile

while((line=in.readLine())!=null){

writer.write(line);

}

Page 221: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

in.close();

writer.close();

}catch(IOExceptionio){

//returnavalidationmessage

ValidationMessagevmsg=new

ValidationMessage(null,io.getMessage());

vam=newValidationMessage[1];

vam[0]=vmsg;

returnvam;

}catch(MissingResourceExceptionmre){

//returnavalidationmessage

ValidationMessagevmsg=new

ValidationMessage(null,mre.getMessage());

vam=newValidationMessage[1];

vam[0]=vmsg;

returnvam;

}catch(Exceptione){

//returnavalidationmessage

ValidationMessagevmsg=new

ValidationMessage(null,e.getMessage());

vam=newValidationMessage[1];

vam[0]=vmsg;

returnvam;

}

//returnemptyarray

vam=newValidationMessage[0];

returnvam;

}

privateStringgetFilename(PageDatapage)throwsException{

try{

ValidateHandlerhandler=newValidateHandler();

returnhandler.getFilename(page);

Page 222: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

}catch(Exceptione){

throwe;}

}

}

Example5-16showstheValidateHandlerhelperclassthatourvalidatorusestogetthefilenamefromthecustomtag.TheValidateHandlermakesafirstpassthroughtheXMLview(beforeitiswrittentoafile)toextractthefilenamethattheuserhasaddedwiththetoxmlelement'sfilenameattribute.TheValidateHandlerdoesalltheworkbehindthescenestoparsetheXMLsothatthevalidatorclasscangetthefilenamewithasimplemethodcall:

ValidateHandlerhandler=newValidateHandler();

returnhandler.getFilename(page);

TheValidateHandlerusestheJavaAPIforXMLprocessing(JAXP)andtheSimpleAPIforXML(SAX)toparsetheXMLprovidedbyjavax.servlet.jsp.tagext.PageData.getInputStream().YouhavetoplacetheValidateHandlerclassinsideoftheWEB-INF/classesdirectory(orinsideofaJARfileinWEB-INF/lib)sothatyourwebapplication(theToXmlValidatorclass)canfindit.YoucanuseanycomponentyouwanttoprovidetheSAXfunctionalitythatawebapplicationneeds.IfyouchoosetouseJAXP,andyourwebcontainerisnotyetbundledwiththenecessaryJAXPcomponents,thenaddthefollowingJARfilestoyourWEB-INF/libdirectoryforacompleteJAXPinstallation:jaxp-api.jar,dom.jar,sax.jar,xalan.jar,xercesImpl.jar,andxsltc.jar.YoucandownloadthesecomponentsaspartoftheJavaWebServicesDeveloperPack(http://java.sun.com/webservices/webservicespack.html),andtheJAXPlibrariesareincludedaspartofJava1.4.x.

Example5-16.ADefaultHandlerthatgrabsthefilenamefromthecustomtagattribute

importorg.xml.sax.Attributes;

Page 223: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

importorg.xml.sax.SAXParseException;

importorg.xml.sax.SAXException;

importorg.xml.sax.helpers.DefaultHandler;

importjavax.xml.parsers.SAXParserFactory;

importjavax.xml.parsers.FactoryConfigurationError;

importjavax.xml.parsers.ParserConfigurationException;

importjavax.xml.parsers.SAXParser;

importjava.io.IOException;

importjavax.servlet.jsp.tagext.PageData;

publicclassValidateHandlerextendsDefaultHandler{

privateStringfileName="";

publicvoidstartElement(StringnameSpaceuri,

Stringsname,Stringqname,Attributesattrs){

for(inti=0;i<attrs.getLength();i++)

if("filename".equals(attrs.getLocalName(i)))

this.fileName=attrs.getValue(i);

}

publicStringgetFilename(PageDatapage)

throwsFactoryConfigurationError,ParserConfigurationException,

SAXException,IOException{

try{

SAXParserFactoryfactory=SAXParserFactory.newInstance();

factory.setNamespaceAware(true);

SAXParsersaxparser=factory.newSAXParser();

saxparser.parse(page.getInputStream(),this);

}catch(FactoryConfigurationErrorfe){

throwfe;

}catch(ParserConfigurationExceptionpce){

throwpce;

}catch(SAXExceptionse){

Page 224: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

throwse;

}catch(java.io.IOExceptionio){

throwio;

}finally{

returnthis.fileName;}

}

publicvoiderror(SAXParseExceptione)

throwsSAXParseException

{

throwe;

}

}

Example5-17showstheXMLviewgeneratedfromtheJSPpageofExample5-13(withsomecarriagereturnsadded).Itmightbeugly,butnowyouknowwhatanXMLviewlookslike!TheHTMLcodeisalltreatedastemplatedata,enclosedinajsp:textelementandCDATAsections.ThetwoXMLelements,jsp:rootandt:toxml,aregivensequentialIDnumbersaspartoftheirjsp:idattributesintheXMLview.TheTagLibraryValidatorclasscanusetheseIDstoprovidefinelygrainedXML-relatedmessagesinvolvingthevalidatedJSPpage.

Example5-17.TheXMLviewofExample5-13

<jsp:rootjsp:id="0"xmlns:jsp="http://java.sun.com/JSP/Page"version="1.2"

xmlns:t="/toxml_view">

<jsp:text><![CDATA[]]></jsp:text>

<jsp:text><![CDATA[<html>]]></jsp:text>

<jsp:text><![CDATA[<head>]]></jsp:text>

<jsp:text><![CDATA[<title>Testtld]]></jsp:text>

<jsp:text><![CDATA[</title>]]></jsp:text>

<jsp:text><![CDATA[</head>]]></jsp:text>

<jsp:text><![CDATA[<bodybgcolor="#ffffff">Hello,thispageisusingthetoxmltagto

lookatitsXMLView.]]></jsp:text>

<t:toxmljsp:id="1"filename="my_xmlview"/>

Page 225: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<jsp:text><![CDATA[]]></jsp:text>

<jsp:text><![CDATA[</body>]]></jsp:text>

<jsp:text><![CDATA[</html>]]></jsp:text>

</jsp:root>

SeeAlso

Recipe5.5oncreatingaJSPfromscratchasaJSPdocument;ChapterJSP.6(JSPdocuments)oftheJSP2.0specification;ChapterJSP.10(XMLviews)oftheJSP2.0specification.

Page 226: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Chapter6.DynamicallyIncludingContentinServletsandJSPs

Introduction

Recipe6.1.IncludingaResourceEachTimeaServletHandlesaRequest

Recipe6.2.UsinganExternalConfigurationtoIncludeaResourceinaServlet

Recipe6.3.IncludingResourcesNestedatMultipleLevelsinaServlet

Recipe6.4.IncludingaResourcethatSeldomChangesintoaJSP

Recipe6.5.IncludingContentinaJSPEachTimetheJSPHandlesaRequest

Recipe6.6.UsinganExternalConfigurationFiletoIncludeaResourceinaJSP

Recipe6.7.IncludinganXMLFragmentinaJSPDocument

Recipe6.8.IncludingContentfromOutsideaContextinaJSP

Page 227: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Introduction

ServletsandJSPsoftenincludefragmentsofinformationthatarecommontoanorganization,suchaslogos,copyrights,trademarks,ornavigationbars.Thewebapplicationusestheincludemechanismstoimporttheinformationwhereveritisneeded,sinceitiseasiertochangecontentinoneplacethentomaintainitineverypieceofcodewhereitisused.Someofthisinformationisstaticandeitherneverorrarelychanges,suchasanorganization'slogo.Inothercases,theinformationismoredynamicandchangesoftenandunpredictably,suchasatextualgreetingthatmustbelocalizedforeachuser.Inbothcases,youwanttoensurethattheservletorJSPcanevolveindependentlyofitsincludedcontent,andthattheimplementationoftheservletorJSPproperlyupdatesitsincludedcontentasnecessary.

ThischapterrecommendsrecipesforincludingcontentinbothservletsandJSPsunderseveralconditions:

Whentheincludedinformationisrefreshedeverytimeausermakesarequest.

Whentheincludedinformationinvolvestwoormorenestedlevelsforexample,whenanincludedfileinturnincludesanotherpieceofinformation,andsoon.

Whenyouwanttousethedeploymentdescriptortoupdatetheitemthataservletincludes,whichisahandy,lesserror-pronewayofincludingcontentwhenthecontentisconfigurableandchangesratheroften.

WhenyouwanttoimportresourcesintoaJSPfromoutsidethewebapplication.

Recipe6.1describeshowtoimportaresourceeachtimetheservlet

Page 228: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

handlesarequest.

Page 229: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe6.1IncludingaResourceEachTimeaServletHandlesaRequest

Problem

Youwanttoincludeinformationfromanexternalfileinaservleteachtimetheservlethandlesarequest.

Solution

Usethejavax.servlet.RequestDispatcher.include(request,response)

methodinthedoGet()methodoftheservletthatincludestheexternalfile.

Discussion

Includingthecontentinthejavax.servlet.http.HttpServlet'sdoGet()methodinitiatestheincludemechanismwheneverthewebcontainerreceivesaGETrequestfortheservlet.

Whenusingthisdesign,implementtheservlet'sdoPost()methodtocalldoGet(request,response).

Example6-1showsaservletthatimportsacopyrighttemplateinthedoGet()methodusingthe

Page 230: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

javax.servlet.RequestDispatcher.include()method.

Example6-1.IncludingcontentintheHttpServlet'sinit()method

packagecom.jspservletcookbook;

importjavax.servlet.*;

importjavax.servlet.http.*;

publicclassIncludeServletextendsHttpServlet{

publicvoiddoGet(HttpServletRequestrequest,

HttpServletResponseresponse)throwsServletException,

java.io.IOException{

response.setContentType("text/html");

java.io.PrintWriterout=response.getWriter();

out.println("<html>");

out.println("<head>");

out.println("<title>IncludeServlet</title>");

out.println("</head>");

out.println("<body>");

out.println("<h1>WelcomeToOurUniverse</h1>");

out.println("Imaginetherestofthepagehere.<br><br>");

//Includethecopyrightinformation

RequestDispatcherdispatcher=request.getRequestDispatcher(

"/copyright");

dispatcher.include(request,response);

out.println("</body>");

out.println("</html>");

}//doGet

}

Page 231: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Example6-1getsaRequestDispatcherobjectbycallingthejavax.servlet.ServletRequest.getRequestDispatcher()

method.TheparametertothegetRequestDispatcher()methodinthiscaseistheservletpathtotheresourcethattheincludeservletimports:/copyright.Thispathismappedinweb.xmltotheCopyrightservlet,whichisshowninExample6-2.

Example6-2.TheimportedCopyrightservlet

publicclassCopyrightextendsHttpServlet{

publicvoiddoGet(HttpServletRequestrequest,

HttpServletResponseresponse)throwsServletException,

java.io.IOException{

java.io.PrintWriterout=response.getWriter();

out.println("Copyright&copy;2003-2004EmbraceAndExtendCorp.");

}

}

TheCopyrightservletoutputsalineoftextthatincludesthecharacterentitycodeforthecopyrightsymbol(&copy;),sothatthecopyrightsymbolisdisplayedcorrectlyintheresultingHTML.Whentheimportingservletcallstheinclude()method,thecopyrighttextisinsertedinthemethodcall'scodelocation.

AservletcanimportanHTMLpage,aswellastheoutputofaJSPpageorservlet.IfyouareimportingHTMLfragmentsinthismanner,makesurethattheimportedtextdoesnotbreakyourHTMLpage,suchasbyrepeatingHTMLtagsorfailingtoclosecertaintags.

Figure6-1showsthepagegeneratedbytheIncludeServletina

Page 232: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

browser.

Figure6-1.TheIncludeServlet'spageinabrowser

Recipe6.2describeshowtoconfiguretheimportedresourceinanexternalconfigurationfile,suchasweb.xml.

JasonHunter,whoprovidedatechnicalreviewofthisbook,pointsoutthatmanypeopleareusinganofflinebuildprocesstopregeneratestatic(e.g.,HTML)fileswhenalotofthesite'swebcontentusesincludes,suchasimportingheadersandfootersintomostofthewebsite'spages.Inmostcases,theservercanhandletherequestsforstaticfilesmuchmoreefficientlythanrequestsfordynamicpages(suchasaJSPthatincludesotherresources).SeeChapter3,ServletBestPractices,inthebookJavaEnterpriseBestPractices(O'Reilly).

SeeAlso

Recipe6.2andRecipe6.3onincludingresourcesinservlets;Recipe6.4-Recipe6.7onusingjsp:include,theincludedirective,aswellasincludingresourcesintoJSPdocumentsorXMLfiles;ChapterSRV.14.2.5oftheServlet2.4specification;ChapterJSP.5.4onoftheJSP2.0specificationonjsp:include;ChapterJSP.1.10.3oftheJSP

Page 233: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

2.0specificationontheincludedirective.

Page 234: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe6.2UsinganExternalConfigurationtoIncludeaResourceinaServlet

Problem

Youwanttouseanexternalconfigurationfile(suchasweb.xml)toconfiguretheresourcethatisincludedinaservlet.

Solution

Useinitparameterswiththeincludingservlettoallowtheexternalconfigurationoftheincludemechanism,thenincludetheresourcewiththejavax.servlet.RequestDispatcher.include(request,response)

method.

Discussion

Youmaywanttoperiodicallychangetheresourcethataservletincludes,withoutchangingandrecompilingtheservletcode.Youcanmakethesechangesbyalteringtheservlet'sinitparametersinweb.xml.Usingthisstrategy,eithertheincludedresource'sfilelocationitselforthemethodofretrievingtheresource(suchasfromadatabase)canchange.Youcanensurethattheservletimportsthecorrectresourcebyalteringthecontentoftheparam-valueelement.Example6-3showsaservletthatisconfiguredtoincludeafilenamedprivacy.jspf.Thisrepresentsastandardprivacystatementforthewebapplication.

Example6-3.Specifyinganincludedresourcebyusingtheservlet'sinit-paramelement

Page 235: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<servlet>

<servlet-name>PrivacyServlet</servlet-name>

<servlet-class>com.jspservletcookbook.IncludeServlet</servlet-class>

<init-param>

<param-name>included-resource</param-name>

<param-value>privacy.jspf</param-value>

<init-param>

</servlet>

Example6-4showsthedoGet()methodofthePrivacyServlet.Thismethodgetsthevalueoftheincluded-resourceinitparameter(privacy.jspf),thenincludestheJSPsegment.

Example6-4.Includingaresourcespecifiedbyaninitparameter

publicvoiddoGet(HttpServletRequestrequest,

HttpServletResponseresponse)throwsServletException,

java.io.IOException{

response.setContentType("text/html");

java.io.PrintWriterout=response.getWriter();

out.println("<html>");

out.println("<head>");

out.println("<title>IncludeServlet</title>");

out.println("</head>");

out.println("<body>");

out.println("<h1>WelcomeToOurUniverse</h1>");

out.println("Imaginetherestofthepagehere.<br><br>");

//Includetheprivacyinformationbasedonaninit-paramvalue

StringincludeRes=(String)getInitParameter(

"included-resource");

//getaRequestDispatcherobjectbasedontheinit-paramvalue

RequestDispatcherdispatcher=request.

getRequestDispatcher(includeRes);

Page 236: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

dispatcher.include(request,response);

out.println("</body>");

out.println("</html>");

}

Example6-4getsaRequestDispatcherrepresentingtheconfiguredinit-paramvaluewiththiscode:

//theincludeResvariableholdstheinit-paramvalue"privacy.jspf"

RequestDispatcherdispatcher=request.getRequestDispatcher(includeRes);

Thenthedispatcher.include(request,response)methodisreplacedbytheoutputoftheprivacy.jspffile.Example6-5showstheJSPsegmentthatthePrivacyServletincludes.TheJSP'scontenthassomeHTMLtagsthatfitintotheHTMLrepresentedbytheincludingpage.

Example6-5.AJSPsegmentincludedinaservletwithaRequestDispatcher

<%@pageerrorPage="/error.jsp"%>

<p><strong>ParkerRiverNetSolutionsPrivacyPolicy</strong></p>

<p>AnypersonalinformationyouprovidetousregardingWeb-orsoftware-development

servicesorsharewaresoftware,suchasyourname,address,telephonenumber,ande-mail

address,willnotbereleased,sold,orrentedtoanyentitiesorindividualsoutside

ofParkerRiverNetSolutions.</p>

Includedsegmentsorpagescannotsetorchangeresponseheaders,soanyattemptstosetthecontenttypeinanincludedservletorJSPasin:

<%@pagecontentType="text/xml"%>

areignored.

Page 237: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

AlltheincludedJSPdoesisspecifyanerrorpagecomposedofsomeformatting-relatedHTMLtagsandtext.Figure6-2showsthebrowserpageforthePrivacyServlet.

Figure6-2.AwebpagewithanincludedJSPsegment

YoumayalsowanttoaugmentExample6-4toprovideadefaultresourceforinclusionintheservlet,justincasethedeploymentdescriptor(web.xml)mistakenlyomitsaninitparameterfortheservlet.ThemethodgetInitParameterreturnsnullintheeventofthisomission.Youcouldtestforthisnullconditionandthenprovideadefaultvaluefortheincludedstatement.

SeeAlso

Recipe6.3onincludingresourcesthathavenestedincludes;Recipe6.4-Recipe6.8onincludingresourcesinJSPs;ChapterSRV.14.2.5oftheServletRecipe2.4specification;ChapterJSP.1.10.3oftheJSP2.0specificationonincludingfilesinJSPs.

Page 238: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe6.3IncludingResourcesNestedatMultipleLevelsinaServlet

Problem

Youwanttoincluderesourcesinaservletthatalreadyincludeservlets,JSPs,orHTML.

Solution

Usethejavax.servlet.RequestDispatcher.include(request,response)

methodtoincludethetop-levelfile.Makesurethaterrorpagesareproperlyconfiguredinweb.xml,justincaseanexceptionisthrowninadeep-nested,importedfile.

Discussion

Eventhoughitdoesnotrepresentthebestarchitecturaldecision,itispossibleforaservlettoincludearesourcethatitselfincludesanotherresource,resultinginanumberofinclusionstakingplacebeneaththesurface.ImaginetheRussiandollsthatfitinsideeachother.Youunscrewthetophalfofthedolls,onlytofindsmallerreplicasofthedollsnestedinsidetheouterones.ItisnotoutlandishtothinkofverycomplexwebpagesusingHTMLframeandtabletags,containingheadersandfooters,withthesesegmentsofthepagecontainingotherspecializedcontentusinganincludemechanism.Oneoftheincludedfilesnestedseverallevelsdeepcouldthrowanexceptionorcorruptthechainofinclusionsinsomemanner.Althoughthereisnofoolproofwaytodefendagainstthisoccurrence,forthepurposesofdebugging,makesurethatthewebapplicationhasanerrorpageconfiguredsothatitcandisplayinformation

Page 239: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

abouttheresourcethatranintoincludeproblems.

Thisrecipeprovidesanexampleofaservletthathasthreelevelsofincludedresources.TheouterservletincludesanotherservletnamedLevel2,whichincludesaJSPlevel3.jsp,whichcompletesthepicturebyincludingtheinnerservlet,Level4.Figure6-3showsthebrowserdisplaywhenauserrequeststhecom.jspservletcookbook.MultipleIncservlet.

Figure6-3.Threeincludedfilesinonewebpage

Example6-6showstheservletcode.Thisservletisresponsibleforthefirstleveloftext("HellofromLevel1"),theneachoftheincludedresourcescontributescontenttotheresponse.

Example6-6.Theouterincludedservlet

packagecom.jspservletcookbook;

importjavax.servlet.*;

importjavax.servlet.http.*;

Page 240: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

publicclassMultipleIncextendsHttpServlet{

publicvoiddoGet(HttpServletRequestrequest,

HttpServletResponseresponse)throwsServletException,

java.io.IOException{

response.setContentType("text/html");

java.io.PrintWriterout=response.getWriter();

out.println("<html>");

out.println("<head>");

out.println("<title>MultipleIncludes</title>");

out.println("</head>");

out.println("<body>");

out.println("<h1>HellofromLevel1</h1>");

out.println("ThistextisdisplayedatLevel1.");

RequestDispatcherdispatcher=request.

getRequestDispatcher("/level2");

dispatcher.include(request,response);

out.println("</body>");

out.println("</html>");

}

}

Thecode:

RequestDispatcherdispatcher=request.getRequestDispatcher("/level2");

dispatcher.include(request,response);

includestheoutputoftheservletthatismappedtotheservletpath/level2,whichExample6-7shows(justthedoGetmethod).

Example6-7.Thefirstinnerincludedservlet

publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throws

Page 241: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

ServletException,IOException{

java.io.PrintWriterout=response.getWriter();

out.println("<h2>HellofromLevel2</h2>");

out.println("ThistextisincludedatLevel2.");

//IncludetheJSPfilenamed"level3.jsp"

try{

RequestDispatcherdispatcher=request.getRequestDispatcher(

"/level3.jsp");

dispatcher.include(request,response);

}catch(Exceptionse){

Stringcontext_path=(String)request.getAttribute(

"javax.servlet.include.context_path");

Stringservlet_path=(String)request.getAttribute(

"javax.servlet.include.servlet_path");

StringerrMessage=newStringBuffer(

"ExceptionraisedduringLevel2servletinclude:<br>").

append("Contextpath:"+context_path+"<br>").

append("Servletpath:"+servlet_path).toString();

thrownewServletException(errMessage);

}

}

Example6-7writesmoretexttotheresponse,thenincludesalevel3.jsp,liketheouterservlet,usingajavax.servlet.RequestDispatcherobjecttoinitiateincludingtheJSP.TheLevel2servletdoessomeotherstuffwithatry/catchblockandrequestattributes,inordertodemonstratethehandlingofexceptionsthatmaybethrownduringincludeoperations.

AccordingtotheJSPAPIspecification,includedresourceshaveaccesstofiverequestattributes:

Page 242: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

javax.servlet.include.request_uri

javax.servlet.include.context_path

javax.servlet.include.servlet_path

javax.servlet.include.path_info

javax.servlet.include.query_string

Inthecatchblock,theLevel2servletgetsthevalueoftwooftheserequestattributeswith:

Stringcontext_path=

(String)request.getAttribute("javax.servlet.include.context_path");

Stringservlet_path=

(String)request.getAttribute("javax.servlet.include.servlet_path");

Inthecatchblock,theLevel2servletthenthrowsanewServletExceptionwiththeattributevaluesaspartoftheexceptionmessage.Anerrorpageconfiguredforthewebapplicationdisplaysinformationabouttheexceptionthatwasgeneratedbytheincludeoperation.

Theerror-pageconfigurationinweb.xmllookslike:

<error-page>

<exception-type>

javax.servlet.ServletException

</exception-type>

<location>/error</location>

</error-page>

where"/error"ismappedtoaservletthatdisplaysexception-relatedinformation.

InExample6-7,thecontextpathwasemptyandtheservletpathwas

Page 243: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

/level2.Figure6-4showsabrowserdisplayingtheerrorpage.Theservletgeneratingtheexceptionisspecifiedasthetop-levelservlet(MultipleInc)becausethiswasthecodethatoriginatedtheincludemechanismwhichresultedintheServletException.

Figure6-4.Displayingexceptioninformationcausedduringanincludeoperation

Example6-8showstheJSPfile(level3.jsp)thatthefirstinnerservletimports.Thelevel3.jspfilerepresentsthesecondlevelofincludedcontent.

Theincludedservletsdonotcallthejava.io.PrintWriter.close()method,becausethatactionwouldpreventtheresponsethatfollowstheouterservlet'sincludecodefrombeingsenttotheclient.Theouterservlet(MultipleIncinExample6-6)finallycallsPrintWriter.close()whenitisfinishedincludingthenestedresources.

Example6-8.Theincludedlevel3.jspJSPfile

Page 244: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<%@pageerrorPage="/error"%>

<h3>HellofromLevel3</h3>

ThistextisincludedatLevel3.

<jsp:includepage="/level4"/>

Finally,theJSPfileusesthejsp:includestandardactiontoimportthetextreturnedfromaservletthatismappedtothe/level4path.TheLevel4servletdoesthesamethingastheotheroftherecipe'sservletsitwritescharacterdatatothePrintWriterobjectsoIhavenotshownitssourcecode.ThereasonIincludedwastodemonstratehowseveraldifferentresourcetypescanbenestedinachainofincludedfiles.Theouterservletincludesservlettwo,whichincludesaJSPfile,whichinturnincludesthetextreturnedfromathirdservlet.ThefirstincludedservletencloseditsownincludecodeinatryblocktocatchanyexceptionsraisedbyincludingaJSPfile.

SeeAlso

Recipe6.1onusingtheRequestDispatcherincludemechanism;Recipe6.2ondetermininganincludedresourcewithanconfigurationfile;Recipe6.4-Recipe6.8onincludingresourcesinJSPs;ChapterSRV.14.2.5oftheServletRecipe2.4proposedfinalspecification;ChapterJSP.1.10.3oftheJSP2.0specificationonincludingfilesinJSPs;Chapter9onspecifyingerrorspagesinwebapplications.

Page 245: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe6.4IncludingaResourcethatSeldomChangesintoaJSP

Problem

Youwanttoincludearesourcethatdoesnotchangeverymuch(suchasapagefragmentthatrepresentsaheaderorfooter)inaJSP.

Solution

UsetheincludedirectiveintheincludingJSPpage,andgivetheincludedJSPsegmenta.jspfextension.

Discussion

JSPpagesareoftencompositesofpagefragmentsthatrepresentnavigationbars,headers(pageelementsthatappearatthetopofawebpage),footers(elementsthatappearatthebottomofawebpage),andthemainbodycontent.Sincepagesinawebapplicationorasitemayallusethesamenavigationbar,thisfileismaintainedinoneplaceandusedbyallofthewebcomponentsthatrequireit.IfyouaregoingtoimportaJSPsegmentthatisastaticorunchangingresource,usetheincludedirectiveintheJSP,asin:

<%@includefile="/WEB-INF/jspf/navbar.jspf"%>

IfyouareusingaJSPdocument(seeChapter5)orXMLsyntaxfortheJSP,usethisformoftheincludedirective:

<jsp:directive.includefile="/WEB-INF/jspf/navbar.jspf"/>

Page 246: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Ifthevalueofthefileattributebeginswitha"/"character,thenitisacontext-relativepath,meaningthatitisrelativetothewebapplicationcontainingtheJSPthatusesthisdirective.IftheJSPincludesthelatterdirective,thenthisfilepathmeans"beginatthewebapplicationrootandincludethe/WEB-INF/jspf/navbar.jspffile."

Afileattributevalueinincludethatdoesnotbeginwitha"/"characterisapage-relativepath,whichisrelativetotheJSPpagethatisusingtheincludedirective.Thefollowingincludedirectiveattemptstoincludeafileinsideofthesegmentsdirectory,whichhasthesameparentdirectoryastheincludingJSP:

<%@includefile="segments/navbar.jspf"%>

Theincludedirectiveincludesthetextorcodeoftheincludedsegmentduringthetranslationphase,whentheJSPisconvertedintoaservlet.TheincludemechanismisamoreefficientwayofimportingthetextorcodethatyouwouldotherwisetypeintoaJSPpriortoitsconversiontoaservlet,suchasHTMLtagsortaglibdirectives.Example6-9showshowtousetheincludedirectivetoimportasegmentoftaglibdirectivesintoaJSP.

Thedifferencebetweentheincludedirectiveandthejsp:includestandardactionisthattheincludedirectiveimportstheactualtextorbytesoftheincludedsegment,whereasthejsp:includestandardactionsendsarequesttotheincludedpageandthenincludesthedynamicresponsetothatrequest.SeeRecipe6.5.

Example6-9.IncludingaJSPsegmentintoaJSPpageattranslationtime

<%@pagecontentType="text/html"%>

<%@includefile="/WEB-INF/jspf/taglib-inc.jspf"%>

Page 247: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<html>

<head>

<title>MainContent</title>

</head>

<body>

<h1>Hereisthemaincontent</h1>

ThiswebapplicationisusingthefollowingServletAPI:

<c:outvalue="${pageContext.servletContext.majorVersion}"/>.<c:outvalue=

"${pageContext.servletContext.minorVersion}"/><br><br>

<jsp:useBeanid="timeValues"class="java.util.Date"/>

<c:settarget="${timeValues}"value=

"${pageContext.session.creationTime}"property="time"/>

Thesessioncreationtime:

<fmt:formatDatevalue="${timeValues}"type="both"dateStyle=

"medium"/><br><br>

ThetoXmltagwillcreateanXMLviewofthispage.

<t:toXmlfilename="include-xmlview"/>

</body>

</html>

ThesecondlineofExample6-9includesaJSPsegmentnamedtaglib-inc.jspf.ThissegmentincludesthetaglibdirectivesresponsibleformakingavailabletheJSTLandcustomtagusedinthepage.Example6-10showsthetaglib-inc.jspfpage.

Example6-10.AJSPsegmentcontainingtaglibdirectives

<%@tagliburi="http://java.sun.com/jstl/core"prefix="c"%>

<%@tagliburi="http://java.sun.com/jstl/fmt"prefix="fmt"%>

<%@tagliburi="/toxml_view"prefix="t"%>

Theincludedirectiveincludesthesethreetaglibdirectivesjustasifyouhadtypedtheminyourself,thentheJSPcontainerconvertsthe

Page 248: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

enclosingJSPintoaservlet.ThethreetaglibdirectivesenabletheuseofthefollowingtagsinExample6-9:

c:out

c:set

fmt:formatDate

t:toXml

TheJSP2.0specificationrecommendsthatyougiveincompleteJSPcodethatisdesignedtobeincludedinotherfilesa.jspfextension,whichusedtomean"JSPfragment."The2.0specification,however,nowreferstothesefragmentsas"JSPsegments"inordertoavoidconfusingthesefileswiththejavax.servlet.jsp.tagext.JspFragmentinterface.ThisinterfaceispartofthetagextensionAPI.

Figure6-5showswhattheJSPlookslikeinabrowserwindow.

Figure6-5.AJSPwithanincludedJSPsegmentoftaglibdirectives

Page 249: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

ThispagedisplaystheServletAPIusedbythewebcontainer,thejavax.servlet.http.HttpSessioncreationtime(formattedusingthefmt:formatDateJSTLtag),andthecustomtagthatisdescribedinRecipe5.6.ThistaggeneratesanXMLviewofthecontainingpageandsavesanewXMLfilenamedaccordingtoitsfilenameattribute.Itwasincludedtoshowamethodofincludingafewdifferenttypesoftaglibs.

SeeAlso

Recipe6.5onusingthejsp:includestandardaction;Recipe6.7onincludingJSPsegmentsinXMLfiles;Recipe6.8onincludingcontentfromoutsideofaJSP'scontext;ChapterJSP.1.10.3oftheJSP2.0specificationonincludingfilesinJSPs;Chapter23ontheJSTLtags.

Page 250: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe6.5IncludingContentinaJSPEachTimetheJSPHandlesaRequest

Problem

YouwanttoincludecontentinaJSPeachtimeitreceivesarequest,ratherthanwhentheJSPisconvertedtoaservlet.

Solution

Usethejsp:includestandardaction.

Discussion

Thejsp:includeactionincludesaresourceinaJSPeachtimeitreceivesarequest,whichmakesjsp:includemoreofadynamicincludemechanismthantheincludedirective(seeRecipe6.4).Usingjsp:include,theincludedJSPsegmentshaveaccesstotheincludingpage'srequest,session,andapplicationimplicitobjects,andtoanyattributestheseobjectscontain.Usethejsp:includeactionineachlocationofthefilewhereyouneedtoimportresourcessuchasJSPsegmentsfromthesamewebapplication.

Theimportcustomaction,whichispartofthecoreJSTL,canimportresourcesfromotherwebapplicationsorfromotherlocationsontheInternet.SeeRecipe6.8.

Page 251: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Example6-10showsaJSPpagethatreceivessubmittedforminformationfromanotherpageinthewebapplication.Thereceivingpageusesjsp:includetoincludeheaderandfooterpagesegmentsatthetopandbottomofthepage.

Justtoshowthattheincludedsegmentshaveaccesstothesamerequestandsessioninformationastheirparentpage,theheadersegmentdisplaystheperson'ssubmittedname,whichisstoredinfnameandlnamerequestparameters,intheformofagreeting-relatedtitleHTMLtag.ThefooterpageelementdisplaysthesessionIDalongwiththeuser'ssubmittedfirstandlastname.First,Figure6-6showsanHTMLpagewithasimplesubmissionformfortheuser'sfirstname,lastname,andemailaddress.

Figure6-6.AnHTMLform

AssumethatthisformpageincludesembeddedJavaScripttocheckthevalidityoftheenteredinformation.WhentheuserclickstheSubmitbutton,theforminformationissubmittedwiththefollowingHTMLtagto/solutions.jsp:

<formmethod=postaction="/solutions.jsp">

Page 252: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Example6-11showsthesolutions.jsppage,whichincludestwoJSPsegments:header.jspfandfooter.jspf.Theheader.jspfcontainsthecontentsofaheadHTMLtag,andplacestheuser'ssubmittednameinitsnestedtitletag.Thefooter.jspfpageforthesakeofdemonstrationechoestheuser'snameandshowshissessionID,whichitobtainsfromtheimplicitsessionJSPobject.TheJSP2.0specificationrecommendsthatyoukeepthesefilesinWEB-INF/jspf.

Example6-11.Includingtwopagesegmentsanddisplayingsubmittedformvalues

<%@pagecontentType="text/html"%>

<html>

<jsp:includepage="/WEB-INF/jspf/header.jspf"/>

<bodybgcolor="white">

<tablewidth="660"border="0"summary="Atwo-columntableinwhichresidesalogoand

navigationbar">

<tr><tdvalign="top">

Organizationimagegoeshere...<p>

<u>Main</u>

</td>

<tdalign="right"valign="top">

Navbargoeshere...

</td></tr><tr><tdvalign="top"align="center"colspan="2">

<tableborder="0"summary=

"Anestedtableforaligningbodycontent">

<tr><td><h2>Thanksforregisteringatthissite</h2></td></tr>

<tr><td>Hereistheinfoyousubmitted:</td></tr>

<tr><td>Name:

<%=request.getParameter("fname")%>

Page 253: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<%=request.getParameter("lname")%></td></tr>

<tr><td>Email:

<%=request.getParameter("eaddress")%>

</td></tr></table>

</td></tr><tr><td></td></tr>

</table>

<tablewidth="660"border="0"summary=

"Atablecontainingafooternavigationbar.">

<tr><tdvalign="top"align="center">

<jsp:includepage="/WEB-INF/jspf/footer.jsp"/>

</td></tr>

</table>

</body>

</html>

Example6-12showstheheader.jspfJSPsegment.

Example6-12.AJSPheadersegmentincludedwithjsp:include

<HEAD>

<METAname="author"content=

"BruceW.Perry,[email protected]">

<METAname="keywords"content=

"Java,JSP,servlets,databases,MySQL,Oracle,webdevelopment">

<TITLE>ParkerRiver:ThanksForVisiting

<%=request.getParameter("fname")%>

<%=request.getParameter("lname")%>

Page 254: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

</TITLE>

</HEAD>

Allthissegmentdoesisincludetheuser'snameinthetitletag.Example6-13showstheimportedfooter.jspfsegment.Thissegmentalsowritestheuser'snametothedisplayedoutputandaddsthesessionID,aftercheckingwhetherthejavax.servlet.http.HttpSessionobjectisnull,andbeforeitcallstheHttpSession.getId()method.

Example6-13.AJSPfootersegmentincludedwithjsp:include

Thanksforvisiting

<%=request.getParameter("fname")%>

<%=request.getParameter("lname")%><br>

SessionID:

<%if(request.getSession()!=null){%>

<%=request.getSession().getId()%>

<%}else{%>

Unknown

<%}%><br><br>

<ahref="/index.html">Main</a>|<ahref="/service.html">Services</a>|

<ahref="/sitemap.html">SiteMap</a>|

<ahref="/resources.html">Resources</a>|

<ahref="/contacts.html">ContactUs</a>|

<ahref="/prns_privacy.html">Privacy</a>

Figure6-7showsthesolutions.jsppageinawebbrowser.

Figure6-7.Theincludedheaderandfootersegmentsdisplayedinawebbrowser

Page 255: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Usingjsp:include,changestoincludedfilesarereflectedimmediatelyintheincludingpages.Ontheotherhand,ifyoumakechangestoapagethatisincludedusingtheincludedirective,thosechangesarenotreflectedintheincludingpageuntilyoumodifythatpageandforcetheJSPcontainertorecompileit.

SeeAlso

Recipe6.4ontheincludedirective;Recipe6.7onincludingJSPsegmentsinXMLfiles;Recipe6.8onincludingcontentfromoutsideofaJSP'scontext;ChapterJSP.1.10.3oftheJSP2.0specificationonincludingfilesinJSPs;Chapter23ontheJSTLtags.

Page 256: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe6.6UsinganExternalConfigurationFiletoIncludeaResourceinaJSP

Problem

YouwanttoincludeafiledynamicallyinaJSP,basedonavaluederivedfromaconfigurationfile.

Solution

Usethejsp:includestandardaction.Providethevalueinanexternalpropertiesfileorasaconfigurationparameterinthedeploymentdescriptor.

Discussion

UsinganexternalconfigurationtospecifyanincludefileforaJSPallowsyoutochangethenameand/orpathtotheincludedfilewithouttouchingtheJSP'scode.Inaddition,whenusingjsp:includetheJSPdoesnothavetoberecompiledtoreflectanychangesintheincludedfilethewebresourceisincludedbytheJSPeachtimeithandlesarequest.Ifyouchangethefilepointedtobytheconfigurationfile,theresponsefromtheincludedresourceisaddedtotheincludingJSP'sresponseduringthenextrequest.

Thedifferencebetweenajsp:includestandardactionandincludedirectiveisthattheincludedirectiveincludesthebytesorcontentsoftheimportedfilebeforetheJSPiscompiled(duringthetranslationphasefortheJSP).Iftheincludedsegmentchanges,theupdateswillnotbereflectedintheJSPuntiltheJSPitselfismodified,whichcausesaJSPcontainer(suchasTomcat'sJasperJSPcontainer)torecompiletheJSP.

Page 257: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Example6-14showsaJSPthatusesanexternalpropertiesfiletospecifythefiletoinclude.

Example6-14.Usingjava.util.ResourceBundle.getBundle()tofetchanexternallyconfiguredfile

<%@pagecontentType="text/html"%>

<%@tagliburi="http://java.sun.com/jstl/core"prefix="c"%>

<html>

<%java.util.ResourceBundlebundle=

java.util.ResourceBundle.getBundle("com.jspservletcookbook.include");

Stringsegment=bundle.getString("external-include");%>

<jsp:includepage="<%=segment%>"/>

<body>

<h2>WelcometoourPortalHome<c:outvalue="${param.fname}"/><c:outvalue="${param.

lname}"/></h2>

<jsp:useBeanid="dateString"class="java.util.Date"/>

Thetimeis<c:outvalue="${dateString}"/>.<br><br>

</body>

</html>

Example6-14includesaJSPsegmentthatisfoundatthepathspecifiedbytheexternal-includeproperty.Thispropertyiswritteninasimpletextfilecalledinclude.properties,withcontentthatlookslikethis:

external-include=WEB-INF/jspf/header_tag.jsp

Theinclude.propertiesfileisstoredinWEB-INF/classes/com/jspservletcookbook.Whenyour

Page 258: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

servletorJSPattemptstoaccessalistofpropertyvaluesbycallingthestaticmethodjava.util.ReseourceBundle.getBundle("com.jspservletcookbook.include"),getBundleautomaticallyreplacestheperiod"."characterswith"/"andappends".properties"totheendoftheString(makingthesearchlooklike"com/jspservletcookbook/include.properties"inourexample).

TheexamplecodesavesthepropertyvalueinaStringvariablesegmentwiththefollowingcode:

Stringsegment=bundle.getString("external-include");

Thenthevalueofthesegmentvariable,whichisafilepath,specifiesthefilefortheJSPtoinclude:WEB-INF/jspf/header_tag.jsp.ThisisaccomplishedwiththeJSPexpression<%=segment%>inthepageattributevalueforjsp:include:

<jsp:includepage="<%=segment%>"/>

WhentheJSPpageisexecuted,theincludedfile'sresponseisincludedinthepartofthepagewherethejsp:includestandardactionoccurs.Example6-15showsthecontentoftheincludedfile,header_tag.jsp.

Example6-15.Thecontentoftheheader_tag.jspsegment

<%@tagliburi="http://java.sun.com/jstl/core"prefix="c"%>

<HEAD>

<METAname="author"content=

"BruceW.Perry,[email protected]">

<METAname="keywords"content=

"Java,JSP,servlets,databases,MySQL,Oracle,webdevelopment">

<TITLE>ParkerRiver:ThanksForVisiting

<c:outvalue="${param.fname}"/>

<c:outvalue="${param.lname}"/>

Page 259: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

</TITLE>

</HEAD>

ThisisacompleteHEADHTMLtag,includingtwonestedMETAtagsandaTITLEtag.IfyourequestedtheincludingJSPpageathttp://localhost:8080/home/externalInclude.jsp?fname=Mister&lname=Bean,thereturnedcontentfromthisJSPsegmenttheactualtextthattheJSPcontainersubstitutesforthejsp:includetagintheoutputlookslikeExample6-16.

Example6-16.Theoutputwhenjsp:includeisused

<HEAD>

<METAname="author"content=

"BruceW.Perry,[email protected]">

<METAname="keywords"content=

"Java,JSP,servlets,databases,MySQL,Oracle,webdevelopment">

<TITLE>ParkerRiver:ThanksForVisiting

Mister

Bean

</TITLE>

</HEAD>

Theincludedsegmentprocessestherequestparametersfnameandlnamefromthequerystring:

fname=Mister&lname=Bean

andincludestheirvaluesintheTITLEtag.Figure6-8showswhattheexternalInclude.jsppagelookslikeinabrowser.

Figure6-8.BrowserviewofJSPthatusesjsp:includetoincludeanotherJSPsegment

Page 260: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Inthisexample,theincludedsegmentusesthepropertaglibdirectivesothatthec:outJSTL1.0tagscanbeused.IfyouareusingJSTL1.1,thentheuriattributevalueishttp://java.sun.com/jsp/jstl/core:

<%@taglib

uri="http://java.sun.com/jstl/core"

prefix="c"%>

Youcanalsopassparametersfortheincludedsegmenttoprocess,inthemannerof:

<jsp:includepage="<%=segment%>">

<jsp:paramname="role"value="comedian"/>

</jsp:include>

Ifyouwanttouseacontextparameterinthewebapplication'sdeploymentdescriptorinsteadtoprovideapathfortheincludedfile,addacontext-paramelementtoweb.xml(asshowninExample6-17).

Example6-17.Acontext-paramelementprovidesanincludedfilepath

<context-param>

<param-name>external-include</param-name>

<param-value>WEB-INF/jspf/header_tag.jsp</param-value>

</context-param>

ThengetthevalueofthecontextparameterintheincludingJSP:

Page 261: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<jsp:includepage="<%=application.getInitParameter("external-include")%>"/>

TheJSPtheninsertsthefilepathWEB-INF/jspf/header_tag.jspasthevalueforthejsp:includepageattribute.

SeeAlso

Recipe6.4ontheincludedirective;Recipe6.7onincludingJSPsegmentsinXMLfiles;Recipe6.8onincludingcontentfromoutsideofaJSP'scontext;ChapterJSP.1.10.3oftheJSP2.0specificationonincludingfilesinJSPs;Chapter23ontheJSTLtags;thiswebpageforhowthegetBundlemethodreturnscertaintypesofResourceBundles:http://java.sun.com/j2se/1.4.1/docs/api/java/util/ResourceBundle.html#getBundlejava.util.Locale,java.lang.ClassLoader).

Page 262: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe6.7IncludinganXMLFragmentinaJSPDocument

Problem

YouwanttoincludeafragmentofanXMLfileinsideofaJSPdocument,orincludeaJSPpageinXMLsyntax.

Solution

Usethejsp:includestandardactionfortheincludesthatyouwanttooccurwitheachrequestoftheJSP.Usethejsp:directive.includeelementiftheincludeactionshouldoccurduringthetranslationphase.

Discussion

BecauseaJSPdocumentisawell-formedXMLfile,bothofthemechanismsthatyoucanusetoincludeJSPsegmentsareXMLelements:jsp:includeandjsp:directive.include.AJSPdocumentisaJSPpageinXMLsyntax,inwhichallofthecodeiswell-formedXML;inotherwords,theentirepageconsistsofXMLelements,attributes,andthebodycontentofsomeXMLelements.YouthentaketheJSPdocumentandplaceitintherootofyourwebapplication(orwhereveryoumakeyourJSPpagesavailable;therootistheusualplace),andtheJSPcontainertranslatestheXMLfileintoaservlet.OnereasonforusingJSPdocumentsistointegratetheJSPswithotherXMLtechnologies,suchasXHTML,SVG,orSOAP.Recipe5.5describesJSPdocumentsinmoredetail.Example6-18showsaJSPdocumentversionofExample6-14,usingjsp:includetoincludeafilethatislocatedatthepathWEB-INF/jspf/header_tag.jspf.

Page 263: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Example6-18.AJSPdocumentusingjsp:includetoincludeafile

<jsp:rootxmlns:jsp="http://java.sun.com/JSP/Page"

xmlns:c="http://java.sun.com/jstl/core"

xmlns="http://www.w3.org/1999/xhtml"version="2.0">

<jsp:directive.pagecontentType="text/html"/>

<html>

<jsp:includepage="WEB-INF/jspf/header_tag.jspf"/>

<body>

<h2>WelcometoourPortal<c:outvalue="

${param.fname}"/><jsp:text></jsp:text>

<c:outvalue="${param.lname}"/></h2>

<jsp:useBeanid="dateString"class="java.util.Date"/>

<jsp:text>Thetimeis</jsp:text><c:outvalue="${dateString}"/>.

<br/><br/>

</body>

</html>

</jsp:root>

InExample6-18,theJSPpageincludesthetextthatisreturnedbyheader_tag.jspf.Usingjsp:include,theincludedfiledoesnothavetobewell-formedXMLitself,aslongasitreturnstextthatiswell-formedXMLandfitscorrectlyintotheJSPdocument.

TheJSP2.0specificationrecommendsthatJSPsegmentsthatyouincludeinJSPpagesorJSPdocumentsbegivena.jspfextension.Inaddition,onewaytodifferentiateJSPdocumentsfromconventionalJSPpagesistogivetheJSPdocumentsa.jspxextension(whenusingtheServlet2.4versionofweb.xml).Tomcat4.1.xwillcompileandexecuteasJSPpagesthefileswiththeseextensionsifyouaddtheseservlet-mappingelementstoconf/web.xml:

<servlet-mapping>

<servlet-name>jsp</servlet-name>

<url-pattern>*.jspf</url-pattern>

</servlet-mapping>

Page 264: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<servlet-mapping>

<servlet-name>jsp</servlet-name>

<url-pattern>*.jspx</url-pattern>

</servlet-mapping>

Example6-19showstheincludedfileheader_tag.jspf.IthasitsowntaglibdirectivesothattheJSTL-relatedtagsinsidetheTITLEtagsproducetheproperoutputfromtherequestparametersfnameandlname.ThecommentatthebottomofExample6-18showsthetextthatisreturnedfromthisJSPsegment,usingjsp:include,whentheenclosingJSPpageisrequestedfromhttp://localhost:8080/home/x617.jspx?fname=Bruce&lname=Perry.

Example6-19.Theincludedfileheader_tag.jspf

<%@tagliburi="http://java.sun.com/jstl/core"prefix="c"%>

<HEAD>

<METAname="author"content=

"BruceW.Perry,[email protected]"/>

<METAname="keywords"content=

"Java,JSP,servlets,databases,MySQL,Oracle,webdevelopment"/>

<TITLE>ParkerRiver:ThanksForVisiting

<c:outvalue="${param.fname}"/><c:outvalue="${param.lname}"/>

</TITLE>

</HEAD>

<!--sourcetextreturnedfromheader_tag.jspf

<HEAD>

<METAname="author"content=

"BruceW.Perry,[email protected]"/>

<METAname="keywords"content=

"Java,JSP,servlets,databases,MySQL,Oracle,webdevelopment"/>

<TITLE>ParkerRiver:ThanksForVisiting

BrucePerry

</TITLE>

</HEAD>-->

Page 265: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Figure6-9showswhatthecompletedocumentlookslikeinabrowser.

Figure6-9.AJSPdocumentdisplayedinabrowser

Youcanalsousethejsp:directive.includeelement,whichincludesthecontentbeforetheJSPdocumentisconvertedintoaservlet,ratherthanatruntimeaswithjsp:include.ToconvertExample6-17touseanincludedirective,replacethejsp:includeelementwith:

<jsp:directive.includefile="WEB-INF/jspf/header_tag.jspf"/>

Theincludedcontentcannothaveanynon-XMLsyntaxforms,suchasaJSPtaglibdirective,becausetheincludedcodeisincludedverbatimintotheJSPdocumentwhenitisconvertedintoaservlet.

AnalternativeapproachistouseCDATAsectionsintheXMLtoattempttopreservethewordsandsymbolsthatwouldotherwisecausetheXMLfiletofailthewell-formedtest.TheCDATAsectionslooklike<![CDATA[...]]>.

Youwouldhavetoremovethetag-libdirectivefromthetopofExample6-19fortheJSPtocompilecorrectlyusingjsp:directive.include.Inaddition,thec:outtagsinsideofthe

Page 266: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

includedsegmentwouldthenbedependentontheinclusionintheenclosingJSPdocumentofanxmlnsattributetomakethecoreJSTLelementsavailable,asinthetopofExample6-18.

AruleofthumbtousewiththetwoincludemechanismsisthatiftheincludedsegmentwillchangefrequentlyandtheenclosingJSPpagemustimmediatelyreflectthosechanges,usejsp:include.Iftheincludedsegmentisrelativelystaticandunchanging,usejsp:directive.include.

SeeAlso

Recipe6.4ontheincludedirective;Recipe6.5onthejsp:includestandardaction;Recipe6.8onincludingcontentfromoutsideofaJSP'scontext;ChapterJSP.1.10.3oftheJSP2.0specificationonincludingfilesinJSPs;Chapter23ontheJSTLtags.

Page 267: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe6.8IncludingContentfromOutsideaContextinaJSP

Problem

YouwanttoincludeaJSPsegmentfromoutsidetheincludingfile'scontext.

Solution

Usethec:importJSTLcoretag.

Discussion

Thec:importtaggivesJSPpageauthorsmuchflexibilityinpullinginresourcesfrominsideandoutsidetheirwebapplication.Thec:importtagallowsapagetoimportwebresources:

FromoutsideJSP'swebcontainer,usinganabsoluteURL(suchashttp://java.sun.com/api).

Fromanothercontextinthesamewebcontainer.Forexample,yourdomainmayincludeacentralrepositoryofincludedcontentathttp://www.mydomain.com/warehouse.AJSPpagethatisinstalledinacontextnamed/customercouldimportaresourcefromthe/warehousecontextbyusing:<c:importurl="/catalog_header.jspf"context="/warehouse"/>

Fromthesamecontext,similartousingjsp:include.

Page 268: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

ThisrecipeincludesexamplesofimportingresourcesfromoutsidetheimportingJSP'scontext.Example6-19importsaJSPsegmentheader_tag.jspfromthe/dbprojcontext.Theurlattributespecifiestheresourcetoinclude;thecontextattributedeclaresthecontextfromwhichtheJSPimportstheresource.Tousethec:importtag,theJSPhastoincludeataglibdirectivesuchas:

<%@tagliburi="http://java.sun.com/jstl/core"prefix="c"%>

Example6-20includesagroupoftaglibsbyinsertingthetaglib-inc.jspfJSPsegmentinthesecondline.

Example6-20.Usingthec:importtagtoimportanexternalURL

<%@pagecontentType="text/html"%>

<%@includefile="/WEB-INF/jspf/taglib-inc.jspf"%>

<html>

<c:importurl="/header_tag.jspf"context="/dbproj"/>

<body>

<h2>WelcometoourPortal<c:outvalue="

${param.fname}"/><c:outvalue="${param.lname}"/>

</h2>

<jsp:useBeanid="dateString"class="java.util.Date"/>

Thetimeis<c:outvalue="${dateString}"/>.

<br/><br/>

</body>

</html>

Thec:importtaginsertsthetextgeneratedby/dbproj/header_tag.jspinthepartofthecodewherethec:importtagislocated.The/dbprojcontextpathrepresentsadifferentwebapplicationorcontextthantheimportingJSP.Thetopoftheimportingpagenowlookslikethefollowingtext,sincethisistheHTMLthattheimportedfileproduces:

Page 269: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<html>

<HEAD>

<METAname="author"content=

"BruceW.Perry,[email protected]"/>

<METAname="keywords"content=

"Java,JSP,servlets,databases,MySQL,Oracle,webdevelopment"/>

<TITLE>ParkerRiver:ThanksForVisiting

MisterBean

</TITLE>

</HEAD>

<body>

<!--pagecontinuesfromhere...-->

UsingTomcat,thecontextelementinconf/server.xmlhastoincludethisattribute/valuepairortheJSPthatusesc:importwillraiseanexceptionifitattemptstoimportresourcesfromanothercontext:

crossContext="true"<!--"false"bydefault-->

Example6-21importsadescriptionoftheHTTP/1.1protocol,RequestForComments(RFC)2068.

Theexampledeclaresitscontenttypeas"text/plain,"sothatthebrowserdoesnottrytodisplaythetextfileasHTML,whichcanbeunreadablewithplaintextfiles.ThenExample6-21usesataglibdirectivesothattheJSPcanusethec:importtag.Thec:importtagspecifiesthelocationoftheimportedtextfileasanabsoluteURL:http://www.ietf.org/rfc/rfc2068.txt.

Example6-21.Usingc:importtoimportatextresourcewhoseaddressisanabsoluteURL

<%@pagecontentType="text/plain"%>

<%@tagliburi="http://java.sun.com/jstl/core"prefix="c"%>

<c:importurl="http://www.ietf.org/rfc/rfc2068.txt"/>

Page 270: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

IfaJSPusesc:importtoaccessaforbiddenresource(whichwillcausethereceivingservertorespondwithaHTTPstatuscode403),thec:importtagthrowansexceptionandtheJSPcompilationwillfail.

Youcanalsoincludeparameterswithc:importusingnestedc:paramtags.Example6-22importsafileheader_tag.jspf,andmakesavailabletworequestparametersforthatfiletoprocess:fnameandlname.ThetaglibdirectiveatthetopofExample6-22allowstheuseofthec:importandc:paramtagslateroninthecode.

Example6-22.Includingparametervaluesusingc:param

<%@tagliburi="http://java.sun.com/jstl/core"prefix="c"%>

<html>

<c:importurl="WEB-INF/jspf/header_tag.jspf">

<c:paramname="fname"value="Mister"/>

<c:paramname="lname"value="Bean"/>

</c:import>

<body>

<h2>Therestofthepagegoeshere...</h2>

</body>

</html>

Theheader_tag.jspffiletakesthevaluesofthetwoparametersandaddsthemtotheTITLEtag'sgreeting.Example6-23showstheHTMLthatresultsfromthisimportaction.

Example6-23.RequestparametervaluesarereflectedintheHTMLoutput

<html>

Page 271: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<HEAD>

<METAname="author"content=

"BruceW.Perry,[email protected]"/>

<METAname="keywords"content=

"Java,JSP,servlets,databases,MySQL,Oracle,webdevelopment"/>

<TITLE>ParkerRiver:ThanksForVisiting

MisterBean

</TITLE>

</HEAD>

<body>

<h2>Therestofthepagegoeshere...</h2>

</body>

</html>

SeeAlso

Recipe6.1-Recipe6.3onincludingresourcesinservlets;Recipe6.4-Recipe6.7onusingjsp:include,theincludedirective,andincludingresourcesinJSPdocumentsorXMLfiles;Chapter23onUsingtheJSTL1.0;ChapterJSP.5.4oftheJSP2.0specificationonjsp:include;ChapterJSP.1.10.3oftheJSP2.0specificationontheincludedirective.

Page 272: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Chapter7.HandlingWebFormDatainServletsandJSPs

Introduction

Recipe7.1.HandlingaPOSTHTTPRequestinaServlet

Recipe7.2.HandlingaPOSTHTTPRequestinaJSP

Recipe7.3.SettingthePropertiesofaJavaBeaninaJSP

Recipe7.4.SettingaScopedAttributeinaJSPtotheValueofaFormParameter

Recipe7.5.PostingDatafromaServlet

Recipe7.6.PostingDatafromaJSP

Recipe7.7.UsingaServlettoAddaParametertoaQueryString

Recipe7.8.UsingaJSPtoAddaParametertoaQueryString

Recipe7.9.UsingaFiltertoReadParameterValues

Page 273: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Introduction

EverywebdeveloperisfamiliarwiththescenarioinwhichaclientfillsoutanHTMLformandthensubmitstheinsertedinformationtoaserver-sideprogramforprocessing.SomeoftheseprogramsusetheHTTPrequestmethodPOSTtodeliverthedatatotheserver-sideprogram.ThePOSTmethodsendsthedatatotheserverinthebodyoftherequest,ratherthanasaquerystringappendedtoaURL(asintheGETmethod).Forexample,considertheHTMLformtaginExample7-1.

Example7-1.HTMLformtagsetupforpostingdata

<formmethod=POSTaction="/project/controller">

<b>UserName:</b><inputtype="text"name="username"

size="20"><br><br>

<b>Department:</b><inputtype="text"name="department"

size="15"><br><br>

<b>Email:</b><inputtype="text"name="email"

size="15"><br><br>

<inputtype="submit"value="Submit">

</form>

Whentheclientsubmitsthisforminformation,thetopoftheclient'srequesttextlookslikethis:

POST/project/controllerHTTP/1.1

Accept:image/gif,image/x-xbitmap,image/jpeg,image/pjpeg,application/msword,

application/vnd.ms-powerpoint,application/vnd.ms-excel,application/pdf,*/*

Referer:http://localhost:8080/project/login.jsp

Page 274: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Accept-Language:en-us

Content-Type:application/x-www-form-urlencoded

Beneaththistext,afterafewmoreheaders,thebodyoftherequestcarriesthesubmitteddata:

username=Bruce+W+Perry&password=bw_p1968

JSPsandservletsmakeparsingthePOSTdataquitetransparentforthedeveloper.Thisisthetopicofthenextfewrecipes.WethendiscusshowtouseservletsandJSPstopostdatasothattheyessentiallyplaytheroleofclient,insteadofactingasaserver-sideprogram.

Page 275: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe7.1HandlingaPOSTHTTPRequestinaServlet

Problem

YouwanttoprocessdatathatispartofaPOSTrequest.

Solution

UsetheServletRequest.getParameter(Stringname),getParameterMap(),getParameterNames(),orgetParameterValues(Stringname)methodsintheservlet'sdoPostmethod.

Discussion

Theservicemethodofaservletcallstheservlet'sdoPostmethodwhenaclientsendsaPOSTHTTPrequest.Theservletdeveloperthenhasfourdifferentmethodsshecancalltogainaccesstotheposteddata,whichmakesitprettyeasytoprocesstheserequests.JustincaseaclientapplicationusesaGETmethodtosendtheservletitsdataasaquerystring,theservletshouldalsocall:

doPost(request,response);

intheservlet'sdoGet()method.Example7-2demonstrateshandlingPOSTdatawiththeoft-usedgetParameter(Stringname)method,aswellaswiththegetParameterMap()method,whichreturnsajava.util.Map.Themapcontainsparameterkeysandvalues.ThegetParameterNames()methodreturnsa

Page 276: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

java.util.Enumerationoftheparameternames.YoucaniteratethroughthisEnumerationandpassthevaluestogetParameter(Stringname).AnotherServletRequestmethod,getParameterValues(Stringname),returnsaStringarrayofallthepostedvaluesforthatparametername(ifthereisonlyonevalue,thereturnedarraycontainsoneString).Figure7-1showsthebrowserdisplayofthePostHandlerservletafterauserhassubmittedtheforminExample7-1.

Figure7-1.Servletdisplaysname/valuepairsfrompostedforminput

Example7-2.UsingtheServletRequest.getParameterandgetParameterMapmethodstohandleposteddata

importjavax.servlet.*;

importjavax.servlet.http.*;

importjava.util.Map;

importjava.util.Iterator;

importjava.util.Map.Entry;

Page 277: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

publicclassPostHandlerextendsHttpServlet{

publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throws

ServletException,java.io.IOException{

/*UsetheServletRequest.getParameter(Stringname),getParameterMap(),

getParameterNames(),orgetParameterValues()methodsintheservlet'sdoPostmethod*/

Stringname=request.getParameter("username");

Stringdepart=request.getParameter("department");

Stringemail=request.getParameter("email");

response.setContentType("text/html");

java.io.PrintWriterout=response.getWriter();

out.println("<html>");

out.println("<head>");

out.println("<title>Welcome</title>");

out.println("</head>");

out.println("<body>");

out.println("<h1>YourIdentity</h1>");

out.println(

"Yournameis:"+((name==null||name.equals(""))?

"Unknown":name));

out.println("<br><br>");

out.println(

"Yourdepartmentis:"+((depart==null||depart.equals(""))?

"Unknown":depart));

out.println("<br><br>");

out.println(

"Youremailaddressis:"+((email==null||

email.equals(""))?"Unknown":email));

Page 278: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

out.println("<h2>UsingServletRequest.getParameterMap</h2>");

Mapparam_map=request.getParameterMap();

if(param_map==null)

thrownewServletException(

"getParameterMapreturnednullin:"+

getClass().getName());

//iteratethroughthejava.util.Mapanddisplaypostedparameter

//values

//thekeysoftheMap.EntryobjectsaretypeString;thevaluesare

//typeString[],

//orStringarray

Iteratoriterator=param_map.entrySet().iterator();

while(iterator.hasNext()){

Map.Entryme=(Map.Entry)iterator.next();

out.println(me.getKey()+":");

String[]arr=(String[])me.getValue();

for(inti=0;i<arr.length;i++){

out.println(arr[i]);

//printcommasaftermultiplevalues,

//exceptforthelastone

if(i>0&&i!=arr.length-1)

out.println(",");

}//endfor

out.println("<br><br>");

}//endwhile

out.println("</body>");

out.println("</html>");

}

Page 279: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)

throwsServletException,java.io.IOException{

doPost(request,response);

}

}

Gettingthevalueofaparameterisassimpleasusingrequest.getParameter(parametername).ThenyoucantestforthefailuretoreturnavalidvaluewithcodefromExample7-2:

out.println("Yournameis:"+

((name==null||name.equals(""))?"Unknown":name));

IfthenamevariableisanemptyStringornull,thentheservletprints"Unknown";otherwise,itprintsthenamevalue.Thereareseveraldesignpatternsyoucanuseforvalidatingforminput,includingclient-sideJavaScriptandspecialvalidationJavaBeans.

Handlingthejava.util.Maptypeismoreinvolvedandentailsmorecode.TheservletgetstheparametermapbycallingtheServletRequestmethod:

Mapparam_map=request.getParameterMap()

Thenthecodegetsajava.util.Iteratorfromthejava.util.SetreturnedfromMap.entrySet().TheSetcontainsMap.Entryobjects,whicharekey/valuepairsrepresentingtheparameternameandvalue.Theservletusestheiteratortocyclethroughtheparameternamesandvalues:

Iteratoriterator=param_map.entrySet().iterator();

while(iterator.hasNext()){

Map.Entryme=(Map.Entry)iterator.next();

out.println(me.getKey()+":");

Page 280: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

//ThereturnedvalueisaStringarray

String[]arr=(String[])me.getValue();

for(inti=0;i<arr.length;i++){

out.println(arr[i]);

//printcommasaftermultiplevalues,

//exceptforthelastone

if(i>0&&i!=arr.length-1)

out.println(",");

}//endfor

out.println("<br><br>");

}//endwhile

Ifthislookstooelaborateforprocessingposteddata,thenreservegetParameterMap()forapplicationsthataredesignedtodealwiththem,suchasavalidatorbeanthattakesaMapasaconstructorormethodparameter.Inaddition,Recipe7.2showsaJSPthatusesJSTLtoconvenientlyprocessaparametermap.

SeeAlso

Recipe7.2onhandlingaPOSTrequestinaJSP;Recipe7.5onpostingdatafromaservlet;Recipe7.7onusingaservlettoaddaparametertoaquerystring;theServletRequestAPIdocsathttp://java.sun.com/j2ee/1.4/docs/api/index.html.

Page 281: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe7.2HandlingaPOSTHTTPRequestinaJSP

Problem

YouwanttohaveaJSPhandlethedatapostedfromaformorclientapplication.

Solution

UsetheJSTLc:forEachtagtoiterateovertheparameternamesandvalues.

Discussion

TheJSTLmakesitveryeasytoprocessinputdatafromaPOSTmethod.TheJSPinExample7-3usesonlytemplatetextandJSTLtagstodisplaypostedinformation.Thec:forEachtagiteratesovertheposteddatausingtheimplicitJSTLobjectparam.Theparamobjectcontainsjava.util.Map.Entrytypes,whicheachholdakey/valuepair.Thekeyandvaluecorrespondtothenameofasubmittedparameteranditsvalue,suchas"department=Development."UsingtheExpressionLanguage(EL),thesyntax"${map_entry.key}"or"${map_entry.value}"istheequivalentofcallingtheMap.Entry.getKey()andgetValue()methods.Thereturnvaluesofthesemethodcallsarefedtothec:outJSTLtagfordisplayintheHTMLpage.Figure7-2showswhatthebrowserpagelookslikeiftheformsubmittedtotheJSPistheonedetailedinExample7-1.Withyourtaglib,useaurivalueofhttp://java.sun.com/jsp/jstl/coreforJSTL1.1.

Page 282: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Example7-3.IteratingposteddatawiththeJSTL

<%@pagecontentType="text/html"%>

<%@tagliburi="http://java.sun.com/jstl/core"prefix="c"%>

<html>

<head><title>PostDataViewer</title></head>

<body>

<h2>Hereisyourposteddata</h2>

<c:forEachvar="map_entry"items="${param}">

<strong><c:outvalue="${map_entry.key}"/></strong>:

<c:outvalue="${map_entry.value}"/><br><br>

</c:forEach>

</body>

</html>

MakesuretoincludethetaglibdirectivewhenyouareusingtheJSTLtags.ThetaglibinExample7-3takescareofanyofthecustomtagswiththe"c"prefix,asinc:forEach.

Chapter23explainshowtoinstalltheJSTLinyourwebapplication,makedifferentcustomtags,andusetheEL.

Figure7-2.AJSPdisplayingpostedname/valuepairs

Page 283: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Ifyouwanttogetthevaluesofparameterswithoutusingac:forEachtag,thenusethecodefragmentinExample7-4.Thiscodedisplaysthevaluesofparameterswhentheparameternamesareknownbythedeveloper(whichisusuallythecase).

Example7-4.Displayingindividualparametervaluesusingc:out

<h2>Hereisyourposteddata</h2>

<strong>Username:</strong>:<c:outvalue="${param.username}"/>

<br><br>

<strong>Department:</strong>:<c:outvalue="${param.department}"/>

<strong>Email:</strong>:<c:outvalue="${param.email}"/>

SubstitutingthiscodeintotheJSPproducesthesameresultsasthoseshownFigure7-2.

TheJSP2.0specificationisdesignedtoallowtheuseoftheELintemplatetextinotherwords,withoutthec:outJSTLtag.

Page 284: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

SeeAlso

Recipe7.2onhandlingaPOSTrequestinaJSP;Recipe7.3onsettingthepropertiesofaJavaBeantoforminput;Recipe7.4onsettingascopedattributetothevalueofaparameter;Recipe7.6onpostingdatafromaJSP;Chapter23onusingtheJSTL.

Page 285: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe7.3SettingthePropertiesofaJavaBeaninaJSP

Problem

YouwanttosetaJavaBean'spropertiestothevaluesenteredinaform.

Solution

Usethejsp:setPropertystandardaction,withitspropertyattributesetto"*"anditsclassattributesettothefullyqualifiedclassnameoftheJavaBean.

Discussion

Thejsp:setPropertystandardactionhasabuilt-inmethodforautomaticallymappingthevaluessubmittedinaformtoaJavaBean'sfieldsorvariables.ThenamesofthesubmittedparametershavetocorrespondtothenamesoftheJavaBean'ssettermethods.Example7-5showsasetBean.jsppagethatreceivesdatafromanHTMLform:

<formmethod=postaction="http://localhost:8080/home/setBean.jsp">

TheJSPfirstinstantiatesanobjectofthetypecom.jspservletcookbook.UserBeanusingjsp:useBean.Thenitsetsthepropertiesofthebeanusingjsp:setProperty.Thenameattributeofjsp:setPropertymatchestheidattributeofjsp:useBean.Thepropertyattributeofjsp:setPropertyissimplysetto"*".

Page 286: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Example7-5.beanSet.jspJSPthatsetstheUserBean'spropertieswithforminput

<%@pagecontentType="text/html"%>

<%@tagliburi="http://java.sun.com/jstl/core"prefix="c"%>

<jsp:useBeanid="userB"class="com.jspservletcookbook.UserBean">

<jsp:setPropertyname="userB"property="*"/>

</jsp:useBean>

<html>

<head><title>PostDataViewer</title></head>

<body>

<h2>Hereisyourposteddata</h2>

<strong>Username</strong>:

<c:outvalue="${userB.username}"/><br><br>

<strong>Department</strong>:

<c:outvalue="${userB.department}"/><br><br>

<strong>Email</strong>:

<c:outvalue="${userB.email}"/>

</body>

</html>

Example7-5usesthec:outelementoftheJSTLtodisplaythebean'svariousvaluesinabrowserpage.Thevalueattributeofc:outusestheELtoacquireapropertyvalue,asin"${userB.email}".ThissyntaxistheequivalentofcallingtheUserBean'sgetEmail()method.Example7-6showstheUserBean,whichusestheJavaBeannamingconventionstoensurethatitspropertiescanbeproperlysetandaccessed.Figure7-3showsthebrowserdisplayofthevalues.

Page 287: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Figure7-3.DisplayingforminputviaaJavaBean

Thejsp:setPropertyaction,asusedinthisrecipe,setstheJavaBean'spropertiesbyusingintrospectiontolineupparameternameswiththebean'ssettermethods.Ifthebeanhasafieldnamed"Username,"thentheparameternamemustbeexactly"Username"andthesettermethodmustbeexactly"setUsername(Stringname)"(ifthebean'sfieldisaString).Watchout,it'scase-sensitive!

Example7-6.EncapsulatingtheposteddatainaJavaBean

packagecom.jspservletcookbook;

publicclassUserBeanimplementsjava.io.Serializable{

Stringusername;

Stringemail;

Stringdepartment;

publicUserBean(){}

publicvoidsetUsername(String_username){

Page 288: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

if(_username!=null&&_username.length()>0)

username=_username;

else

username="Unknown";

}

publicStringgetUsername(){

if(username!=null)

returnusername;

else

return"Unknown";}

publicvoidsetEmail(String_email){

if(_email!=null&&_email.length()>0)

email=_email;

else

email="Unknown";

}

publicStringgetEmail(){

if(_email!=null)

returnemail;

else

return"Unknown";}

publicvoidsetDepartment(String_department){

if(_department!=null&&_department.length()>0)

department=_department;

else

department="Unknown";

}

Page 289: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

publicStringgetDepartment(){

if(department!=null)

returndepartment;

else

return"Unknown";}

}

Recipe7.4showshowtouseabeantovalidateforminput,thensetascopedattributetotheinput.

SeeAlso

Recipe7.2onhandlingaPOSTrequestinaJSP;Recipe7.4onsettingascopedattributetothevalueofaparameter;Recipe7.6onpostingdatafromaJSP;Chapter23onusingtheJSTL.

Page 290: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe7.4SettingaScopedAttributeinaJSPtotheValueofaFormParameter

Problem

Youwanttosetarequest-,session-,orapplication-scopedattributetoavaluethataclienthassubmittedaspartofforminput.

Solution

Usethejsp:useBeanandjsp:setPropertystandardactionstosetaJavaBean'spropertytothesubmittedvalue.Thenusethec:setJSTLcustomtagtosettheattributetothevalidatedvalue.

Discussion

Somewebapplicationsmayvalidateforminputsuchasanemail/passwordcombination,thensetarequest-,session-,orapplication-scopedattributetothevalidatedvalue.AnefficientwaytohandleimportantdatathatausersubmitsistouseaJavaBeanwhosepurposeistovalidatethesubmissionagainstsomebusinessruleorexternalresource,suchasadatabase.Ifthesubmissionisvalid,thentheapplicationcreatesasessionattribute,forinstance,withthevalue.Ifthesubmissionisinvalid,thenabooleanvariableintheJavaBeanissettofalse.TheJSPtowhichtheforminputissentcancheckthisvaluebeforeithandlesthedataasvalid.

Example7-7showsaClientValidatorbeanthathasthreefields:email,password,andvalid.ThisbeanisusedbyaJSPtovalidateforminputbeforetheJSPsetsrequest-scopedattributestothesubmitted

Page 291: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

values.

Example7-7.TheClientValidatorbean

packagecom.jspservletcookbook;

publicclassClientValidatorimplementsjava.io.Serializable{

Stringemail;

Stringpassword;

booleanvalid;

publicClientValidator(){

this.valid=false;}

publicbooleanisValid(){

/*UseaDataAccessObjecttovalidatetheemailandpassword.

Ifthevalidationdoesnotfail,thensetthis.validtotrue*/

this.valid=true;

returnvalid;

}

publicvoidsetEmail(String_email){

if(_email!=null&&_email.length()>0)

email=_email;

else

email="Unknown";

}

publicStringgetEmail(){

Page 292: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

returnemail;

}

publicvoidsetPassword(String_password){

if(_password!=null&&_password.length()>0)

password=_password;

else

password="Unknown";

}

publicStringgetPassword(){

returnpassword;}

}

Example7-8istheJSPthatusesClientValidator.TheJSPfirstusesjsp:useBeantocreateaninstanceofthebean.ThenitsetsthefieldsorpropertiesofthebeantothevaluesthathavebeenpostedtotheJSP,whichare"email"and"password".IftheisValidbeanpropertyistrue,whichistestedwiththisJSTLcode:

<c:iftest="${isValid}">

thentheJSPsetstworequest-scopedattributes.Theattributesarenowavailabletoapagethatisforwardedthisrequest.SessionattributesareaccessiblefromservletsandJSPsthatareassociatedwiththesamesession(seeChapter11).Theapplicationscopeencompassesthecontextorwebapplication.

Ifyouwanttosetsession-orapplication-scopedattributes,changethecodeinExample7-8to:

<c:setvar="email"value="${chk.email}"

Page 293: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

scope="session"/>

<c:setvar="password"value="${chk.password}"

scope="session"/>

or:

<c:setvar="email"value="${chk.email}"

scope="application"/>

<c:setvar="password"value="${chk.password}"

scope="application"/>

Example7-8.validChk.jsppagethatusesavalidatorbeantocheckforminputdata

<%@pagecontentType="text/html"%>

<%@tagliburi="http://java.sun.com/jstl/core"prefix="c"%>

<jsp:useBeanid="chk"class="com.jspservletcookbook.ClientValidator">

<jsp:setPropertyname="chk"property="*"/>

</jsp:useBean>

<%--getvalidpropertyfromClientValidatorbean--%>

<c:setvar="isValid"value="${chk.valid}"/>

<c:iftest="${isValid}">

<c:setvar="email"value="${chk.email}"scope="request"/>

<c:setvar="password"value="${chk.password}"scope="request"/>

</c:if>

<html>

<head><title>ClientChecker</title></head>

<body>

<h2>Welcome</h2>

<strong>Email</strong>:

Page 294: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<c:outvalue="${email}"/><br><br>

<strong>Password</strong>:

<c:outvalue="${password}"/>

</body>

</html>

SeeAlso

Recipe7.2onhandlingaPOSTrequestinaJSP;Recipe7.3onsettingthepropertiesofaJavaBeantoforminput;Recipe7.6onpostingdatafromaJSP;Chapter23onusingtheJSTL.

Page 295: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe7.5PostingDatafromaServlet

Problem

YouwanttosendparametersandtheirvaluesasaPOSTrequestfromaservlet.

Solution

UsetheJakartaCommonsHttpClientcomponentanditsPostMethodclasstoautomatethepostingofdatatootherprograms.

Discussion

TheJakartaCommonsHttpClientisacomponentthatallowsthedevelopertomimicthefeaturesofawebbrowserinhisJavacode,suchassendingGETandPOSTHTTPrequests,aswellasusingHTTPSforsecuresockets.Asthehomepagedescribesthisusefulcomponent,HttpClient"providesanefficient,up-to-date,andfeature-richpackageimplementingtheclientsideofthemostrecentHTTPstandardsandrecommendations"(http://jakarta.apache.org/commons/httpclient/).HttpClientisofferedundertheApacheSoftwareLicense.

ThisrecipedescribesusingHttpClienttopostdatatoanotherserver-sideprogramusingthePOSTHTTPmethod.First,downloadtheHttpClientdistributionfromtheJakartasite(http://jakarta.apache.org/commons/httpclient/downloads.html).ThenunpackthedistributionandplacetheJARfilethatitcontainsintheWEB-INF/libdirectoryofyourwebapplication.Atthiswriting,theJARforRelease2.0Alpha3wascommons-httpclient-2.0-alpha2.jar.Onceyou

Page 296: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

havetakencareofthisinstallation,yourservletsandbeanscanusetheHttpClientclasses.

Example7-9isaservletthatpostsdatatoaJSP:http://localhost:8080/home/viewPost.jsp.Example7-3showstheviewPost.jspfile.Notetheclassesfromtheorg.apache.commons.httpclientpackagethattheservlethastoimportatthetopofthecode.

Example7-9.AservletthatpostsdatatoaJSPusingHttpClient

packagecom.jspservletcookbook;

importjavax.servlet.*;

importjavax.servlet.http.*;

importorg.apache.commons.httpclient.HttpClient;

importorg.apache.commons.httpclient.HttpStatus;

importorg.apache.commons.httpclient.methods.PostMethod;

importorg.apache.commons.httpclient.NameValuePair;

publicclassClientPostextendsHttpServlet{

publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)

throwsServletException,java.io.IOException{

HttpClienthttpClient=newHttpClient();

PostMethodpostMethod=newPostMethod(

"http://localhost:8080/home/viewPost.jsp");

NameValuePair[]postData={

newNameValuePair("username","devgal"),

newNameValuePair("department","development"),

newNameValuePair("email","[email protected]")

Page 297: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

};

//the2.0beta1versionhasa

//PostMethod.setRequestBody(NameValuePair[])

//method,asaddParametersisdeprecated

postMethod.addParameters(postData);

httpClient.executeMethod(postMethod);

//displaytheresponsetothePOSTmethod

response.setContentType("text/html");

java.io.PrintWriterout=response.getWriter();

//A"200OK"HTTPStatusCode

if(postMethod.getStatusCode()==HttpStatus.SC_OK){

out.println(postMethod.getResponseBodyAsString());

}else{

out.println("ThePOSTactionraisedanerror:"+postMethod.getStatusLine());

}

//releasetheconnectionusedbythemethod

postMethod.releaseConnection();

}

publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)

throwsServletException,java.io.IOException{

doPost(request,response);

}

}

Thecodesendsthreename/valuepairstotheJSP(namedusername,

Page 298: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

department,andemail),whichwillhandletheposteddata.HttpClienthandlesthereturnedtextfromthePOSTmethodsothatyoucandisplayitinthesameservlet.IfyouexpecttoreceivelargeamountsoftextasreturnvaluesfromthePOST,thenconsiderusingtheHttpMethodBase.getResponseBodyAsStream()methodinsteadofgetResponseBodyAsString().ThegetResponseBodyAsStream()methodreturnsajava.io.InputStream.Example7-9isderivedfromsamplecodeprovidedattheHttpClientwebsite.

Figure7-4showsthewebbrowserdisplayafterrequestingtheClientPostservlet.

Figure7-4.Displayingthereturnedtextafterpostingdatafromaservlet

SeeAlso

Recipe7.1onhandlingaPOSTrequestinaservlet;Recipe7.7onusingaservlettoaddaparametertoaquerystring;theJakartaCommonsHttpClientpage:http://jakarta.apache.org/commons/httpclient.

Page 299: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe7.6PostingDatafromaJSP

Problem

YouwanttosendparametersandtheirvaluesasanHTTPPOSTrequestfromaJSP.

Solution

TheeasiestwaytopostdatafromaJSPistodoittheoldfashionedway:usetheHTMLformtagandaSubmitbutton.Ifyouhavetosendthedatadynamically(asinnotrelyingonausertopressaformbutton),useaJavaBeanthatencapsulatestheHttpClientcodediscussedinRecipe7.5.

Discussion

ThesimplestwaytoinitiateaPOSTmethodinaJSPistosetuptheHTMLtemplatetextasshowninExample7-1:provideanHTMLformtagthattheuserfillsoutandsubmits.SinceExample7-1alreadyshowsatypicalHTMLform,I'lusethisspacetoshowaJavaBeanthatallowsaJSPtodynamicallypostdatatoanotherserver-sideprocess.

Example7-10showsajspPost.jsppagethatusesaPostBeanutilityclasstosendasetofparameters/valuestoanotherJSP.ThereceivingJSP,viewPost.jsp,processestheparametersthatthePostBeanobjectsendsit,thenreturnssometextfortheJSPinExample7-10todisplay.TheJSPpassestheparametersthatitwantstopostasajava.util.MaptothePostBeanclass.ThePostBeanurlpropertyisthedestinationfortheposteddata(theaddressthatyouwould

Page 300: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

otherwiseplaceintheactionattributeofaformHTMLtag).Thecode:

<jsp:setPropertyname="postBean"property="parameters"value="<%=request.

getParameterMap()%>"/>

getsaMapoftheparametersthatwerepassedtothejspPost.jsppagewiththeHttpServletRequest.getParameterMap()method,thenpassesthatMaptothePostBeanclasstobereposted.

Example7-10.AJSPthatpostsparametersandvaluesdynamically

<%@tagliburi="http://java.sun.com/jstl/core"prefix="c"%>

<%--createaninstanceofthePostBeanclassifoncedoesnotexist--%>

<jsp:useBeanid="postBean"class="com.jspservletcookbook.PostBean"/>

<%--setthePostBeanparameterspropertytoaMaptype--%>

<jsp:setPropertyname="postBean"property="parameters"value="<%=request.

getParameterMap()%>"/>

<jsp:setPropertyname="postBean"property="url"value="http://localhost:8080/home/

viewPost.jsp"/>

<%--Posttheparametersanddisplaythereturnedtext--%>

<jsp:getPropertyname="postBean"property="post"/>

Example7-11showsthePostBeanclassthattheJSPpageusestopostdata.ThisbeanusestheJakartaCommonsHttpClientcomponenttosendanHTTPPOSTrequest.ThesendingactionhappensinthePostBean.getPost()method,whichsendsofftheparametersandreturnsthetextresultfromthereceivingservlet(inthisexample,it'sviewPost.jsp).BecausethebeanmethodiscalledgetPost(),usingtheJavaBeannamingconventionsformethodsthatreturnpropertyvalues,wecancallthemethodintheJSPwith:

Page 301: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<jsp:getPropertyname="postBean"property="post"/>

ThelattercodeisthenreplacedwiththeStringreturnvalue.

Example7-11.Adata-postingJavaBeanforusebyaJSPorservlet

packagecom.jspservletcookbook;

importjava.util.Map;

importjava.util.Iterator;

importjava.util.Map.Entry;

importorg.apache.commons.httpclient.HttpClient;

importorg.apache.commons.httpclient.HttpStatus;

importorg.apache.commons.httpclient.methods.PostMethod;

importorg.apache.commons.httpclient.NameValuePair;

importorg.apache.commons.httpclient.HttpException;

publicclassPostBeanimplementsjava.io.Serializable{

privateMapparameters;

privateStringurl;

publicPostBean(){

}

publicvoidsetParameters(Mapparam){

if(param!=null)

parameters=param;

}

publicMapgetParameters(){

returnparameters;

Page 302: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

}

publicvoidsetUrl(Stringurl){

if(url!=null&&!(url.equals("")))

this.url=url;

}

publicStringgetUrl(){

returnurl;

}

publicStringgetPost()throwsjava.io.IOException,HttpException{

if(url==null||url.equals("")||parameters==null)

thrownewIllegalStateException(

"InvalidurlorparametersinPostBean.getPostmethod.");

StringreturnData="";

HttpClienthttpClient=newHttpClient();

PostMethodpostMethod=newPostMethod(url);

//converttheMappassedintothebeantoaNameValuePair[]type

NameValuePair[]postData=getParams(parameters);

//the2.0beta1versionhasa

//PostMethod.setRequestBody(NameValuePair[])

//method,asaddParametersisdeprecated

postMethod.addParameters(postData);

httpClient.executeMethod(postMethod);

Page 303: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

//A"200OK"HTTPStatusCode

if(postMethod.getStatusCode()==HttpStatus.SC_OK){

returnData=postMethod.getResponseBodyAsString();

}else{

returnData="ThePOSTactionraisedanerror:"+

postMethod.getStatusLine();

}

//releasetheconnectionusedbythemethod

postMethod.releaseConnection();

returnreturnData;

}//endgetPost

privateNameValuePair[]getParams(Mapmap){

NameValuePair[]pairs=newNameValuePair[map.size()];

//UseanIteratortoputname/valuepairsfromtheMap

//intothearray

Iteratoriter=map.entrySet().iterator();

inti=0;

while(iter.hasNext()){

Map.Entryme=(Map.Entry)iter.next();

//Map.Entry.getValue()returnsaString[]arraytype

pairs[i]=newNameValuePair(

(String)me.getKey(),((String[])me.getValue())[0]);

i++;

}

Page 304: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

returnpairs;

}//endgetParams

}

ThedisplayedresultslooksexactlylikeFigure7-5,whichalsousesviewPost.jsptoshowthename/valuepairsthatwerefedtotheJSP.Again,ifyouhavetouseaJSPtodynamicallymimicanHTMLform,itisagoodideatodelegatethemechanicsofpostingdatatoaJavaBeansothattheJSPremainsapresentationcomponentandthebeancanbereusedelsewhere.

Figure7-5.DisplayingparametersaddedfromaforwardingJSP

SeeAlso

Recipe7.2onhandlingaPOSTrequestinaJSP;Recipe7.3onsettingthepropertiesofaJavaBeantoforminput;Recipe7.8onusingaJSPto

Page 305: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

addaparametertoaquerystring.

Page 306: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe7.7UsingaServlettoAddaParametertoaQueryString

Problem

Youwanttouseaservlettoaddoneormoreparameterstoaquerystring,thenforwardtherequesttoitsfinaldestination.

Solution

UsetheHttpServletRequestAPItogettheexistingquerystring.Thenappendanynewparameterstothequerystringanduseajavax.servlet.RequestDispatchertoforwardtherequest.

Discussion

TheservletinExample7-12simplytakesanyexistingquerystringandappendstheparametersthatithastoaddtothisString.Thenitsendsthenowextended(ornew)querystringonitsmerrywaywithacalltoRequestDispatcher.forward.

Example7-12.Addingaparametertoaquerystringwithaservlet

packagecom.jspservletcookbook;

importjavax.servlet.*;

importjavax.servlet.http.*;

Page 307: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

publicclassQueryModifierextendsHttpServlet{

publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)

throwsServletException,java.io.IOException{

//returnsnulliftheURLdoesnotcontainaquerystring

Stringquerystr=request.getQueryString();

if(querystr!=null){

querystr=querystr+

"&inspector-name=Jen&[email protected]";

}else{

querystr="inspector-name=Jen&[email protected]";}

RequestDispatcherdispatcher=

request.getRequestDispatcher("/viewPost.jsp?"+querystr);

dispatcher.forward(request,response);

}

publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)

throwsServletException,java.io.IOException{

doGet(request,response);

}

}

TheHttpServletRequest.getQueryString()methodreturnsthequerystringwithouttheopening"?",asin:

first=Bruce&last=Perry&zipcode=01922

IfyouwanttogettherequestURLrightuptothequerystringbutnotincludethe

Page 308: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

"?",useHttpServletRequest.getRequestURL(),whichreturnsajava.lang.StringBuffertype.

SeeAlso

Recipe7.1onhandlingaPOSTrequestinaservlet;Recipe7.5onpostingdatafromaservlet.

Page 309: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe7.8UsingaJSPtoAddaParametertoaQueryString

Problem

YouwanttouseaJSPtoaddoneormoreparameterstoaquerystring,thenforwardtherequesttoitsdestination.

Solution

Usethejsp:forwardandjsp:paramstandardactions.

Discussion

AddingoneormoreparametersandforwardingtoanothercomponentisaseasyasfourlinesinaJSP.Thejsp:forwardactionaddsanyjsp:paramstoexistingparameterswhenitforwardsthistexttotheprocessingcomponent,asshowninExample7-13.

Example7-13.AddingparametersandforwardinginaJSP

<jsp:forwardpage="/viewPost.jsp">

<jsp:paramname="inspector-name"value="Jen"/>

<jsp:paramname="inspector-email"value="[email protected]"/>

</jsp:forward>

IfthisJSPisrequestedwiththefollowingURL:

http://localhost:8080/home/addParam.jsp?first=Bruce&last=Perry&zip=01922

Page 310: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

thenthethreeoriginalparameters(first,last,andzip)arepreservedwhenthejsp:forwardactionaddstwoadditionalparameters(inspector-name,inspector-email)andforwardsthepage.Intheexample,thepageisprocessedbytheviewPost.jsppageshowninExample7-3.RequestingaddParam.jspinabrowserforwardstherequest,andatotaloffiveparameterstotheviewPost.jsppage.Figure7-5showstheresultinabrowser.

SeeAlso

Recipe7.2onhandlingaPOSTrequestinaJSP;Recipe7.3onsettingthepropertiesofaJavaBeantoforminput;Recipe7.6onpostingdatafromaJSP.

Page 311: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe7.9UsingaFiltertoReadParameterValues

Problem

Youwanttouseafiltertointerceptforminputandreadit.

Solution

UsethevariousgetParametermethodsoftheServletRequestAPItotakealookatparametervaluesinafilter.

Discussion

Whenyoudevelopafilterforaservlet,yourfilterclasshastoimplementthejavax.servlet.Filterinterface.ThismeansthatyourFilterclasshastoimplementthedoFilter(request,response)anddestroy()methodsofthatinterface.ThedoFiltermethodcontainsthehooktothefilteredservlet'sparametervalues.ThedoFilter'sServletRequestparameterhasthegetParameter,getParameterMap,getParameterNames,andgetParameterValuesmethodswhichallowthefiltertopeekataservlet'sparametersandvalues.

First,youhavetomaptheFilteryouhavedesignedtotheservlet.Thischunkofweb.xmlmapsaFilterobjecttoaservletnamedViewer.

<!--anycontext-paramelementsgohere-->

<filter>

Page 312: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<filter-name>ParamSnoop</filter-name>

<filter-class>com.jspservletcookbook.ParamSnoop</filter-class>

</filter>

<filter-mapping>

<filter-name>ParamSnoop</filter-name>

<servlet-name>Viewer</servlet-name>

</filter-mapping>

<!--web.xmlcontinues-->

PlacethefilterclassintheWEB-INF/classesdirectoryofyourwebapplication,orinsideaJARfilethatisplacedinWEB-INF/lib.Theservletcontainercreatesaninstancewhenthecontainerstartsupofeachfilterthatisdeclaredinweb.xml.Thecontainerthenexecutesthefilter(callsitsdoFiltermethod)whenauserrequestsanyoftheservletsthefilterismappedto.SotheParamSnoopfiltercaninspectarequestmadetotheViewerservletbeforetheservletprocessestherequest.

"OnlyoneinstanceperfilterdeclarationinthedeploymentdescriptorisinstantiatedperJavavirtualmachineofthecontainer,"accordingtotheServletv2.4specification,ChapterSRV.6.2.1.

Example7-14getsaccesstotheparametersintheinterceptedrequestbycallingServletRequest.getParameterMap().However,youarefreetouseotherServletRequestAPImethodstolookatparameters,suchasgetParameterStringName.ThegetParameterMap()methodreturnsajava.util.Mapofparameternamesandvalues,whichyouextractfromtheMapusingajava.util.Iteratoranditsnext()method.

ThecallMap.entrySet()returnsajava.util.Set,fromwhichyouobtainanIteratorbycallingSet.iterator().TheobjectsreturnedfromtheIterator.next()methodinthiscaseareMap.Entryobjectsthathold

Page 313: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

key/valuepairs,relatingtotheparameternamesandvalues.

Example7-14alsoshowshowtopullthekey/valuepairsoutofthemapandlogthevaluesusingtheServletContext.log()method.

Example7-14.Snoopingonparametervalueswithaservlet

packagecom.jspservletcookbook;

importjavax.servlet.*;

importjavax.servlet.http.*;

importjava.util.Map;

importjava.util.Iterator;

importjava.util.Map.Entry;

publicclassParamSnoopimplementsFilter{

privateFilterConfigconfig;

/**CreatesnewParamSnoop*/

publicParamSnoop(){

}

publicvoidinit(FilterConfigfilterConfig)throwsServletException{

this.config=filterConfig;

}

publicvoiddoFilter(

ServletRequestrequest,ServletResponseresponse,FilterChainchain)

throwsjava.io.IOException,ServletException{

Page 314: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

MapparamMap=request.getParameterMap();

ServletContextcontext=config.getServletContext();

/*usetheServletContext.logmethodtolog

paramnames/values*/

context.log("doFiltercalledin:"+config.getFilterName()+

"on"+(newjava.util.Date()));

context.log("Snoopingtheparametersinrequest:"+

((HttpServletRequest)request).getRequestURI());

Iteratoriter=paramMap.entrySet().iterator();

while(iter.hasNext()){

Map.Entryme=(Map.Entry)iter.next();

context.log((String)me.getKey()+":"+

((String[])me.getValue())[0]);

}

//continuetherequest,responsetonextfilterorservlet

//destination

chain.doFilter(request,response);

}

publicvoiddestroy(){

/*calledbeforetheFilterinstanceisremoved

fromservicebythewebcontainer*/

}

}

TheonlyreasonweusedtheServletContext.log()methodwastodisplaytheinspectionofparametersbythefilter.HereisanexampleoftheTomcatlogin<Tomcat-installation-directory>/logsshowingthetwoparametersthatwerestoredintheservletrequest(last,first).Inotherwords,thewebbrowserrequestwashttp://localhost:8080/home/viewer?first=Bruce&last=Perry.

2003-04-1317:13:33doFiltercalledin:ParamSnooponSunApr1317:13:33EDT2003

Page 315: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

2003-04-1317:13:33Snoopingtheparametersinrequest:/home/viewer

2003-04-1317:13:33last:Perry

2003-04-1317:13:33first:Bruce

SeeAlso

Recipe7.1onhandlingaPOSTrequestinaservlet;Recipe7.7onusingaservlettoaddaparametertoaquerystring;Chapter19onfilteringrequestsandresponses;ChapterSRV.6onFiltersintheServlet2.4specification.

Page 316: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Chapter8.UploadingFilesIntroduction

Recipe8.1.PreparingtheHTMLPageforFileUploads

Recipe8.2.Usingthecom.oreilly.servletLibrary

Recipe8.3.UploadingOneFileataTime

Recipe8.4.UploadingMultipleFiles

Recipe8.5.RenamingFiles

Recipe8.6.UsingaJSPtoHandleaFileUpload

Page 317: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Introduction

WebsitesusetheHTMLformtagtoallowuserstosubmitfilesfromtheirownfilesystemforprocessingontheserver.Theformtagenablestheuploadingactionwithanestedinputelementthathasatypeattributesetto"file".TheformandinputtagisspecifiedusingthesyntaxdescribedinRecipe8.1.

TheHTTPrequestforfileuploadingusesacontenttypeof"multipart/form-data".TheHTTPmessagethattheusersendstotheserverbyclickingthewebpage'sSubmitbuttoncontainsdescriptiveheadersandthebodyofeachuploadedfile.Eachoftheuploadedfilesisseparatedbyaspecifiedboundarypattern(seetheContent-TypeheadervalueinExample8-1).Example8-1showsanabbreviatedviewofa"multipart/form-data"typerequestincludingtheuploadingofthreeverysmallfiles.Tomakethisexamplemorecompact,IhaveremovedsomeofthevaluesfromtheAcceptrequestheader.

Example8-1.AnHTTPrequestmessagewiththreeuploadedfiles

POST/home/upload.jspHTTP/1.1

Accept:image/gif,image/x-xbitmap,image/jpeg,image/pjpeg...

Referer:http://localhost:8080/home/interact.html

Accept-Language:en-us

Content-Type:multipart/form-data;boundary=---------------------------7d33c11c6018e

Accept-Encoding:gzip,deflate

User-Agent:Mozilla/4.0(compatible;MSIE5.5;WindowsNT4.0)

Host:localhost:9000

Content-Length:541

Connection:Keep-Alive

Cache-Control:no-cache

Cookie:JSESSIONID=7F6154184FFF3D1AE345E1F2FFF1A22E

Page 318: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

-----------------------------7d33c11c6018e

Content-Disposition:form-data;name="file1";filename="H:\home\file1.txt"

Content-Type:text/plain

Thisisfile1.

-----------------------------7d33c11c6018e

Content-Disposition:form-data;name="file2";filename="H:\home\file2.txt"

Content-Type:text/plain

Thisisfile2.

-----------------------------7d33c11c6018e

Content-Disposition:form-data;name="file3";filename="H:\home\file3.txt"

Content-Type:text/plain

Thisisfile3.

-----------------------------7d33c11c6018e--

TheHTTPrequestdelineateseachuploadedfilewithaboundarypattern:

-----------------------------7d33c11c6018e.

EachofthefileshasaContent-DispositionandContent-Typeheader.ThesimpletextfilesthatExample8-1uploadstotheserverhaveonlyonelineeachtogiveyouaclearsnapshotofwhatthistypeofHTTPrequestlookslike.Formoredetailsonthefile-uploadingmechanismitself,seeRFC1867:http://www.ietf.org/rfc/rfc1867.txt.

Page 319: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe8.1PreparingtheHTMLPageforFileUploads

Problem

YouwanttosetupanHTMLpagetoallowtheusertospecifyafilefromhisfilesystemtouploadtotheserver.

Solution

UsetheHTMLformtagwithitsenctypeattributesetto"multipart/form-data".Useaninputtagnestedintheformtagwithatypeattributeof"file".

Discussion

TheHTMLforfileuploadinginvolvesafew"musthaves."Theformtagspecifiestheservlet(orotherserver-sidecomponent)thatishandlingthefileuploadinitsactionattribute.ThemethodattributemustbePOST(notGET)forthefileuploadactiontowork.Theformtag'senctypeattributemustbe"multipart/form-data".

Thewidgetwithwhichtheuserentersthefiletouploadisaninputtagwithatypeof"file",andlookslikeatextfield.Thenameattributeuniquelynamestheparticularinputtag,whichbecomesimportantwhentheHTMLspecifiestheuploadingofmorethanonefile(seethenoteattheendofthisrecipe).Withoutanyadditionalintervention,theserversavestheuploadedfilewithitsoriginalfilename.Theacceptattributeisdesignedtolimitthefiletypesthattheusercanchooseforuploading,suchastothe"application/pdf"MIMEtype,butthisattribute

Page 320: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

haspoorsupportamongbrowsers.

WhendisplayingtheHTMLinExample8-2,browsersautomaticallyshowaBrowsebutton.Whentheformclientselectsthebutton,thebrowserdisplaysatypicalfilesystemnavigationwindowwithwhichtheusercanselectthefile.

Example8-2.SimpleHTMLforfileuploading

<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.0Transitional//EN">

<html>

<head>

<title>PleaseChooseTheFile</title>

</head>

<bodybgcolor="#ffffff">

<tableborder="0"><tr>

<formaction="/home/servlet/com.jspservletcookbook.UploadServlet"method="post"

enctype="multipart/form-data">

<tdvalign="top"><strong>Pleasechooseyourdocument:</strong><br></td>

<td><inputtype="file"name="file1">

<br><br>

</td></tr>

<tr><td><inputtype="submit"value="UploadFile"></td></tr>

</form>

</table>

</body>

</html>

Afterselection,thetextfielddisplaysthefullpathtotheselectedfile.Figure8-1showsthisHTMLpageinawebbrowser.

Page 321: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Figure8-1.HTMLpageforuploadingafiletoaservlet

Figure8-1showstheinputfieldaftertheuserhasalreadychosenthefile.Thebrowserthenautomaticallyfillsinthetextfieldwiththecompletefilepath.

Toallowtheuploadingofmultiplefiles,includemorethanoneinputtagwithdifferentvaluesforthenameattribute.ThebrowserassociatesaBrowsebuttonwitheachofthem.

SeeAlso

Recipe8.4onusingthecom.oreilly.servletlibraryforfileuploading;Recipe8.5onhandlingasinglefileupload;Recipe8.6onhandlingmultiplefileuploads;Recipe8.5oncontrollingfilenaming;Recipe8.6onusingaJSPtohandlefileuploads;thehomepageforcom.oreilly.servlet:http://www.servlets.com/cos/index.html;theRFC1867documentonform-basedfileuploads:http://www.ietf.org/rfc/rfc1867.txt.

Page 322: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe8.2Usingthecom.oreilly.servletLibrary

Problem

Youwanttousethecom.oreilly.servletclassesthatO'ReillyauthorJasonHunterhasdevelopedtohandlefileuploads.

Ofcourse,thisisn'tmuchofaproblem,asJason'slibrarytakesmostoftheworkoutofuploadingandacceptingfiles.IuseJason'slibraryhere(withhispermission,ofcourse)becauseithandlesfileuploadsnicely,andthere'snogoodreasontoreinventaperfectlygoodwheel.

Solution

DownloadthedistributionZIPfilefromhttp://www.servlets.com/cos/index.html.Addthecos.jarfile,whichispartofthedistributiontotheWEB-INF/libdirectoryofyourwebapplication.Makesurethatyouadheretothesoftwarelicensewhenusingthelibrary.

Discussion

AJARfilenamedcos.jarincludesthecom.oreilly.servletandcom.oreilly.servlet.multipartpackages.Thesepackagesincludeseveralclasses,suchasalloftheJavaclassesthatbeginwith"Multipart,"whichcanbeusedtohandlefileuploadinginaservlet.

Thecos.jararchivealsocontainsmanyotherinterestingandusefulclassestouse

Page 323: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

withservlets,butthefollowingrecipesfocusonfileuploads.

DownloadthelatestZIPfilecontainingthedistributionfromhttp://www.servlets.com/cos/index.html.ThecontentsoftheZIPfileincludecos.jar,whichyouneedtoaddtotheWEB-INF/libdirectoryofyourwebapplication.Inyourservlet,youthenimporttheclassesthatyouwanttouse:

importcom.oreilly.servlet.MultipartRequest;

importcom.oreilly.servlet.multipart.FileRenamePolicy;

Beforeyouhaveintegratedtheseclassesintoyourcode,makesurethatyouhavereadtheaccompanyingsoftwarelicenseforthiscode:http://www.servlets.com/cos/license.html.

Therestoftherecipesinthischapterassumethatyouhavecos.jarandtheclassesitcontainsavailableinyourwebapplication.Ifyoudon'ttakestepstomaketheseclassesavailable,noneoftheexamplesinthischapterwillfunctionproperly.

SeeAlso

Recipe8.1onpreparingtheHTMLforafileupload;Recipe8.5onhandlingasinglefileupload;Recipe8.6onhandlingmultiplefileuploadsinaservlet;Recipe8.5oncontrollingfilenaming;Recipe8.6onusingaJSPtohandlefileuploads;thehomepageforcom.oreilly.servlet:http://www.servlets.com/cos/index.html;theRFC1867documentonform-basedfileuploads:http://www.ietf.org/rfc/rfc1867.txt.

Page 324: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe8.3UploadingOneFileataTime

Problem

Youwanttocreateacomponentthatcanreceiveaclientfileuploadandstorethefileinalocaldirectory.

Solution

Createaservletthatusesthecom.oreilly.servlet.MultipartRequestclassfromJasonHunter'scos.jararchive.

Discussion

TheMultipartRequestclassincludesseveraloverloadedconstructors.TheoneusedinExample8-3takesthejavax.servlet.http.HttpServletRequestobject,thepathtothedirectorywhereyouwanttosaveuploadedfiles,andthesizelimitforthefileasparameters.InExample8-3,iftheclientuploadsafilethatexceeds5MB,thentheUploadServletthrowsajava.io.IOException.Youcanallowthisexceptiontobemanagedbyanerror-pageelementinweb.xmlforIOExceptions,asExample8-3does,oruseatry/catchblockintheuploadservlettodealwitherrors.

SeeChapter9forhowtodeclareerrorpagesforthewebapplication.

Page 325: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

WithMultipartRequest,assoonasthecodeinstantiatestheobject,theobjectishandlingthefileupload;inotherwords,youdonothavetocallamethodtocommencemanagingtheupload.

TheservletinExample8-3initiatesthefileuploadandthendisplaysthenameoftheuploadedfile(s).

Example8-3.AservletthatusestheMultipartRequestclass

packagecom.jspservletcookbook;

importjavax.servlet.*;

importjavax.servlet.http.*;

importcom.oreilly.servlet.MultipartRequest;

importjava.util.Enumeration;

publicclassUploadServletextendsHttpServlet{

privateStringwebTempPath;

publicvoidinit()

webTempPath=getServletContext().getRealPath("/")+"data";

}

publicvoiddoPost(HttpServletRequestrequest,

HttpServletResponseresponse)

throwsServletException,java.io.IOException{

//filelimitsizeof5MB

MultipartRequestmpr=newMultipartRequest(

request,webTempPath,5*1024*1024);

Enumerationenum=mpr.getFileNames();

Page 326: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

response.setContentType("text/html");

java.io.PrintWriterout=response.getWriter();

out.println("<html>");

out.println("<head>");

out.println("<title>Servletupload</title>");

out.println("</head>");

out.println("<body>");

for(inti=1;enum.hasMoreElements();i++)

out.println("Thenameofuploadedfile"+i+

"is:"+mpr.getFilesystemName((String)enum.nextElement())

+"<br><br>");

out.println("</body>");

out.println("</html>");

}

publicvoiddoGet(HttpServletRequestrequest,

HttpServletResponseresponse)

throwsServletException,java.io.IOException{

thrownewServletException("GETmethodusedwith"+

getClass().getName()+":POSTmethodrequired.");

}

}

Thecodegeneratesthepathtothesavedirectorybycallingjavax.servlet.ServletContext.getRealPath("/")togetanabsolutepathnametotherootofthewebapplication(asinh:\home\).Thenthecodeaddsthenameofthedirectorywherethefilewillbesaved(data).

Thisdirectorynamecouldalsobeaddedusinganexternalconfigurationsuchasacontext-paramelementinweb.xml.SeeRecipe8.6fordetails.

Page 327: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

ThemethodMultipartRequest.getFilesystemName(StringName)returnsthefilenamefromtheclient'sfilesystem.Thefilecanbesavedontheserverendwithitsoriginalfilename,oryoucanuseadifferentMultipartRequestconstructorthattakesasaparameteraFileRenamePolicyobject.Thisconstructorlookslike:

MultipartRequest(javax.servlet.http.HttpServletRequestrequest,

java.lang.StringsaveDirectory,intmaxPostSize,

FileRenamePolicypolicy)

ThereareafewversionsoftheMultipartRequestconstructorwiththeFileRenamePolicyparameter,whichisusedtorenameuploadedfiles(seeRecipe8.5).Example8-3alsothrowsaServletExceptioniftheUploadServletisrequestedwithaGETmethod,whichisnotallowedwithfileuploads.

SeeAlso

Recipe8.1onpreparingtheHTMLforafileupload;Recipe8.4ondownloadingandusingthecom.oreilly.servletlibrary;Recipe8.6onhandlingmultiplefileuploadsinaservlet;Recipe8.5oncontrollingfilenamingduringfileuploads;Recipe8.6onusingaJSPtohandlefileuploads;thehomepageforcom.oreilly.servlet:http://www.servlets.com/cos/index.html;theRFC1867documentonform-basedfileuploads:http://www.ietf.org/rfc/rfc1867.txt.

Page 328: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe8.4UploadingMultipleFiles

Problem

Youwanttouploadmorethanonefileatatimefromaclient,andhandleeachfileasitisuploaded.

Solution

UsetheMultipartParserfromJasonHunter'scos.jararchive.

Discussion

TheMultipartParserclassallowstheservlettohandleeachfilepartsequentiallyastheserverreceivesamultipartHTTPrequest.

YoucanalsousetheMultipartRequestclasstohandlemultiplefiles.However,theMultipartParserallowsyoutohandleeachpart(suchasbysavingittoadatabase)duringtheparsingofamultiple-fileupload.

Inaddition,thefile'scontenttype,size,andnamecanbereadastheservlethandlestherequest.Theservletcanalsomakebasicchecksusingthisclass,suchascountinghowmanyfileswereuploadedandverifyingwhethertheuseruploadedafileforeachoftheavailableforminputfields.

TheHTMLfilefromRecipe8.5hasbeenalteredtoallowtheuploadofthreedifferentfilesfromtheuser'sfilesystem,asshowninFigure8-2.

Page 329: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Figure8-2.AnHTMLformforuploadingthreefiles

ThisHTMLformiscreatedbyincludingthreeinputtagswithtype="file",asin:

<inputtype="file"name="file1"><br><br>

<inputtype="file"name="file2"><br><br>

<inputtype="file"name="file3">

Example8-4handlesthemultiplefileuploadsbyimportingthreeclassesfromthecos.jararchive.TheMultipartParserclassrestrictsthesizeoffileuploadsto5MBinExample8-4;however,youcansetthisconstructorparametertoanothervaluetoallowsmallerorlargerfilesizes,orleavetheacceptedfilesizeatthe1MBdefault.

YoucanviewtheJavadocforthisclassathttp://www.servlets.com/cos/javadoc/com/oreilly/servlet/multipart/MultipartParser.html.

TheMultipartParserobjectthrowsajava.io.IOExceptionifanyofthefileuploadsexceedthesizelimit.Callingthe

Page 330: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

MultipartParser.readNextPart()methodreturnsaParttype,ornulliftheincomingstreamdoesnotcontainanymoreparts.APartcanbeeitheraFilePartoraParamPart,dependingonthecontentitincludes.TheParamPartcoverstheotherparametersthatanHTMLformmightinclude,suchas"username".TheFileParthasseveralmethodsthatprovideinformationabouttheuploadedfile,suchasitscontenttypeandthefilename.TheFilePart.writeTo(java.io.Filedir)methodsavesthefiletothespecifieddirectoryandreturnsthefilesizeasalongtype.TheFilePartcanalsowritetoanOutputStream,asinwriteTo(java.io.OutputStreamout).

Example8-4.Aservlethandlingmultiplefileuploads

packagecom.jspservletcookbook;

importjavax.servlet.*;

importjavax.servlet.http.*;

importcom.oreilly.servlet.multipart.MultipartParser;

importcom.oreilly.servlet.multipart.Part;

importcom.oreilly.servlet.multipart.FilePart;

publicclassParserServletextendsHttpServlet{

privateStringfileSavePath;

publicvoidinit(){

//saveuploadedfilestoa'data'directoryinthewebapp

fileSavePath=getServletContext().getRealPath("/")+"data";

}

publicvoiddoPost(HttpServletRequestrequest,

Page 331: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

HttpServletResponseresponse)throwsServletException,

java.io.IOException{

response.setContentType("text/html");

java.io.PrintWriterout=response.getWriter();

out.println("<html>");

out.println("<head>");

out.println("<title>Fileuploads</title>");

out.println("</head>");

out.println("<body>");

out.println("<h2>Hereisinformationaboutanyuploadedfiles</h2>");

try{

//filelimitsizeof5MB

MultipartParserparser=newMultipartParser(

request,5*1024*1024);

Part_part=null;

while((_part=parser.readNextPart())!=null){

if(_part.isFile()){

//getsomeinfoaboutthefile

FilePartfPart=(FilePart)_part;

Stringname=fPart.getFileName();

if(name!=null){

longfileSize=fPart.writeTo(

newjava.io.File(fileSavePath));

out.println("Theuser'sfilepathforthefile:"+

fPart.getFilePath()+"<br>");

Page 332: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

out.println("Thecontenttypeofthefile:"+

fPart.getContentType()+"<br>");

out.println("Thefilesize:"+fileSize+"bytes<br><br>");

//commencewithanotherfile,ifthereisone

}else{

out.println(

"Theuserdidnotuploadafileforthispart.");

}

}elseif(_part.isParam()){

//dosomethingelseifitisanon-file-typeparameter,

//suchasausername

}

}//endwhile

out.println("</body>");

out.println("</html>");

}catch(java.io.IOExceptionioe){

//anerror-pageinthedeploymentdescriptoris

//mappedtothejava.io.IOException

thrownewjava.io.IOException(

"IOExceptionoccurredin:"+getClass().getName());

}

}//doPost

publicvoiddoGet(HttpServletRequestrequest,

HttpServletResponseresponse)throwsServletException,

Page 333: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

java.io.IOException{

thrownewServletException(

"GETmethodusedwith"+getClass().getName()+

":POSTmethodrequired.");

}

}

Figure8-3showsthedescriptivepagethattheservletdisplaysabouteachuploadedfile.

Figure8-3.Aservletdisplaysinformationaboutuploadedfiles

SeeAlso

Recipe8.1onpreparingtheHTMLforafileupload;Recipe8.4ondownloadingandusingthecom.oreilly.servletlibrary;Recipe8.5onhandlingasinglefileuploadinaservlet;Recipe8.5oncontrollingfilenaming;Recipe8.6onusingaJSPtohandlefileuploads;thehomepageforcom.oreilly.servlet:http://www.servlets.com/cos/index.html;theRFC1867documentonform-basedfileuploads:http://www.ietf.org/rfc/rfc1867.txt.

Page 334: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe8.5RenamingFiles

Problem

Youwanttorenametheuploadedfilesaccordingtoastandardpolicyortoavoidconflictswithexistingfilesthathavethesamename.

Solution

Createaclassthatimplementsthecom.oreilly.servlet.multipart.FileRenamePolicyinterface,orusetheDefaultFileRenamePolicyclass.Thenusethatclassasaparameterintheconstructorforthecom.oreilly.servlet.MultipartRequestclass.

Discussion

Thecom.oreilly.servlet.multipartpackagecontainsaFileRenamePolicyinterfacethatcanbeusedwhenyouwanttoimplementaparticularfile-renamingpolicywithfileuploads.

TheDefaultFileRenamePolicyclassrenamesanuploadedfilewhosenameconflictswithanexistingfilebyaddinganumbertotheuploadedfilename.Forexample,ifindex.txtalreadyexists,thentheDefaultFileRenamePolicyclassrenamestheuploadedfileindex1.txt;andifasecondfileisuploadedwiththesamenameitwillberenamedindex2.txt,andsoon.

Ifyouwanttoimplementyourownrenamingpolicy,thencreateyourownclassthatimplementstheFileRenamePolicyinterface,then

Page 335: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

implementtheclass'srename(java.io.Filefile)methodtoinitiatetherenamingaction.

ThiscodesampleshowsaMultipartRequestconstructorfromExample8-3.Thistime,theconstructoraddsaDefaultFileRenamePolicyobjectasaconstructorparameter:

MultipartRequestmpr=newMultipartRequest(

request,webTempPath,(5*1024*1024),newDefaultFileRenamePolicy());

Makesuretoincludethefollowingimportstatementsintheservletclass:

importcom.oreilly.servlet.MultipartRequest;

importcom.oreilly.servlet.multipart.DefaultFileRenamePolicy;

Asmentionedbefore,youcanimplementtheFileRenamePolicyinterfaceyourselfandcreateacustomfile-renamingmechanism.Example8-5showsaMyFileRenamePolicyclassthatrenameseachuploadedfilebyappendingatimestamptotheendofitsname.Thesimpletimestampiscalculatedas:

//secondssinceJan1,1970,00:00:00

newjava.util.Date().getTime()/1000

ThecoderenamesthefilebyappendingtheString(representingaseriesofnumbers)tothefilenameminusitsextension,andthenappendingtheextensionattheend(ifthefilenameoriginallyhadanextension).

Example8-5.RenaminguploadedfileswithyourownJavaclass

packagecom.jspservletcookbook;

importjava.io.File;

importjava.util.Date;

Page 336: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

importcom.oreilly.servlet.multipart.FileRenamePolicy;

publicclassMyFileRenamePolicyimplementsFileRenamePolicy{

//implementtherename(Filef)methodtosatisfythe

//FileRenamePolicyinterfacecontract

publicFilerename(Filef){

//Gettheparentdirectorypathasinh:/home/useror/home/user

StringparentDir=f.getParent();

//Getfilenamewithoutitspathlocation,suchas'index.txt'

Stringfname=f.getName();

//Gettheextensionifthefilehasone

StringfileExt="";

inti=-1;

if((i=fname.indexOf("."))!=-1){

fileExt=fname.substring(i);

fname=fname.substring(0,i);

}

//addthetimestamp

fname=fname+(""+(newDate().getTime()/1000));

//piecetogetherthefilename

fname=parentDir+System.getProperty(

"file.separator")+fname+fileExt;

Filetemp=newFile(fname);

returntemp;

}

}

Page 337: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Giventhatyournewclassiscalledcom.jspservletcookbook.MyFileRenamePolicyandimplementstheFileRenamePolicyinterface,theconstructorfortheMultipartRequestwouldnowlooklikethis:

MultipartRequestmpr=newMultipartRequest(

request,webTempPath,(5*1024*1024),

newcom.jspservletcookbook.MyFileRenamePolicy());

StoreyournewclassintheWEB-INF/classesdirectoryofthewebapplicationusingthesamedirectorystructureastheclass'spackagename(asinWEB-INF/classes/com/jspservletcookbook/MyFileRenamePolicy.class).

Ingeneral,thecom.oreilly.servletpackagealsoincludestheMultipartFilterclass.AccordingtoanarticlethatJasonhaswritten(http://www.servlets.com/soapbox/filters.html),"TheMultipartFilterworksbywatchingincomingrequestsandwhenitdetectsafileuploadrequest(withthecontenttypemultipart/form-data),thefilterwrapstherequestobjectwithaspecialrequestwrapperthatknowshowtoparsethespecialcontenttypeformat."

SeeAlso

Recipe8.1onpreparingHTMLforafileupload;Recipe8.4ondownloadingandusingthecom.oreilly.servletlibrary;Recipe8.3andRecipe8.6onhandlingsingle-andmultiple-fileuploadsinaservlet;Recipe8.6onusingaJSPtohandlefileuploads;thehomepageforcom.oreilly.servlet:http://www.servlets.com/cos/index.html;theRFC1867documentonform-basedfileuploads:http://www.ietf.org/rfc/rfc1867.txt.

Page 338: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe8.6UsingaJSPtoHandleaFileUpload

Problem

YouwanttouseaJSPtohandleafileupload.

Solution

CreateaJavaBeanthatwrapsthefunctionalityofthecom.oreilly.servlet.MultipartRequestclassfromJasonHunter'scos.jarlibrary.Thenusethejsp:useBeanstandardactioninaJSPtocreateaninstanceofthisbeanforhandlingthefileuploads.

Discussion

ThisrecipedescribesaJavaBeanthatusesthecom.oreilly.servlet.MultipartRequestclasstomanagefileuploads.First,I'llshowthebeanthatwrapsthefunctionalityoftheMultipartRequestclass,thentheJSPthatusesthebeantouploadafile.

Example8-6showstheUploadBeanusedbytheJSPinExample8-7.

Example8-6.Afile-uploadingJavaBean

packagecom.jspservletcookbook;

importjava.util.Enumeration;

Page 339: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

importjavax.servlet.http.HttpServletRequest;

importjavax.servlet.ServletRequest;

importcom.oreilly.servlet.MultipartRequest;

importcom.oreilly.servlet.multipart.DefaultFileRenamePolicy;

publicclassUploadBean{

privateStringwebTempPath;

privateHttpServletRequestreq;

privateStringdir;

publicUploadBean(){}

publicvoidsetDir(StringdirName){

if(dirName==null||dirName.equals(""))

thrownewIllegalArgumentException(

"invalidvaluepassedto"+getClass().getName()+".setDir");

webTempPath=dirName;

}

publicvoidsetReq(ServletRequestrequest){

if(request!=null&&requestinstanceofHttpServletRequest){

req=(HttpServletRequest)request;

}else{

thrownewIllegalArgumentException(

"Invalidvaluepassedto"+getClass().getName()+".setReq");

}

}

Page 340: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

publicStringgetUploadedFiles()throwsjava.io.IOException{

//filelimitsizeof5MB

MultipartRequestmpr=newMultipartRequest(

req,webTempPath,5*1024*1024,newDefaultFileRenamePolicy());

Enumerationenum=mpr.getFileNames();

StringBufferbuff=newStringBuffer("");

for(inti=1;enum.hasMoreElements();i++){

buff.append("Thenameofuploadedfile").append(i).

append("is:").

append(mpr.getFilesystemName((String)enum.nextElement())).

append("<br><br>");

}//for

//returntheString

returnbuff.toString();

}//getUploadedFiles

}

ThiscodeimportstheclassesitneedstohandletheuploadedfileswiththeMultipartRequestclass.TheDefaultFileRenamePolicyclassisusedintheMultipartRequestconstructortohandleconflictsbetweenthenamesofuploadedfilesandanyexistingfileswiththesamename.Whenthesenamingconflictsoccur,theDefaultFileRenamePolicyclassautomaticallyaddsanumbertotheendoftheuploadedfile,asinindex1.txtiftheuploadedfilewasnamedindex.txt.

Example8-6usestheJavaBeannamingconventionsforitsmethods,asinsetDir()andgetUploadedFiles(),whichallowthemethods

Page 341: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

tobecalledusingthejsp:getPropertyandjsp:setPropertystandardactions.Example8-7showstheuseofbothoftheseactionsandtheJSPthathandlesthefileuploadanddisplayinformationabouttheuploadedfiles.

TheJSPusestheUploadBean,theclassIjustdefined.TheJSPinstantiatesthebeanusingthejsp:useBeanstandardaction,setsthedirectorynamewheretheuploadedfilewillbesavedwithjsp:setProperty,thenusesjsp:getPropertytosavethefile(s)tothespecifieddirectory.

Example8-7.AJSPthatuploadsfilesanddisplaysinformationaboutthem

<jsp:useBeanid="uploader"class="com.jspservletcookbook.UploadBean"/>

<jsp:setPropertyname="uploader"property="dir"

value="<%=application.getInitParameter(\"save-dir\")%>"/>

<jsp:setPropertyname="uploader"property="req"value="<%=request%>"/>

<html>

<head><title>fileuploads</title></head>

<body>

<h2>Hereisinformationabouttheuploadedfiles</h2>

<jsp:getPropertyname="uploader"property="uploadedFiles"/>

</body>

</html>

TheJSPinExample8-7createsaninstanceoftheUploadBeanwiththiscode:

<jsp:useBeanid="uploader"class="com.jspservletcookbook.UploadBean"/>

Page 342: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Thecom.jspservletcookbook.UploadBeanclassmustbeplacedinthewebapplication'sWEB-INF/classesdirectory(insideofWEB-INF/classes/com/jspservlet/cookbook),orinaJARfileinsideofWEB-INF/lib.

TheJSPthenpassestheHttpServletRequestobjecttothebeanwiththiscode:

<jsp:setPropertyname="uploader"property="req"value="<%=request%>"/>

UnderJSP2.0,youcanpassalongtherequestvaluewiththiscode:

<jsp:setPropertyname="uploader"property="req"value="${pageContext.request}"/>

TheJSP2.0specificationallowstheuseofELsyntaxinthejsp:setPropertyvalueattribute.

ThebeanneedstherequestobjecttopassintotheMultipartRequestconstructor,whichdoesallthefile-uploadingwork.TheJSPalsospecifiesthedirectorywhereuploadedfilesaresaved:

<jsp:setPropertyname="uploader"property="dir"

value="<%=application.getInitParameter(\"save-dir\")%>"/>

Theexpressionapplication.getInitParameter(\"save-dir\")returnsthevalueofthecontextparametersave-dir,whichisthepathtothedirectorywheretheuploadedfilesaresaved.Hereiswhatthisweb.xmlelementlookslike:

<!--beginningofdeploymentdescriptor-->

<context-param>

<param-name>save-dir</param-name>

Page 343: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<param-value>h:\home\data</param-value>

</context-param>

<!--deploymentdescriptorcontinues-->

Thefinalstepistocallthebean'sgetUploadedFiles()method.TheJSPaccomplishesthistaskusingthejsp:getPropertystandardaction,asin:

<jsp:getPropertyname="uploader"property="uploadedFiles"/>

TheJSPcancallthebean'smethodinthismanner,asthoughtheJSPwasfetchingabeanproperty,becauseInamedthemethodwiththestandard"get"prefix:getUploadedFiles().Tricky!

Figure8-4showstheresultingwebpageaftertheuserhassubmittedtheHTMLform.

Figure8-4.AJSPthathandlesfileuploads

TousethisJSPtohandleafileupload,youhavetospecifyitinanHTMLformtag'sactionattribute,asin:

Page 344: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<formaction="http://localhost:9000/home/upload.jsp"method="post"

enctype="multipart/form-data">

SeeAlso

Recipe8.1onpreparingtheHTMLforafileupload;Recipe8.4ondownloadingandusingthecom.oreilly.servletlibrary;Recipe8.3andRecipe8.6onhandlingsingle-andmultiple-fileuploadsinaservlet;Recipe8.5oncontrollingfilerenamingasfilesareuploaded;thehomepageforcom.oreilly.servlet:http://www.servlets.com/cos/index.html;theRFC1867documentonform-basedfileuploads:http://www.ietf.org/rfc/rfc1867.txt.

Page 345: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Chapter9.HandlingExceptionsinWebApplications

Introduction

Recipe9.1.DeclaringExceptionHandlersinweb.xml

Recipe9.2.CreatinganException-HandlingServlet

Recipe9.3.SendinganErrorfromaServlet

Recipe9.4.SendinganErrorfromaJSP

Recipe9.5.CreatinganError-HandlingJSP

Recipe9.6.DeclaringaSpecialException-HandlingJSPforOtherJSPs

Page 346: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Introduction

Webapplicationscansometimesshowanumberoferrorsthatyoudon'twantuserstosee.Ifauserwhoexpectstobeservedaninformation-richpageisinsteadgreetedwithanuglyandincomprehensibleannouncementofan"HTTPStatus500"inherwebbrowser,youcanbetthisvisittothesitewillbeherlast!AllwebsiteshandleunexpectedHTTPstatuscodes(suchasthe"404NotFound"or"403Forbidden")withafriendlyandinformativeerrormessage,butyou'llwanttohidethesemessagesfromyourusers.ToolstohandlebothJavaruntimeexceptionsandtheseunanticipatedHTTPstatuscodesareavailabletodevelopers,andtherecipesinthischaptershowyouhowtousethemeffectively.

Page 347: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe9.1DeclaringExceptionHandlersinweb.xml

Problem

YouwanttodisplaycertainservletsorJSPswhenawebcomponentthrowsaJavaexceptionorgeneratesunexpectedserverresponsecodes.

Solution

Usetheerror-pageelementinweb.xmltospecifytheinvocationofservletsorJSPsinresponsetocertainexceptionsorHTTPstatuscodes.

Discussion

AJavawebdevelopershouldhandlethesetypesofunexpectedoccurrenceswithinhiswebapplication:

The"404NotFound"serverresponsecode,whichindicatesthattheuserhasmadeamistakewhentypingintheURL,orrequestedapagethatnolongerexists.

The"500InternalServerError"thatcanberaisedbyaservletwhenitcallssendError(500)ontheHttpServletResponseobject.

Runtimeexceptionsthatarethrownbythewebapplicationandnotcaughtbythefilter,servlet,orJSP.

Page 348: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Youconfigurethehandlingofexceptionsandserverresponsecodeswiththeerror-pageelementinthedeploymentdescriptor.Theerror-pageelementinweb.xmlcomesafteranyservlet,servlet-mapping,session-config,mime-mapping,andwelcome-file-listelements,aswellasbeforeanytaglib,resource-env-ref,resource-ref,orsecurity-constraintelements.Theerror-pageelementincludesamappingbetweenthestatuscodeorexceptiontype,aswellasthepathtoawebresource.Thisresource,whichshouldbeaservlet,JSP,orHTMLfile,shouldinformtheuseraboutwhathappenedandprovidelinkstootherpartsofthewebsite,dependingonthenatureoftheerror.

Example9-1showsadeploymentdescriptorforservletAPI2.3thatconfigureserrorpages.

Example9-1.Configuringerrorpagesinweb.xml

<?xmlversion="1.0"encoding="ISO-8859-1"?>

<!DOCTYPEweb-app

PUBLIC"-//SunMicrosystems,Inc.//DTDWebApplication2.3//EN"

"http://java.sun.com/dtd/web-application_2_3.dtd"

>

<web-app>

<!--topofdeploymentdescriptor,suchasfilter,servlet,servlet-mapping,session-

config,welcome-fileelements-->

<servlet>

<servlet-name>Error404</servlet-name>

<servlet-class>com.jspservletcookbook.Error404</servlet-class>

</servlet>

<servlet>

<servlet-name>Error403</servlet-name>

<servlet-class>com.jspservletcookbook.Error403</servlet-class>

Page 349: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

</servlet>

<servlet>

<servlet-name>ErrorIo</servlet-name>

<servlet-class>com.jspservletcookbook.ErrorIo</servlet-class>

</servlet>

<servlet>

<servlet-name>ErrorServlet</servlet-name>

<servlet-class>com.jspservletcookbook.ErrorServlet</servlet-class>

</servlet>

<servlet>

<servlet-name>ErrorGen</servlet-name>

<servlet-class>com.jspservletcookbook.ErrorGen</servlet-class>

</servlet>

<!--servletmappings-->

<servlet-mapping>

<servlet-name>Error404</servlet-name>

<url-pattern>/err404</url-pattern>

</servlet-mapping>

<servlet-mapping>

<servlet-name>Error403</servlet-name>

<url-pattern>/err403</url-pattern>

</servlet-mapping>

<servlet-mapping>

<servlet-name>ErrorIo</servlet-name>

<url-pattern>/errIo</url-pattern>

</servlet-mapping>

<servlet-mapping>

<servlet-name>ErrorServlet</servlet-name>

<url-pattern>/errServ</url-pattern>

Page 350: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

</servlet-mapping>

<servlet-mapping>

<servlet-name>ErrorGen</servlet-name>

<url-pattern>/errGen</url-pattern>

</servlet-mapping>

<!--error-coderelatederrorpages-->

<!--NotFound-->

<error-page>

<error-code>404</error-code>

<location>/err404</location>

</error-page>

<!--Forbidden-->

<error-page>

<error-code>403</error-code>

<location>/err403</location>

</error-page>

<!--exception-typerelatederrorpages-->

<error-page>

<exception-type>javax.servlet.ServletException</exception-type>

<location>/errServ</location>

</error-page>

<error-page>

<exception-type>java.io.IOException</exception-type>

<location>/errIo</location>

</error-page>

<!--allothertypes-->

<error-page>

<exception-type>java.lang.Throwable</exception-type>

<location>/errGen</location>

</error-page>

Page 351: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<!--web.xmlcontinues;tag-lib,resource-ref,security-constraintelements,etc.-->

</web-app>

Whenaservletthrowsanexception,thewebcontainersearchestheconfigurationsinweb.xmlthatusetheexception-typeelementforamatchwiththethrownexceptiontype.InExample9-1,ifthewebapplicationthrowsaServletException,thenthewebcontainerinvokesthe/errServservlet.Thewebcontainerinvokestheclosestmatchintheclasshierarchy.Forexample,ifaservletthrowsanIOException,thecontainerinvokesthe/errIoservletthatismappedtothethrownexceptiontype,notthecomponentmappedtojava.lang.ThrowableeventhoughIOExceptionisinthesameclasshierarchyasThrowable.IfthisapplicationthrowsanIllegalStateException,thecontainerinvokesthe/errGenservlet(whichismappedtoThrowable),becausethereisnospecificerrorpagemappingforIllegalStateException.

IntheeventofanHTTPresponsecodeof403or404,thecontainerinvokesthewebcomponentsorHTMLpagesmappedwiththelocationelementtothoseexactnumbers.

Thewebcontainermustreturnaresponsecodeof500ifanexceptionoccursthatisnothandledbythiserror-pagemechanism,accordingtotheservletAPIspecification.

SeeAlso

Recipe9.2oncreatingaservleterrorhandler;Recipe9.3onsendinganerrorfromaservlet;Recipe9.4onsendinganerrorfromaJSP;Recipe9.5onusingJSPstohandleerrors;Recipe9.6ondeclaringinaJSPthatanotherJSPwillhandleitsexceptions;Chapter1onthedeployment

Page 352: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

descriptor;theJavaservletspecification,whichcoverserrorhandlinginChapterSRV.9.9:http://java.sun.com/products/servlet/index.html.

Page 353: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe9.2CreatinganException-HandlingServlet

Problem

Youwanttocreateaservletthatgeneratesanerrorpage.

Solution

Createaservletthatdisplayssomeinformationabouttheerror,thenmapexceptiontypesand/orerrorcodestotheservletinthedeploymentdescriptor.

Discussion

Anerror-handlingservlethasaccesstoseveralrequestattributesthatitcanusetodescribetheerror.Theerrorpagealsohasaccesstotherequestandresponseobjectsassociatedwiththepagethatgeneratedtheerror.Forexample,thejava.lang.Throwableobjectassociatedwithanyexceptionscanbeaccessedwiththefollowingcode:

Throwablethrowable=(Throwable)

request.getAttribute("javax.servlet.error.exception");

Youcanaccesstheserverresponsecodewiththiscode:

Stringstatus_code=((Integer)

request.getAttribute("javax.servlet.error.status_code")).toString();

Table9-1showstherequestattributesthatanerror-handlingservlethas

Page 354: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

accessto.

Table9-1.Requestattributesavailabletoservleterrorpages

Requestattribute Javatype

javax.servlet.error.status_code java.lang.Integer

javax.servlet.error.exception_type java.lang.Class

javax.servlet.error.message java.lang.String

javax.servlet.error.exception java.lang.Throwable

javax.servlet.error.request_uri java.lang.String

javax.servlet.error.servlet_name java.lang.String

Example9-2showstheErrorGenservlet.ThewebcontainerinvokesthisservletwhenanotherservletorJSPthrowsanunhandledThrowable,accordingtotheconfigurationinExample9-1.

Example9-2.Anerror-handlingservlet

packagecom.jspservletcookbook;

importjavax.servlet.*;

importjavax.servlet.http.*;

publicclassErrorGenextendsHttpServlet{

publicvoiddoPost(HttpServletRequestrequest,

HttpServletResponseresponse)

throwsServletException,java.io.IOException{

//checktheservletexception

Page 355: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Throwablethrowable=(Throwable)

request.getAttribute("javax.servlet.error.exception");

StringservletName=(String)

request.getAttribute("javax.servlet.error.servlet_name");

if(servletName==null)

servletName="Unknown";

StringrequestUri=(String)

request.getAttribute("javax.servlet.error.request_uri");

if(requestUri==null)

requestUri="Unknown";

response.setContentType("text/html");

java.io.PrintWriterout=response.getWriter();

out.println("<html>");

out.println("<head>");

out.println("<title>Errorpage</title>");

out.println("</head>");

out.println("<body>");

if(throwable==null){

out.println("<h2>Theerrorinformationisnotavailable</h2>");

out.println("Pleasereturntothe<ahref=\""+

response.encodeURL("http://localhost:8080/home")+

"\">homepage</a>.");

}else{

out.println("<h2>Hereistheerrorinformation</h2>");

out.println(

"Theservletnameassociatedwiththrowingtheexception:"+

servletName+"<br><br>");

out.println("Thetypeofexception:"+

throwable.getClass().getName()+"<br><br>");

out.println("TherequestURI:"+requestUri+"<br><br>");

Page 356: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

out.println("Theexceptionmessage:"+throwable.getMessage());

}

out.println("</body>");

out.println("</html>");

}

publicvoiddoGet(HttpServletRequestrequest,

HttpServletResponseresponse)

throwsServletException,java.io.IOException{

doPost(request,response);

}

}

Theservletgetsareferencetothethrownexception,thendisplaysinformationsuchastheexception'sclassnameandtheexceptionmessage.TherequestURIrepresentsapartialpath(suchas/home/errGen.jsp)tothecomponentthatthrewtheexception,whichcanbeveryhelpfulfordebuggingandinformationpurposes.Figure9-1showswhatthebrowserdisplayswhenaservletthrowsanexceptionusingTomcat'swebcontainer.

Figure9-1.ErrorpageHTMLdisplayedbyanerror-handlingservlet

Page 357: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Figure9-2showstheerrorpagedisplayedbyourexampleservletwhenaJSPinthesamewebapplicationthrowsajava.lang.ArithmeticException.

Figure9-2.TheerrorpagedisplayedbyExample9-1whenaJSPthrowsanexception

SeeAlso

Page 358: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe9.1ondeclaringexceptionhandlersinthedeploymentdescriptor;Recipe9.3onsendinganerrorfromaservlet;Recipe9.4onsendinganerrorfromaJSP;Recipe9.5onusingJSPstohandleerrors;Recipe9.6ondeclaringinaJSPthatanotherJSPwillhandleitsexceptions;Chapter1onthedeploymentdescriptor;theJavaservletspecification,whichcoverserrorhandlinginChapterSRV.9.9:http://java.sun.com/products/servlet/index.html.

Page 359: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe9.3SendinganErrorfromaServlet

Problem

Youwanttouseaservlettomanuallysendaresponseerrortotheclient.

Solution

Usethejavax.servlet.HttpServletResponse.sendError()method.

Discussion

Thejavax.servlet.http.HttpServletResponseclasshastwoversionsofthesendError()method:onethattakesanintparameterrepresentingtheHTTPresponsecode(suchas500),andtheothertakinganintparameterandaStringerrormessage.TheStringparameterisusedtodisplayamessagetotheclientifanerrorpageisnotconfiguredforthatparticularresponsecode.Example9-3showstheskeletonofaservletwhosecommentedsectionsdescribevariousscenariosforsendingresponsecodes.

Usethetwo-parametermethodversion,sothatameaningfulmessageisdisplayedintheeventthattheapplicationhasnotconfiguredanerrorpageforaparticularerrorcode.

Page 360: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Example9-3.Sendingaresponsecodefromaservlet

packagecom.jspservletcookbook;

importjavax.servlet.*;

importjavax.servlet.http.*;

publicclassSenderextendsHttpServlet{

publicvoiddoPost(HttpServletRequestrequest,

HttpServletResponseresponse)throwsServletException,

java.io.IOException{

/*iftheservlettriestoaccessaresourceandfindsoutthattheclientisnot

authorizedtoaccessit-"401Unauthorized"*/

//response.sendError(401,

//"Youarenotauthorizedtoviewtherequestedcomponent");

/*iftheservlettriestoaccessaresourcethatisforbiddenforthisclientandthere

isnofurtherinformationonit-"403Forbidden"*/

//response.sendError(403,

//"Youareforbiddenfromviewingtherequestedcomponent;no

//furtherinformation");

/*iftheservlettriestoaccessaresourcethatisnotfoundgiventheclient'sprovided

URL-"404NotFound"*/

//response.sendError(404,

//"Theservercouldnotfindtherequestedcomponent");

}

publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)

throwsServletException,java.io.IOException{

doPost(request,response);

}

Page 361: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

}

IfanerrorpageisconfiguredfortheerrorcodethatyouspecifiedinthesendError()method,thewebcontainerinvokestheerrorpagemappedtothaterrorcode.Iftheerrorcodedoesnothaveanerrorpageconfiguredforitinweb.xml,thewebcontainergeneratesadefaultHTMLpagecontainingthemessageyouincludedastheStringparametertothesendError()method,asinFigure9-3.TheserverleavescookiesandotherresponseheadersunmodifiedwhenitreturnsthisHTMLtotheclient.

IfyoucallsendError()afteralreadycommittingtheresponsetotheclient(suchaswhentheresponsebuffer,atemporarystoragelocationfortheresponsedata,isfulland"auto-flushed"),sendError()throwsajava.lang.IllegalStateException.Youcansetthebuffersizewiththejavax.servlet.ServletResponse.setBufferSize()method.

Figure9-3.ServerresponsetoHttpServletResponse.sendErrorwhenthereisnoerror

pageisconfiguredfortheerrorcode

Page 362: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

SeeAlso

Recipe9.1ondeclaringexceptionhandlersinthedeploymentdescriptor;Recipe9.2ondevelopingaservleterrorhandler;Recipe9.4onsendinganerrorfromaJSP;Recipe9.5onusingJSPstohandleerrors;Recipe9.6ondeclaringinaJSPthatanotherJSPwillhandleitsexceptions;Chapter1onthedeploymentdescriptor;theJavaservletspecification,whichcoverserrorhandlinginChapterSRV.9.9:http://java.sun.com/products/servlet/index.html.

Page 363: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe9.4SendinganErrorfromaJSP

Problem

YouwanttouseaJSPtomanuallysendaresponseerrortoaclient.

Solution

UsetheresponseimplicitobjectandthesendErrormethodinsideaJSPscriptlet.

Discussion

IfyouwanttosendaresponseerrorfromaJSP,thensimplygrabtheresponseimplicitobjectinsideascriptletandcallsendError()onit.MakesurenottocallsendError()afteralreadyflushingorcommittingtheresponsetotheclient,orthemethodwillthrowajava.lang.IllegalStateException.TheJSPcodeinExample9-4,whichcouldbeastandaloneJSPorafragmentofalargerpage,resultsinthedisplayofFigure9-3whenrequestedwiththefollowingquerystring:"?client-unauthorized=true".

Example9-4.UsingtheresponseimplicitobjecttosendaresponseerrorfromaJSP

<%@tagliburi=

"http://java.sun.com/jstl/core"prefix="c"%>

<c:iftest="${param.client-unauthorized}">

Page 364: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<%response.sendError(401,

"Youarenotauthorizedtoviewtherequestedcomponent");

%>

</c:if>

SeeAlso

Recipe9.1ondeclaringexceptionhandlersinthedeploymentdescriptor;Recipe9.2ondevelopingaservleterrorhandler;Recipe9.3onsendinganerrorfromaservlet;Recipe9.5onusingJSPstohandleerrors;Recipe9.6ondeclaringinaJSPthatanotherJSPwillhandleitsexceptions;Chapter1onthedeploymentdescriptor;theJavaservletspecification,whichcoverserrorhandlinginChapterSRV.9.9:http://java.sun.com/products/servlet/index.html.

Page 365: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe9.5CreatinganError-HandlingJSP

Problem

YouwanttouseaJSPasyourerrorpageforbothservletsandJSPs.

Solution

CreateaJSPthatdisplaysinformationaboutthejava.lang.Throwablereportedbyusingthespecifiedrequestattributes,suchasjavax.servlet.error.exception.Usetheerror-pageattributeinweb.xmltomapcertainexceptiontypestotheJSP.

Discussion

AJSPcandisplayerrorinformationinthesamemannerastheservletusedinRecipe9.2.Example9-5canbeusedastheerrorpageforbothJSPsandservlets.ThissampleJSPusestheJSTLandtheELtodisplaythethrownexception'svariouscharacteristics,suchasitsfullyqualifiedclassname.

Example9-5.UsingaJSPasanerrorpage

<%@pageisErrorPage="true"%>

<%@tagliburi="http://java.sun.com/jstl/core"prefix="c"%>

<html>

<head><title>Sorryabouttheerror</title></head>

<body>

Page 366: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<h2>Sorry,WeErredHandlingYourRequest</h2>

<strong>Hereisinformationabouttheerror:</strong><br><br>

Theservletnameassociatedwiththrowingtheexception:

<c:outvalue="${requestScope[\"javax.servlet.error.servlet_name\"]}"/>

<br><br>

Thetypeofexception:

<c:outvalue=

"${requestScope[\"javax.servlet.error.exception\"].class.name}"/>

<br><br>

TherequestURI:

<c:outvalue="${requestScope[\"javax.servlet.error.request_uri\"]}"/>

<br><br>

Theexceptionmessage:

<c:outvalue=

"${requestScope[\"javax.servlet.error.exception\"].message}"/>

</body>

</html>

TheerrorpagegrabstherequestUniformResourceIndicator(URI),whichistheservletpathbeginningwiththecontextpathandnotincludinganyquerystring,withthiscode:

<c:outvalue="${requestScope[\"javax.servlet.error.request_uri\"]}"/>

Thispassesthevalueofarequestattributenamedjavax.servlet.error.request_uritothec:outJSTLtag,whichresultsintheattributevaluedisplayedintheHTML.MakesuretoescapethedoublequotesinsidetheELphrase,asin:

"${requestScope[\"javax.servlet.error.request_uri\"]"

Thecodegetsinformationabouttheexceptionfromtherequestattributesthatareautomaticallycreatedbythewebcontainerwhenthe

Page 367: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

servletorJSPthrowsanexception.Forexample,ifyouwanttoaddtheresponsestatuscodetothisinformation,thenthisnumberisavailablefromtherequestattributejavax.servlet.error.status_code.

SeeTable9-1forthecompletelistoftheseattributes.

Inaddition,thepartofExample9-5thatgetstheclassnameoftheexceptioncallsgetClass().getName()ontheThrowableobject.Figure9-4showsthebrowserdisplayofthiserrorpageafteraJSPnamederrGen.jspgeneratesanerror.

Figure9-4.AJSPerrorpagedisplaysinformationaboutathrownexception

Theweb.xmldeploymentdescriptorusesthefollowingelementtospecifythattheerrorpageofExample9-5shouldhandleany

Page 368: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

java.io.IOExceptions:

<error-page>

<exception-type>java.io.IOException</exception-type>

<location>/errHandler.jsp</location>

</error-page>

Example9-6showstheJSPthatthrowstheexception.

Example9-6.AJSPthatthrowsajava.io.IOException

<html>

<head><title>ExceptionThrower</title></head>

<body>

<h2>ThrowanIOException</h2>

<%java.io.Filefile=newjava.io.File(

"z:"+System.getProperty("file.separator")+"temp");

file.createNewFile();%>

</body>

</html>

SeeAlso

Recipe9.1ondeclaringerrorpagesinweb.xml;Recipe9.2oncreatingaspecialexception-handlingservlet;Recipe9.3onsendinganerrorfromaservlet;Recipe9.4onsendinganerrorfromaJSP;Recipe9.6ondeclaringinaJSPthatanotherJSPwillhandleitsexceptions;Chapter23onusingtheJSTL;theJSP2.0specificationanditsChapterJSP.1.4onerrorhandling:http://java.sun.com/products/jsp/.

Page 369: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe9.6DeclaringaSpecialException-HandlingJSPforOtherJSPs

Problem

YouwanttodeclareinsideofaJSPthatanotherorexternalJSPwillhandleanythrownerrors.

Solution

SetthepagedirectiveattributeerrorPagetothespecialJSPerrorpage'spathinthewebapplication.TheJSPerrorpageitselfhasitspagedirectiveattributeisErrorPagesetto"true".

Discussion

TheJSPspecificationallowsaJSPauthortodeclareatthetopofthepagethataspecialerror-handlingJSPwillhandleanyexceptionsthrownbythepagethattheyareauthoring.ThisdesignallowstheencapsulationoferrorhandlinginsideaspeciallydesignedJSP.

IfyouwanttospecificallytargetaJSPerrorpagewithinJSPcode,setthepagedirective'serrorPageattributetothetargeterrorpage'slocationinthewebapplication.Example9-7showsaJSPwithapagedirectivedeclaringerrHandler.jspasitserrorpage.

Thispagedirectivedeclarationoverridesanymatchingerror-pageconfigurationsinweb.xml.IfthisJSPthrowsanjava.io.IOExceptionandweb.xmlhasanexception-typeattributeforthatexception,thewebcontainerinvokestheerrorpagespecifiedbythepagedirectiveinsteadofanyURIspecifiedintheweb.xmlconfiguration.

Page 370: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Example9-7.AJSPthatspecifiesanotherJSPasitserrorpage

<%@pageerrorPage="/errHandler.jsp"%>

<html>

<head><title>ExceptionThrower</title></head>

<body>

<h2>ThrowanIOException</h2>

<%

java.io.Filefile=newjava.io.File("z:"+System.getProperty("file.separator")+

"temp");

file.createNewFile();%>

</body>

</html>

Theerrorpagehasaccesstoanexceptionimplicitobjectthatrepresentsthejava.lang.Throwableobjectassociatedwiththeerror.

Example9-8usestheJSTLandtheELtoshowinformationabouttheexception.SeeChapter23ifyouhavenotyetbeenintroducedtotheJSTLortheEL.

Example9-8.AJSPerrorpagenamederrHandler.jsp

<%@pageisErrorPage="true"%>

<%@tagliburi="http://java.sun.com/jstl/core"prefix="c"%>

<html>

<head><title>Sorryabouttheerror</title></head>

<body>

<h2>Sorry,WeErredHandlingYourRequest</h2>

Page 371: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<strong>Hereisinformationabouttheerror:</strong><br><br>

Theservletnameassociatedwiththrowingtheexception:

<%--JSP2.0usageonly!

<c:outvalue="${pageContext.errorData.servletName}"/>--%>

<br><br>

Thetypeofexception:

<c:outvalue="${pageContext.exception.class.name}"/>

<br><br>

TherequestURI:

<%--JSP2.0usageonly!

<c:outvalue="${pageContext.errorData.requestURI}"/>--%>

<br><br>

Theexceptionmessage:

<c:outvalue="${pageContext.exception.message}"/>

</body>

</html>

Figure9-5showstheerrHandler.jsppagedisplayedinabrowser,aftertheJSPinExample9-7hasthrownajava.io.IOExceptionwhiletryingtocreateafileonaphantomdisk.Thecommented-outsectionsofExample9-8showtheuseofthejavax.servlet.jsp.ErrorDataclass,whichallowsyoutousetheELtogetmoreinformationabouttheerror.Forexample,youcangettherequestURI(asin/home/errGen.jsp)oftheoffendingJSPwiththissyntax:

${pageContext.errorData.requestURI}

However,thisusagefailsinaJSP1.2containersuchasTomcat4.1.12,becauseitwasintroducedinJSP2.0.Thisiswhythereisanemptyspaceinthebrowserpageafter"TherequestURI:."

Figure9-5.AJSPerrorpageusingthepagedirectiveattributeserrorPageandisErrorPage

Page 372: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Youcanalsousethissyntaxtogetaccesstothejava.lang.Throwableobjectintheerrorpage:

<c:outvalue="${requestScope[

\"javax.servlet.jsp.jspException\"]}"/>

SeeAlso

Recipe9.1ondeclaringerrorpagesinweb.xml;Recipe9.2oncreatingaspecialexception-handlingservlet;Recipe9.3onsendinganerrorfromaservlet;Recipe9.4onsendinganerrorfromaJSP;Recipe9.5onusingJSPstohandleerrors;Chapter23onusingtheJSTL;ChapterJSP.1.4oftheJSP2.0specificationonerrorhandling:http://java.sun.com/products/jsp/.

Page 373: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Chapter10.ReadingandSettingCookiesIntroduction

Recipe10.1.SettingaCookiewithaServlet

Recipe10.2.CreatinganArrayfromAlloftheRequest'sCookies

Recipe10.3.SettingaCookiewithaJSP

Recipe10.4.ReadingCookieValueswithaServlet

Recipe10.5.ReadingCookieValueswithaJSP

Recipe10.6.AlteringorRemovingaCookieThatHasAlreadyBeenSet

Page 374: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Introduction

Inatypicalvisittoawebsite,ausersendsmultiplerequestsforresourcestoawebserver.Ifawebpagecontainsmanyimages(andmostdo!),thenrequestingthesinglewebpageinvolvesoneHTTPrequestfortheHTMLcodeandothertemplatetext(suchasheadlinesandphrases),followedbyseparaterequestsforeachimagethewebpagecontains.Futurerequestsforthesamepageoftenreturnversionsofthesetextandimagesthatarecachedontheclient'scomputerforthesakeofefficiency,dependingonwhetherthefetchedresourcespermitcaching.Atanyrate,theserverviewseachHTTPrequestforthesewebresourcesasseparateanddiscretefromtheotherrequests.Withouttheuseofadditionalprotocols,theserverdoesnothaveamechanismformanagingclientstate,suchastheprogressofawebuserthroughaquestionnaireorstorefront.Beingabletologicallyrelateoneormorewebrequestsasasingleusersessioniswherecookiescomein.

Acookieisasmallpieceofinformationonauser'scomputerthatawebservercanusetoidentifythatuserthenexttimehevisitsthesite.Whenauserinitiallyvisitsthecookie-enabledsite,theserverrespondswithanextraresponseheaderthatlookslike:

Set-Cookie:mycookie=1051565332678;Domain=.myorg.com;

Expires=Tue,29-Apr-200307:42:12GMT

Consequently,whentheuservisitsthesamesite,hisbrowsersendsanextrarequestheaderthatcontainsthecookieassociatedwiththatweblocation.Hereiswhattherequestheaderslooklikewhentheclientreturnstothesitethatpreviouslysetthecookie;sincetheservletcontainerisTomcat4.1.12,theCookierequestheaderalsoincludesaname/valuepairforthesession-relatedcookie(JSESSIONID):

GET/home/cookieHTTP/1.1

Accept:image/gif,image/x-xbitmap,image/jpeg,image/pjpeg,application/msword,

application/vnd.ms-powerpoint,application/vnd.ms-excel,application/pdf,*/*

Accept-Language:en-us

Page 375: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Accept-Encoding:gzip,deflate

User-Agent:Mozilla/4.0(compatible;MSIE5.5;WindowsNT4.0)

Host:localhost:9000

Connection:Keep-Alive

Cookie:JSESSIONID=F80F0F571FDE4873CFF3FF0B842D4938;mycookie=1051610231064

Acookiecontainsanameandavalue;thecookiecanalsohaveseveralotheroptionalattribute/valuepairs,whichareseparatedbysemicolons:

Domain

Specifiesthedomaintowhichthiscookiewillbesentinfuturerequests,asinDomain=.jspservletcookbook.com.ThedefaultvalueofthisoptionalattributeisthehostnameofthedomainthathassenttheSet-Cookieheader.

Path

Furtherdelineatesthepartofthewebsitethat,whenrequested,issentthecookiebytheclient.Mostcookiesgivethisattributeavalueof/.Forexample,ifonlythecustomercontextpathshouldreceivethecookie,thentheSet-Cookieheaderwouldincludethepath=/customerattribute/valuepair.Theclientwouldnotsendthecookievaluewhenmakinganyrequeststothedomainthatdonotincludethe/customercontextpath.

Expires

Specifiesthemaximumamountoftimetheuser'sbrowsershouldkeepthecookie.Thisattributeisadatestringrepresentingafuturedate.IfExpiresspecifiesapastdate,thenthecookieisdeleted.TheJavaCookieAPImanagesthisattributebycallingtheCookie

Page 376: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

object'ssetMaxAge()method(seeRecipe10.1).

Version

Anoptionalvalueof0forNetscape'spreliminaryspecificationand1fortheRFC2109document.

Secure

TrueifthecookiecanbesentonlyoverasecureconnectionsuchasHTTPS.

Comment

Mayhaveasavalueadescriptionofthecookie'spurpose.

Abrowserisexpectedtosupport20cookiesforeachwebserver,300cookiestotal,andmaylimitcookiesizeto4KBeach,accordingtothejavax.servlet.http.CookieAPIdocumentation.Thecookienameandvaluecombinetorepresentthe4-KBlimit,accordingtotheNetscapepreliminaryspecification.Atypicalcookieisfarlessthan4KBinsize.

Theusercanalsodisablecookies,sothathisbrowserdoesnotsaveanyofthecookiesinaweb-serverresponse.Forexample,inNetscape7.1,themenucombinationEdit Preferences Privacy&SecurityCookiesallowsyoutopreventtheacceptanceofcookiesbychoosingthe"Disablecookies"radiobutton.Inthiscase,thewebdeveloperuses"URLrewriting"foranyclientsthathavedisabledcookies(seeRecipe11.7andRecipe11.8).

Page 377: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

TheJavaservletAPIabstractsacookieasanobjectoftypejavax.servlet.http.Cookie.Therecipesinthischaptershowhowtocreatenewcookies,aswellasreadoralterexistingcookies,withbothservletsandJSPs.

Page 378: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe10.1SettingaCookiewithaServlet

Problem

Youwanttosetacookieusingaservlet.

Solution

Createthejavax.servlet.http.Cookieobjectinaservlet,thensetthecookieonauser'smachinewiththejavax.servlet.http.HttpServletResponse.addCookie(Cookie

cookie)method.

Discussion

Insidetheservlet,createtheCookiebyinstantiatinganewCookieandcallingitssetter(ormutator)methods.TheCookieconstructorincludesthenameandvalueforthecookie:

Cookiecookie=newCookie("mycookie","the1cookie");

Example10-1createsacookieandsetsitspathattribute(asin:cookie.setPath(Stringpath))tothenameofthecontextpath(asin/home).Withthispathsetting,theclientwillnotsendthecookietotheserverunlesstheclientrequestsresourceswithinthespecifiedcontextpath.ThecodeusesHttpServletRequest.getContextPath()toprovidethevalueforthecookie'spathattribute.

Example10-1.Aservletthatsetsacookieanddisplayssomecookieinformation

Page 379: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

packagecom.jspservletcookbook;

importjavax.servlet.*;

importjavax.servlet.http.*;

publicclassCookieServletextendsHttpServlet{

publicvoiddoGet(HttpServletRequestrequest,

HttpServletResponseresponse)throwsServletException,

java.io.IOException{

Cookiecookie=null;

//GetanarrayofCookiesassociatedwiththisdomain

Cookie[]cookies=request.getCookies();

booleannewCookie=false;

//Getthe'mycookie'Cookieifitexists

if(cookies!=null){

for(inti=0;i<cookies.length;i++){

if(cookies[i].getName().equals("mycookie")){

cookie=cookies[i];

}

}//endfor

}//endif

if(cookie==null){

newCookie=true;

//Getthecookie'sMax-Agefromacontext-paramelement

//Ifthe'cookie-age'paramisnotsetproperly

//thensetthecookietoadefaultof-1,'neverexpires'

intmaxAge;

try{

maxAge=newInteger(

getServletContext().getInitParameter(

"cookie-age")).intValue();

}catch(Exceptione){

Page 380: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

maxAge=-1;

}//try

//CreatetheCookieobject

cookie=newCookie("mycookie",""+getNextCookieValue());

cookie.setPath(request.getContextPath());

cookie.setMaxAge(maxAge);

response.addCookie(cookie);

}//endif

//getsomeinfoaboutthecookie

response.setContentType("text/html");

java.io.PrintWriterout=response.getWriter();

out.println("<html>");

out.println("<head>");

out.println("<title>Cookieinfo</title>");

out.println("</head>");

out.println("<body>");

out.println(

"<h2>Informationaboutthecookienamed\"mycookie\"</h2>");

out.println("Cookievalue:"+cookie.getValue()+"<br>");

if(newCookie){

out.println("CookieMax-Age:"+cookie.getMaxAge()+"<br>");

out.println("CookiePath:"+cookie.getPath()+"<br>");

}

out.println("</body>");

out.println("</html>");

}

privatelonggetNextCookieValue(){

//returnsthenumberofmillesecondssinceJan1,1970

Page 381: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

returnnewjava.util.Date().getTime();

}

publicvoiddoPost(HttpServletRequestrequest,

HttpServletResponseresponse)throwsServletException,

java.io.IOException{

doGet(request,response);

}

}

Example10-1usesCookie.setMaxAge(intage)tospecifywhenthecookiewillexpireorbedeletedbythebrowser.Themethodparameterrepresentsthemaximumnumberofsecondsthatthecookiewillliveontheuser'smachineafteritiscreated.Theexamplecodegetsthevalueforthismethodfromacontext-paramelementinweb.xml,whichallowsawebdevelopertoconfigureoroptionallychangethisvalueinthedeploymentdescriptor.Hereisanexampleofacontext-paramelementthatprovidesavalueforacookie'sage:

<context-param>

<param-name>cookie-age</param-name>

<param-value>31536000</param-value>

</context-param>

Forexample,ifyouwantedthecookietolingerforoneyear(365x24x60x60seconds),youcouldusethiscode:

cookie.setMaxAge(31536000);

Userscandeleteacookiefromtheirmachine,regardlessofthemaximumagethatyouhavecreatedforit.Somebrowsersprovideawindowintoauser'scookies,withfeaturesthatallowtheusertoremoveoneormorecookies.Don'tassumethatbecauseyousetamaximumage,thecookiewillalwaysbeavailableonusers'machines.

Page 382: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Example10-1alsochecksfortheexistenceofacookieofthesamenamethatthecodeplanstogivethenewcookie(mycookie).Iftheuserhasnotalreadysentthemycookiecookie,thentheservletsetsanewcookieanddisplayssomeofthecookie'svaluesafterward.

Figure10-1showstheservletoutput.

Figure10-1.Aservletshowsinformationaboutanewcookie

ThecookievalueisarbitrarilysettoaStringshowingalargenumber,justtodemonstratehowtoprovidethevalueforacookie.Asmanycookiesneeduniquevalues,youcoulduseamethodwherebytheuser'semailaddressoruniquedatabaseIDisencodedandthenusedasthecookievalue.

SeeAlso

Recipe10.3onsettingacookiewithaJSP;Recipe10.4onusingaservlettoreadcookies;Recipe10.5onreadingcookievalueswithaJSP;Recipe10.6onalteringorremovinganexistingcookie;theRFC2109

Page 383: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

documentdealingwithcookies:ftp://ftp.rfc-editor.org/in-notes/rfc2109.txt;Netscape'spreliminaryspecificationforcookies:http://wp.netscape.com/newsref/std/cookie_spec.html;theJavaCookieAPI:http://java.sun.com/j2ee/1.4/docs/api/javax/servlet/http/Cookie.html.

Page 384: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe10.2CreatinganArrayfromAlloftheRequest'sCookies

Problem

Youwanttostoreallofthecookiescontainedbyaclient'srequestinaCookiearray.

Solution

UsetheHttpServletRequest.getCookies()method,whichreturnsanarrayofjavax.servlet.http.Cookieobjects.

Discussion

TocreateanarrayofCookiesrepresentingallofthecookiesincludedinarequest,usetheHttpServletRequest.getCookies()method.YoucanthenaccessthenameandvalueofacookiebycallingtheCookieclass'sgetName()andgetValue()methods.

ThecodeforaccessinganarrayofCookieslookslikeExample10-2.

Example10-2.CreatingaCookiearray

//servlet'sdoGetmethod

publicvoiddoGet(HttpServletRequestrequest,

HttpServletResponseresponse)throwsServletException,

java.io.IOException{

Page 385: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Cookiecookie=null;

//GetanarrayofCookiesassociatedwiththisdomain

Cookie[]cookies=request.getCookies();

//Checkforanullvalue,thendosomethingwithanyCookies

if(cookies!=null){//readeachCookievalue

}

//restoftheservlet

Onceacookiehasalreadybeencreated,thenexttimetheusersendsthecookieasarequestheader,theonlyinformationyoucanextractfromtheCookieobjectisitsnameandvalue.Youwillnotbeabletoderivethecookie'smaximumagefromtherequestheader,becausealltheheaderwillcontainistheCookieobject:headername,thenthenameandvalueofthecookie.

SeeAlso

Recipe10.1onsettingacookiewithaservlet;Recipe10.3onsettingacookiewithaJSP;Recipe10.4onusingaservlettoreadcookies;Recipe10.5onreadingcookievalueswithaJSP;Recipe10.6onalteringorremovinganexistingcookie;theRFC2109documentdealingwithcookies:ftp://ftp.rfc-editor.org/in-notes/rfc2109.txt;Netscape'spreliminaryspecificationforcookies:http://wp.netscape.com/newsref/std/cookie_spec.html;theJavaCookieAPI:http://java.sun.com/j2ee/1.4/docs/api/javax/servlet/http/Cookie.html.

Page 386: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe10.3SettingaCookiewithaJSP

Problem

YouwanttouseaJSPtosetacookieonaclient.

Solution

WrapaJavaBeanaroundtheservletAPIforcreatingcookies.ThenusethebeanintheJSPwiththejsp:useBeanstandardaction.

Discussion

AJSPcanuseaJavaBeantocreatethecookieandsetthecookieontheclient.Example10-3createsaninstanceofaJavaBeanoftypecom.jspservletcookbook.CookieBeanusingthejsp:useBeanstandardaction.ThentheJSPsetsafewbeanproperties.ThebeanwillpassthroughthepropertyvaluestothecookiethatitisgeneratingfortheJSP.TheJSPusesjsp:setPropertytosetthefollowingcookieproperties:

Thecookiename(bakedcookieinthecode).

Themaximumnumberofsecondsthebrowserwillholdontothecookie(roughlyoneyearinExample10-2).Thisnumberisconvertedtoareadablefuturedateforthecookie'sExpiresattribute.

Thepathontheserverassociatedwiththiscookie.OncetheJSPhassentthiscookietotheclient,theclientwillreturntheassociated

Page 387: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

cookieonlyintherequestheadersforrequeststhatcontainthespecifiedcontextpath(suchas/home).Forexample,ifthecookieissetbytheJSPfileto/home/cookieSet.jsp,onlyrequestsforresourcesin/homewillincludeaCookieheader.

Example10-3.AJSPthatsendsacookietoaclient

<jsp:useBeanid="cookieBean"class="com.jspservletcookbook.CookieBean"/>

<jsp:setPropertyname="cookieBean"property="name"value="bakedcookie"/>

<%--set'Expires'attributetoaboutoneyearfromnow--%>

<jsp:setPropertyname="cookieBean"property="maxAge"value=

"<%=(365*24*60*60)%>"/>

<jsp:setPropertyname="cookieBean"property="path"value="<%=request.getContextPath()

%>"/>

<jsp:setPropertyname="cookieBean"property="cookieHeader"value="<%=response%>"/>

<html>

<head><title>CookieMaker</title></head>

<body>

<h2>Hereisinformationaboutthenewcookie</h2>

Name:<jsp:getPropertyname="cookieBean"property="name"/><br>

Value:<jsp:getPropertyname="cookieBean"property="value"/><br>

Path:<jsp:getPropertyname="cookieBean"property="path"/>

</body>

</html>

TheJSPpassesalongtheHttpServletResponseobjecttoitswrapperbean,sothatthebeancancallresponse.addCookie(Cookiecookie)tosendtheclientthenewcookie.Theresponseobjectispassedtothebeanusingthiscode(seethesetCookieHeader()methodinExample10-4):

<jsp:setPropertyname="cookieBean"property="cookieHeader"value=

"<%=response%>"/>

ThebottomoftheJSPdisplayssomeofthenewcookie'svalues.Figure10-2showstheJSP'soutputinawebbrowser.Repeatedlyrequesting

Page 388: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

theJSPwilloverwritetheexistingcookiewithanewone.

Figure10-2.AJSPshowsinformationaboutanewcookie

Example10-4showsthecodefortheCookieBeanitself,whichisratherlengthyduetoallthegetterandsettermethods.

ThisJavaBeanclassmustbeplacedintheWEB-INF/classesdirectoryofthewebapplication(includingadirectorystructurethatmatchesthebean'spackagename)sothatthewebcontainercanloadtheclass.ThebeancouldalsobearchivedinaJARfilethatisplacedinWEB-INF/lib;however,theJARwouldstillhavetocontainadirectorystructurethatmatchesthebean'spackagename.

YoucansetthecookievalueintheJSP(whichisnotdoneinExample10-3)bycallingthebean'ssetValue(Stringvalue)methodviajsp:setProperty:

<jsp:setPropertyname="cookieBean"property="value"value="newvalue"/>

ThebeanhastoimporttheCookieandHttpServletResponseclasses,becauseitusesthemtomakethenewcookie,thensendthecookietotheclient.Example10-4wrapsitsownmethodsaroundsome

Page 389: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

oftheCookieclassmethods,suchassetValue()andsetMaxAge().

Example10-4.AJavaBeanformakingcookies

packagecom.jspservletcookbook;

importjavax.servlet.http.HttpServletResponse;

importjavax.servlet.http.Cookie;

publicclassCookieBean{

privateCookiecookie=null;

publicCookieBean(){}

//setthecookiename

publicvoidsetName(Stringname){

if(name==null||(name.equals("")))

thrownewIllegalArgumentException(

"Invalidcookienamesetin:"+getClass().getName());

cookie=newCookie(name,""+newjava.util.Date().getTime());

}

//setthecookievalue

publicvoidsetValue(Stringvalue){

if(value==null||(value.equals("")))

thrownewIllegalArgumentException(

"Invalidcookievaluesetin:"+getClass().getName());

if(cookie!=null)

cookie.setValue(value);

}

Page 390: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

publicvoidsetMaxAge(intmaxAge){

if(cookie!=null)

cookie.setMaxAge(maxAge);

}

publicvoidsetPath(Stringpath){

if(path==null||(path.equals("")))

thrownewIllegalArgumentException(

"Invalidcookiepathsetin:"+getClass().getName());

if(cookie!=null)

cookie.setPath(path);

}

publicvoidsetCookieHeader(HttpServletResponseresponse){

if(response==null)

thrownewIllegalArgumentException(

"InvalidHttpServletResponsesetin:"+getClass().getName());

if(cookie!=null)

response.addCookie(cookie);

}

publicStringgetName(){

if(cookie!=null)

returncookie.getName();

else

return"unavailable";

}

publicStringgetValue(){

Page 391: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

if(cookie!=null)

returncookie.getValue();

else

return"unavailable";

}

publicStringgetPath(){

if(cookie!=null)

returncookie.getPath();

else

return"unavailable";

}

}

IftheJSPfailstousejsp:setPropertytocallthebean'ssetCookieHeader(HttpServletResponseresponse)method,thenthecookieiscreatedbutneverincludedintheresponseheaderssenttotheclient.Inthisdesign,youallowtheusertosetsomeoptionalcookieattributes(suchasPath)beforesheexplicitlysendsthecookieaspartoftheresponse.

SeeAlso

Recipe10.1onsettingacookiewithaservlet;Recipe10.2oncreatinganarrayfromalloftherequest'scookies;Recipe10.4onusingaservlettoreadcookies;Recipe10.5onreadingcookievalueswithaJSP;Recipe10.6onalteringorremovinganexistingcookie;theRFC2109documentdealingwithcookies:ftp://ftp.rfc-editor.org/in-notes/rfc2109.txt;Netscape'spreliminaryspecificationforcookies:http://wp.netscape.com/newsref/std/cookie_spec.html;theJavaCookieAPI:http://java.sun.com/j2ee/1.4/docs/api/javax/servlet/http/Cookie.html.

Page 392: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe10.4ReadingCookieValueswithaServlet

Problem

Youwanttoreadcookievaluesfromaclientusingaservlet.

Solution

CreateaJavaarrayofjavax.servlet.http.CookieobjectsbycallingtheHttpServletRequest.getCookies()method.Thencyclethroughthearray,accessingeachcookieandvalueasneeded.

Discussion

ThewebuserwillsendcookiestoawebsiteonlyiftheuseroriginallyreceivedSet-Cookieheadersfromthatdomain.Inaddition,ifthecookiewassetwithaPathattributespecifyingacontextpath,thentheservletcanaccessthecookieonlyiftheservletisalsoassociatedwiththecontextpath.Asaresult,alwaystestthereturnvalueoftherequest.getCookies()method(whichreturnsanarrayofCookieobjects)toseeifitisnull,indicatingthattheuserhasnotsentanycookies,beforeoperatinguponit.

Example10-5displaysthevalueofanyfoundcookiesinawebbrowser.TheCookieReaderclassusesthejavax.servlet.http.Cookie.getName()andgetValue()methodsinordertodisplaythisinformation.

Page 393: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Example10-5.Acookie-readingservlet

packagecom.jspservletcookbook;

importjavax.servlet.*;

importjavax.servlet.http.*;

publicclassCookieReaderextendsHttpServlet{

publicvoiddoGet(HttpServletRequestrequest,

HttpServletResponseresponse)throwsServletException,

java.io.IOException{

Cookiecookie=null;

//GetanarrayofCookiesassociatedwiththisdomain

Cookie[]cookies=request.getCookies();

booleanhasCookies=false;

//ifcookiescontainsanarrayandnotanullvalue,

//thenwecandisplayinformationaboutthecookies.

if(cookies!=null)

hasCookies=true;

//displaythename/valueofeachcookie

response.setContentType("text/html");

java.io.PrintWriterout=response.getWriter();

out.println("<html>");

out.println("<head>");

out.println("<title>Cookieinformation</title>");

out.println("</head>");

out.println("<body>");

if(hasCookies){

out.println(

"<h2>Thenameandvalueofeachfoundcookie</h2>");

Page 394: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

for(inti=0;i<cookies.length;i++){

cookie=cookies[i];

out.println(

"Nameofcookie#"+(i+1)+":"+cookie.getName()+"<br>");

out.println(

"Valueofcookie#"+(i+1)+":"+

cookie.getValue()+"<br><br>");

}//for

}else{

out.println(

"<h2>Thisrequestdidnotincludeanycookies</h2>");

}

out.println("</body>");

out.println("</html>");}

publicvoiddoPost(HttpServletRequestrequest,

HttpServletResponseresponse)throwsServletException,

java.io.IOException{

doGet(request,response);

}

}

Thejavax.servlet.http.Cookieclassisanabstractionofacookiethathasgetterandsettermethodsforacookie'sattributes,suchasitsname,value,path,andsecureattributes.However,whenyouretrieveacookie,youcanonlygetitsnameandvalue,becausethisistheonlyinformationthattheclientincludesintherequestheader.TheCookierequestheaderlookslike:

Cookie:JSESSIONID=F80F0F571FDE4873CFF3FF0B842D4938;mycookie=1051610231064

Forexample,callingCookie.getPath()onaretrievedcookiewillreturnnull,evenifthecookiewasoriginallysetwithavalidpathattribute,suchas/mypath.YoucanonlyaccessthesevaluesintheservletorJSPthatcreatesthecookieobjectinthefirstplace(seeRecipe

Page 395: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

10.1andRecipe10.3).

Figure10-3showshowawebbrowserdisplaysthisservlet'soutput.

Figure10-3.Aservletdisplayscookieinformation

SeeAlso

Recipe10.1onsettingacookiewithaservlet;Recipe10.2oncreatinganarrayfromalloftherequest'scookies;Recipe10.3onsettingacookiewithaJSP;Recipe10.5onreadingcookievalueswithaJSP;Recipe10.6onalteringorremovinganexistingcookie;theRFC2109documentdealingwithcookies:ftp://ftp.rfc-editor.org/in-notes/rfc2109.txt;Netscape'spreliminaryspecificationforcookies:http://wp.netscape.com/newsref/std/cookie_spec.html;theJavaCookieAPI:http://java.sun.com/j2ee/1.4/docs/api/javax/servlet/http/Cookie.html.

Page 396: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe10.5ReadingCookieValueswithaJSP

Problem

YouwanttoreadcookievalueswithaJSP.

Solution

UsetheJSTLanditscookieimplicitobjecttodisplaythenameandvalueofanycookiesfoundintherequest.

Discussion

TheJSTLanditsELhaveacookieimplicitobject(avariablethatisautomaticallyavailabletoJSPorELcode)thatyoucanuseinJSPstodisplayanycookienamesandvalues.FormoreinformationontheJSTLandEL,seeChapter23.

YoucanaccessthecookieimplicitobjectinJSPcodethisway:

${cookie}

Thisimplicitobjectevaluatestoajava.util.Maptypewhosevaluesyoucaniterateoverwiththec:forEachJSTLtag.Eachiterationofc:forEachreturnsajava.util.Map.Entry,whichencapsulatesakey/valuepair.Thekeyisthenameofthecookie;thevalueisajavax.servlet.http.Cookieobject.

Example10-6usesthiscodetoretrieveaCookieobjectfromtheMapofavailablecookies:

Page 397: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<c:forEachvar="cookieVal"items="${cookie}">

Thevarattributeofc:forEachcontainsaMap.Entryobjectwhosekeyisthecookiename;thevalueistheCookieobject.Thecodeusesc:outtagstodisplaythecookienamesandvaluesintheJSP.Thisoddsyntaxdisplaysthevalueofeachcookie:

<c:outvalue="${cookieVal.value.value}"/>

ThecodecookieVal.valueevaluatestothejavax.servlet.http.Cookieobject.Thefullphrase${cookieVal.value.value}istheequivalentofcallingCookie.getValue().

Example10-6.AJSPthatreadscookienamesandvalues

<%@tagliburi="http://java.sun.com/jstl/core"prefix="c"%>

<html>

<body>

<%--checkwhethertherequestcontainsanycookies--%>

<c:choose>

<c:whentest="${emptycookie}">

<h2>Wedidnotfindanycookiesintherequest</h2>

</c:when>

<c:otherwise>

<h2>Thenameandvalueofeachfoundcookie</h2>

<c:forEachvar="cookieVal"items="${cookie}">

<strong>Cookiename:</strong><c:outvalue="${cookieVal.key}"/><br>

<strong>Cookievalue:</strong><c:outvalue=

"${cookieVal.value.value}"/><br><br>

</c:forEach>

</c:otherwise>

</c:choose>

Page 398: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

</body>

</html>

Figure10-4showstheJSPdisplayingtheavailablecookieinformation.

Figure10-4.OutputofthecookieReader.jsppage

MakesuretoincludethetaglibdirectivefortheJSTLcorelibraryatthetopofyourJSP,sothatyoucanusetheJSTLtagstoviewanycookievalues:

<%@tagliburi=

"http://java.sun.com/jstl/core"prefix="c"%>

Useuri=http://java.sun.com/jsp/jstl/corewhenusingJSTL1.1

SeeAlso

Recipe10.1onsettingacookiewithaservlet;Recipe10.2oncreatinganarrayfromalloftherequest'scookies;Recipe10.3onsettingacookiewithaJSP;Recipe10.4onusingaservlettoreadcookies;Recipe10.6onalteringorremovinganexistingcookie;theRFC2109

Page 399: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

documentdealingwithcookies:ftp://ftp.rfc-editor.org/in-notes/rfc2109.txt;Netscape'spreliminaryspecificationforcookies:http://wp.netscape.com/newsref/std/cookie_spec.html;TheJavaCookieAPI:http://java.sun.com/j2ee/1.4/docs/api/javax/servlet/http/Cookie.html.

Page 400: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe10.6AlteringorRemovingaCookieThatHasAlreadyBeenSet

Problem

Youwanttooverwriteorremoveanexistingcookie.

Solution

Sendacookiewiththesamenameandpathasanexistingcookietooverwritetheexistingcookie.Todeleteacookie,sendacookiewiththesamenameandpathbutsettheExpiresattributetoadateinthepast.

Discussion

Youcanoverwriteacookieandoptionallyprovidedifferentvaluesforitsattributes(suchasthecookievalue)byincludingacookieinaresponseheaderthathasthesamenameandpathasanexistingcookie.Forexample,imagineaservlethassetacookieontheclientwiththefollowingresponseheader:

Set-Cookie:newcookie=1051642031398;Expires=Wed,28-Apr-200418:47:11GMT;Path=/home

Thiscookiecanbeoverwrittenontheclientbychangingitscookievalue,butnotthenameandpath:

Set-Cookie:newcookie=A1lnew;Expires=Wed,28-Apr-200418:52:50GMT;Path=/home

Thisresponseheaderwillreplacenewcookiewithacookieofthesamename.Thenewversionhasanewvalue(A1lnew)andanExpiresattributevalue.

Page 401: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

DeletingaCookie

YoucandeleteacookiebysendingaresponseheadertotheclientwiththesamecookienameandPathvalue,butwithanExpiresattributevaluethatrepresentsadateinthepast.WithJava'sCookieAPI,yousimplycallthejavax.servlet.http.Cookie.setMaxAge()methodwithanargumentvalueof0.Example10-7istheJSPofRecipe10.2.ThistimetheJSPisdeletingmycookiebysettingthemaxAgepropertyto0usingjsp:setProperty.

Example10-7.Deletinganexistingcookie

<jsp:useBeanid="cookieBean"class="com.jspservletcookbook.CookieBean"/>

<jsp:setPropertyname="cookieBean"property="name"value="mycookie"/>

<%--deletethecookiebycallingCookie.setMaxAge(0)--%>

<jsp:setPropertyname="cookieBean"property="maxAge"value="0"/>

<jsp:setPropertyname="cookieBean"property="value"value="finished"/>

<jsp:setPropertyname="cookieBean"property="path"value=

"<%=request.getContextPath()%>"/>

<jsp:setPropertyname="cookieBean"property="cookieHeader"value=

"<%=response%>"/>

<%--restofJSPcontinues--%>

CookiescanbedeletedonlybyaSet-Cookieresponseheaderemanatingfromthesamedomainthatcreatedthecookie,withthesamecookienameandPathattribute.HereiswhattheresponseheaderfromthedeletingJSPlookslike:

HTTP/1.1200OK

Content-Type:text/html;charset=ISO-8859-1

Set-Cookie:mycookie=finished;Expires=Thu,01-Jan-197000:00:10GMT;Path=/home

Transfer-Encoding:chunked

Date:Tue,29Apr200319:18:59GMT

Server:ApacheCoyote/1.0

Page 402: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

NotethattheExpiresattributevalueisadateinthepast.Asaresult,theclientwillnolongersendthemycookiecookieinitsrequestheaderswhenitmakesarequesttothesamedomainatthe/homecontextpath.However,itmaysendothercookies(withdifferentnames)thatwerecreatedduringpriorvisitstothesamedomainandcontextpath.

Thebrowserusercandeleteacookiefromhismachineanytimehewants,soalwaysplanaccordingly.

SeeAlso

Recipe10.1onsettingacookiewithaservlet;Recipe10.2oncreatinganarrayfromalloftherequest'scookies;Recipe10.3onsettingacookiewithaJSP;Recipe10.4onusingaservlettoreadcookies;Recipe10.5onreadingcookievalueswithaJSP;theRFC2109documentdealingwithcookies:ftp://ftp.rfc-editor.org/in-notes/rfc2109.txt;Netscape'spreliminaryspecificationforcookies:http://wp.netscape.com/newsref/std/cookie_spec.html;theJavaCookieAPI:http://java.sun.com/j2ee/1.4/docs/api/javax/servlet/http/Cookie.html.

Page 403: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Chapter11.SessionTracking

Introduction

Recipe11.1.SettingtheSessionTimeoutinweb.xml

Recipe11.2.SettingtheSessionTimeoutinAllTomcatWebApplications

Recipe11.3.SettingtheSessionTimeoutProgrammatically

Recipe11.4.CheckingifaSessionExistsinanHttpServletRequest

Recipe11.5.TrackingSessionActivityinServlets

Recipe11.6.TrackingSessionActivityinJSPs

Recipe11.7.UsingURLRewritinginaJSP

Recipe11.8.UsingURLRewritinginaServlet

Recipe11.9.UsingaListenertoTracktheSessionLifecycle

Recipe11.10.UsingaListenertoMonitorSessionAttributes

Recipe11.11.UsingaFiltertoMonitorSessionAttributes

Page 404: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Introduction

ThischapterdescribeshowtomonitorsessionsinservletsandJSPs.Asessionrepresentsaninteractionbetweenawebuserandawebapplication.TheHypertextTransferProtocol(HTTP)isastatelessprotocol,meaningthatitisnotdesignedtomaintainstate,ortheprogressofasingleuserassheinteractswithawebserverbyexchangingHTTPrequestsandresponses.EachrequestforaJSPorservlet,atleastfromtheHTTPserver'spointofview,isconsideredseparatefromotherrequestsandnotassociatedwiththesameuser.Manywebapplications,however,needtofollowauser'sprogressstepbystepthroughouttheapplication,tokeeptrackofherpurchaseditemsand/orpreferences.

Forexample,whenauserbuysbooksatAmazon.com,thewebsitemonitorswhatisaddedtoorremovedfromthecustomer'sshoppingcartandusesthisinformationduringthecheckoutandpaymentprocess.Inaddition,Amazon.comshowsuserswhichbookstheyhavelookedatduringtheircurrentsession.Sequentialvisitsbyasingleusertoane-commercesitelikethisareconsideredpartsofonesession.

Webapplicationscommonlyusecookiesinordertoimplementsessions.Allservletcontainershavetosupporttheuseofcookiestotracksessions,accordingtotheServletv2.3and2.4specifications.Acookieisasmallpieceofinformationthatisstoredbytheclientwebbrowserinresponsetoaresponseheaderissuedbythewebserver.CookiesaredescribedinmoredetailinChapter10,butsincetheyarecentraltothesessionconcept,Iincludeabriefoverviewoftheiruseinsessiontrackinghere.

Whenauserrequestsapagefromawebserver,theserverrespondswithacollectionofname/valuepairscalledresponseheaders,alongwiththeHTMLresponse.TheseheadersmayincludeonelabeledSet-Cookie,whichrequeststhattheclientstoresomestateinformationlocally.TheonlyrequiredelementoftheSet-CookieHTTPresponseheaderisthecookienameandvalue.Thecookiemayincludeother

Page 405: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

piecesofinformationseparatedbysemicolons.ThecookiethatJavawebcontainerssetinordertoimplementsessiontrackinglookslikejsessionid=cookie-value,wherecookie-valueisusuallyalongnumericstringofbytesusinghexadecimalnotation.Accordingtotheservletspecificationv2.3,thiscookie'snamemustbeJSESSIONID.Somewebcontainersgeneratethenameinlowercase,however,likeTomcat.Atypicalsession-relatedcookielookslikethefollowing:

jsessionid=3CAF7CD0A0BFF5076B390CCD24FD8F0D

ThecookievaluerepresentsthesessionID.ThisIDuniquelyidentifiestheuserfortheperiodwhenheismakingrequeststothewebserver.Forexample,if10usersareinteractingwiththewebapplicationatthesametime,thewebserverassignsthem10uniquesessionIDs.Additionally,ifapersonsitsdownathisPCandconnectswiththewebapplicationusingInternetExplorer,thenmovesovertoaconnectedlaptopandopensupSafaritothesamewebapplication,thosebrowserswillbeassociatedwithtwodifferentsessionIDs.Thewebserverdoesnothaveanywayofknowingthatthesamepersonisinteractingwiththewebapplicationfromtwodifferentbrowsersatthesametime,particularlyifheisconnectingfrombehindaproxyserver.However,aslongastheuserworkswithasinglebrowserandthatuser'ssessionhasnotyettimedout,awebservercantrackthatuser'sactions,andassociatethemasonesession.

DisabledCookies

Whatiftheuserblockscookies?Webbrowserstypicallyallowthedisablingofcookiesintheuserpreferences.ServersmayalsousetheSecureSocketsLayer(SSL),whichhasabuilt-insession-trackingmechanism.Inaddition,URLrewritingisacommonfallbackmethodofsessiontracking.URLrewritinginvolvesaddingthesessionIDasapathparametertotheURLwhenlinkingfromonepagetothenext,sothatthenextpagehasaccess(withoutcookies)tothesessionID.TheseURLslooklikethis:

/home/default.jsp;jsessionid=3CAF7CD0A0BFF5076B390CCD24FD8F0D

Page 406: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

AsmostpagerequestsineverydaywebusearenotmadeusingSSL,youshouldcodeyoursessiontracking-relatedwebcomponentstoaccommodateURLrewriting.

Page 407: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe11.1SettingtheSessionTimeoutinweb.xml

Problem

Youwanttoconfigureatimeoutperiodforthewebapplicationinthedeploymentdescriptor.

Solution

Createasession-configelementinweb.xml.

Discussion

Thelengthoftimethatasessionlastsbeforetheserverinvalidatesthesessionandunbindsanyofitsobjectsisanimportantcomponentofyourwebapplication.InTomcat4.1.x,thedefaulttimeoutperiodforasessionis30minutes.Ifanyrequeststhatareassociatedwiththesessionhavebeeninactiveforthatperiod,thesessiontimesout.Iftheuserdecidestoreturntothewebapplicationafter30minutes,usingthesamebrowser,thenanewsessioniscreatedforhim.Example11-1showshowtosetyourowntimeoutperiodforsessions.

Example11-1.Configuringthesessiontimeout

<?xmlversion="1.0"encoding="ISO-8859-1"?>

<!DOCTYPEweb-app

PUBLIC"-//SunMicrosystems,Inc.//DTDWebApplication2.3//EN"

"http://java.sun.com/dtd/web-application_2_3.dtd"

Page 408: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

>

<web-app>

<!--filter,listener,servlet,andservlet-mappingelementsprecedesession-config-->

<session-config>

<session-timeout>15</session-timeout>

</session-config>

</web-app>

Placeonenestedsession-timeoutelementwithinthesession-config.Thetimeoutisexpressedasminutes,andoverridesthedefaulttimeout(whichis30minutesinTomcat,forexample).However,theHttpSession.getMaxInactiveInterval()methodinaservletreturnsthetimeoutperiodforthatsessioninseconds;ifyoursessionisconfiguredinweb.xmlfor15minutes,getMaxInactiveInterval()returns900.

Anotherwaytoconfigureatimeoutvalueforaservletistousetheinit-paramelementinweb.xml,asshowninExample11-2.

Example11-2.Addinganinit-paramtoaservlettosetasessiontimeoutinterval

<servlet>

<servlet-name>Cart</servlet-name>

<servlet-class>com.jspservletcookbook.TimeoutSession</servlet-class>

<init-param>

<param-name>timeout</param-name>

<param-value>600</param-value>

</init-param>

</servlet>

Theservletelementinthiswebapplication'sweb.xmlfilehasanested

Page 409: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

init-param,whichcreatesaparametercalledtimeout.TheCartservlettakestheparametervalue(600seconds,equivalentto10minutes)andpassesittothesession.setMaxInactiveInterval(intseconds)method.Example11-3showsthedoGet()methodoftheservlet,whichsetsthesessiontimeoutvariabletotheconfiguredparametervalue.

Example11-3.Usinginitparameterstosetaservlet'ssessiontimeout

publicvoiddoGet(HttpServletRequestrequest,

HttpServletResponseresponse)

throwsServletException,java.io.IOException{

response.setContentType("text/html");

java.io.PrintWriterout=response.getWriter();

HttpSessionsession=request.getSession();

//initiallysettodefaulttimeoutinterval

int_default=session.getMaxInactiveInterval();

inttimeout=_default;

try{

timeout=newInteger(getInitParameter("timeout")).intValue();

}catch(NumberFormatExceptionnfe){

//reportanyproblemswiththeconfiguredvalueinweb.xml

log("Problemwithconfiguringsessiontimeoutin:"+

getClass().getName());

}//try

Page 410: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

//nowsetthesessiontotheconfiguredtimeoutperiod

if(timeout!=_default&&timeout>-2)

session.setMaxInactiveInterval(timeout);

out.println("<html>");

out.println("<head>");

out.println("<title>CartServlet</title>");

out.println("</head>");

out.println("<body>");

out.println("Thetimeoutintervalis:"+

session.getMaxInactiveInterval());

out.println("</body>");

out.println("</html>");

}

Figure11-1showstheresultofrunningthisservletinabrowserwindow.

Figure11-1.Dynamicallychangingthesessiontimeout

Thesessiontimeoutischangedonlyiftheconfiguredvalueisdifferentthantheinitialvalue,andifthevalueisgreaterthan-2:

if(timeout!=_default&&timeout>-2)

session.setMaxInactiveInterval(timeout);

Atimeoutintervalcanbesetto-1,whichisdefinedbytheServletv2.4specificationasasessionthatneverexpires.

Page 411: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Thisbehaviormaynotbeimplementedconsistentlyfromservertoserver.

Asmentionedbefore,sessionsareimplementedthemajorityofthetimeascookies.Chapter10includesrecipesdescribingthehandlingofcookiesinJSPsandservlets.

SeeAlso

Recipe11.2andRecipe11.3onconfiguringthesessiontimeoutinTomcatwebapplications;Chapter1onweb.xml;Chapter7oftheServletv2.3and2.4specificationsonsessions;thesession-trackingsectionsofJavaServletProgrammingbyJasonHunter(O'Reilly)andJavaServerPagesbyHansBergsten(O'Reilly).

Page 412: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe11.2SettingtheSessionTimeoutinAllTomcatWebApplications

Problem

YouwanttoconfigureasessiontimeoutperiodforallofthewebapplicationsthatarerunningwithinaninstanceofTomcat.

Solution

Setthesessiontimeoutwithinthesession-configelementin<Tomcat-installation-directory>/conf/web.xml.

Discussion

YoucansetthesessiontimeoutforallwebapplicationsbyconfiguringTomcat'sdefaultconf/web.xmlfile.Ifthedeploymentdescriptorforaparticularwebapplicationdoesnothaveasession-configelement,thentheapplicationusesthevaluesetinconf/web.xmlasthedefaultsessiontimeout.Thecontentofthesession-timeoutelement(nestedwithinsession-config)representsthetimeinminutesuntilaninactivesessionexpires.

Example11-4showsthesession-configelementinthedefaultweb.xmlfileforTomcat4.1.x,withtheaccompanyingXMLcomment.

Example11-4.Thesession-configelementinsideofthedefaultTomcatweb.xmlfile

Page 413: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<!--===================DefaultSessionConfiguration================-->

<!--Youcansetthedefaultsessiontimeout(inminutes)forallnewly-->

<!--createdsessionsbymodifyingthevaluebelow.-->

<session-config>

<session-timeout>30</session-timeout>

</session-config>

Onapplicationdeployment,Tomcatprocessesitsdefaultweb.xmlfile,followedbythedeploymentdescriptorsforeachwebapplication.Yourownsession-configelementoverridestheonespecifiedinconf/web.xml.Itisusuallyabetterideatoconfiguresessionsforeachwebapplicationindividually,particularlyiftheyaredesignedtobeportable.

SeeAlso

Recipe11.1onconfiguringthesessiontimeout;Recipe11.3onsettingthesessiontimeoutprogrammatically;Recipe11.4oncheckingthevalidityofasession;Chapter1onweb.xml;Chapter7oftheServletv2.3and2.4specificationsonsessions;thesession-trackingsectionsofJavaServletProgrammingbyJasonHunter(O'Reilly)andJavaServerPagesbyHansBergsten(O'Reilly).

Page 414: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe11.3SettingtheSessionTimeoutProgrammatically

Problem

Youwanttosetasessiontimeoutinyourservletcode.

Solution

UsetheHttpServletRequestobject'sgetSession()methodtogetareferencetotheHttpSessionobject.ThenchangethetimeoutperiodprogrammaticallybyusingtheHttpSession.setMaxInactiveInterval(intseconds)method.

Discussion

TheHttpSession.setMaxInactiveInterval(intseconds)methodsetsthetimeoutforasessionindividually,sothatonlytheparticularsessionobjectbeingoperateduponisaffected.Otherservletsthatdosessiontrackinginthewebapplicationstillusethesession-timeoutvalueinweb.xmlor,intheabsenceofthiselement,theserver'sdefaultsession-timeoutvalue.Example11-5checksthetimeoutperiodforasession,thenresetsthattimeoutperiodto20minutes.

Example11-5.Resettingadefaulttimeoutperiod

packagecom.jspservletcookbook;

importjava.util.Date;

Page 415: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

importjava.text.DateFormat;

importjavax.servlet.*;

importjavax.servlet.http.*;

publicclassSimpleSessionextendsHttpServlet{

publicvoiddoGet(HttpServletRequestrequest,

HttpServletResponseresponse)

throwsServletException,java.io.IOException{

response.setContentType("text/html");

java.io.PrintWriterout=response.getWriter();

HttpSessionsession=request.getSession();

out.println("<html>");

out.println("<head>");

out.println("<title>SimpleSessionTracker</title>");

out.println("</head>");

out.println("<body>");

out.println("<h2>SessionInfo</h2>");

out.println("sessionID:"+session.getId()+"<br><br>");

out.println("TheSESSIONTIMEOUTperiodis"+

session.getMaxInactiveInterval()+"seconds.<br><br>");

out.println("Nowchangingitto20minutes.<br><br>");

session.setMaxInactiveInterval(20*60);

out.println("TheSESSIONTIMEOUTperiodisnow"+

session.getMaxInactiveInterval()+"seconds.");

out.println("</body>");

Page 416: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

out.println("</html>");

}

}

Figure11-2showstheresultofrequestingthisservletinawebbrowser.

Figure11-2.Gettingsession-timeoutinfo

ThisservletgetstheHttpSessionobjectwiththeHttpServletRequestclass'sgetSession()method.

Whatevertheservlet'sdefaulttimeoutperiodis,say,30minutes,Example11-5changestheaccessedsession'stimeoutto20minutes:

session.setMaxInactiveInterval(20*60);

Remember,thismethodaltersthedefaultsession-timeoutintervalonlyforthesessionassociatedwiththeuserswhorequestthisservlet.Whywouldsomeusersgetadifferenttimeoutintervalthanothers?Perhapsweb-usertestingatyourorganizationhasindicatedthatasessiontimeoutoffiveminutesismoreappropriateforyourshoppingcart-relatedservlets,whereassomechart-ormap-creationservletsrequirethedefaulttimeoutof30minutesormore,sincetheirusersmightlingeroverthecompleximagesintheirbrowsersforalongperiod.

Inmostwebapplications,thesessiontimeoutisset(oraltered)inthe

Page 417: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

deploymentdescriptor,andyouwillnothavetodynamicallychangethetimeoutintheservletcode.

SeeAlso

Recipe11.1onconfiguringthesessiontimeout;Recipe11.2onsettingthesessiontimeoutinallTomcatapplications;Recipe11.4oncheckingthevalidityofasession;Chapter1onweb.xml;Chapter7oftheServletv2.3andv2.4specificationsonsessions;thesession-trackingsectionsofJavaServletProgrammingbyJasonHunter(O'Reilly)andJavaServerPagesbyHansBergsten(O'Reilly).

Page 418: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe11.4CheckingifaSessionExistsinanHttpServletRequest

Problem

Youwanttocheckifawebapplicationuserhasavalidsession.

Solution

UsetheHttpServletRequestobject'sgetSession(false)methodtofindoutwhethertheHttpSessionobjectisnull.

Discussion

Somewebcomponentsaredesignedtomonitorifasessionisvalid,thenoptionallyredirectorforwardtheusertoanotherwebcomponentbasedonthevalidityofthesession.Forexample,imaginethatausermakesarequesttoacomponentthatexpectstofindacustomobjectstoredinthesessionobject,suchasa"shoppingcart."Youwanttocheckifthesessionisvalid;however,youdonotwanttocreateanewsessionfortherequestifthesessionisnotvalid,becauseanotherwebcomponentfartherbackinthechainofapplicationcomponentsisresponsibleforcreatingnewsessionsandpopulatingthemwithshoppingcartitems.TheusermayhaveenteredthewebapplicationatStep3insteadofStep1.Inthiscase,ifthesessionisinvalid,therequestisforwardedtoanotheraccesspointintheapplication(suchasaloginscreen).

IfyoucalltheHttpServletRequestobject'sgetSession(false)methodandthemethodreturnsfalse,thentheuserdoesnothaveavalidsessionandtherequestobjecthasnotcreatedanewsessionfor

Page 419: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

her.

EitherHttpServletRequest.getSession(true)orgetSession()willattempttocreateanewsession.

Example11-6isaservletthatchecksauser'ssession,thenredirectstheusertoanotherwebcomponentifthesessionobjectisnull.

Example11-6.Checkingifasessionisvalidornot

importjavax.servlet.*;

importjavax.servlet.http.*;

publicclassSessionCheckextendsHttpServlet{

publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)

throwsServletException,java.io.IOException{

HttpSessionsession=request.getSession(false);

if(session==null){

response.sendRedirect("/myproj/login.jsp");

}else{

response.sendRedirect("/myproj/menu.jsp");

}

}

}

IfthesessioninExample11-6isnull,theservletredirectstherequesttothelogin.jsppageatthecontextpath/myproj.Ifthesessionobjectisvalid,therequestisredirectedtothe/myproj/menu.jspcomponent.

Page 420: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

TheHttpServletResponse.sendRedirect(Stringlocation)methodsendstheclientanHTTPresponsethatlookslikethis:

HTTP/1.1302MovedTemporarily

Location:

http://localhost:9000/dbproj/login.jsp

Content-Type:text/html;charset=ISO-8859-1

...

TheclientthensendsanotherrequestfortheURLspecifiedinthelocationheaderoftheHTTPresponse.

SeeAlso

Recipe11.1andRecipe11.3onconfiguringthesessiontimeout;Chapter1onweb.xml;Chapter7oftheServletv2.3and2.4specificationsonsessions;thesession-trackingsectionsofJavaServletProgrammingbyJasonHunter(O'Reilly)andJavaServerPagesbyHansBergsten(O'Reilly).

Page 421: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe11.5TrackingSessionActivityinServlets

Problem

Youwanttouseaservlettotrackthecreationtimeandlast-accessedtimeforasession.

Solution

UsetheHttpServletRequestobject'sgetSession()methodtogetareferencetotheHttpSessionobject.ThencalltheHttpSession.getCreationTime()andHttpSession.getLastAccessedTime()methodsonthatobject.

Discussion

ThisrecipedescribeshowtousetheHttpSessionAPItofindoutthecreationtimeandthelast-accessedtimeforasession.Howwouldawebapplicationusethisinformation?Forone,youmightwanttomonitorthepatternofrequestactivityinawebapplicationbycomparingthesessioncreationtime,thelast-accessedtime,andthecurrenttime.Forexample,thedifferencebetweenthecreationtimeandthecurrenttime(measuredinseconds)wouldindicatehowlongthewebapplicationhadbeentrackingaparticularuser'ssession.

ThemethodHttpSession.getLastAccessedTime()returnsthetime(asalongdatatype)ofthelasttimetheusermadearequestassociatedwithaparticularsession.

AservletthatcallsgetLastAccessedTime()representsthemostcurrent

Page 422: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

requestassociatedwiththesession.Inotherwords,thetimeatwhichtheuserrequeststheservletthatcallsgetLastAccessedTime()becomesthelastaccessedtime.

Example11-7displaysthecurrenttime,aswellasthesession'screationandlast-accessedtimes.

TheHttpServletRequest.getSession()methodassociatesanewsessionwiththerequestifonedoesnotalreadyexist.TheHttpServletRequest.getSession(false)methodreturnsnullifasessionisnotassociatedwiththerequestanditwillnotcreateanewHttpSessionfortheuser.SeeRecipe11.4.

Example11-7.CallingHttpSessionmethodsinaservlet

packagecom.jspservletcookbook;

importjavax.servlet.*;

importjavax.servlet.http.*;

importjava.util.Date;

importjava.text.DateFormat;

importjava.util.Enumeration;

publicclassSessionDisplayextendsHttpServlet{

publicvoiddoGet(HttpServletRequestrequest,

HttpServletResponseresponse)

throwsServletException,java.io.IOException{

response.setContentType("text/html");

Page 423: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

java.io.PrintWriterout=response.getWriter();

HttpSessionsession=request.getSession();

DatecreationTime=newDate(session.getCreationTime());

DatelastAccessed=newDate(session.getLastAccessedTime());

Datenow=newDate();

DateFormatformatter=

DateFormat.getDateTimeInstance(DateFormat.MEDIUM,

DateFormat.MEDIUM);

out.println("<html>");

out.println("<head>");

out.println(

"<title>DisplayingtheSessionCreationand"+

"Last-AccessedTime</title>");

out.println("</head>");

out.println("<body>");

out.println("<h2>SessionCreationandLast-AccessedTime</h2>");

out.println(

"Thetimeanddatenowis:"+formatter.format(now)+

"<br><br>");

out.println("Thesessioncreationtime:"+

"HttpSession.getCreationTime():"+

formatter.format(creationTime)+"<br><br>");

out.println("Thelasttimethesessionwasaccessed:"+

HttpSession.getLastAccessedTime():"+

formatter.format(lastAccessed));

out.println("</body>");

Page 424: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

out.println("</html>");

}//doGet

publicvoiddoPost(HttpServletRequestrequest,

HttpServletResponseresponse)

throwsServletException,java.io.IOException{

doGet(request,response);

}//doPost

}

AnexampleofabrowserdisplayforthisservletisshowninFigure11-3.

Figure11-3.Findingoutasession'screationandlast-accessedtimes

Asinthepriorrecipe,thisexampleusesajava.text.DateFormatobjecttoformatDateStringsforbrowserdisplay.Thedate-relatedHttpSessionmethodsgetCreationTime()andgetLastAccessedTime()returnlongdatatypes,fromwhichjava.util.Dateobjectscanbecreated:

DatecreationTime=newDate(session.getCreationTime());

Thesession'screationtimecanthenbedisplayedusingtheDateFormat'sformat(Date_date)method.

Page 425: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

ThenextrecipeshowshowaJSPcantracksessionactivity.

SeeAlso

Recipe11.5andRecipe11.8;Chapter1onweb.xml;Chapter7oftheServletv2.3and2.4specificationsonsessions;thejavax.servlet.http.HttpSessionAPIathttp://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/servlet/http/HttpSession.htmlthesession-trackingsectionsofJavaServletProgrammingbyJasonHunter(O'Reilly)andJavaServerPagesbyHansBergsten(O'Reilly).

Page 426: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe11.6TrackingSessionActivityinJSPs

Problem

Youwanttofindoutasession'screationtimeandlast-accessedtimeusingJSPs.

Solution

UsetheJSTLtogetaccesstotheJSP'sassociatedHttpSessionobject.ThencalltheHttpSession.getCreationTime()andHttpSession.getLastAccessedTime()methodsonthatobject.

Discussion

ItisveryeasytokeeptrackofsessionactivityinaJSP;youjustuseslightlydifferentmethodsandtoolscomparedtothoseusedwithaservlet.Example11-8usestheoutcustomactionfromtheJSTL1.0todisplayinformationaboutthecurrentsession.Chapter24describestheJSTLanditsassociatedELinmoredetail.

Example11-8.TrackingsessionsusingtheJSTL

<%@pagecontentType="text/html"%>

<%@tagliburi="http://java.sun.com/jstl/core"prefix="c"%>

<html>

<head><title>ViewSessionJSP</title></head>

Page 427: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<body>

<h2>SessionInfoFromAJSP</h2>

Thesessionid:<c:outvalue="${pageContext.session.id}"/><br><br>

Thesessioncreationtimeasalongvalue:

<c:outvalue="${pageContext.session.creationTime}"/><br><br>

Thelastaccessedtimeasalongvalue:

<c:outvalue="${pageContext.session.lastAccessedTime}"/><br><br>

</body>

</html>

ThisJSPusesataglibdirectivetomakethecustomactionsthatarepartofthecoretaglibraryavailable.Byconvention,theuriattributeforthecoretagsishttp://java.sun.com/jstl/core,andtheprefixisc(youcancreateyourownprefixinthetaglibdirective).WithJSTL1.1,theurivalueishttp://java.sun.com/jsp/jstl/core.TheJSPthenusestheouttagfromtheJSTL'scoretaglibrarytodisplaythecurrentsessionID(thereturnvalueofHttpSession.getId()),thesession'screationtimeasalongtype,andthesession'slast-accessedtime.Figure11-4showsabrowserdisplayofthesevalues.

Figure11-4.ShowingsessioninfoinaJSP

Page 428: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

TheoutelementwritesthevalueofitsvalueattributetotheJSP'sresponsestream.However,itistheELthatdoesthefetchingofthevalue.Forexample,thefollowingELexpressiongetsthevalueofthesession'screationtime:

${pageContext.session.creationTime}

ThepageContextreferenceisoneoftheimplicitobjectsthatcanbeaccessedfromtheEL.ThisisequivalenttotheimplicitJSPscriptingobjectofthesamename.

Thewaythecreationtimeisaccessedisdifferentthanamethodcall;youusethedot(.)operatortogetthepageContext'ssessionproperty,theninturnusethedotoperatortoaccessthesessionobject'screationTimeproperty.Sothewholephraselookslikethis:

pageContext.session.creationTime.

Finally,intheEL,allvariableandpropertyvaluesaredereferenced(togettheirvalues)bybracketingthemin${}characters.

TheJSPgetstheothersessionvaluesinthesameway.Forexample,thesession'slast-accessedtime(thelongtypereturnvaluefromthemethodHttpSession.getLastAccessedTime())isreturnedusingthissyntax:

${pageContext.session.lastAccessedTime}

Example11-8displaysthelast-accessedtimeforasessionasalarge,unfriendlynumber.Naturally,thisvalueismoreunderstandabledisplayedasadate.Example11-9showshowtousetheJSTL'scustomformattingactionstoformatadatestring.

Page 429: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Example11-9.Formattingthesessioncreationtimeandlast-accessedtimewiththeJSTL

<%@pagecontentType="text/html"%>

<%@tagliburi="http://java.sun.com/jstl/core"prefix="c"%>

<%@tagliburi="http://java.sun.com/jstl/fmt"prefix="fmt"%>

<html>

<head><title>ViewSessionJSP</title></head>

<body>

<h2>SessionInfoFromAJSP</h2>

ThesessionID:<c:outvalue="${pageContext.session.id}"/>

<h3>SessiondatevaluesformattedasDates</h3>

<jsp:useBeanid="timeValues"class="java.util.Date"/>

<c:settarget="${timeValues}"value=

"${pageContext.session.creationTime}"property="time"/>

Thecreationtime:<fmt:formatDatevalue="${timeValues}"type="both"

dateStyle="medium"/><br><br>

<c:settarget="${timeValues}"value=

"${pageContext.session.lastAccessedTime}"property="time"/>

Thelastaccessedtime:<fmt:formatDatevalue="${timeValues}"type=

"both"dateStyle="short"/>

</body>

</html>

Figure11-5showsthebrowserdisplayforthisJSP.

Page 430: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Figure11-5.Sessiondate/timesformattedusingtheJSTL

ThisJSPtakestwodate-relatedsessionvalues:thedate/timewhenthesessionwascreatedandthelastdate/timewhenarequestassociatedwiththissessionwasmadetothewebapplication.Itdisplaystheirvaluesinthebrowser.Asmentionedpreviously,thesevaluesarereturnedfromtheHttpSessionobjectaslongJavatypes.YouhavetocreateaDateobjectwithitstimepropertysettotheselongvalues.ThenusetheJSTLformattingcustomactionstocreatereadableStringsfromthedates.First,maketheformattingtaglibraryavailabletotheJSPwiththistaglibdirective:

<%@tagliburi="http://java.sun.com/jstl/fmt"prefix="fmt"%>

Thejava.util.DateobjectthatwillbeusedtocreatedatesoutoflongvaluesisgeneratedusingaJSPstandardactioncalledjsp:useBean.Hereistheexample'ssyntax:

<jsp:useBeanid="timeValues"class="java.util.Date"/>

ThislinecreatesanewDateobjectandstorestheobjectinavariablecalledtimeValues,makingitavailablethroughtheELwiththesyntax${timeValues}.TheJSPthenusesthesetcustomactiontosetatimepropertyintheDateobject:

Page 431: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<c:settarget="${timeValues}"value="${pageContext.session.creationTime}"

property="time"/>

Thevalueofset'stargetattributeistheJavaBeanwhosepropertyyouaresetting.Thepropertynameisspecifiedbythesetelement'spropertyattribute.ThevaluethisexpressionsetsthetimepropertytoisthelongtypereturnedfromthisJSTLexpression:

${pageContext.session.creationTime}

Inotherwords,usingthecustomactionthiswayistheequivalentofcallingthejava.util.Date.setTime(longsecs)methodonthetimeValuesDateobject.Thistimevalueisactuallysetanddisplayedtwice,torepresentthecreationtimeandlast-accessedtimeofthesession.Example11-10isthecodechunkthatdoesthesettinganddisplaying,includingthefmt:formatDatecustomaction.

Example11-10.Displayingasession'screationtimeandlast-accessedtime

<c:settarget="${timeValues}"value="${pageContext.session.creationTime}"

property="time"/>

Thecreationtime:<fmt:formatDatevalue="${timeValues}"type="both"

dateStyle="medium"/><br><br>

<c:settarget="${timeValues}"value=

"${pageContext.session.lastAccessedTime}"property="time"/>

Thelastaccessedtime:<fmt:formatDatevalue="${timeValues}"type="both"

dateStyle="short"/>

TheformatDateelementisoneoftheJSTL'sformattingactions,whicharedescribedinChapter24.ThewaytheformatDateactionworksinthisexampleisthatthefollowingcodeisreplacedbytheformatteddatevalue,asin"Jan21,20031:57:39PM":

Page 432: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<fmt:formatDatevalue="${timeValues}"type="both"dateStyle="short"/>

Inordertodisplaytheirdifferences,Example11-10givestwodifferentvalues(mediumandshort)forthedateStyleattribute.

SeeAlso

Recipe11.4oncheckingthevalidityofasession;Chapter1onweb.xml;Chapter7oftheServletv2.3and2.4specificationsonsessions;thejavax.servlet.http.HttpSessionAPIathttp://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/servlet/http/HttpSession.htmlthesession-trackingsectionsofJavaServletProgrammingbyJasonHunter(O'Reilly)andJavaServerPagesbyHansBergsten(O'Reilly).

Page 433: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe11.7UsingURLRewritinginaJSP

Problem

YouwanttomakesurethatURLrewritingisusedinaJSP,incaseanyusersdisablecookiesintheirbrowsers.

Solution

UsetheurlcustomactionintheJSTLtocreateURLsthatautomaticallyincludethesessionIDasaparameter.

Discussion

Itispossiblethatsomeusersofawebapplicationwillconfiguretheirbrowserstodisablecookies.SincecookiesarethedefaultbasisforsessiontrackingwithJSPs,howwilldisablingcookiesaffecttheseusers'experiencewiththewebapplication?Irecommenddesigningallsession-trackingJSPstoaccommodateURLrewriting,sothatthecookie-averseusersdonotcrashandburninyourwebapplication.

OnesolutiontothisproblemistousetheurlcustomactionthatispartoftheJSTL.

TheurlelementautomaticallyinsertsthesessionIDasaparameterwithURLsthatwillbeusedinhref,form,andframesettags,forinstance.Thisallowsthepagesthattheselinkspointto,suchasservletsorJSPs,totracksessionswithoutusingcookies.

OneofthenicethingsaboutusingtheurlelementlikethisisthatitaddsthesessionIDasaparametertotheURLwhennecessary,without

Page 434: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

theJSPauthor'sintervention.Example11-11showshowtouseurl.

Example11-11.UsingtheurlcoretagtorewriteURLs

<%@pagecontentType="text/html"%>

<%@tagliburi="http://java.sun.com/jstl/core"prefix="c"%>

<html>

<head><title>URLRewriter</title></head>

<body>

<h1>ThispagewilluseURLrewritingifnecessary</h2>

<c:urlvalue="/default.jsp"var="goToDefault"escapeXml="false"/>

Gotothedefault.jsppage<ahref="<c:outvalue="${goToDefault}"/>">here</a>.

</body>

</html>

ThisexampleusesataglibdirectivetomaketheJSTL'scoretaglibraryavailable.Thisdirectivelookslikethis:

<%@tagliburi="http://java.sun.com/jstl/core"prefix="c"%>

TheurlelementofthistaglibrarycreatesaURLrepresentingthewebcomponentdefault.jsplocatedonthetoplevelofthewebapplication.TheURLisstoredinagoToDefaultvariableusingtheurlelement'svarattribute.TheescapeXmlattributeissettofalse(itistruebydefault)topreventcharacterssuchasampersandsandanglebracketsfrombeingconvertedtotheircharacterentitycodesintheURL.Theurlelementlookslikethis:

<c:urlvalue="/default.jsp"var="goToDefault"escapeXml="false"/>

TheURLcreatedbythecustomactionisthenusedasthevalueforanhrefattributeinthefollowingmanner:

Page 435: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<ahref="<c:outvalue="${goToDefault}"/>">here</a>

ThiscodeusestheoutcustomactionandanELexpression(${goToDefault})tocreatethehyperlink.Afterthepageisrequested,thereturnedHTMLlookslikethisifcookiesaredisabledinthebrowser:

<ahref="/home/default.jsp;jsessionid=3CAF7CD0A0BFF5076B390CCD24FD8F0D">here</a>

YoumaynoticetwodifferencesbetweentheURLthatwascreatedhere:

<c:urlvalue="/default.jsp"var="goToDefault"escapeXml="false"/>

andtheURLthatwasgeneratedfromtheoutcustomaction:

/home/default.jsp;jsessionid=3CAF7CD0A0BFF5076B390CCD24FD8F0D

First,theurlcustomactionhasautomaticallyaddedthecontextpath(/homeintheexample)asaprefixto/default.jsp.Second,thesessionIDwasaddedtotheURLasapathparameternamedjsessionid,sothatthelinkdestinationcanaccessthesessionIDassociatedwiththisuserandundertakesessiontracking.

Apathparameterbeginswithasemicolonandaname/valuepair,asin;jsessionid=3CAF7CD0A0B.

TheURLthattheJSPcreatesbyusingtheoutelementmayalsohaveadditionalparameters.Example11-12isthesameasthefirstrecipeexample,exceptthatparametershavebeenaddedtotheURLinsidetheurlcustomaction.

Example11-12.Addingparametersusingtheurlcustomaction

Page 436: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<%@pagecontentType="text/html"%>

<%@tagliburi="http://java.sun.com/jstl/core"prefix="c"%>

<html>

<head><title>JSPPage</title></head>

<body>

<h1>ThispagewilluseURLrewritingifnecessary</h2>

<c:urlvalue="/default.jsp?n=${param.first}&l=${param.last}"

var="goToDefault"/>

Gotothedefault.jsppage<ahref="<c:outvalue="${goToDefault}"

escapeXml="false"/>">here</a>.

</body>

</html>

TheURLnowlookslikethis:

/default.jsp?n=${param.first}&l=${param.last}

ThisURLusesembeddedELsyntaxtoaccesstworequestparameters,calledfirstandlast.IfcodeusestheELtoaccessaparameternamedfirst,forinstance,thenitusestheparamELimplicitobject,followedbythedotoperator,andthenameoftheparameter,asin${param.first}.SupposetheexampleJSPisrequestedinthefollowingmanner:

http://localhost:8080/home/url_rewrite.jsp?first=Bruce&last=Perry

Theurlelement'svalueattributeresolvestothiscode:

<c:urlvalue="/default.jsp?n=Bruce&l=Perry"var="goToDefault"/>

TheoutcustomactionfurtheralongintheexampleJSPhasitsescapeXmlattributesettofalse.IfescapeXmlisleftwithitsdefaultvalue(true)andtheampersandcharacter(&)isreplacedwithitscharacterentitycode(&amp;),thequerystringintheURLlookslikethis

Page 437: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

whentheJSPisexecuted:

<ahref="/home/default.jsp;jsessionid=D37AF592DACABD?n=Bruce&amp;l=Perry">

here</a>

TopreventthisoutcomewhengeneratinglinkedURLswiththeoutelement,makesuretosetout'sescapeXmlattributetofalse.

Table11-1.Specialcharactersandentitycodes

Character Entitycode

< &lt;

> &gt;

& &amp;

' &#039;

" &#034;

MakesuretouserelativeURLsoftheform/default.jspwhenusingURLrewritingwiththeurlelement.URLrewritingwillnottakeplaceifanabsoluteURLisusedinurl'svalueattribute,asinhttp://www.mysite.com/home/default.jsp.

SeeAlso

Recipe11.6ontrackingsessionactivityinJSPs;Recipe11.8onusingURLrewritinginaservlet;theJSPConfigurationsectionoftheJSPv2.0specification;Chapter23ontheJSTL;thesession-trackingsectionsofJavaServerPagesbyHansBergsten(O'Reilly).

Page 438: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe11.8UsingURLRewritinginaServlet

Problem

YouwanttocreateaservletthatusesURLrewritingiftheuserhasdisabledcookiesinhisbrowser.

Solution

UsetheHttpServletResponse.encodeURL(Stringurl)methodtoencodeallURLsthatareusedtolinkwithotherpages.

Discussion

Thejavax.servlet.HttpServletResponseclassincludesaniftymethodthatwillencodeaURLwiththecurrentsessionID,intheeventthattheusermakingtheservletrequesthasdisabledcookies.

Infact,ifyouusetheHttpServletResponse.encodeURL(Stringurl)methodtoencodetheURLsthatareusedinaservlet,thismethodtakescareofURLrewritingifnecessary,andyouwon'thavetoworryaboutwhethercookiesareenabledinusers'browsers.YoumustconscientiouslyencodeeveryURLlinkinvolvedwiththeservletwhenusingthismethod.Example11-13isaservletversionoftheexampleusedinRecipe11.6.

Example11-13.UsingURLrewritinginaservlet

importjavax.servlet.*;

Page 439: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

importjavax.servlet.http.*;

publicclassUrlRewriteextendsHttpServlet{

publicvoiddoGet(HttpServletRequestrequest,

HttpServletResponseresponse)

throwsServletException,java.io.IOException{

response.setContentType("text/html");

java.io.PrintWriterout=response.getWriter();

StringcontextPath=request.getContextPath();

StringencodedUrl=response.encodeURL(contextPath+

"/default.jsp");

out.println("<html>");

out.println("<head>");

out.println("<title>URLRewriter</title>");

out.println("</head>");

out.println("<body>");

out.println(

"<h1>ThispagewilluseURLrewritingifnecessary</h2>");

out.println("Gotothedefault.jsppage<ahref=\""+encodedUrl+

"\">here</a>.");

out.println("</body>");

out.println("</html>");

}

publicvoiddoPost(HttpServletRequestrequest,

HttpServletResponseresponse)

throwsServletException,java.io.IOException{

doGet(request,response);

}

Page 440: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

}

Inthepagethatissenttothebrowserwithcookiesdisabled,theURLlookslike:/home/default.jsp;jsessionid=3CAF7CD0A0BFF5076B390CCD24FD8F0D

OneofthedifferencesbetweenusingencodeURLandtheJSPsolutioninRecipe11.7(whichusedtheurlcustomactionfromtheJSTL)isthatthecustomactioninJSTL1.0willautomaticallyprependthecontextpathtotheURL.Ifthecontextpathwas/home,andtheURLwas/default.jsp,thentherewrittenURLwouldlooklike/home/default.jsp;jsessionid=3CAF7CD0A0BFF5076B390CCD24FD8F0D.AutomaticallyaddingthecontextpathinthismannertotheURLisaseparateoperationcomparedwithURLrewriting;itisnotperformedbytheencodeURLmethod.Ifyouwanttoduplicatethisoperationwithaservlet,addthecontextpathtotheURLbeforecallingtheencodeURLmethod,asin:

StringcontextPath=request.getContextPath();

StringencodedUrl=response.encodeURL(contextPath+"/default.jsp")

YoucanalsousetherelatedHttpServletResponse.encodeRedirectURL(Stringurl)methodtoinitiateURLrewritingwithcallstoHttpServletResponse.sendRedirect(Stringurl).TheservletdoGet()methodinExample11-14usesencodeRedirectURLtoensurethatthedestinationURLshaveaccesstothesessionIDoftheredirecteduser.

Example11-14.UsingencodeRedirectURLinaservletdoGetmethod

publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throws

ServletException,java.io.IOException{

//redirecttheuserdependingonthevalueofthegoparam

Stringdestination=request.getParameter("go");

StringcontextPath=request.getContextPath();

Page 441: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

if(destination==null||destination.equals(""))

thrownewServletException(

"Missingorinvalid'go'parameterin"+

getClass().getName());

if(destination.equals("weather")){

//ensureURLrewriting

response.sendRedirect(

response.encodeRedirectURL(

contextPath+"/weather"));}

if(destination.equals("maps")){

//ensureURLrewriting

response.sendRedirect(

response.encodeRedirectURL(

contextPath+"/maps"));}

}

Theresponse.sendRedirect(Stringurl)methodredirectstherequesttothedestinationrepresentedbyitsurlparameter.TheserversendsanHTTPstatusmessagetotheclient:

HTTP/1.1302MovedTemporarily

Additionally,aLocationresponseheaderissentalongthatprovidestheclientwiththenewURLfortherequestedfile.Ifnecessary,theresponse.encodeRedirectURL(Stringurl)methodaddsthesessionIDtotheredirectdestinationofthisURL.Theexamplegetsthenameofaservletfromthevalueoftherequest'sgoparameter:

Stringdestination=request.getParameter("go");

TheservletthrowsaServletExceptioniftheparameteriseithermissingorisanemptyString.Ifthegoparameterisvalid,theservletredirectstherequesttooneoftwoservlets,withpathsof/weatheror/maps(thecontextpathintheexampleis/home).Ifimplemented

Page 442: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

properlyontheserver,thefollowingcodeaddsthesessionIDtotheURLiftherequester'scookiesaredisabled,sothedestinationservletcaninitiatesessiontracking:

response.sendRedirect(response.encodeRedirectURL(contextPath+"/weather"));

SeeAlso

Recipe11.4oncheckingthevalidityofasession;Recipe11.7onusingURLrewritinginaJSP;Chapter1onweb.xml;Chapter7oftheServletv2.3and2.4specificationsonsessions;thejavax.servlet.http.HttpSessionAPIathttp://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/servlet/http/HttpSession.htmlthesession-trackingsectionsofJavaServletProgrammingbyJasonHunter(O'Reilly)andJavaServerPagesbyHansBergsten(O'Reilly).

Page 443: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe11.9UsingaListenertoTracktheSessionLifecycle

Problem

YouwantanobjectthatimplementstheHttpSessionListenerinterfacetorespondwhenasessioniscreatedordestroyed.

Solution

CreatealistenerclassthatimplementstheHttpSessionListenerinterface,andregistertheclassinyourdeploymentdescriptor.

Discussion

TheservletAPIprovidesthejavax.servlet.http.HttpSessionListenerinterfaceforuseinrespondingtosessioncreationordestruction.Aclassthatimplementsthisinterfacecanperformcustombehavioroneither(orboth)ofthesetwoevents.Hereistheprocessforcreatinganddeclaringasessionlistenerforyourwebapplication:

1. CreateaclassthatimplementstheHttpSessionListenerinterface.Thisinterfacedefinestwomethods:sessionCreated()andsessionDestroyed(),eachofwhichacceptasingleHttpSessionEventparameter.

Makesuretheimplementingclasshasazero-argumentconstructor.

PlacethecompiledclassintheWEB-INF/classesdirectoryofyour

Page 444: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

webapplication(includinganyofitspackage-relateddirectories);orstoretheclassinaJARlocatedintheWEB-INF/libdirectory.

Declarethelistenerintheweb.xmldeploymentdescriptor.

Restartthewebcontainer(ifnecessary),whichwillinstantiateyourlistenerclassandregisteritasalistenerforallnewsessionsandsessioninvalidationsinthewebapplication.

ObjectsthatareboundtosessionsshouldimplementtheHttpSessionBindingListenerinterface.Thislistenerdoesnothavetobeconfiguredinthedeploymentdescriptor,buttheboundobjectsmustimplementHttpSessionBindingListener,aswellasthevalueBound(),valueUnbound(),andinit()methods.TheHttpSessionActivationListenerisdesignedforsessionsthatmigratebetweenJavaVirtualMachines(JVMs).ObjectsthatareboundtothesesessionsmustimplementHttpSessionActivationListeneranditstwomethods:sessionDidActivate()andsessionWillActivate().

Hereistheweb.xmlentryforourexamplelistenerclass:

<listener>

<listener-class>com.jspservletcookbook.SessionListen</listener-class>

</listener>

TheHttpSessionListenerclassinExample11-15keepsacountoflivesessionsinthewebapplicationandwritesamessagetotheconsolewheneverasessioniscreatedordestroyed.Itwouldbebettertologmessagesusingacomponentsuchaslog4j,whichI'lldiscussinChapter14.

Example11-15.Keepingtrackofsessionactivitywithalistenerclass

Page 445: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

packagecom.jspservletcookbook;

importjava.util.Date;

importjavax.servlet.*;

importjavax.servlet.http.*;

publicclassSessionListenimplementsHttpSessionListener{

privateintsessionCount;

publicSessionListen(){

this.sessionCount=0;

}

publicvoidsessionCreated(HttpSessionEventse){

HttpSessionsession=se.getSession();

session.setMaxInactiveInterval(60);

//incrementthesessioncount

sessionCount++;

Stringid=session.getId();

Datenow=newDate();

Stringmessage=newStringBuffer(

"NewSessioncreatedon").

append(now.toString()).append("\nID:").

append(id).append("\n").append("Therearenow").

append(""+sessionCount).append(

"livesessionsintheapplication.").toString();

System.out.println(message);

}

Page 446: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

publicvoidsessionDestroyed(HttpSessionEventse){

HttpSessionsession=se.getSession();

Stringid=session.getId();

--sessionCount;//decrementthesessioncountvariable

Stringmessage=newStringBuffer("Sessiondestroyed"+

"\nValueofdestroyedsessionIDis").

append(""+id).append("\n").append(

"Therearenow").append(""+sessionCount).append(

"livesessionsintheapplication.").toString();

System.out.println(message);

}

}

Eachlistenermusthaveazero-argumentconstructor.TheSessionListenclasshasoneinstancevariable,anintthatkeepstrackofthenumberofsessions.InthesessionCreated()method,thecodegetsaccesstothenewsessionbycallingtheHttpSessionEvent.getSession()method.Thesession'stimeoutisthenresetto60seconds,sothecreatinganddestroyingcanbeobservedintheconsolewithoutalotofdelay.

AnHttpSessionListenerclassisnotifiedonlyofrequeststopagesthatcreatenewsessions,suchaswiththerequest.getSession()method.ThislistenerisalsonotifiedifaservletorJSPinvalidatesanexistingsession,aneventthatwilltriggertheclass'ssessionDestroyed()method.IfaservletorJSPisaccessed,butdoesnotdosessiontracking,thenthelistenerisnotnotifiedofthoseactivities;thesameistruewhenthesessionisfurtheraccessedthroughthewebapplicationafteritiscreated,unlessitisexplicitlyinvalidated.

Page 447: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

SimilarmessagingandaccesstotheHttpSessionobjecttakesplaceinthesessionDestroyed()method.TheresultingconsoleinFigure11-6showsthatyoucangetinformationabouttheHttpSessionobjectinbothofthelistener'smethods.

Figure11-6.Notificationsofsessioncreationandinvalidation

UsingtheHttpSessionListenerinterface,itispossibletocreateclassesthatmonitorhowmanysessionsarecreatedduringacertainperiodoftime,andhowlongittakesbeforetheyareleftidleandtimeout.

SeeAlso

Chapter14onusinglistenerstologmessages;Recipe11.4oncheckingthevalidityofasession;Chapter1onweb.xml;Chapter7oftheServletv2.3and2.4specificationsonsessions;thejavax.servlet.http.HttpSessionAPIathttp://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/servlet/http/HttpSession.html

Page 448: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe11.10UsingaListenertoMonitorSessionAttributes

Problem

Youwantalistenerclasstobenotifiedwhenasessionattributeisadded,removed,orreplaced.

Solution

CreateaJavaclassthatimplementstheHttpSessionAttributeListenerinterface.Registerthisclassusingthewebapplication'sdeploymentdescriptor.

Discussion

TheHttpSessionAttributeListenerinterfacehasthreemethods:attributeAdded(),attributeRemoved(),andattributeReplaced();allhaveaparameterofthetypeHttpSessionBindingEvent.Thislistenerisnotifiedwhenthesessionsets,removes,orchangesanattribute.Therefore,themethodcallsinthewebapplicationthatcauseanHttpSessionAttributeListenernotificationare:

HttpSession.setAttribute(Stringname,Objectvalue).

HttpSession.removeAttribute(Stringname).

AcalltoHttpSession.setAttribute()whenanattributeof

Page 449: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

thesamenameisalreadyboundtothesession.Theoriginalattributeisreplaced,triggeringacalltotheattributeReplaced(HttpSessionBindingEventevent)

method.

Example11-16displaysamessagetotheconsolewhenasessionobjectisbound,includingthevalueoftheobject(whichisaStringinthissimpleexample).Messagesarealsodisplayedwhentheattributeisremovedorreplaced.Tomakethislisteneravailabletotheapplication:

1. Givetheclassazero-argumentconstructor.

Addtheclasstothewebapplication'sWEB-INF/classesorlibdirectory(whenit'sinaJAR).

Declarethelistenerinthedeploymentdescriptor.

Restartthewebcontainer(ifnecessary)soitcaninstantiatethelistener.

Example11-16.Listeningforsessionobjectbindingorunbinding

packagecom.jspservletcookbook;

importjavax.servlet.*;

importjavax.servlet.http.*;

publicclassSessionAttribListenimplementsHttpSessionAttributeListener{

//CreatesnewSessionAttribListen

publicSessionAttribListen(){

System.out.println(getClass().getName());

}

Page 450: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

publicvoidattributeAdded(HttpSessionBindingEventse){

HttpSessionsession=se.getSession();

Stringid=session.getId();

Stringname=se.getName();

Stringvalue=(String)se.getValue();

Stringsource=se.getSource().getClass().getName();

Stringmessage=newStringBuffer(

"Attributeboundtosessionin").append(source).

append("\nTheattributename:").append(name).

append("\n").append("Theattributevalue:").

append(value).append("\n").

append("ThesessionID:").

append(id).toString();

System.out.println(message);

}

publicvoidattributeRemoved(HttpSessionBindingEventse){

HttpSessionsession=se.getSession();

Stringid=session.getId();

Stringname=se.getName();

if(name==null)

name="Unknown";

Stringvalue=(String)se.getValue();

Page 451: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Stringsource=se.getSource().getClass().getName();

Stringmessage=newStringBuffer(

"Attributeunboundfromsessionin").append(source).

append("\nTheattributename:").append(name).

append("\n").append("Theattributevalue:").

append(value).append("\n").append(

"ThesessionID:").append(id).toString();

System.out.println(message);

}

publicvoidattributeReplaced(HttpSessionBindingEventse){

Stringsource=se.getSource().getClass().getName();

Stringmessage=newStringBuffer(

"Attributereplacedinsession").

append(source).toString();

System.out.println(message);

}

}

Whenattributesareadded,replaced,andremovedfromasessioninthewebapplication,thisclassprintsinformationabouttheattributeandthesessiontothewebcontainer'sconsole.TheHttpSessiontypethatbindstheattributecanbeaccessedbycallingtheHttpSessionBindingEventclass'sgetSession()method.Inallthreeofthelistener'smethods,youcangettheIDofthesessionassociatedwiththeattribute,aswellastheattribute'snameandvalue.Insidethelistenerclass'sconstructorisalineofcodethatprintsthelistenerclassnametotheconsolewhenitisinstantiated:

System.out.println(getClass().getName());

Thismessageindicatestothedeveloperthatthelistenerisproperly

Page 452: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

referencedinweb.xml,andthatthewebcontainerhascreatedaninstanceofthelistener.Finally,thislistenerclassprintsamessagetotheconsoleaboutthesessionclassthatisthesourceoftheevent.Thelistenerusesthejava.util.EventObject.getSource()method(whichisinheritedbytheHttpSessionBindingEventobject)togetareferencetothesourceofthesession-bindingevent:

Stringsource=se.getSource().getClass().getName();

ThesevariableistheHttpSessionBindingEventobject.HereistheinformationthatisprintedtotheTomcatconsole:

Attributeboundtosessioninorg.apache.catalina.session.StandardSession

Theattributename:session-attribute

Theattributevalue:Hello

ThesessionID:9ED2C34964778265A34F7AB0DEA4B884

Attributereplacedinsessionorg.apache.catalina.session.StandardSession

Attributeunboundfromsessioninorg.apache.catalina.session.StandardSession

Theattributename:session-attribute

Theattributevalue:Hellothere.

ThesessionID:9ED2C34964778265A34F7AB0DEA4B884

ThelistenerallowsyoutogetthesessionID,aswellasthenameandvalueofthesessionattribute,duringtheattribute'sremovalfromthesession.TheHttpSessionBindingEvent.getValue()methodreturnsthevalueoftheattributeasajava.lang.Object.Therefore,ifyouwantaccesstotheattributeinthelistener,thenyouwouldhavetocasttheObjecttypetoitsappropriatetypeduringitsaddition,removal,orreplacement.Forexample,imaginethatyouhavestoredajava.util.Mapinasession.YouwanttochecktheMapcontentsinthelistener'sattributeRemovedmethod.IfthevariablebeisoftypeHttpSessionBindingEvent,thenthiscodechecksthereturntypeofbe.getValue():

java.util.Mapmap=null;

Objectvalue=null;

Page 453: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

if((value=be.getValue())instanceofjava.util.Map){

map=(java.util.Map)value;

System.out.println("HashMapvalue:"+map.get("key"));

}

Thismethodreturnsthevalueofthesession-boundobjectthat'sbeingremoved.IfthereturntypeisaMap,thelocalvariablevalueiscasttoajava.util.Map,thentheget()methodiscalledonthatMap(giventhattheMapinstancecontainsakeycalled"key").

SeeAlso

Chapter14onusinglistenerstologmessages;Recipe11.4oncheckingthevalidityofasession;Recipe11.9onusingalistenertotracksessionlifecycle;Chapter1onweb.xml;Chapter7oftheServletv2.3and2.4specificationsonsessions;thejavax.servlet.http.HttpSessionAPIathttp://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/servlet/http/HttpSession.html

Page 454: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe11.11UsingaFiltertoMonitorSessionAttributes

Problem

Youwanttouseafiltertocheckasessionattributepriortotherequestreachingaservlet.

Solution

CreateaJavaclassthatimplementsjavax.servlet.Filter,writesession-relatedcodeintheclass'sdoFilter()method,thenconfigurethefilterinyourdeploymentdescriptor.

Discussion

Filters,astheirnamesuggests,aresemipermeablebarriersthroughwhichrequeststoyourwebapplicationmustpassbeforetheyreachservlets,JSPs,orevenstaticcontent.FiltersaretechnicallyJavaclassesthatimplementthejavax.servlet.Filterinterface.AfiltercanhavealookattheServletRequestandServletResponseobjectsbeforetheseobjectsfindtheirwaytoaservlet'sservicemethods(whichincludeservice(),doGet(),anddoPost()).Filterscaninitiateauthentication,logging,encryption,databaseactions,caching,andjustaboutanyothertaskthatpassesthroughrequestandresponseobjects.

Filtersareconfiguredinweb.xml.InExample11-18,afilterchecksalogged-inHttpSessionattribute,andlogsitsactivitiesbycallingtheServletContextobject'slog()method.Thisfilterismappedtoaservletregisteredinweb.xmlasMyServlet.Anyrequeststothe

Page 455: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

MyServletservletcausetheSessionFilter.doFilter()methodtobecalled.Example11-17showstherelevantentriesinweb.xml.

Example11-17.Configuringafilterinweb.xml

<!--thebeginningofweb.xmlgoeshere-->

<filter>

<filter-name>SessionFilter</filter-name>

<filter-class>com.jspservletcookbook.SessionFilter</filter-class>

</filter>

<filter-mapping>

<filter-name>SessionFilter</filter-name>

<servlet-name>MyServlet</servlet-name>

</filter-mapping>

<!--morefiltersorlistenerclassesaddedhere-->

<servlet>

<servlet-name>MyServlet</servlet-name>

<servlet-class>com.jspservletcookbook.MyServlet</servlet-class>

</servlet>

<!--deploymentdescriptorcontinues...-->

Thefilterelementspecifiesthefilter'sregisterednameanditsfullyqualifiedJavaclass.YoupackagethefilterclasswiththerestofthewebapplicationbyplacingtheclassinWEB-INF/classesorinaJARfileinWEB-INF/lib.Thefilter-mappingelementmapsthefiltertotheservletregisteredinthedeploymentdescriptorasMyServlet.FilterscanalsobemappedtoURLpatterns(Chapter20explainsthissyntaxindetail).Example11-18isthesourcecodeforcom.jspservletcookbook.SessionFilter.

Example11-18.Afilterthatsnoopsonsessioninformation

Page 456: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

packagecom.jspservletcookbook;

importjavax.servlet.*;

importjavax.servlet.http.*;

publicclassSessionFilterimplementsFilter{

privateFilterConfigconfig;

//CreatesnewSessionFilter

publicSessionFilter(){}

publicvoidinit(FilterConfigfilterConfig)throwsServletException{

System.out.println("Instancecreatedof"+getClass().getName());

this.config=filterConfig;

}

publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,

FilterChainchain)throwsjava.io.IOException,ServletException{

HttpSessionsession=((HttpServletRequest)request).getSession();

ServletContextcontext=config.getServletContext();

/*usetheServletContext.logmethodtolog

filtermessages*/

context.log("doFiltercalledin:"+config.getFilterName()+

"on"+(newjava.util.Date()));

//logthesessionID

context.log("sessionID:"+session.getId());

//Findoutwhetherthelogged-insessionattributeisset

Stringlogged=(String)session.getAttribute("logged-in");

if(logged==null)

session.setAttribute("logged-in","no");

Page 457: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

//logamessageaboutthelog-instatus

context.log("log-instatus:"+

(String)session.getAttribute("logged-in"));

context.log("");

chain.doFilter(request,response);

}

publicvoiddestroy(){

/*calledbeforetheFilterinstanceisremoved

fromservicebythewebcontainer*/

}

}

Everyfilterhastohaveazero-argumentconstructor,justlikelistenerclasses.

Theinit()methoddisplaysaconsolemessagewhenitsinstanceiscreatedbythewebcontainer.Thejavax.servlet.FilterConfigobjectisusedtogettheServletContextobjectforthisfilter(bycallingFilterConfig.getServletContext()).TheServletContext.log()methodisusedtologmessagesfromthefilter.Thesemessagescanthenbereadintheserverlogs.InTomcat,lookinthe<Tomcat-install-directory>/logsdirectoryforlogfileswithnamessuchaslocalhost_home_log.2003-01-24.txt.Hereisanexampleofthelogentriesforthisfilter:

2003-01-2411:56:09doFiltercalledin:SessionFilteronFriJan2411:56:09EST2003

2003-01-2411:56:09sessionID:E04DE93D9B88A974ED2350BCF7945F34

2003-01-2411:56:09log-instatus:no

Thefiltergetsaccesstothesessionwiththiscode:

Page 458: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

HttpSessionsession=((HttpServletRequest)request).getSession();

SincethedoFilter()methodhasaServletRequestparametertype,andnotaHttpServletRequesttype,therequestparameterhastobecasttothelattertypesothatthecodecancalltherequest.getSession()method.

BewareofdoingthisblindlyinenvironmentswhereyouarenotpositivethatallservletsareHttpServlets.Ifyouaren'tsure,asimpleclasscheckbeforecastingcansolvethisproblem.

Oncethefilterhasaccesstothesessionobject,itlooksforacertainsessionattribute(logged-in).Ifsession.getAttribute("logged-in")returnsnull,thisattributeisaddedtothesessionwiththevalue"no".Thecodethencallschain.doFilter(request,response)insideofthefilter'sdoFilter()method.

ThismethodcallontheFilterChainobjectensuresthattherequestandresponsearepassedalongtothenextfilteronthechain,or,intheabsenceofanymoremappedfilters,tothetargetedwebresource.Example11-19showsthedoGet()methodoftheMyServletservletthatthefilterinExample11-18ismappedto.

Example11-19.doGetmethodofaservlettowhichafilterismapped

publicvoiddoGet(HttpServletRequestrequest,

HttpServletResponseresponse)

throwsServletException,java.io.IOException{

response.setContentType("text/html");

java.io.PrintWriterout=response.getWriter();

Page 459: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

HttpSessionsession=request.getSession();

Stringlogged=(String)session.getAttribute("logged-in");

out.println("<html>");

out.println("<head>");

out.println("<title>FilterServlet</title>");

out.println("</head>");

out.println("<body>");

out.println("<h2>SessionLoggedinInfo</h2>");

out.println("loggedin:"+logged+"<br><br>");

out.println("</body>");

out.println("</html>");

}

Thisservletchecksthelogged-insessionattributeanddisplaysitsvalue,asshowninFigure11-7.

Afilterismappedtoaservlet'sregisterednamelikethis:

<filter-mapping>

<filter-name>SessionFilter</filter-name>

<servlet-name>MyServlet</servlet-name>

</filter-mapping>

Therequestsforthisservletwillnotpassthroughthemappedfilterfirst,however,iftheservletisrequestedwithan"invoker"-styleURLoftheformhttp://localhost:8080/servlet/com.jspservletcookbook.MyServlet.Ifthiscausesproblemsforthewebapplication,considerdisablingoroverridingtheURLmappingof/servlet/*inyourwebapplication.Recipe3.6describeshowtodothis.

Page 460: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Figure11-7.Checkingasessionobjectafterafilterhasalteredit

AfiltercantakeanumberofactionswithasessionobjectbeforeitreachesaservletorJSPthatdoessessiontracking,suchasadd,remove,orchangesessionattributes.Itcanalsoalterthesession'stimeoutperiod(withtheHttpSession.setMaxInactiveInterval(intseconds)method)basedonanattributeofthesessionorrequest.

SeeAlso

Chapter19onusingfilters;Recipe11.4oncheckingthevalidityofasession;Chapter1onweb.xml;Chapter7oftheServletv2.3and2.4specificationsonsessions;thejavax.servlet.http.HttpSessionAPIathttp://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/servlet/http/HttpSession.htmlChapter1onweb.xml;Chapter6oftheServletv2.3and2.4specificationsonfiltering.

Page 461: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Chapter12.IntegratingJavaScriptwithServletsandJSPs

Introduction

Recipe12.1.IncludingJavaScriptModulesinaServlet

Recipe12.2.IncludingJavaScriptModulesinaJSP

Recipe12.3.CreatingaNewWindowwithJavaScriptinaServlet

Recipe12.4.CreatingaNewWindowwithJavaScriptinaJSP

Recipe12.5.UsingJavaScripttoValidateFormValuesinaServlet

Recipe12.6.UsingJavaScripttoValidateFormValuesinaJSP

Page 462: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Introduction

JavaScriptisascriptingsystemforwebpages,standaloneapplications,andservers.NetscapeCorporationinventedJavaScript,whichhasbecomesuchapopularandusefulprogrammingtoolthatallmajorbrowsersnowsupportit.UnliketheJavacodeshowninthisbook,JavaScriptismainlyexecutedinthewebbrowserasaclient-sidescriptingsystem,ratherthanontheserver.

MostbusywebsitesuseJavaScriptfordynamicbehavior,suchasvalidatingforminputorcreatingnewbrowserwindows(muchtothechagrinofusers,whoareoftenoverwhelmedbyirresponsibleanddynamicallygeneratedpopups!).Justchoose"ViewSource"fromthebrowsermenubarforatypicalwebpage,andoftenthefirsttextitemsyou'llseedisplayedareendlesslinesofJavaScript.JavaScriptisusedforadvancedtaskssuchascontrollingoranimatingbrowsershapes(dynamicHTML),creatingflyingobjects,andinitializingthebehaviorofembeddedvideos.

DevelopersconvertingstaticwebpagestoJSPsorservletsmayhavetointegrateexistingJavaScriptcodeintotheirJavasourcecode.Thisiswhattheupcomingrecipesareallabout.

JavaScriptguidesareavailablefromhttp://devedge.netscape.com/.

Page 463: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe12.1IncludingJavaScriptModulesinaServlet

Problem

YouwanttoimportamoduleorfilecontainingJavaScriptcodesothattheJavaScriptcanbeincludedintheservlet'sHTMLoutput.

Solution

Usethejavax.servlet.RequestDispatch.include()methodtoimporttheneededJavaScriptintoyourpage.

Discussion

AnefficientmethodforhandlingJavaScriptthroughoutawebprojectistostoretheJavaScriptcodeinseparatefilesormodules.ServletsthatrequiretheJavaScriptfunctionscanthenimporttheJavaScriptmodules.YouwouldnotstoreyourJavaclassfileswilly-nillyalloverthecomputer'sfilesystemwithoutanorganizationthatmirrorsthecode'spurpose.NorshouldyouorganizeyourJavaScriptinanythingbutwell-definedmodules.

TheJavaScriptisincludedintheservlet'sHTMLoutputwithscripttagsandexecutedinthebrowserwhenneeded.Example12-1showsamoduleofJavaScriptcodenamedfunctions.js.Thismoduleisstoredinthewebapplication'sWEB-INF/javascriptdirectory.

AsensibleplacetostoreJavaScriptmodulesisintheirowndirectory,sothattheyareeasytolocateanddonotclutterupthetop-leveldirectoryofthewebapplication.TheJavaScriptdirectorycanbeasub-directoryofWEB-INF,asin

Page 464: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

thisrecipe.

Example12-1.AJavaScriptmodule

<scriptlanguage="JavaScript">

functionCheckEmail(email)

{

varfirstchunk,indx,secondchunk

if(email==""){

alert("Pleasemakesureyouhaveenteredavalid"+

"emailbeforesubmittingtheinfo.")

returnfalse

}

//getthezero-basedindexofthe"@"character

indx=email.indexOf("@")

//ifthestringdoesnotcontainan@,thenreturnfalse

if(indx==-1){

alert("Pleasemakesureyouhaveenteredavalid"+

"emailbeforesubmittingtheinfo.")

returnfalse

}

//ifthefirstpartofemailis<twocharsandthyesecondpartis<sevenchars

//(arbitrarybutworkablecriteria),rejecttheinputaddress

firstchunk=email.substr(0,indx)//uptobutnotincludingthe"@"

Page 465: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

//startatcharfollowingthe"@"andincludeuptoendofemailaddr

secondchunk=email.substr(indx+1)

//ifthepartfollowingthe"@"doesnotincludeaperiod"."then

//alsoreturnfalse

if((firstchunk.length<2)||(secondchunk.length<7)||

(secondchunk.indexOf(".")==-1)){

alert("Pleasemakesureyouhaveenteredavalid"+

"emailbeforesubmittingtheinfo.")

returnfalse

}

//theemailwasokay;atleastithada@,morethanoneusernamechars,

//morethansixcharsafterthe"@",andthesubstringafterthe"@"

//containeda"."char

returntrue

}//CheckEmail

functionCreateWindow(uri){

varnewWin=

window.open(uri,'newwin1',

'width=500,height=400,resizable,'+

'scrollable,scrollbars=yes');

newWin.focus();

}

</script>

ThemoduleinExample12-1containsascriptblockwithtwo

Page 466: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

JavaScriptfunctiondefinitions.ThefunctionCheckEmailensuresthattheemailaddressauserhastypedintoanHTMLformcontainsatleastan@character,twocharactersprecedingthe@andsevencharactersafterthatcharacter,andthatthecharactersafterthe@containaperiodcharacter(.).TheCreateWindowfunctioncreatesanewbrowserwindowwiththesuppliedURI.

Example12-2showsaservletthatimportsthisJavaScriptfileusingthejavax.servlet.RequestDispatcher.include()method.

Example12-2.AservletincludesaJavaScriptfile

packagecom.jspservletcookbook;

importjavax.servlet.*;

importjavax.servlet.http.*;

publicclassModuleServletextendsHttpServlet{

publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throws

ServletException,java.io.IOException{

response.setContentType("text/html");

java.io.PrintWriterout=response.getWriter();

out.println("<html><head>");

RequestDispatcherdispatcher=request.getRequestDispatcher(

"/WEB-INF/javascript/functions.js");

dispatcher.include(request,response);

out.println("<title>ClientForms</title></head><body>");

out.println("<h2>EnterYourNameandEmail</h2>");

out.println("<formaction=

Page 467: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

\"/home/displayHeaders.jsp\"name=\"entryForm\"onSubmit=

\"returnCheckEmail(this.email.value)\">");

out.println("<tableborder=\"0\"><tr><tdvalign=\"top\">");

out.println(

"Firstandlastname:</td><tdvalign=\"top\"><inputtype=

\"text\"name=\"name\"size=\"20\"></td></tr>");

out.println("<tr><tdvalign=\"top\">");

out.println("Email:</td>

<tdvalign=\"top\"><inputtype=\"text\"name=

\"email\"size=\"20\"></td>");

out.println("<tr><tdvalign=\"top\"><inputtype=

\"submit\"value=\"Submit\"></td>");

out.println("</tr></table></form>");

out.println("</body></html>");

}//doGet

}

TheservletinExample12-2usesaRequestDispatchertoincludethecodecontainedinfunctions.jswithintheHTMLheadtaggeneratedbytheservlet.ThegeneratedpageincludesanHTMLformtag.WhenthepageuserclickstheSubmitbutton,theformtag'sonSubmiteventhandlercheckstheemailaddressthattheusertypedintotheformusingtheimportedJavaScriptCheckEmailfunction.Thisfunctionreturnsfalse,whichcancelstheformsubmissioniftheemailaddressdoesnotmeetthesimplecriteriaspecifiedbythefunction.

Figure12-1showswhatthewebpagelookslikewhentheuserhasenteredanemailaddressintotheform.

Figure12-1.AservletgeneratesawebpagecontainingJavaScript

Page 468: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Userscanalsousethebuilt-insrcattributeoftheHTMLscripttagtoimportaJavaScriptmodule,asin:

<scriptsrc="functions.js">

SeeAlso

TheNetscapeDevEdgesiteathttp://devedge.netscape.com/;Recipe12.2,Recipe12.4,andRecipe12.6onusingJavaScriptwithJSPs;Recipe12.3onusingJavaScriptwithservletsforcreatingnewbrowserwindows;Recipe12.5onvalidatingformvalueswithaservletandJavaScript;Recipe18.3onusingafilterwithHTTPrequests.

Page 469: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe12.2IncludingJavaScriptModulesinaJSP

Problem

YouwanttoincludeamoduleorfilecontainingJavaScriptcodewithinaJSPpage'soutput.

Solution

Usethec:importJSTLcoretag.

Discussion

ThepreviousrecipedescribedhowtoincludeafilecontainingJavaScript(Example12-1)intoaservlet'sHTMLinput.ItisveryeasytoaccomplishthesametaskinaJSP,suchasbyusingtheimportMod.jspfileshowninExample12-3.ThisJSPusestheJSTLcoretagc:importtoincludeafilenamedfunctions.js.Thefunctions.jsmodulecontainsascripttagwithtwoJavaScriptfunctiondefinitions(Example12-1inRecipe12.1).TheHTMLgeneratedbytheJSPshowsthatthec:importactionpositionedthescripttagwithintheJSP'sheadtag.TheJSPgeneratestheHTMLformshownpreviouslyinFigure12-1.

Example12-3.UsingtheJSTLc:importtagtoimportJavaScript

<%@tagliburi="http://java.sun.com/jstl/core"prefix="c"%>

<html>

Page 470: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<head>

<c:importurl="/WEB-INF/javascript/functions.js"/>

<title>ClientForms</title></head><body>

<h2>EnterYourNameandEmail</h2>

<formaction="/home/displayHeaders.jsp"name="entryForm"

onSubmit="returnCheckEmail(this.email.value)">

<tableborder="0"><tr><tdvalign="top">

Firstandlastname:</td><tdvalign="top"><inputtype="text"name="name"size="20"></

td></tr>

<tr><tdvalign="top">

Email:</td><tdvalign="top"><inputtype="text"name="email"size="20"></td></tr>

<tr><tdvalign="top"><inputtype="submit"value="Submit"></td>

</tr></table>

</form>

</body></html>

WhentheusersubmitstheHTMLform,heractionisinterceptedbytheformtag'sonSubmiteventhandler,whichdoesabasicsyntaxcheckontheemailaddresstheusertypedintotheform.Theformsubmit,targetedtoa/home/displayHeaders.jsppage,iscancelledifthesubmittedemailaddresshasthewrongsyntax.

TheJavaScriptcodethis.email.valuereturnstheStringthattheusertypedintothetextfieldnamedemail.Thekeywordthisreferstotheformobject,whichcontainstheeventhandleronSubmit.TheJavaScriptcodeisaparameterofthiseventhandler.

Page 471: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

SeeAlso

TheNetscapeDevEdgesiteathttp://devedge.netscape.com/;Recipe12.4onusingJavaScripttocreateanewwindowinaJSP;Recipe12.6onusingJavaScripttovalidateforminputinaJSP;Recipe12.3onusingJavaScriptwithservletsforcreatingnewbrowserwindows;Recipe12.5onvalidatingformvalueswithaservletandJavaScript;Recipe18.3onusingafilterwithHTTPrequests.

Page 472: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe12.3CreatingaNewWindowwithJavaScriptinaServlet

Problem

YouwantaservlettocontainJavaScriptthatcangenerateanewbrowserwindow.

Solution

Useajavax.servlet.RequestDispatchertoincludetheJavaScriptfunctionintheservlet.TheJavaScriptfunctioncallstheJavaScriptwindowobject'sopenmethod.

Discussion

Thisrecipeusesthesameimportedmoduleasthefirsttworecipes,butthistimetheservletusesthesecondfunctiondefinition(CreateWindow)ratherthanthefirst.Example12-4generatesanHTMLbuttonwidget.Whentheuserclicksthebutton,JavaScriptgeneratesasmallwindow(sometimesreferredtoasawindoid,orpopup).TheservletdynamicallyretrievestheURLforloadingintothenewwindowfromaservletinitparameter,whichissomethingyoucannotdowithastaticHTMLpage.

Example12-4.AservletthatloadsJavaScriptforcreatingawindow

packagecom.jspservletcookbook;

Page 473: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

importjavax.servlet.*;

importjavax.servlet.http.*;

publicclassWindowServletextendsHttpServlet{

publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throws

ServletException,java.io.IOException{

//URLforthepop-upwindowisconfigured

Stringurl=getInitParameter("popup-url");

//justincasetheinitParameterismisconfigured

if(url==null||url.equals(""))

url="/displayHeaders.jsp";

//addthecontextpathasaprefixtotheURL,asin/home

url=request.getContextPath()+url;

response.setContentType("text/html");

java.io.PrintWriterout=response.getWriter();

out.println("<html><head>");

RequestDispatcherdispatcher=request.getRequestDispatcher(

"/WEB-INF/javascript/functions.js");

dispatcher.include(request,response);

out.println("<title>HelpPage</title></head><body>");

out.println("<h2>CookieInfo</h2>");

out.println("<formaction=\"\"onSubmit=\"returnfalse\">");

out.println("<tableborder=\"0\"><tr><tdvalign=\"top\">");

out.println(

"Clickonthebuttontogetmoreinfooncookies:</td>");

Page 474: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

out.println("<tdvalign=\"top\">");

out.println("<inputtype=\"button\"name=\"button1\""+

"value=\"MoreInfo\"onClick=\"CreateWindow('"+url+

"')\"></td></tr>");

out.println("</table></form>");

out.println("</body></html>");

}//enddoGet

}

Thisservletassumessomeconfigurationstepshavebeentakenintheapplication'sdeploymentdescriptor.Thisconfigurationincludesaninit-paramthatspecifiestheURLforloadingintothenewwindow.TheurlvariableistheCreateWindowfunction'sparameter(seeExample12-1foradefinitionoftheJavaScriptfunctions).TheservletgeneratestheHTMLanddynamicallyprovidestheURLforloadingintothenewwindow.HereistheHTMLbuttondefinitionintheservlet'soutput:

<inputtype="button"name="button1"value="MoreInfo"

onClick="CreateWindow('home/cookieReader.jsp')">

Iftheapplicationisdynamicallyreloadable(thewebcontainermonitorsthedeploymentdescriptorforanychangesandreloadsthecontextifthefileisaltered),thenthedevelopercanchangethevalueoftheservletinit-paraminthedeploymentdescriptor.Theservletpop-upwindowthenloadsthenewURLwithoutrecompilingtheservletorstoppingtheserver.

Hereistheconfigurationforthisservletinweb.xml:

<servlet>

<servlet-name>windowservlet</servlet-name>

<servlet-class>com.jspservletcookbook.WindowServlet</servlet-class>

<init-param>

Page 475: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<param-name>popup-url</param-name>

<param-value>/cookieReader.jsp</param-value>

</init-param>

</servlet>

TheservletloadsthedefinitionfortheJavaScriptfunctionCreateWindowwiththiscode:

RequestDispatcherdispatcher=request.getRequestDispatcher(

"/WEB-INF/javascript/functions.js");

IntheHTMLcodetheservletgenerates,thescripttagcontainingtheJavaScriptcodeappearswithintheHTMLheadtag.Whentheuserclickstheformbuttonontheservlet-generatedwebpage,anewwindowiscreatedandtheURLspecifiedbytheinit-paramelementinweb.xml(cookieReader.jsp)isloaded.Figure12-2showstheservletoutput.Figure12-3showsthepop-upwindow.

Figure12-2.Aservletthatcreatesapop-upwindow

Figure12-3.ThenewwindowloadsaURLvaluefromaservletinit-param

Page 476: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

SeeAlso

TheNetscapeDevEdgesiteathttp://devedge.netscape.com/;Recipe12.2,Recipe12.4,andRecipe12.6onusingJavaScriptwithJSPs;Recipe12.5onvalidatingformvalueswithaservletandJavaScript;Recipe18.3onusingafilterwithHTTPrequests.

Page 477: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe12.4CreatingaNewWindowwithJavaScriptinaJSP

Problem

YouwanttouseJavaScriptinaJSPtocreateanewbrowserwindow.

Solution

Usethec:importJSTLtagtoimporttheJavaScriptcodeintotheJSP.ThenusetheinitParamJSTLimplicitobjecttodynamicallyprovidetheURLforaJavaScript-generatedwindow.

Discussion

TheJSPinExample12-5(windowJ.jsp)usestheJSTL'sc:importcoretagtoimporttheJavaScriptfunctiondefinitionforcreatinganewwindow.TheJSPthencallstheJavaScriptfunction(CreateWindow)intheonClickeventhandlerforawebpagebutton.TheCreateWindowfunctionloadstheURLspecifiedinitsparameterintothenewbrowserwindow.Example12-5usesthec:outcoretagandELsyntaxtodynamicallyacquiretheURLfortheJavaScriptwindowfromacontextparameter.Thec:outtaglookslikethis:

<c:outvalue=

"${pageContext.request.contextPath}${initParam[\"jsp-url\"]}"/>

ThevalueattributespecifiestwoELexpressions.ThefirstoneprovidestheJSP'scontextpath,whilethesecondgivesthevalueofthecontext-paramelementjsp-url.ThefullURLspecifiedbythese

Page 478: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

concatenatedELexpressionsis/home/cookieReader.jsp.

Example12-5.UsingtheJSTLtoimportJavaScriptintoaJSP

<%@tagliburi="http://java.sun.com/jstl/core"prefix="c"%>

<html>

<head>

<c:importurl="/WEB-INF/javascript/functions.js"/>

<title>HelpPage</title></head><body>

<h2>CookieInfo</h2>

<formaction=""onSubmit="returnfalse">

<tableborder="0"><tr><tdvalign="top">

Clickonthebuttontogetmoreinfooncookies:</td>

<tdvalign="top">

<inputtype="button"name="button1"value=

"MoreInfo"onClick=

"CreateWindow('<c:outvalue=

"${pageContext.request.contextPath}${initParam[\"jsp-url\"]}"/>')">

</td></tr>

</table></form>

</body></html>

ThisJSPusesthefollowingcontext-paramelementinweb.xml:

<context-param>

<param-name>jsp-url</param-name>

<param-value>/cookieReader.jsp</param-value>

</context-param>

TheELimplicitobjectinitParamevaluatestoajava.util.Map

Page 479: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

containingthenamesandvaluesofanycontext-paramelementsconfiguredforthewebapplication.AnimplicitobjectisavariablethattheJSTLautomaticallymakesavailabletoyourJSPcode.

Example12-5usestheELsyntaxinitParam[\"jsp-url\"],asopposedtoinitParam.jsp-url,inordertoreturntheintendedvalueinTomcat5(alphaversionasofthiswriting).Thecode'spurposeistoescapethehyphencharacter(-)in"jsp-url."

SeeAlso

TheNetscapeDevEdgesiteathttp://devedge.netscape.com/;Recipe12.2andRecipe12.6onusingJavaScriptwithJSPstoimportJavaScriptandvalidateforminput;Recipe12.3oncreatingnewbrowserwindowswithservletsandJavaScript;Recipe12.5onvalidatingformvalueswithaservletandJavaScript;Recipe18.3onusingafilterwithHTTPrequests.

Page 480: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe12.5UsingJavaScripttoValidateFormValuesinaServlet

Problem

YouwanttovalidateforminputvaluesusingJavaScriptinaJSP.

Solution

Useajavax.servlet.RequestDispatchertoincludethevalidatingJavaScriptintheservlet.ThencallthevalidatingJavaScriptfunctionintheform'sonSubmiteventhandler.

Discussion

Example12-6isaJavaScriptmodulenamedvalidate.js.ThisfileshouldbelocatedinWEB-INF/javascript/validate.js.Thefilecontainsascripttagthatcontainsonefunctiondefinition:validate.ThisJavaScriptfunctioniteratesthroughtheformelements(suchasinputtagswhosetypeattributeistextinotherwords,textformfields)todetermineifanyofthemhavebeenleftblank.Theparameterforthevalidatefunctionisaformobject.

Iftheuserhasleftthefieldsempty,thisfunctiondisplaysanalertwindowandthencancelstheformsubmit.Amorerealisticvalidationfunctionmightinvolveagreaterdegreeofcomplexbusinesslogic,butIamkeepingthisexamplesimpleinordertodemonstratethemechanicsofincludingthefunctioninaservlet.

Page 481: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Example12-6.AJavaScriptmodulenamedvalidate.jsforvalidatingforminput

<scriptlanguage="JavaScript">

functionvalidate(form1)

{

for(i=0;i<form1.length;i++){

if((form1.elements[i].value=="")){

alert("Youmustprovideavalueforthefieldnamed:"+

form1.elements[i].name)

returnfalse

}

}

returntrue

}

</script>

TheservletinExample12-7includesthevalidate.jsfileusingaRequestDispatcher.TheRequestDispatcherpositionstheJavaScriptscripttagwithinanHTMLheadtagintheservlet'soutput.Theservletpage'sformtaghasanattributethatiscomposedofthecontextpath(thereturnvalueofrequest.getContextPath())concatenatedwiththe/displayHeaders.jspJSPfile.Iftheformfieldsarefilledoutproperly,thebrowsersubmitstheformtotheJSPpage(/home/displayHeaders.jsp).

Finally,theform'sonSubmiteventhandlercallstheincludedJavaScriptfunctionvalidate,passinginthethisJavaScriptkeyword.Thethisparameterevaluatestotheformobject.Iftheuserfailstofilloutthenameandemailfields,thevalidatefunctioncancelsthebrowser'ssubmissionoftheformbyreturningfalse.

Example12-7.ImportingJavaScriptinaservlettovalidateformvalues

Page 482: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

packagecom.jspservletcookbook;

importjavax.servlet.*;

importjavax.servlet.http.*;

publicclassFormServletextendsHttpServlet{

publicvoiddoGet(HttpServletRequestrequest,

HttpServletResponseresponse)throwsServletException,

java.io.IOException{

response.setContentType("text/html");

java.io.PrintWriterout=response.getWriter();

out.println("<html><head>");

RequestDispatcherdispatcher=request.getRequestDispatcher(

"/WEB-INF/javascript/validate.js");

dispatcher.include(request,response);

out.println("<title>HelpPage</title></head><body>");

out.println("<h2>Pleasesubmityourinformation</h2>");

out.println(

"<formaction=\""+request.getContextPath()+

"/displayHeaders.jsp\"onSubmit=\"returnvalidate(this)\">");

out.println("<tableborder=\"0\"><tr><tdvalign=\"top\">");

out.println("Yourname:</td><tdvalign=\"top\">");

out.println("<inputtype=\"text\"name=\"username\"size=\"20\">");

out.println("</td></tr><tr><tdvalign=\"top\">");

out.println("Youremail:</td><tdvalign=\"top\">");

out.println("<inputtype=\"text\"name=\"email\"size=\"20\">");

out.println("</td></tr><tr><tdvalign=\"top\">");

out.println(

Page 483: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

"<inputtype=\"submit\"value=\"SubmitInfo\"></td></tr>");

out.println("</table></form>");

out.println("</body></html>");

}//doGet

}

Figure12-4showsthebrowserpagecontainingtheform.Figure12-5showsthealertwindowgeneratedbytheJavaScriptfunction.

Figure12-4.TheservletoutputforanHTMLform

Figure12-5.TheincludedJavaScriptvalidatefunctionproducesanalertwindow

Anotheroptionforvalidatingforminputistouseafiltertocheck

Page 484: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

parametervalues,andthenreturntheusertotheformpageoranewpageiftheinputcontainsanerror.DevelopersmightpreferthisoptionbecauseafilterallowsyoutouseJavacodetoparsetheparametervaluesandgivesyouagreatdealofcontroloverthecustomizationoftheresponsepage,inthecaseofaforminputerror.Recipe18.3describeshowtouseafilterwithaservlettodealwithclientrequests.

SeeAlso

TheNetscapeDevEdgesiteathttp://devedge.netscape.com/;Recipe12.2andRecipe12.6onusingJavaScriptwithJSPstoimportJavaScriptandvalidateforminput;Recipe12.3oncreatingnewbrowserwindowswithservletsandJavaScript;Recipe12.5onvalidatingformvalueswithaservletandJavaScript;Recipe18.3onusingafilterwithHTTPrequests.

Page 485: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe12.6UsingJavaScripttoValidateFormValuesinaJSP

Problem

YouwanttoimportJavaScriptintoaJSPtovalidateHTMLformvalues.

Solution

Usethec:importJSTLcoretagtoimporttheJavaScriptfunctiondefinitions.ThenvalidatetheHTMLforminputbyusingtheformtag'sonSubmiteventhandler.

Discussion

TheJSPinExample12-8usestheJSTLcoretagc:importtoincludethecontentsofthe/WEB-INF/javascript/validate.jsfile.SeeExample12-6forthecontentsofvalidate.js,whichisadefinitionforthefunctionvalidate.Thisfunctiondetermineswhethertheuserhasleftanyformfieldsblank.

TherestoftheJSPisstraightforward:theonSubmiteventhandlercallsthevalidatefunctionandpassesintheformobject(representedbytheJavaScriptkeywordthis)asaparameter.Byreturningfalse,thevalidatefunctioncancelstheformsubmitifitfindsanyblankfields.

Example12-8.AJSPusesJavaScripttovalidateHTMLforminput

Page 486: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<%@tagliburi="http://java.sun.com/jstl/core"prefix="c"%>

<html>

<head>

<c:importurl="/WEB-INF/javascript/validate.js"/>

<title>HelpPage</title></head><body>

<h2>Pleasesubmityourinformation</h2>

<formaction="/home/displayHeaders.jsp"onSubmit="returnvalidate(this)">

<tableborder="0"><tr><tdvalign="top">

Yourname:</td><tdvalign="top">

<inputtype="text"name="username"size="20">

</td></tr><tr><tdvalign="top">

Youremail:</td><tdvalign="top">

<inputtype="text"name="email"size="20">

</td></tr>

<tr><tdvalign="top">

<inputtype="submit"value="SubmitInfo"></td></tr>

</table></form>

</body></html>

Figure12-4showsthewebpagecontainingtheform.Figure12-5depictsthealertwindowthatwouldbedisplayediftheuserleavesoneormoretextfieldsblankwhensubmittingtheform.

SeeAlso

TheNetscapeDevEdgesiteathttp://devedge.netscape.com/;Recipe12.2andRecipe12.4onusingJavaScriptwithJSPstoimportJavaScriptfunctiondefinitionsandcreatenewbrowserwindows;Recipe12.3on

Page 487: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

creatingnewbrowserwindowswithservletsandJavaScript;Recipe12.5onvalidatingformvalueswithaservletandJavaScript;Recipe18.3onusingafilterwithHTTPrequests.

Page 488: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Chapter13.SendingNon-HTMLContentIntroduction

Recipe13.1.SendingaPDFFile

Recipe13.2.SendingaWordProcessingFile

Recipe13.3.SendinganXMLfile

Recipe13.4.SendinganAudioFile

Recipe13.5.ViewingInternalResourcesinaServlet

Page 489: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Introduction

Mostwebsitesofferasmorgasbordofmediatypestotheirusers.TypicalwebcontentthesedaysincludesPortableDocumentFormat(PDF)files,word-processingdocuments,audiofiles,movies,andExtensibleMarkupLanguage(XML).Insomecases,thesealternativefiletypesarestoredindatabasesasbinarydata,orstreamsofunencodedbytes.Webdeveloperscannotalwaysprovidetheiruserswithstraightforwardhyperlinkstothesefilesfordownloading.TheuserchoosesalinkorentersaURLinthebrowser'slocationfield,andaservletorsomeotherwebcomponentdownloadsthebinarydatatotheclient.Theclientinmostcasessavesthedataasafile,foruselaterindocumentviewersandotherapplications.

Thefollowingrecipesdescribehowtoinitiatethisdownloadmethod.Inatypicalscenario,theservletsetsupadownloadwherebythebrowserpromptstheuserwitha"SaveAs"dialogallowinghimtosavethefilesonhisownfilesystem.Thesestrategies,however,donotguarantee100-percentconsistentbehavioramongwebbrowsers.Somebrowsersallowtheusertopreciselyconfigurehowhewantstohandlehandlecertainfiletypes(suchasaPDFdocument).Forexample,Opera5givestheuserallkindsofoptionsfordealingwithdownloads,suchasopeningupanexternalhelperapplication,displayingafileusingaplug-in,orimmediatelydownloadingafiletoaspecifiedfolderwithoutfirstopeningupa"SaveAs"window.

Testhowyourwebapplicationworksinvariousbrowsers,inresponsetodifferentbrowserconfigurations,aswellasondifferentplatforms,sothatyouareawareofthedifferentbrowserresponseselicitedbytheservlet.

ThealternativetothesestrategiesissimplyprovidingalinktoaPDFfileforinstanceifthedataexistsasafile.Thismethod,however,also

Page 490: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

placesagreatdealoftheresponsibilityontheclientbrowser,andtheuserwhoconfiguresthebrowser,formanagingthemediatype.Whileadvancedusersmaylikethisapproach,itisrarelysufficientforless-experiencedusers.

Page 491: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe13.1SendingaPDFFile

Problem

YouwanttosendbinarydatarepresentingaPDFfiletoauser.

Solution

Useaservletandajava.io.BufferedInputStreamtoreadthebytesfromthefile.Sendthefilecontenttotheuserwithajavax.servlet.ServletOutputStreamretrievedfromthejavax.servlet.http.HttpServletResponseobject.

Discussion

PDFfilesareubiquitousontheWeb,asmostusersareequippedwiththeAdobeReaderapplicationthatreadsthem.Example13-1takesafilenamefromaquerystringthatispartoftherequesttotheservlet,andrespondswithbinarydatathatrepresentsthePDFfile.TheservletidentifiesthefilethatitsendstotheclientastheMIMEtypeapplication/pdfbyusingtheContent-Typeresponseheader.

MultipurposeInternetMailExtensions(MIME)designatethemediatypesofvariousdatathataresentasemailoraspartofHTTPresponsesontheWeb.AMIMEtypehasatop-leveltypeandasub-typeseparatedbyaforward-slashcharacter,asintext/html,application/pdf,oraudio/mpeg.TheContent-Typeresponseheaderisthemethodtheserverresponseusestoconveytheintendedtypeandformatofthedatathattheserversendstoanetworkclientsuchasawebbrowser.SeethefollowingRequestForComments(RFC)technicaldocumentsonMIMEformoreinformation:ftp://ftp.rfc-editor.org/in-notes/rfc2045.txtandftp://ftp.rfc-editor.org/in-notes/rfc2046.txt.

Page 492: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Table13-1showsseveralMIMEtypesthatwebdevelopersmayencounter.

Table13-1.SomecommonMIMEtypes

File MIMEtype Extension

XML text/xml .xml

HTML text/html .html

Plaintextfile text/plain .txt

PDF application/pdf .pdf

GraphicsInterchangeFormat(GIF)image image/gif .gif

JPEGimage image/jpeg .jpeg

PNGimage image/x-png .png

MP3musicfile audio/mpeg .mp3

ShockwaveFlashanimation application/futuresplashorapplication/x-shockwave-flash .swf

MicrosoftWorddocument application/msword .doc

Excelworksheet application/vnd.ms-excel .xls

PowerPointdocument application/vnd.ms-powerpoint .ppt

Therequesttotheservletlookslikethis:

http://localhost:8080/home/sendpdf?file=chapter5

Page 493: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Example13-1checkstoseeiftherequestparameterfileisvalidandthenaddsthefileextension.pdftothefilenameifitdoesnotalreadyhavethatsuffix.ThisisthefilenametheHTTPresponserecommendstothebrowser(itwillappearasthedefaultfilenameinanydisplayed"SaveAs"windows).

JasonHunterinJavaEnterpriseBestPractices(O'Reilly)pointsoutthatitisoftenusefultoincludetheintendedfilename(forthe"SaveAs"dialogboxthebrowserproduces)directlyintheURLasextrapathinfo.Thebrowserdetectsthatnameastherequestedresourceandmayspecifythenameinthe"SaveAs"dialogwindow.AnexampleURLinthiscaselookslike:

http://localhost:8080/home/chapter5.pdf?file=ch5

Example13-1.SendingaPDFfileasbinarydata

packagecom.jspservletcookbook;

importjava.io.FileInputStream;

importjava.io.BufferedInputStream;

importjava.io.File;

importjava.io.IOException;

importjavax.servlet.*;

importjavax.servlet.http.*;

publicclassSendPdfextendsHttpServlet{

publicvoiddoGet(HttpServletRequestrequest,

HttpServletResponseresponse)throwsServletException,

IOException{

//getthefilenamefromthe"file"parameter

StringfileName=(String)request.getParameter("file");

if(fileName==null||fileName.equals(""))

thrownewServletException(

Page 494: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

"Invalidornon-existentfileparameterinSendPdfservlet.");

//addthe.pdfsuffixifitdoesn'talreadyexist

if(fileName.indexOf(".pdf")==-1)

fileName=fileName+".pdf";

//wherearePDFskept?

StringpdfDir=getServletContext().getInitParameter("pdf-dir");

if(pdfDir==null||pdfDir.equals(""))

thrownewServletException(

"Invalidornon-existent'pdfDir'context-param.");

ServletOutputStreamstream=null;

BufferedInputStreambuf=null;

try{

stream=response.getOutputStream();

Filepdf=newFile(pdfDir+"/"+fileName);

//setresponseheaders

response.setContentType("application/pdf");

response.addHeader(

"Content-Disposition","attachment;filename="+fileName);

response.setContentLength((int)pdf.length());

FileInputStreaminput=newFileInputStream(pdf);

buf=newBufferedInputStream(input);

intreadBytes=0;

//readfromthefile;writetotheServletOutputStream

while((readBytes=buf.read())!=-1)

stream.write(readBytes);

}catch(IOExceptionioe){

Page 495: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

thrownewServletException(ioe.getMessage());

}finally{

//closetheinput/outputstreams

if(stream!=null)

stream.close();

if(buf!=null)

buf.close();

}

}//enddoGet

publicvoiddoPost(HttpServletRequestrequest,

HttpServletResponseresponse)

throwsServletException,IOException{

doGet(request,response);

}

}

Example13-1getsthedirectorywherethePDFfilesarestoredfromacontext-paramelementinthedeploymentdescriptor:

<context-param>

<param-name>pdf-dir</param-name>

<param-value>h:/book/distribute</param-value>

</context-param>

Rememberthatthecontext-paramelementsappearbeforethefilter,filter-mapping,listener,andservletelementsintheweb.xmlversionforservletAPI2.3.

ThecodethengetstheServletOutputStreamfromthe

Page 496: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

HttpServletResponseobject.ThebinarydatarepresentingthePDFiswrittentothisstream:

stream=response.getOutputStream();

Theservletdoesnotuseajava.io.PrintWriterasinresponse.getWriter(),becauseaPrintWriterisdesignedforreturningcharacterdata,suchasHTML,thatthebrowserdisplaysonthecomputerscreen.Example13-1addstheresponseheadersthathelppreventthebrowsersfromtryingtodisplaythebytesascontentinthebrowserwindow:

response.setContentType("application/pdf");

response.addHeader(

"Content-Disposition","attachment;filename="+fileName);

response.setContentLength((int)pdf.length());

TheContent-Dispositionheaderfieldsignalstheclienttotreatthereceivedcontentasanattachment,notascharacterstobedisplayedinthebrowser.Thisoptionalresponseheaderalsoprovidesarecommendedfilename,whichthebrowsermayincludeasthedefaultfilenameinany"SaveAs"windows.

SeeRFC2183atftp://ftp.rfc-editor.org/in-notes/rfc2183.txtforbackgroundinformationontheContent-Dispositionheader.

TheclientbrowsercanusetheContent-Lengthheadervalue(providedwithresponse.setContentLength())toindicatetotheuserthedownloadprogresswithawidgetthatshowsahorizontalbarsteadilyfillingwithcolor.Theservletalsousesajava.io.BufferedInputStreamtobuffertheinputfromthefileinabyte[]array,whichspeedsupthetransferofdatafromtheservertotheclient.

Page 497: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

SeeRecipe13.5foranexampleofusingajava.net.URLConnection(asopposedtoaFileInputStream)togetaninputstreamassociatedwithawebresource.AURLConnectionisusefulwhenyouwanttoobtainbinarydatafromaPDFfilethatisavailableonlyasawebaddressbeginningwith"http://".

ThecodeclosestheServletOutputStreamandtheBufferedInputStreaminafinallyblocktoreleaseanysystemresourcesusedbytheseobjects.Thecodewithinthefinallyblockexecutesregardlessofwhetherthecodethrowsanexception.

InternetExplorer5.5usuallyraisesanexceptionthatisdisplayedintheTomcatlogfilewhenarequestismadetothisrecipe'sservlet.Theloggedexceptiondoesnotdisrupttheapplication,nordoesitappearwhentheservletisrequestedbyOpera5,orbyInternetExplorer5.2andtheSafariMacintoshbrowsers.Theexceptionmessageincludesthetext"Connectionresetbypeer:socketwriteerror."Thismessagehasraisedspeculationonvariousservlet-relatedmailingliststhattheIEclientbrowseronWindowshascausedtheexceptionbyseveringtheconnectionwithTomcatafterthedatatransfer.Nobodyhasyetdevisedadefinitivesolutiontothisapparentlyharmlessexception,beyondsuggestingthattheservletcontainer'sloggingmechanismbeconfiguredtoignoreexceptionsofthistype.

SeeAlso

Recipe13.2-Recipe13.4onsendingWord,XML,andMP3filesasbinarydata;Recipe13.5ongettinganinputstreamrepresentingawebresourcesuchasweb.xml;RFCtechnicaldocumentsonMIME:ftp://ftp.rfc-editor.org/in-notes/rfc2045.txtandftp://ftp.rfc-editor.org/in-notes/rfc2046.txt.;RFC2183atftp://ftp.rfc-editor.org/in-notes/rfc2183.txtforbackgroundinformationontheContent-Dispositionheader;theMediaTypessectionoftheHTTPPocketReferencebyClintonLong(O'Reilly).

Page 498: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe13.2SendingaWordProcessingFile

Problem

YouwanttosendaMicrosoftWordfileasbinarydata.

Solution

UsethesameservletsetupasdescribedinRecipe13.1,butincludeadifferentfileextensionandaContent-Typeofapplication/msword.

Discussion

YoumighthavesomeMicrosoftWorddocumentsthatyouwanttodistributeasbinarydatafromaservlet.Example13-2usesthesamebasicstructureasExample13-1,withafewchangestoadapttheservletforsendingMicrosoftWorddocuments.Theseincludeaccessingadifferentcontext-paramelement(youcouldkeepallfilesfordownloadinthesamedirectory,however),andusingadifferentMIMEtypeastheparameterforthesetContentType()method,asinresponse.setContentType("application/msword").

Example13-2.SendingaWordfileasbinarydata

packagecom.jspservletcookbook;

importjava.io.FileInputStream;

importjava.io.BufferedInputStream;

importjava.io.File;

Page 499: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

importjava.io.IOException;

importjavax.servlet.*;

importjavax.servlet.http.*;

publicclassSendWordextendsHttpServlet{

publicvoiddoGet(HttpServletRequestrequest,

HttpServletResponseresponse)throwsServletException,

IOException{

//getthefilenamefromthe"file"parameter

StringfileName=(String)request.getParameter("file");

if(fileName==null||fileName.equals(""))

thrownewServletException(

"Invalidornon-existentfileparameterinSendWord.");

//addthe.docsuffixifitdoesn'talreadyexist

if(fileName.indexOf(".doc")==-1)

fileName=fileName+".doc";

//whereareWordfileskept?

StringwordDir=getServletContext().getInitParameter("word-dir");

if(wordDir==null||wordDir.equals(""))

thrownewServletException(

"Invalidornon-existentwordDircontext-param.");

ServletOutputStreamstream=null;

BufferedInputStreambuf=null;

try{

stream=response.getOutputStream();

Filedoc=newFile(wordDir+"/"+fileName);

//setresponseheaders

response.setContentType("application/msword");

Page 500: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

response.addHeader(

"Content-Disposition","attachment;filename="+fileName);

response.setContentLength((int)doc.length());

FileInputStreaminput=newFileInputStream(doc);

buf=newBufferedInputStream(input);

intreadBytes=0;

//readfromthefile;writetotheServletOutputStream

while((readBytes=buf.read())!=-1)

stream.write(readBytes);

}catch(IOExceptionioe){

thrownewServletException(ioe.getMessage());

}finally{

//closetheinput/outputstreams

if(stream!=null)

stream.close();

if(buf!=null)

buf.close();

}

}//enddoGet

publicvoiddoPost(HttpServletRequestrequest,

HttpServletResponseresponse)throwsServletException,

IOException{

doGet(request,response);

}

}

TheServletOutputStream(theinformationsentastheservlet

Page 501: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

response)andtheBufferedInputStream(fromwhichtheservletgetsthefiletosend)arebothclosedinthefinallyblocktomakesureanysystemresourcestheyusearereleased.SeetheendofthediscussioninRecipe13.1forafurtherdescriptionofthiscode,includingthewarningattheendofthatrecipeabouttheInternetExplorer-relatedexception.

SeeAlso

Recipe13.1onsendingaPDFfile;Recipe13.3andRecipe13.4onsendingXMLandMP3filesasbinarydata;Recipe13.5ongettinganinputstreamrepresentingawebresourcesuchasweb.xml;RFCtechnicaldocumentsonMIME:ftp://ftp.rfc-editor.org/in-notes/rfc2045.txtandftp://ftp.rfc-editor.org/in-notes/rfc2046.txt;RFC2183atftp://ftp.rfc-editor.org/in-notes/rfc2183.txtforbackgroundinformationontheContent-Dispositionheader;theMediaTypessectionoftheHTTPPocketReferencebyClintonWong(O'Reilly);Chapter1introducingthedevelopmentofaservlet.

Page 502: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe13.3SendinganXMLfile

Problem

YouwanttosendanXMLfileasbinarydatafromaservlet.

Solution

Usethejavax.servlet.ServletOutputStreamobtainedfromthejavax.servlet.http.HttpServletResponseobjecttosendtheXMLfileasbinarydatatotheclient.

Discussion

ThisrecipedescribeshowtosendanXMLfileasbinarydatafromaServletOutputStream,sothattheusercanhandlethefileasdownloadedXML.Example13-3obtainsthebytesthatrepresenttheXMLasaBufferedInputStreamwrappedaroundaFileInputStream.ThecodeisverysimilartoExample13-1inRecipe13.1,exceptthatitusesaMIMEtypeoftext/XML.

InapopularformofconvertingXMLintoareadableformat,youcouldconverttheXMLcontenttoHTMLoranotherformusingExtensibleStylesheetLanguageTransformations(XSLT).IftheintentistouseXSLTforgeneratingthecontentinabrowser,leaveouttheContent-Dispositionresponseheader,becausethisheaderisdesignedtohandletheXMLasadownloadedfilethatwillbesavedintheuser'sfilesystem.SeeChapter23onusingthex:transformJSTLtag.

Page 503: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Example13-3.SendinganXMLfilewithaservlet

packagecom.jspservletcookbook;

importjava.io.FileInputStream;

importjava.io.BufferedInputStream;

importjava.io.File;

importjava.io.IOException;

importjavax.servlet.*;

importjavax.servlet.http.*;

publicclassSendXmlextendsHttpServlet{

publicvoiddoGet(HttpServletRequestrequest,

HttpServletResponseresponse)throwsServletException,

IOException{

//getthefilenamefromthe"file"parameter

StringfileName=(String)request.getParameter("file");

if(fileName==null||fileName.equals(""))

thrownewServletException(

"Invalidornon-existentfileparameterinSendXmlservlet.");

//addthe.xmlsuffixifitdoesn'talreadyexist

if(fileName.indexOf(".xml")==-1)

fileName=fileName+".xml";

//whereareXMLfileskept?

StringxmlDir=getServletContext().getInitParameter("xml-dir");

if(xmlDir==null||xmlDir.equals(""))

thrownewServletException(

"Invalidornon-existentxmlDircontext-param.");

ServletOutputStreamstream=null;

BufferedInputStreambuf=null;

Page 504: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

try{

stream=response.getOutputStream();

Filexml=newFile(xmlDir+"/"+fileName);

//setresponseheaders

response.setContentType("text/xml");

response.addHeader(

"Content-Disposition","attachment;filename="+fileName);

response.setContentLength((int)xml.length());

FileInputStreaminput=newFileInputStream(xml);

buf=newBufferedInputStream(input);

intreadBytes=0;

//readfromthefile;writetotheServletOutputStream

while((readBytes=buf.read())!=-1)

stream.write(readBytes);

}catch(IOExceptionioe){

thrownewServletException(ioe.getMessage());

}finally{

//closetheinput/outputstreams

if(stream!=null)

stream.close();

if(buf!=null)

buf.close();

}//finally

Page 505: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

}//enddoGet

publicvoiddoPost(HttpServletRequestrequest,

HttpServletResponseresponse)

throwsServletException,IOException{

doGet(request,response);

}

}

Forthecontext-paramtoworkcorrectlyinthiscode,youhavetoincludeinweb.xmlanelementthatlookslike:

<context-param>

<param-name>xml-dir</param-name>

<param-value>h:/home/xml</param-value>

</context-param>

SeeChapter1ifyouneedanintroductionorrefresherforthedeploymentdescriptorweb.xml.

ThediscussioninRecipe13.1describesthebasicmechanicsofthiscode,soIdon'trepeatthatinformationhere.SeethenoteattheendofRecipe13.1abouttheInternetExplorer-relatedexceptionthatyoumayexperiencewithservletsofthistype.

SeeAlso

Recipe13.1onsendingaPDFfile;Recipe13.2onsendingaMicrosoftWordfileasbinarydata;Recipe13.4onsendingMP3filesasbinarydata;Recipe13.5ongettinganinputstreamrepresentingawebresourcesuchasweb.xml;theRFCtechnicaldocumentsonMIME:

Page 506: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

ftp://ftp.rfc-editor.org/in-notes/rfc2045.txtandftp://ftp.rfc-editor.org/in-notes/rfc2046.txt;RFC2183atftp://ftp.rfc-editor.org/in-notes/rfc2183.txtforbackgroundinformationontheContent-Dispositionheader;theMediaTypessectionoftheHTTPPocketReferencebyClintonWong(O'Reilly);Chapter1introducingthedevelopmentofaservlet;atutorialonjava.sun.comonXSLT:http://java.sun.com/webservices/docs/1.1/tutorial/doc/JAXPXSLT.html#wp68287

Page 507: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe13.4SendinganAudioFile

Problem

YouwanttosendanaudiofilesuchasanMPEGlayer3(MP3)mediatype.

Solution

Useajava.io.BufferedInputStreamtofetchtheaudiodata,andthejavax.servlet.ServletOutputStreamfromthejavax.servlet.http.HttpServletResponseobjecttosendthedatatotheclient.

Discussion

ThecodeinExample13-4usesthesameapproachasthepriorrecipes,exceptfortheMIMEtype,whichisspecifiedasaudio/mpeg.

WebbrowsersassociateanumberofotherMIMEtypesforMP3files,includingaudio/x-mpeg,audio/mp3,andaudio/x-mp3.

TheuserrequestsafilenameintheURL,asin:

http://localhost:8080/home/sendmp3?file=song_name

Thedeploymentdescriptor(web.xml)mapstheservletpath/sendmp3to

Page 508: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

theservletclassofExample13-4:com.jspservletcookbook.SendMp3.Iftherequestedfiledoesnotalreadyhavethe.mp3suffix,thenthecodeaddsthatfileextension.Acontext-paramelementinthedeploymentdescriptorspecifiesthedirectorywheretheaudiofilesarekept:

<context-param>

<param-name>mp3-dir</param-name>

<param-value>h:/home/mp3s</param-value>

</context-param>

Example13-4usesthisdirectoryname,plusthefilename,astheconstructorparametertocreateanewjava.io.Fileobject,whichisthesourceforajava.io.FileInputStream.ABufferedInputStreambuffersthebytesfromthesongfile,whichtheServletOutputStreamresponsereads.

Example13-4.SendinganMP3file

packagecom.jspservletcookbook;

importjava.io.FileInputStream;

importjava.io.BufferedInputStream;

importjava.io.File;

importjava.io.IOException;

importjavax.servlet.*;

importjavax.servlet.http.*;

publicclassSendMp3extendsHttpServlet{

publicvoiddoGet(HttpServletRequestrequest,

HttpServletResponseresponse)throwsServletException,IOException{

//getthefilenamefromthe"file"parameter

StringfileName=(String)request.getParameter("file");

Page 509: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

if(fileName==null||fileName.equals(""))

thrownewServletException(

"Invalidornon-existentfileparameterinSendMp3servlet.");

//addthe.mp3suffixifitdoesn'talreadyexist

if(fileName.indexOf(".mp3")==-1)

fileName=fileName+".mp3";

//whereareMP3fileskept?

Stringmp3Dir=getServletContext().getInitParameter("mp3-dir");

if(mp3Dir==null||mp3Dir.equals(""))

thrownewServletException(

"Invalidornon-existentmp3-Dircontext-param.");

ServletOutputStreamstream=null;

BufferedInputStreambuf=null;

try{

stream=response.getOutputStream();

Filemp3=newFile(mp3Dir+"/"+fileName);

//setresponseheaders

response.setContentType("audio/mpeg");

response.addHeader(

"Content-Disposition","attachment;filename="+fileName);

response.setContentLength((int)mp3.length());

FileInputStreaminput=newFileInputStream(mp3);

buf=newBufferedInputStream(input);

intreadBytes=0;

//readfromthefile;writetotheServletOutputStream

while((readBytes=buf.read())!=-1)

stream.write(readBytes);

Page 510: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

}catch(IOExceptionioe){

thrownewServletException(ioe.getMessage());

}finally{

//closetheinput/outputstreams

if(stream!=null)

stream.close();

if(buf!=null)

buf.close();

}

}//doGet

publicvoiddoPost(HttpServletRequestrequest,

HttpServletResponseresponse)throwsServletException,IOException{

doGet(request,response);

}

}

ReviewRecipe13.1forafurtherexplanationofthiscode,includingthewarningattheendofthe"Discussion"sectionaboutloggedexceptionsthatmayoccurwithInternetExplorer.

SeeAlso

Recipe13.1onMIMEtypesandsendingaPDFfileasbinarydata;Recipe13.2andRecipe13.3onsendingWordandXMLfiles,respectively,asbinarydata;Recipe13.5onreceivinganinputstreamrepresentingawebresourcesuchasweb.xml;theRFCtechnicaldocumentsonMIME:ftp://ftp.rfc-editor.org/in-notes/rfc2045.txtand

Page 511: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

ftp://ftp.rfc-editor.org/in-notes/rfc2046.txt;RFC2183atftp://ftp.rfc-editor.org/in-notes/rfc2183.txtforbackgroundinformationontheContent-Dispositionheader;theMediaTypessectionoftheHTTPPocketReferencebyClintonWong(O'Reilly);Chapter1introducingthedevelopmentofaservlet.

Page 512: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe13.5ViewingInternalResourcesinaServlet

Problem

Youwanttouseaservlettofetchinternalresourcesfromawebapplicationforviewingbyauthenticatedusers.

Solution

Usethejavax.servlet.ServletContext.getResource(Stringpath)methodtogeneratetheinputstreamfromthewebresource.

Discussion

Aservletcouldbeusedwhileawebapplicationisindevelopmenttoprovideaviewofthedeploymentdescriptor.Webdevelopersoftenhavetodouble-checkweb.xmlforthevaluesofcontext-paramelements,aservlet'sregisteredname,andotherinformation.Wouldn'titbenicetojustrequestaservletinthebrowsertoviewweb.xml?

Example13-5opensupweb.xmlusingtheServletContext.getResource()method,whichreturnsajava.net.URLobjectrepresentingthedeploymentdescriptoratthepathWEB-INF/web.xml.

ThecodeopensaconnectiontotheXMLfilebycallingtheURLobject'sopenConnection()method,whichreturnsajava.net.URLConnectionobject.ThenthecodebufferstheinputstreamtotheresourcebywrappingitinaBufferedInputStream:

Page 513: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

buf=newBufferedInputStream(urlConn.getInputStream());

TheurlConnvariablereferstoaURLConnection.

IfthebrowserisnotsavvyaboutdisplayingXMLfilesinareadablefashion(Netscape7.1andInternetExplorercandisplaythesefilesproperly),youcanuseXSLTtoconverttheXMLintoHTMLbeforeitissenttothebrowser.

Example13-5.Displayingthedeploymentdescriptorviaaservlet

packagecom.jspservletcookbook;

importjava.io.BufferedInputStream;

importjava.io.PrintWriter;

importjava.io.IOException;

importjava.net.URL;

importjava.net.URLConnection;

importjava.net.MalformedURLException;

importjavax.servlet.*;

importjavax.servlet.http.*;

publicclassResourceServletextendsHttpServlet{

publicvoiddoGet(HttpServletRequestrequest,

HttpServletResponseresponse)throwsServletException,

IOException{

//getweb.xmlfordisplaybyaservlet

Stringfile="/WEB-INF/web.xml";

Page 514: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

URLurl=null;

URLConnectionurlConn=null;

PrintWriterout=null;

BufferedInputStreambuf=null;

try{

out=response.getWriter();

//accessawebresourcewithinthesamewebapplication

//asaURLobject

url=getServletContext().getResource(file);

//setresponseheader

response.setContentType("text/xml");

urlConn=url.openConnection();

//establishconnectionwithURLrepresentingweb.xml

urlConn.connect();

buf=newBufferedInputStream(urlConn.getInputStream());

intreadBytes=0;

//readfromthefile;writetothePrintWriter

while((readBytes=buf.read())!=-1)

out.write(readBytes);

}catch(MalformedURLExceptionmue){

thrownewServletException(mue.getMessage());

}catch(IOExceptionioe){

thrownewServletException(ioe.getMessage());

Page 515: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

}finally{

//closetheinput/outputstreams

if(out!=null)

out.close();

if(buf!=null)

buf.close();

}

}//doGet

publicvoiddoPost(HttpServletRequestrequest,

HttpServletResponseresponse)

throwsServletException,IOException{

doGet(request,response);

}

}

Thisservletisdesignedfordevelopers;ifjustanyonehasachancetostudythedeploymentdescriptor,itwillcompromisethewebapplication'ssecurity.Therefore,youshouldremovetheservletfromproductionversionsofthewebapplication,oruseauthenticationtoallowonlyauthorizeduserstoviewtheservlet'soutput(seeChapter15fordetails).

ThecodeusesaPrintWritertowritethebytesreceivedfromtheinputstream,becausetheservletintendstodisplaytheresponseascharacters(insteadofofferingtheresponsetotheclientasadownloadedresource).TheServletContext.getResource(Stringpath)methodtakesapaththatbeingswiththe/character.Thepathisinterpretedasbeginningatthecontextroot,ortop-leveldirectory,ofthewebapplication.Therefore,theservletobtainsweb.xmlwiththefollowing

Page 516: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

code:

Stringfile="/WEB-INF/web.xml";

...

url=getServletContext().getResource(file);

TheServletContext.getResouce()methodreturnsnullifitisunabletoreturnavalidresourcerepresentingthepathparameter.

SeeAlso

Recipe13.1-Recipe13.4onsendingPDF,Word,XML,andaudiofiles,respectively,asbinarydata;theRFCtechnicaldocumentsonMIME:ftp://ftp.rfc-editor.org/in-notes/rfc2045.txtandftp://ftp.rfc-editor.org/in-notes/rfc2046.txt;RFC2183atftp://ftp.rfc-editor.org/in-notes/rfc2183.txtforbackgroundinformationontheContent-Dispositionheader;theMediaTypessectionoftheHTTPPocketReferencebyClintonWong(O'Reilly);Chapter1introducingthedevelopmentofaservlet.

Page 517: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Chapter14.LoggingMessagesfromServletsandJSPs

Introduction

Recipe14.1.LoggingWithoutLog4j

Recipe14.2.SettingUpLog4j

Recipe14.3.UsingaLoggerWithoutaConfigurationFile

Recipe14.4.AddinganAppendertotheRootLogger

Recipe14.5.UsingaPatternwithaLogger'sAppender

Recipe14.6.Usinglog4jinaJSP

Recipe14.7.LoggingMessagesUsingaServletContextEventListener

Recipe14.8.LoggingMessagesUsingaSessionEventListener

Page 518: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Introduction

Logginginvolvessendingmessagesfromyourapplicationanddisplayingthisinformationinavarietyofwaysforwebdevelopersandadministrators.Themessagescanbedeliveredtoaconsole,ortheycanbestoredpersistentlyinfilesordatabases.Loggingmaybeusedonlyforsendingdebug-relatedinformationwhileawebapplicationisbeingdeveloped,orthesemessagesmayprovideinformationfromanapplicationinproduction,includingdataaboutwarningsandfatalerrors.

Thischapterdescribesaverypowerfulopensourceloggingtoolcalledlog4j.ThisisaJavaARchive(JAR)file(log4j-1.2.8.jar)thatyoucanaddtoyourwebapplicationbyplacingitinyourWEB-INF/libdirectory.Thismakesitavailableforuseinanyservletsorbeansthatyouwanttosendloggingmessagesfrom.Thissectionprovidesonlyabriefintroductiontolog4j,becauseitspowerdoesentailsomecomplexity.

log4jinvolvesthreemainconcepts:loggers,appenders,andlayouts.log4jusesanexternalconfigurationfile,similartoadeploymentdescriptor,toconfigurethesethreeloggingelements.Theupcomingrecipesprovidesomeexamplesoftheseconfigurationfiles,whicharemostlysimpletextfilesinvolvingalistofname/valuepairs.Thepowerofusingexternalfilesisthatyoucanchangethepropertiesinthesetextfilestoalteralogger(forinstance,modifytheformatofitsmessages)insteadofrecompilingtheservletcode.

Forthechangestotakeeffect,youmayrequireareloadoftheservletorothercomponentthatinitializestheloggingsystemfortheapplication.

Loggers

Page 519: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Aloggeristheentitythataservletusestologmessages.Touseone,importthelog4jclassesintotheservlet,createaninstanceofalogger(specificallyanorg.apache.log4j.Logger),thencallthelogger'smethods.Themethodsarenamedafterthelogginglevelofthemessage.Forexample,tologaninformationalmessage(anINFOlevel)youwouldcall:

logger.info("HttpServletinitmethodcalled.");

log4jhasfivedifferentlevelsoflogcategories:DEBUG,INFO,WARN,ERROR,andFATAL.ThelogcategoriesareorganizedinascendingorderbeginningwithDEBUGaloggerconfiguredforINFO-levellogginglogsonlyINFO,WARN,ERROR,andFATALmessages(butnotDEBUG-levelmessages,becauseinthishierarchyDEBUGisbeneathINFOandtheotherlevels).Hereisabriefdescriptionofthepurposeofeachlevel:

DEBUGinvolvesloggingmessageswhileinitiallydevelopinganddebugginganapplication.

INFOhelpsyoumonitortheprogressofanapplication.

WARNdesignatespotentiallyharmfulsituations.

ERRORrepresentsanerrorthattheapplicationcanlikelyrecoverfrom.

FATALsuggestserrorsthatwillcauseanapplicationtoabort.

Everyloggerisconfiguredwithalevel(suchasDEBUG)inthelog4jpropertiesorconfigurationfile(seeRecipe14.4).log4jalsoassociatesthemessagesthatyoulogwithaspecifiedlevel,whichmakesiteasytousebecausethemethodnamesarethesameasthelevelnames.Theloggerdoesnotsendthesemessagesunlessthelogger'slevelisequaltoorgreaterthanthelevelrepresentedbythemethodcall(asinlogger.debug(Objectmessage)).

Page 520: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Forexample,let'ssayyouconfiguretheloggerwithalevelofDEBUG,thendevelopaservletwithanumberoflogger.debug(Objectmessage)calls.

Later,youcanchangetheconfigurationfileandgivetheloggeranINFOlevel.Changingtheconfigurationinthismanner"turnsoff"DEBUG-levellogginginthatservlet,sothattheseloggingmessagesnolongershowupinthelogfiles,database,orotherloggingrepository.ThisisbecauseDEBUGisnotequaltoorgreaterthanINFOinthehierarchyofloggingcategories.

Similarly,youcanturnbackonDEBUG-levellogginginthepriorexamplebysimplyswitchingthelogger'sconfigurationbackfromINFOtoDEBUG.Asaresult,thedebug-levelmessageswillnolongerbefilteredout.

ProgrammerswritingsoftwarewithseveralDEBUG-levelmethodcallscaneasilyswitchintoWARN-orERROR-leveldebuggingoncetheapplicationmovesintoitsnextstageofdevelopment,orgoesintoproduction.

Appenders

log4jisalsoverypowerfulintermsofthedifferentwaysyoucanlogmessages.Youcanuselog4jtologmessagestoaconsole,afile,arollingfile(whichautomaticallycreatesabackupfilewhenalogfilereachesaspecifiedsize),adatabase,anemailserver,andseveralothertypesoflogrepositories.log4jcallseachoftheseloggingmechanismsanappender.Recipe14.4introducestheconfigurationfileinwhichyoucandescribeappenders.

Layouts

Whatdoestheactualloggedmessagelooklike?Whatinformationdoesitinclude?log4jshinesinthisareatoo.Youcanspecifynumerousdifferentlayoutsforthemessagesusingthelog4jconfigurationfile.log4jletsyou

Page 521: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

specifyverycomplex(orsimple)layoutsusingconversionpatterns,whicharesomewhatsimilartoregularexpressions.Toachievethemostbasiclayout,youcanspecifyanorg.apache.log4j.SimpleLayout.Withthisformat,thelogcontainsthelevelname,followedbyadash(-)andtheactualmessage:

INFO-HttpServletinitmethodcalled.

Usinganorg.apache.log4j.PatternLayoutismorepowerful,andRecipe14.5providessomeexamplesofdifferentlayoutsforloggingmessages.

Page 522: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe14.1LoggingWithoutLog4j

Problem

Youwanttoputamessageintheserverlogs.

Solution

CalltheServletContext.log()methodinsidetheservlet.

Discussion

Ifyoujustwanttologamessageintheservletcontainer'slogfileanddonotneedthepoweroflog4j,usetheServletContext.log()method.Example14-1showsthetwoversionsofthelog()method.OnetakestheStringmessageasaparameter,andtheotherhastwoparameters:aStringmessageandaThrowable.TheservletlogwillcontainthestacktraceoftheThrowableifyouusethislog()form.

Example14-1.AservletusestheServletContext.log()method

packagecom.jspservletcookbook;

importjavax.servlet.*;

importjavax.servlet.http.*;

publicclassContextLogextendsHttpServlet{

Page 523: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

publicvoiddoGet(HttpServletRequestrequest,

HttpServletResponseresponse)throwsServletException,

java.io.IOException{

StringyourMessage=request.getParameter("mine");

//CallthetwoServletContext.logmethods

ServletContextcontext=getServletContext();

if(yourMessage==null||yourMessage.equals(""))

//logversionwithThrowableparameter

context.log("Nomessagereceived:",

newIllegalStateException("Missingparameter"));

else

context.log("Hereisthevisitor'smessage:"+yourMessage);

response.setContentType("text/html");

java.io.PrintWriterout=response.getWriter();

//loggingservletsprobablywanttodisplaymoreHTML

out.println(

"<html><head><title>ServletContextlogging</title></head><body>");

out.println("<h2>Messagessent</h2>");

out.println("</body></html>");

}//doGet

}

TheServletContextlogsitstextmessagestotheservletcontainer'slogfile.WithTomcattheselogsarefoundin<Tomcat-installation-directory>/logs.BelowistheoutputofExample14-1andthesecondformofServletContext.log(),whichprintsthemessageandtheThrowable'sstacktrace(onlythefirsttwolevelsofthemethodstackareshown).Youcanseethatthelogincludesthedateandtimeoftheloggingactivity,andthemessagetext:

2003-05-0814:42:43Nomessagereceived:

java.lang.IllegalStateException:Missingparameter

atcom.jspservletcookbook.ContextLog.doGet(UnknownSource)

Page 524: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

atjavax.servlet.http.HttpServlet.service(HttpServlet.java:740)

...

Thesingle-parameterformofthelog()methodsimplydisplaysthedate,time,andtextofthemessage,asinthefirstlineofthepriorlogsample.Eachlog()methodcallplacesthemessageonanewlineintheserverlogfile.

SeeAlso

Recipe14.2-Recipe14.8onusinglog4jtodesignyourowncustomloggingmechanism;ChapterSRV.3oftheservletAPIontheservletcontext;linkstothelatestservletspecification:http://java.sun.com/products/servlet/index.html.

Page 525: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe14.2SettingUpLog4j

Problem

Youwanttosetuplog4jforuseinyourwebapplication.

Solution

Downloadthelog4jdistributionfromtheApacheJakartaprojectandplacetheaccompanyinglog4j-1.2.8.jarfile(thenamewillbedifferentfordifferentlog4jversions)intheWEB-INF/libdirectoryofyourwebapplication.

Discussion

Thelog4jpackageisavailableforuseundertheApacheSoftwareLicense,whichisincludedwiththedistribution.Herearethestepsforsettinguplog4jforyourwebapplication:

1. Gotothelog4jwebsiteanddownloadthedistributioninZIP(Windows)orgzipped(Unix-basedsystems)format:http://jakarta.apache.org/log4j/docs/download.html.Thedownloadedfilewillbenamedsomethinglikejakarta-log4j-1.2.8.ziporjakarta-log4j-1.2.8.tar.gz.

Unpackthedistribution,whichcreatesadirectoryjakarta-log4j-1.2.8(forVersion1.2.8oflog4j).Insidethedistdirectoryofthistop-leveldirectoryisthelog4j-1.2.8.jarfile.CopythisJARfileintotheWEB-INF/libdirectoryofyourwebapplication(s).

Createalog4jpropertiesfileandplaceitinthewebapplication's

Page 526: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

WEB-INF/classesdirectory.Thisistypicallyatextfilewithname/valuepairsforconfiguringlog4jelementssuchasloggers,appenders,andlayouts.Recipe14.4includesanexampleofthisfile.

Intheservletsorbeanswhereyouwillusealogger,includetheproperimportstatements.Example14-2isaskeletalservletshowingtheclassesthatyoumighttypicallyuse.

Example14-2.Importinglog4j-relatedpackages

importorg.apache.log4j.Logger;

importorg.apache.log4j.PropertyConfigurator;

importjavax.servlet.*;

importjavax.servlet.http.*;

publicclassLoggerSkelextendsHttpServlet{

privateLoggerlog;

publicvoidinit(){

//log4jwillfindthelog4j.propertiesfile

//inWEB-INF/classes

log=Logger.getLogger(LoggerSkel.class);

//Justanexampleofusingthelogger

log.debug("Instancecreatedof:"+getClass().getName());

}

publicvoiddoGet(HttpServletRequestrequest,

HttpServletResponseresponse)throwsServletException,

java.io.IOException{

Page 527: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

//dologginghereifnecessary

}//doGet

}

Aslongaslog4j-1.2.8.jarislocatedinWEB-INF/lib,yourservletcanusethenecessaryclassesfromtheorg.apache.log4j.*packages.

SeeAlso

Recipe14.3-Recipe14.8onusinglog4jtodesignyourowncustomloggingmechanism;thelog4jdownloadsite:http://jakarta.apache.org/log4j/docs/download.html;thelog4jprojectdocumentationpage:http://jakarta.apache.org/log4j/docs/documentation.html.

Page 528: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe14.3UsingaLoggerWithoutaConfigurationFile

Problem

Youwanttousealoggerinaservletwithoutsettingupyourownconfigurationfile.

Solution

Createtheloggerintheservletandusetheorg.apache.log4j.BasicConfiguratorclasstoconfigurethelogger.

Discussion

log4jallowstheconfigurationofaloggerwithoutaprovidedconfigurationorpropertiesfile.Example14-3isaservletthatinstantiatesaloggerinitsinit()method,whichtheservletcontainercallswhentheservletinstanceiscreated.ThestaticBasicConfigurator.configure()methodcreatesaConsoleAppender;inotherwords,theloggerwilllogitsmessagestotheconsoleusingadefaultformat.

Example14-3.AservletusesBasicConfiguratortoconfigurealogger

packagecom.jspservletcookbook;

importorg.apache.log4j.Logger;

Page 529: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

importorg.apache.log4j.BasicConfigurator;

importjavax.servlet.*;

importjavax.servlet.http.*;

publicclassLoggerNconfigextendsHttpServlet{

privateLoggerlog=null;

publicvoidinit(){

//usetherootlogger

log=Logger.getRootLogger();

//thisloggerwilllogtotheconsolewithadefaultmessageformat

BasicConfigurator.configure();

}

publicvoiddoGet(HttpServletRequestrequest,

HttpServletResponseresponse)

throwsServletException,java.io.IOException{

//displayaDEBUGlevelmessage

log.debug("SendingaDEBUGmessage");

//displayanINFOlevelmessage

log.info("SendinganINFOmessage");

//betterdisplaysomeHTML

response.setContentType("text/html");

java.io.PrintWriterout=response.getWriter();

out.println(

"<html><head><title>Servletlogging</title></head><body>");

out.println("<h2>HellofromaLoggerwithnoConfigfile</h2>");

Page 530: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

//Thislogger'sparentistherootlogger

out.println(

"Yourloggernameis:"+log.getName()+"<br>");

out.println(

"Yourloggerparentis:"+log.getParent().getName()+"<br>");

out.println("</body></html>");

}//doGet

publicvoiddoPost(HttpServletRequestrequest,

HttpServletResponseresponse)throwsServletException,

java.io.IOException{

doGet(request,response);

}

}

Example14-4showsanexamplemessagefromtheservlet.Themessageisbasedonadefaultformatthatincludesthethreadname(Thread-5),thelevelname(DEBUG),theloggername(com.jspservletcookbook.LoggerNconfig),andtheactualmessage("SendingaDEBUGmessage").Recipe14.5showshowtocreateaformatpatternforloggingmessages,sothatyoucancustomizethetypeofinformationthattheloggersends.

Example14-4.ExampleofaloggedmessageusingBasicConfigurator

4061660[Thread-5]DEBUGcom.jspservletcookbook.LoggerNconfig-SendingaDEBUGmessage

4061660[Thread-5]INFOcom.jspservletcookbook.LoggerNconfig-SendinganINFOmessage

HereisthepatternusedforthelayoutassociatedwithBasicConfigurator:

%-4r[%t]%-5p%c%x-%m%n

Page 531: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

SeeRecipe14.5fordetailsontheorg.apache.log4j.PatternLayoutclass.

SeeAlso

Recipe14.2ondownloadingandsettinguplog4j;Recipe14.4-Recipe14.8onusinglog4jtodesignyourowncustomloggingmechanism;thelog4jdownloadsite:http://jakarta.apache.org/log4j/docs/download.html;thelog4jJavadocpage:http://jakarta.apache.org/log4j/docs/api/index.html;thelog4jprojectdocumentationpage:http://jakarta.apache.org/log4j/docs/documentation.html.

Page 532: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe14.4AddinganAppendertotheRootLogger

Problem

Youwanttoconfigureanappenderorloggingdestinationfortherootlogger.

Solution

Createaconfigurationfilecalledlog4j.propertiesandplaceitintheWEB-INF/classesdirectoryofyourwebapplication.

Discussion

Nowourdiscussionmovesontothelog4jconfigurationfile,wheredeveloperscancustomizeloggers,appenders,andlayouts.Herearethestepsforusingthisrecipe'sexamples:

1. Createapropertiesfilenamedlog4j.properties(itscontentslooklikeExample14-5).

PlacethepropertiesfileintheWEB-INF/classesdirectoryofthewebapplication.

Importthisclassintoyourservlet:org.apache.log4j.Logger.

Intheservlet,getareferencetotherootloggerwiththestaticLogger.getRootLogger()method,andstartlogging.

Page 533: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Example14-5configurestherootlogger,akindof"superlogger"foryourapplication,withaDEBUGlevel.Therootloggerusesanappendernamedcons.Thisappenderisofatypeorg.apache.log4j.ConsoleAppender,meaningthatitsendsitslogmessagestotheconsole.

Example14-5.Thelog4j.propertiesfileforcreatingarootloggerappender

log4j.rootLogger=DEBUG,cons

log4j.appender.cons=org.apache.log4j.ConsoleAppender

log4j.appender.cons.layout=org.apache.log4j.SimpleLayout

Thethirdlineofthelog4j.propertiesfilestatesthattheloggerwilluseaSimpleLayout,whichlogsthelevelname(DEBUG),adash(-),andthemessageitself.Example14-6showstheservletthatisusingthelogger.log4jwillfindthelog4j.propertiesfileautomaticallyinWEB-INF/classesbecausetheservlethasnototherwiseconfiguredtheloggerwithacalltoBasicConfigurator.configure(),asshowninRecipe14.3.

Example14-6.Usingtherootloggerconfiguredwiththelog4j.propertiesfile

packagecom.jspservletcookbook;

importorg.apache.log4j.Logger;

importjavax.servlet.*;

importjavax.servlet.http.*;

publicclassLoggerWconfigextendsHttpServlet{

Page 534: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

privateLoggerlog=null;

publicvoidinit(){

//Therootloggerwillgetitsconfigurationfrom

//WEB-INF/classes/log4j.properties

log=Logger.getRootLogger();

log.info("LoggerWconfigstarted.");

}

publicvoiddoGet(HttpServletRequestrequest,

HttpServletResponseresponse)

throwsServletException,java.io.IOException{

//displayaDEBUG-levelmessage

log.debug("SendingaDEBUGmessage");

//displayanINFO-levelmessage

log.info("SendinganINFOmessage");

//betterdisplaysomeHTML

response.setContentType("text/html");

java.io.PrintWriterout=response.getWriter();

out.println(

"<html><head><title>Servletlogging</title></head><body>");

out.println(

"<h2>HellofromaLoggerwithalog4j.propertiesfile</h2>");

out.println("Yourloggernameis:"+log.getName()+"<br>");

out.println("</body></html>");

}//enddoGet

}

Page 535: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Example14-6logsanINFOmessageintheservlet'sinit()method,thenlogstwomessagesintheservlet'sdoGet()servicemethod.Theloggerlogsallofthesemessagestotheconsolebecausethisishowthelog4j.propertiesfileconfigurestherootlogger'sappender.Thisiswhattheconsoleoutputlookslike:

INFO-LoggerWconfigstarted.

DEBUG-SendingaDEBUGmessage

INFO-SendinganINFOmessage

Figure14-1showstheservlet'soutputinawebbrowser.

Figure14-1.Theloggerdisplaysitsnameinaservlet

SeeAlso

Recipe14.2ondownloadingandsettinguplog4j;Recipe14.3onusingalog4jloggerwithoutapropertiesfile;Recipe14.5-Recipe14.8onusinglog4jtodesignyourowncustomloggingmechanism;thelog4jdownloadsite:http://jakarta.apache.org/log4j/docs/download.html;thelog4jJavadocpage:http://jakarta.apache.org/log4j/docs/api/index.html;thelog4jprojectdocumentationpage:http://jakarta.apache.org/log4j/docs/documentation.html.

Page 536: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe14.5UsingaPatternwithaLogger'sAppender

Problem

Youwanttocreateyourownloggerforaservletandgivetheloggeranappender.

Solution

Includetheappenderconfigurationinthelog4j.propertiesfile.

Discussion

Thisrecipecreatesanewlogger,whichbringsustothediscussionoflog4j'sinheritancestructure.Therootloggeristhe"superlogger"thatalllogger'sinheritfrom,similartojava.lang.ObjectinJava'sobjectorientedprogrammingsetup.Example14-7createsanewloggernamedcom.jspservletcookbook,whichinheritstherootlogger'slevel(DEBUG)andconsoleappender(namedcons).Example14-7alsocreatesanappenderforthecom.jspservletcookbooklogger.Placethislog4j.propertiesfileintheWEB-INF/classesdirectory.

Example14-7.Theconfigurationforaloggernamedcom.jspservletcookbook

log4j.rootLogger=DEBUG,cons

log4j.logger.com.jspservletcookbook=,myAppender

Page 537: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

#therootlogger'sappender

log4j.appender.cons=org.apache.log4j.ConsoleAppender

#thecom.jspservletcookbooklogger'sappender

log4j.appender.myAppender=org.apache.log4j.RollingFileAppender

log4j.appender.myAppender.File=h:/home/example.log

log4j.appender.myAppender.MaxBackupIndex=1

log4j.appender.myAppender.MaxFileSize=1MB

#therootlogger'slayout

log4j.appender.cons.layout=org.apache.log4j.SimpleLayout

#thecom.jspservletcookbooklogger'slayout

log4j.appender.myAppender.layout=org.apache.log4j.PatternLayout

log4j.appender.myAppender.layout.ConversionPattern=%-5pLogger:%c{1}

Date:%d{ISO8601}-%m%n

YouprobablynoticedthesimilaritybetweenpackagenamesandthenameofthenewloggerinExample14-7:com.jspservletcookbook.log4jusesanamingschemebasedonJava's.Here'sthebasicrundownonthisscheme:

Allloggersinheritfromtherootlogger.

Allloggerswhosenamecontainsaprefixthatmatchesaconfiguredlogger'sname(suchascom.jspservletcookbook)alsoinheritfromthatconfiguredlogger.Therefore,aloggernamedcom.jspservletcookbook.LoggerWconfigderivesitscharacteristicsfromthecom.jspservletcookbooklogger.

InExample14-7,thecom.jspservletcookbookloggerspecifiesthatitwilluseanappendernamedmyAppender.ThemyAppender

Page 538: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

appenderisarollingfileappender,whichisalogfilethatautomaticallycreatesabackupfilewhentheoriginallogreachesacertainsize.TheappenderisbasedontheJavaclassorg.apache.log4j.RollingFileAppender,whichisamongthesetofclassesthatlog4juses.

IfyoulookattheJavadocforthatclass,thenyouseethatithasabunchofmethodsthatlooklikegetXXX(),whereXXXisoneofthelogger'sproperties.Yousetthesepropertiesoftheappenderintheconfigurationfilebygivingeachpropertyavalue.TosetthemyAppenderappender'sFileproperty,thesyntaxis:

log4j.appender.myAppender.File=h:/home/example.log

Thisconfigurationelementspecifiesthefilelocationwheretheappenderwilllogitsmessages.WhenthisfilereachesitsMaxFileSizeof1MB,log4jrenamesthefileexample.log.1andcreatesanewexample.logtoreceivelogmessages.TheMaxBackupIndexmeansthatlog4jwillcreateonlyonebackupfile.

TheJavadocforRollingFileAppendercanbefoundat:http://jakarta.apache.org/log4j/docs/api/org/apache/log4j/RollingFileAppender.html.

Example14-7alsospecifiesalayoutforthecom.jspservletcookbooklogger,andaratherelaborateoneatthat:

log4j.appender.myAppender.layout=org.apache.log4j.PatternLayout

log4j.appender.myAppender.layout.ConversionPattern=%-5pLogger:%c{1}Date:

%d{ISO8601}-%m%n

ThefirstlinespecifiesthatthemyAppenderlayoutwilluseanorg.apache.log4j.PatternLayout,whichisbasedonthe

Page 539: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

conversionpatternoftheprintffunctioninC,accordingtothePatternLayoutJavadoc.Thispatternlanguagecombinesliteraltextandconversionspecifierstogenerateaformattedlogmessage.Theconversionspecifiersareletters(likec)thathavespecialmeaningsasplaceholders.Forexample,thelettersmayrepresentdatesorloggernames.

The%characterprecedestheconversionpatternsymbols.Forexample,considerthefollowingpattern:

Logger:%c{1}

Thistranslatesto"theliteraltext`Logger:'followedbythelogger'sname."Thenumber1incurlybraces({1})followingthe%ccharactersisaprecisionspecifier,whichmeans"displayjustonesegmentofthenamebeginningfromtherighthandside."Iftheloggeriscom.jspservletcookbook.LoggerServlet,thenthe%c{1}patterndisplays"LoggerServlet"inthelogtext.Thisisbecausethecconversionspecifierisaplaceholderfortheloggername.

Thelettermdisplaysthelogmessageitself,theletternproducestheplatform-specificlineseparator,andtheletterdrepresentsthedate.Theentirestring%d{ISO8601}isalog4jdateformatter,whichdisplaysthedateindetailedform.Seehttp://jakarta.apache.org/log4j/docs/api/org/apache/log4j/helpers/ISO8601DateFormat.html

Example14.8showsaservletthatusesaloggerthatinheritsitscharacteristicsfromtwoconfiguredloggers:therootloggerandthecom.jspservletcookbooklogger.

Example14-8.Aservletusesadescendantlogger

packagecom.jspservletcookbook;

importorg.apache.log4j.Logger;

Page 540: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

importjavax.servlet.*;

importjavax.servlet.http.*;

publicclassLoggerNewConfigextendsHttpServlet{

privateLoggerlog=null;

publicvoidinit(){

//thelogger'snameisthesameastheclassname:

//com.jspservletcookbook.LoggerNewConfig

log=Logger.getLogger(LoggerNewConfig.class);

log.info("LoggerNewConfigstarted.");

}

publicvoiddoGet(HttpServletRequestrequest,

HttpServletResponseresponse)

throwsServletException,java.io.IOException{

//displayaDEBUG-levelmessage

log.debug("SendingaDEBUGmessage");

//displayanINFO-levelmessage

log.info("SendinganINFOmessage");

//betterdisplaysomeHTML

response.setContentType("text/html");

java.io.PrintWriterout=response.getWriter();

out.println(

"<html><head><title>Servletlogging</title></head><body>");

out.println(

"<h2>HellofromaLoggerwithitsownconfigurationinthe"+

log4j.propertiesfile</h2>");

out.println("Yourloggernameis:"+log.getName()+"<br>");

Page 541: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

out.println(

"Yourloggerparentis:"+log.getParent().getName()+"<br>");

out.println("</body></html>");

}//enddoGet

}

Thestaticorg.apache.log4j.Logger.getLogger(ClassclassName)methodcreatesaloggernamedaftertheclassinExample14.8(com.jspservletcookbook.LoggerNewConfig).Therefore,thisnewloggerinheritstheappenderthatthepropertiesfileinExample14-7setupfortheloggercom.jspservletcookbook,becausethenewlogger'snamehascom.jspservletcookbookasaprefix.Infact,anyotherloggercreatedinclassesthatarepartofthecom.jspservletcookbookpackageinheritstheseproperties,aslongasthedeveloperkeepsnamingherloggersaftertheJavaclassinwhichtheyarecreated.

HereisanexampleofwhattheentirepatterntheconfigurationfileofExample14-7createdgeneratesinthelogfile:

INFOLogger:LoggerNewConfigDate:2003-07-1017:16:22,713-LoggerNewConfigstarted

DEBUGLogger:LoggerNewConfigDate:2003-07-1017:16:34,530-SendingaDEBUGmessage

INFOLogger:LoggerNewConfigDate:2003-07-1017:16:34,530-SendinganINFOmessage

Visithttp://jakarta.apache.org/log4j/docs/api/org/apache/log4j/PatternLayout.htmlformoredetailsonpatternlayouts.

Becauseoftheinheritancestructureestablishedbythelog4jconfigurationfile,theservletinExample14-8alsologsitsmessagestotheconsole.

Page 542: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

SeeAlso

Recipe14.2ondownloadingandsettinguplog4j;Recipe14.3onusingalog4jloggerwithoutapropertiesfile;Recipe14.4onaddinganappendertotherootlogger;Recipe14.6onusingloggersinJSPs;Recipe14.7andRecipe14.8onusinglog4jwithapplicationeventlisteners;thelog4jdownloadsite:http://jakarta.apache.org/log4j/docs/download.html;thelog4jJavadocpage:http://jakarta.apache.org/log4j/docs/api/index.html;thelog4jprojectdocumentationpage:http://jakarta.apache.org/log4j/docs/documentation.html.

Page 543: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe14.6Usinglog4jinaJSP

Problem

YouwanttoincludeloggingstatementsinaJSP.

Solution

Designacustomtagthatuseslog4jtoinitiateloggingmessages.

Discussion

AcustomtagisanXMLelementthatyouinventordesignforuseinaJSP.Inotherwords,theJSPcontainerdoesnotprovidethecustomactions;thewebdeveloperhimselfdesignstheJavaclassesthatprovidethetagfunctionality.Acustomtagoractioncanbeusedtoimplementlog4jloggingfunctionalityinJSPs.

Inthisrecipe,Ishow:

AJavaclassthatprovidesthetaghandlerforacustomtagnamedcbck:log.

ATagLibraryDescriptor(TLD)thatprovidesthewebapplicationwithinformationaboutthetag.

AJSPpagethatusesthecbck:logtag.

Example14-9showstheJavaclassLoggerTagonwhichthecbck:logtagisbased.Eachcustomactionisactuallydrivenbehindthe

Page 544: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

scenesbyoneormoreJavaclasses.Inthiscase,LoggerTagislikeaJavaBeanthatwrapsthelog4jclasses,whichweimportatthetopofthetagclass.

CustomJSPactionsareacomplextopic,soIexplainthistagbyfocusingmainlyonitslog4jfeatures.SeeChapter22tohelpfillinthemissingspacesinyourownknowledgeaboutcustomtagdevelopment.

Example14-9.Acustomtagthatuseslog4j

packagecom.jspservletcookbook;

importorg.apache.log4j.Logger;

importorg.apache.log4j.PropertyConfigurator;

importjava.lang.reflect.Method;

importjavax.servlet.jsp.*;

importjavax.servlet.jsp.tagext.*;

publicclassLoggerTagextendsBodyTagSupport{

privateLoggerlog=null;

privateStringconfigFile=null;

privateStringlevel=null;

privatestaticfinalString[]LEVELS=

{"debug","info","warn","error","fatal"};

publicvoidsetConfigFile(StringfileName){

this.configFile=fileName;

}

publicvoidsetLevel(Stringlevel){

Page 545: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

this.level=level;

}

publicintdoEndTag()throwsJspException{

StringrealPath=pageContext.getServletContext().getRealPath("/");

StringfileSep=System.getProperty("file.separator");

if(realPath!=null&&(!realPath.endsWith(fileSep))){

realPath=realPath+fileSep;}

//configuretheloggeriftheuserprovidesthisoptionalattribute

if(configFile!=null)

PropertyConfigurator.configure(realPath+

"WEB-INF/classes/"+configFile);

//throwanexceptionifthetaguserprovidesaninvalidlevel,

//somethingotherthanDEBUG,INFO,WARN,ERROR,orFATAL

level=level.toLowerCase();

if(!contains(level))

thrownewJspException(

"Thevaluegivenforthelevelattributeisinvalid.");

//Theloggerhasthesamenameastheclass:

//com.jspservletcookbook.LoggerTag.Therefore,itinheritsits

//appendersfromaloggerdefinedintheconfigfile:

//com.jspservletcookbook

log=Logger.getLogger(LoggerTag.class);

Stringmessage=getBodyContent().getString().trim();

Methodmethod=null;

try{

Page 546: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

method=log.getClass().

getMethod(level,newClass[]{Object.class});

method.invoke(log,newString[]{message});

}catch(Exceptione){}

returnEVAL_PAGE;

}//doEndTag

publicvoidrelease(){

//releaseresourcesusedbyinstancevariables

log=null;

configFile=null;

level=null;

}//release

privatebooleancontains(Stringstr){

for(inti=0;i<LEVELS.length;i++){

if(LEVELS[i].equals(str))

returntrue;

}

returnfalse;

}//contains

}

TheLoggerTagextendsthejavax.servlet.jsp.tagext.BodyTagSupportclass,whichisdesignedforcustomactionsthatprocessbodycontent,orthetextthatmayappearbetweenopeningandclosingtags.

Thetagattributes,arequiredattributenamedlevelandtheconfigFileoptionalattribute,arehandledlikeJavaBeanproperties:

Page 547: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

with"setter"methods(e.g.,publicvoidsetLevel(Stringlevel)).ThedoEndTag()methoddoesmostoftheimportantworkforthetag:

1. ItattemptstoconfiguretheloggeriftheuserhasprovidedaconfigurationfilenameintheconfigFileattribute.

Itchecksifthelevelisvalid(oneofDEBUG,INFO,WARN,ERROR,orFATAL).

Itlogsthemessage.

Example14-10showstheTLD,whichconveystagspecificstotheJSPcontainer,suchaswhetheranattributeisrequiredoroptional.ThetaglibraryassociatedwiththisTLDdescribesonlythecbck:logtag.TheTLDfilesmustbelocatedinWEB-INForasubdirectorythereof,orinsideoftheMETA-INFdirectoryofaJARthatisplacedinWEB-INF/lib.

Example14-10.TheTLDforthecustomloggertag

<?xmlversion="1.0"encoding="ISO-8859-1"?>

<!DOCTYPEtaglib

PUBLIC"-//SunMicrosystems,Inc.//DTDJSPTagLibrary1.2//EN"

"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">

<taglib>

<tlib-version>1.0</tlib-version>

<jsp-version>1.2</jsp-version>

<short-name>cbck</short-name>

<uri>jspservletcookbook.com.tags</uri>

<description>Cookbookcustomtags</description>

<tag>

<name>log</name>

Page 548: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<tag-class>com.jspservletcookbook.LoggerTag</tag-class>

<body-content>JSP</body-content>

<description>Thistaguseslog4jtologamessage.</description>

<attribute>

<name>configFile</name>

<required>false</required>

<rtexprvalue>false</rtexprvalue>

<description>

Thisattributeprovidesanyconfigurationfilenameforthe

logger.Thefilemustbelocatedin

WEB-INF/classes.

</description>

</attribute>

<attribute>

<name>level</name>

<required>true</required>

<rtexprvalue>false</rtexprvalue>

<description>Thisattributeprovidesthelevelforthelogrequest.

</description>

</attribute>

</tag>

</taglib>

Example14-11showsthelogger.jsppageandhowthecustomactioncanbeused.

Example14-11.AJSPusesalogcustomactiontoaccesslog4j

<%@pagecontentType="text/html"%>

<%@tagliburi="jspservletcookbook.com.tags"prefix="cbck"%>

<html>

<head><title>AloggingJSP</title></head>

Page 549: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<body>

<h2>Hereistheloggingstatement</h2>

<cbck:loglevel="debug">

Debugmessagefromlogger.jsp

</cbck:log>

Debugmessagefromlogger.jsp

</body>

</html>

First,thepageusesthetaglibdirectivetodeclarethetaglibrarythatcontainsourcustomaction.Example14-10showstheTLDfile,anXMLfilethatdescribesthepropertiesofataglibrary'svarioustags.Chapter22describesTLDsinmoredetail.

Thecbck:logcustomactionallowsadevelopertologamessagefromtheJSPbynestingthemessagetextwithinthecbck:logtag(i.e.,thebodycontentofthetagisthelogmessage).Thecbckpartofthetagistheprefixthatthetaglibdirectivedeclared.Thelogpartisthenameofthetag.Thetagallowsthedevelopertodeclarethelogginglevelwiththecustomaction'slevelattribute.

Typically,acomponentsuchasaninitializationservletinitializesthelog4jloggingsystemwhenthewebapplicationstartsup.Thecustomactiondescribedheredoesnothavetoinitializelog4jitself.However,I'veincludedanoptionalconfigFileattributethatpermitsmetospecifythenameofalog4jconfigurationfile,whichwillconfigurethelogger'slevel,appender(s),andlayout.

Forthistag,assumethatyouwanttodecidewhichloggingleveltouse,andthuspassinavalueforthelevelattribute.ThetagclassdoesnotknowwhetherthemessagewillrequestalogginglevelofDEBUG,INFO,WARN,ERROR,orFATAL.Sincethelogger'smethodsinlog4jusethesamenameasthelevels,wecandynamicallycallthepropermethod

Page 550: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

basedonthevalueofthelevelattribute.Thisisthepurposeofthecode:

method=log.getClass().

getMethod(level,newClass[]{Object.class});

method.invoke(log,newString[]{message});

Wegetajava.lang.reflect.MethodobjectthatisnamedeitherDEBUG,INFO,WARN,ERROR,orFATAL,andtheninvokethatmethodcallingmethod.invoke,passinginthelogmessagefromtheJSPpage.

Aconfigurationfilenameisnotrequiredforthistag,sohowdoeslog4jknowhowandwheretologthemessage?Thistagassumesthataservlethasalreadyinitializedthelog4jsystemforthewebapplication,whichistypicalfortheuseoflog4jinawebenvironment.TheconfigurationfileistheonedescribedbyRecipe14.4andshowninExample14-5.

Youcanalsouseaservletasanlog4j-initializationservlet,similartoExample14-6.

Thatconfigurationfilecreatedaloggingmechanismthatsendsmessagestotheconsoleandafile,sothatiswherethecustomtag'smessagesgo.Forexample,runninglogger.jspdisplaysamessageontheconsole:

DEBUG-Debugmessagefromlogger.jsp

Thetag'sloggerwritesthefollowingmessageinthefileexample.log:

DEBUGLogger:LoggerTagDate:2003-05-1212:53:13,750-Debugmessagefromlogger.jsp

Ifyouwanttoincludeyourownconfigurationfile,youcanincludea

Page 551: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

configFileattributewhenusingthecustomtag.Thetagwillconfiguretheloggerusingthatfileinsteadofanypreviouslyinitializedone:

if(configFile!=null)

PropertyConfigurator.configure(

pageContext.getServletContext().getRealPath("/")+

"WEB-INF/classes/"+configFile);

ThePropertyConfigurator.configure()methodallowsyoutospecifythenameofalog4jpropertiesfilewhenyouinitializetheloggingsystem,ifthefilenameisdifferentthanlog4j.properties.ThePropertyConfigurator.configure()method(inlog4jVersion1.2.8)doesnotthrowanexceptionthatcanbecaughtinthetagclass.YoucouldcheckfortheexistenceoftheconfigFilevalue(representingthepathtoafileinthewebapplication)explicitlyinthecodeusingthejava.ioAPI,andthenthrowanexceptioniftheconfigFileattributedeclaresaninvalidfilename.

SeeAlso

Recipe14.2ondownloadingandsettinguplog4j;Recipe14.3onusingalog4jloggerwithoutapropertiesfile;Recipe14.4onaddinganappendertotherootlogger;Recipe14.5onusingapatternlayoutwithalogger'sappender;Recipe14.7andRecipe14.8onusinglog4jwithapplicationeventlisteners;thelog4jdownloadsite:http://jakarta.apache.org/log4j/docs/download.html;thelog4jJavadocpage:http://jakarta.apache.org/log4j/docs/api/index.html;thelog4jprojectdocumentationpage:http://jakarta.apache.org/log4j/docs/documentation.html.

Page 552: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe14.7LoggingMessagesUsingaServletContextEventListener

Problem

Youwanttologmessagesusinglog4jwhenaservletcontextiscreatedandshutdown.

Solution

Uselog4jandaservletcontexteventlistener.

Discussion

TheservletAPIincludesalistenerinterfacenamedjavax.servlet.ServletContextListenerthatyoucanusetonotifyaspecificJavaclasswhenaservletcontextiscreatedorshutdown.Thisnotifiedclassmaywanttologtheservletcontextcreationorshutdownorstoreanobjectattributeintheservletcontext,actionsthattheJavaclass(thelistener)takeswhenitreceivesitsnotification.

Theservletcontextlistenerisanapplicationeventlistener,acategorythatalsoincludessessioneventlisteners(seeChapter11orRecipe14.8)andrequesteventlisteners.Forexample,thesessioneventlistenerreceivesnotificationswhentheservletcontainercreatesnewHTTPsessionobjectsinordertotrackauser'sprogressthroughawebapplication.Theservletcontainernotifiestherequesteventlistenerwhenausermakesawebapplicationrequest,sothatalistenercantakesomekindofactionsuchasloggingtheuser'sIPaddress.

Ajavax.servlet.ServletContextisusedtostoreattributesor

Page 553: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

accesscontextparametersthatarecommontoawebapplication,getRequestDispatcherobjectsforforwardingorincludingfiles(seeChapter6),orgetinformationsuchasanabsolutepathnameassociatedwithawebresource.Everywebapplicationhasoneassociatedservletcontext.

Thereisoneservletcontextinstanceperwebapplication(perJavaVirtualMachine(JVM),inthecaseofdistributedwebapplications)accordingtotheServletContextJavadoc:http://java.sun.com/j2ee/1.4/docs/api/javax/servlet/ServletContext.html.

log4jisagoodchoiceforgeneratingcustom-designedlogmessagesfromaclassthatimplementstheServletContextListenerinterface.Example14-12showstheContextLoggerclass,whichuseslog4jtosendmessagesinitstwomethods.

Example14-12.Aservletcontexteventlistenerthatsendslogmessages

packagecom.jspservletcookbook;

importorg.apache.log4j.Logger;

importorg.apache.log4j.PropertyConfigurator;

importjavax.servlet.*;

importjavax.servlet.http.*;

publicclassContextLoggerimplementsServletContextListener{

privateLoggerlog;

Page 554: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

publicContextLogger(){}

publicvoidcontextDestroyed(ServletContextEventsce){

Stringname=sce.getServletContext().getServletContextName();

//logrequestoftheINFOlevel

log.info("ServletContextshutdown:"+(name==null?"":name));

//doothernecessarywork,likecleanupanyleft-overresources

//usedbythewebapp

}

publicvoidcontextInitialized(ServletContextEventsce){

ServletContextcontext=sce.getServletContext();

StringrealPath=context.getRealPath("/");

StringfileSep=System.getProperty("file.separator");

//Makesuretherealpathendswithafileseparatorcharacter('/')

if(realPath!=null&&(!realPath.endsWith(fileSep))){

realPath=realPath+fileSep;}

//Initializeloggerhere;thelog4jpropertiesfilenameisspecified

//byacontextparameternamed"logger-config"

PropertyConfigurator.configure(realPath+

"WEB-INF/classes/"+context.getInitParameter("logger-config"));

log=Logger.getLogger(ContextLogger.class);

Stringname=context.getServletContextName();

//logrequestaboutservletcontextbeinginitialized

log.info("ServletContextready:"+(name==null?"":name));

Page 555: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

}

}

Givethisclassano-argsconstructor,placeitinWEB-INF/classesorinaJARlocatedinWEB-INF/lib,andregisteritinweb.xml:

<listener>

<listener-class>

com.jspservletcookbook.ContextLogger

</listener-class>

</listener>

TheServletContextListenertracksthelifecycleofaservletcontextwithtwomethods:contextInitialized()andcontextDestroyed().Theservletcontainercallsthefirstmethodwhentheservletcontextiscreatedandthewebapplicationisreadytoreceiveitsfirstrequest.ThecontainernotifiesthelistenerclassandcallsthecontextDestroyed()methodwhentheservletcontextisabouttobeshutdown,suchaswhenawebapplicationisstoppedpriortobeingreloaded.

Tomcat4.1.24initializestheservletcontextlistenerpriortocreatingservletinstances,eveniftheapplicationconfigurestheservlettobepreloaded.Example14-12initializesthelog4jsysteminthecontextInitialized()method.

Thedeploymentdescriptorcaninstructtheservletcontainertoloadaservletinstanceandcallitsinit()methodatstartupbyincludingaload-on-startupelementnestedintheservletelement,asin:

<servlet>

<servlet-name>logger</servlet-name>

<servlet-class>

com.jspservletcookbook.LoggerServlet

</servlet-class>

<load-on-startup>1</load-on-startup>

</servlet>

Thevalueofload-on-startupisanintegerindicatingtheorderinwhichthecontainerloadstheservlet.

Page 556: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

InthecontextInitialized()method,thelistenerconfigureslog4jusingthefilespecifiedbyacontext-paramelementinweb.xml:

<context-param>

<param-name>logger-config</param-name>

<param-value>servletLog.properties</param-value>

</context-param>

Thislog4jconfigurationfile(servletLog.properties)islocatedintheWEB-INF/classesdirectory.Thelistenerthenlogsitsmessagestotheconsoleandtoafilewhenthewebapplicationstartsuporisshutdown.Example14-13showstheconfigurationfilethelistenerusesforlog4j.

Example14-13.Log4jconfigurationfileusedbytheservletcontextlistener

log4j.rootLogger=DEBUG,cons

log4j.logger.com.jspservletcookbook=,myAppender

log4j.appender.cons=org.apache.log4j.ConsoleAppender

#configurethe'myAppender'appender

log4j.appender.myAppender=org.apache.log4j.RollingFileAppender

log4j.appender.myAppender.File=h:/home/example.log

log4j.appender.myAppender.MaxBackupIndex=1

log4j.appender.myAppender.MaxFileSize=1MB

log4j.appender.cons.layout=org.apache.log4j.SimpleLayout

log4j.appender.myAppender.layout=org.apache.log4j.PatternLayout

log4j.appender.myAppender.layout.ConversionPattern=

%-5pLogger:%c{1}Date:%d{ISO8601}-%m%n

Thelistenergetsaloggerwiththiscode:

Page 557: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

log=Logger.getLogger(ContextLogger.class);

Thisnamestheloggeraftertheclasscom.jspservletcookbook.ContextLogger.Therefore,inthelog4jnamingscheme,thelistener'sloggerinheritstheappenderthatExample14-13definesfortheloggercom.jspservletcokbook.Thisisbecausetheconfigurationdoesnotdefinealoggerforcom.jspservletcookbook.ContextLogger;consequently,thelistener'sloggerinheritsthenextdefinedloggeravailable:com.jspservletcookbook.Thecom.jspservletcookbookloggerhasaconsoleappenderandafileappender.

Asaresult,theservletcontextlistenersendsitslogmessagestotheconsoleandtheh:/home/example.logfile.Example14-13hasdifferentlayoutsfortheconsoleandfileappenders.Thelistener'sconsolemessageslooklikethis:

INFO-ServletContextshutdown:Thehomewebapplication

INFO-ServletContextready:Thehomewebapplication

Thelogfilemessageshaveadifferentformat:

INFOLogger:ContextLoggerDate:2003-05-1216:45:20,398-ServletContextshutdown:

Thehomewebapplication

INFOLogger:ContextLoggerDate:2003-05-1216:45:20,999-ServletContextready:The

homewebapplication

Theformatofthesemessagesconsistsofthenameofthelogginglevel(e.g.,INFO),theloggername,thedateofthelogrequest,andthemessageitself.

SeeAlso

Recipe14.2ondownloadingandsettinguplog4j;Recipe14.3onusingalog4jloggerwithoutapropertiesfile;Recipe14.4onaddinganappendertotherootlogger;Recipe14.5onusingapatternlayoutwithalogger's

Page 558: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

appender;Recipe14.6onusingaloggerwithaJSP;Recipe14.8onusinglog4jwithsessioneventlisteners;thelog4jdownloadsite:http://jakarta.apache.org/log4j/docs/download.html;thelog4jJavadocpage:http://jakarta.apache.org/log4j/docs/api/index.html;thelog4jprojectdocumentationpage:http://jakarta.apache.org/log4j/docs/documentation.html.

Page 559: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe14.8LoggingMessagesUsingaSessionEventListener

Problem

Youwanttologmessagesinacustom-designedmannerfromasessioneventlistener.

Solution

Designasessioneventlistenerthatusesalog4jloggingmechanism.

Discussion

TheservletcontainernotifiesasessioneventlistenerclasswhenitcreatesanewHttpSession,aswellaswhenitisabouttoinvalidateorexpireasession.Webapplicationsusesessionstotrackauser'sprogressthroughthewebapplication,typicallybyidentifyinghimwithacookienamedJSESSIONID.SeeChapter10formoreinformationoncookies,andChapter11fordetailedcoverageofsessions.

Example14-14implementsthejavax.servlet.http.HttpSessionListenerinterfaceandtheinterface'stwomethods:sessionCreated()andsessionDestroyed().ThecodelogsmessagesrelatingtonewsessionsinsessionCreated()andrelatingtoinvalidatedsessionsinsessionDestroyed().

Example14-14.Usinglog4jinasessioneventlistener

Page 560: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

packagecom.jspservletcookbook;

importorg.apache.log4j.Logger;

importorg.apache.log4j.PropertyConfigurator;

importjavax.servlet.*;

importjavax.servlet.http.*;

publicclassSessionLoggerimplementsHttpSessionListener

{

privateLoggerlog;

publicSessionLogger(){

/*

Theloggersaretypicallyinitializedbyaspecialinitialization

listenerorservlet.Ifthisisnotthecase,theninitializethe

loggerhere:

java.util.ResourceBundlebundle=

java.util.ResourceBundle.getBundle(

"com.jspservletcookbook.global");

PropertyConfigurator.configure(bundle.getString(

"log-configure-path"));

*/

log=Logger.getLogger(SessionLogger.class);

}

publicvoidsessionCreated(HttpSessionEventse){

//logrequestoftheINFOlevel

log.info("HttpSessioncreated:"+se.getSession().getId());

Page 561: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

}

publicvoidsessionDestroyed(HttpSessionEventse){

//logrequestaboutsessionsthatareinvalidated

log.info("HttpSessioninvalidated:"+se.getSession().getId());

}

}

Givethisclassano-argsconstructor,placeitinWEB-INF/classesorinaJARlocatedinWEB-INF/lib,andregisteritinweb.xml:

<listener>

<listener-class>

com.jspservletcookbook.SessionLogger

</listener-class>

</listener>

TheSessionLoggerclassgetsaloggerinitsconstructor;itdependsontheapplicationalreadyhavinginitializedthelog4jloggingmechanisminaservletorintheservletcontextlistener(asinRecipe14.4).

Awebapplicationcanconfigureitslog4jmechanismusingaspecialinitializationservletorlistener,sotheotherclassesorbeansthatdologgingdonothavetohandlethelog4jconfigurationstage.Youcaninitializethelog4jloggingmechanismusingaservletsuchastheoneshowninRecipe14.6.

Thecommented-outcodeintheconstructorshowsanotherwaythatthislistenerclasscouldconfigureitsownloggerintheeventthattheapplicationhasnotyetconfiguredtheloggingmechanism.

HereisthemessageloggedtotheTomcatconsoleafterthefirstrequesttoaservletorJSPthatparticipatesinsessiontracking:

Page 562: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

INFO-HttpSessioncreated:A65481C53B92F869BD18961D635BBF52

Whenthesessionisinvalidated,theconsoletextis:

INFO-HttpSessioninvalidated:A65481C53B92F869BD18961D635BBF52

LikethelistenerdescribedinRecipe14.7,thesessionlistener'sloggerinheritstheloggingdestinationsorappendersfromthecom.jspservletcookbooklogger.TheconfigurationfileofExample14-13showshowthisloggerissetuptosendmessagestoboththeconsoleandanexample.logfile.Thelogfile'sappenderlayoutisspecifiedusingaPatternLayout,whichisadifferentlayoutthantheoneusedwiththeconsoleappender.Hereisexampletextfromthislogwhentheservletcontainerinvalidatesasession:

INFOLogger:SessionLoggerDate:2003-05-1220:41:05,367-HttpSessioninvalidated:

A65481C53B92F869BD18961D635BBF52

SeeAlso

Recipe14.2ondownloadingandsettinguplog4j;Recipe14.3onusingalog4jloggerwithoutapropertiesfile;Recipe14.4onaddinganappendertotherootlogger;Recipe14.5onusingapatternlayoutwithalogger'sappender;Recipe14.6onusingaloggerwithaJSP;Recipe14.8onusinglog4jwithsessioneventlisteners;thelog4jdownloadsite:http://jakarta.apache.org/log4j/docs/download.html;thelog4jJavadocpage:http://jakarta.apache.org/log4j/docs/api/index.html;thelog4jprojectdocumentationpage:http://jakarta.apache.org/log4j/docs/documentation.html.

Page 563: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Chapter15.AuthenticatingClientsIntroduction

Recipe15.1.CreatingUsersandPasswordswithTomcat

Recipe15.2.SettingUpSSLonTomcat

Recipe15.3.UsingBASICAuthentication

Recipe15.4.UsingForm-BasedAuthentication

Recipe15.5.LoggingOutaUser

Recipe15.6.UsingJAAStoCreateaLoginModule

Recipe15.7.CreatingtheJAASConfigurationFile

Recipe15.8.UsingJAASinaServlet

Recipe15.9.UsingJAASinaJSP

Page 564: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Introduction

Becauseoftheincreaseindigitalcommerceandacorrespondingriseintheneedtotransferandstoresensitivedata(suchascreditcardnumbersandfinancialaccounts),securityisofparamountimportancetoJavawebapplications.

Thischapter'srecipescovertasksthatinvolveauthentication,whichisdesignedtoanswerthequestion"areyouwhoyousayyouare?"Authenticationusuallyinvolvesaninteractionbetweenaclientoruserandserver-sidecodeforthepurposeofcheckingausernameandpassword(andsometimesadigitalcertificate,biometricdata,orotherevidence)againststoredinformation,suchasauserdatabase.

TherecipesdescribehowtosetupSecureSocketsLayer(SSL),aswellasuseBASIC-andform-basedauthenticationwithApacheTomcat.ThelaterrecipesdescribehowtouseapowerfulsecurityframeworkcalledJavaAuthenticationandAuthorizationService(JAAS)withservletsandJSPs.

Page 565: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe15.1CreatingUsersandPasswordswithTomcat

Problem

Youwanttocreateusernamesandpasswordsforauthenticatingrequestsforcertainwebcomponents.

Solution

Addtheusernames,passwords,androlestothetomcat-users.xmlfile.

Discussion

AveryeasymethodofauthenticatinguserswithTomcatinvolvescreatingusernames,passwords,androlesinthetomcat-users.xmlfile.Thisfileisstoredin<Tomcat-installation-directory>/conf.

Everyoneisfamiliarwithusernamesandpasswords,butwhatareroles?Rolesarelogicalwaystodescribegroupsofuserswhohavesimilarresponsibilities,suchasmanagerordatabaseAdmin.Example15-1showsatomcat-users.xmlfilethatcreatestworolesandtwouserswithtwoaptlynamedXMLelements:roleanduser.

Example15-1.Thetomcat-usersXMLfile

<?xmlversion='1.0'encoding='utf-8'?>

<tomcat-users>

Page 566: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<rolerolename="dbadmin"/>

<rolerolename="manager"/>

<userusername="BruceP"password="bwperry"roles="dbadmin,manager"/>

<userusername="JillH"password="jhayward"roles="manager"/>

</tomcat-users>

InExample15-1,theuserBrucePisassociatedwithtworoles(dbadminandmanager),whileuserJillHisassociatedonlywiththemanagerrole.TomcatusesthisfilewhenauthenticatinguserswithBASICandform-basedauthentication,asdescribedinRecipe15.3andRecipe15.4.

SeeAlso

TheTomcatdocumentationandRecipe15.2onsettingupSSLforusewithauthentication:http://jakarta.apache.org/tomcat/tomcat-4.1-doc/ssl-howto.html;Recipe3.9onrestrictingrequestsforcertainservlets;Recipe15.3onusingBASICauthentication;Recipe15.4onusingform-basedauthentication;Recipe15.5onloggingoutauser;Recipe15.6-Recipe15.9onusingJAAS.

Page 567: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe15.2SettingUpSSLonTomcat

Problem

YouwanttosetupSSLonTomcatsothatyoucantransmitusernamesandpasswordsinencryptedform.

Solution

CreateadigitalcertificatefortheTomcatserverusingthe$JAVA_HOME\bin\keytoolutility,thenuncommenttheSSLConnectorelementinconf/server.xml.

Discussion

WhentransferringusernamesandpasswordsoverHTTP,youshouldsetupSSLonTomcatorwhicheverapplicationserveryouareusing.Thisprotocolensuresthatthenamesandpasswordsareinencryptedformastheytravelacrossthenetwork,andthusprotectedfromtheftandmalicioususebyhackersandotherintruders.

SettingupSSLonTomcat4isatwo-stepprocess:

1. Usethekeytoolutilitytocreateakeystorefileencapsulatingadigitalcertificateusedbytheserverforsecureconnections.

UncommenttheSSLConnectorelementinTomcat'sconf/server.xmlfile,andalteritsattributesifnecessary.

ThekeytoolutilityislocatedinthebinsubdirectoryofthedirectorywhereyouhaveinstalledtheJSDK.Thefollowingcommandlinecreates

Page 568: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

asingleself-signeddigitalcertificatefortheTomcatserverwithinakeystorefilenamed.keystore.Thisfileiscreatedinthehomedirectoryoftheuserrunningthecommand.

%JAVA_HOME%\bin\keytool-genkey-aliastomcat-keyalgRSA

TheUnixversionofthiscommandis:

$JAVA_HOME\bin\keytool-genkey-aliastomcat-keyalgRSA

Forthiscommandtosucceed,theJAVA_HOMEenvironmentvariablemustbesettothedirectorywheretheJava2SDKisinstalled,suchash:\j2sdk1.4.1_01.

Example15-2showstheconsoleoutputresultingfromexecutingthekeytoolcommand.Thekeytoolwillrequestsomeinformationaboutyouandyourorganization,butyoucanacceptthedefaultvaluesbypressingEnter.Thisinformationisincorporatedintotheserver'scertificateandpresentedtotheuser(viaherwebbrowser)whensherequestsanycomponentswithaURLthatstartswithhttps://.

InsettingupSSLforTomcat,youmustusethesamepasswordforboththekeystoreandthecertificatethatisstoredinthekeystore.

ThedefaultpasswordusedinTomcatis"changeit":http://jakarta.apache.org/tomcat/tomcat-4.1-doc/ssl-howto.html.

Example15-2.Theconsoleoutputresultingfromusingthekeytoolutility

Page 569: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Enterkeystorepassword:changeit

Whatisyourfirstandlastname?

[Unknown]:BrucePerry

Whatisthenameofyourorganizationalunit?

[Unknown]:

Whatisthenameofyourorganization?

[Unknown]:

WhatisthenameofyourCityorLocality?

[Unknown]:

WhatisthenameofyourStateorProvince?

[Unknown]:

Whatisthetwo-lettercountrycodeforthisunit?

[Unknown]:

IsCN=BrucePerry,OU=Unknown,O=Unknown,L=Unknown,ST=Unknown,C=Unknowncorrect?

[no]:yes

Enterkeypasswordfor<tomcat>

(RETURNifsameaskeystorepassword):

Finally,uncommenttheSSLConnectorelementintheconf/server.xmlfile(showninFigure15-3)byremovingthecommentcharactersaroundit(<!---->).ThenrestartTomcat.

Example15-3.TheConnectorelementinsideserver.xml

<!--DefineaSSLCoyoteHTTP/1.1Connectoronport8443-->

<ConnectorclassName=

"org.apache.coyote.tomcat4.CoyoteConnector"port=

"8443"minProcessors="5"maxProcessors="75"enableLookups=

"true"acceptCount="100"debug="0"scheme="https"secure="true"

useURIValidationHack="false"disableUploadTimeout="true">

<FactoryclassName=

"org.apache.coyote.tomcat4.CoyoteServerSocketFactory"clientAuth=

"false"protocol="TLS"/>

Page 570: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

</Connector>

TheConnectorusesadifferentportnumber(8443)thanthatusedbyinsecureHTTPconnections(inTomcat,it'susually8080).AfteryouhaverestartedTomcat,youcannowmakeasecureconnectiontoawebcomponentinthehomeapplicationwithaURLthatlookslikethis:

https://localhost:8443/home/sqlJsp.jsp

Don'tforgetthehttps(asopposedtohttp)partinsettinguptheseweblinks!

SeeAlso

TheTomcatdocumentationonsettingupSSLforusewithauthentication:http://jakarta.apache.org/tomcat/tomcat-4.1-doc/ssl-howto.html;Recipe15.1oncreatingusernamesandpasswordsinTomcat;Recipe15.3onusingBASICauthentication;Recipe15.4onusingform-basedauthentication;Recipe15.5onloggingoutauser;Recipe15.6-Recipe15.9onusingtheJAAS.

Page 571: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe15.3UsingBASICAuthentication

Problem

YouwanttouseBASICauthenticationwithwebcomponentsinaTomcatwebapplication.

Solution

Usethesecurity-constraint,login-config,andsecurity-roleelementsinthedeploymentdescriptortoprotectoneormoreURLs.

Discussion

BASICauthenticationisasecuritymethodthathasbeenusedwithwebresourcesforseveralyears,andallpopularbrowserssupportit.ThismethodofauthenticationinvolvesthetransferofusernamesandpasswordsoveranetworkencodedwiththeBase64content-encodingmechanism.Base64iseasytodecodeandthereforenotverysecure.ThesolutionistocombineBASICauthenticationwithSSL,whichwillfurtherencryptthedataasitistransferredacrossthenetwork(seeRecipe15.2).

HereishowsettingupBASICauthenticationworkswithwebapplicationsthatyouhaveinstalledonTomcat:

1. Setupusernames,passwords,androlesintheconf/tomcat-users.xmlfiledescribedinRecipe15.1.

Createasecurity-constraintelementinthedeployment

Page 572: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

descriptor(web.xml),specifyingthewebresourcesforwhichyouarerequiringauthentication.

Includealogin-configinweb.xml;thiselementhasanestedauth-methodelementthatcontainsthetext"BASIC".

Whentheuserrequestsanyoftheprotectedresources,theserversendsalongaresponseheaderthatlookslikethis:

WWW-Authenticate:BASICRealm="MyRealm"

Youareprobablyfamiliarwithwhathappensnext:thebrowserdisplaysastandarddialogwindowrequestingtheclienttoprovideausernameandpassword(Figure15-1).Iftheusernameandpasswordareincorrect,thebrowserwilleithergivetheuseranotherchancetologinbyredisplayingthedialogwindow,orsimplysendbackaserverstatuscode"401:Unauthorized"typeofresponse.

Theusernamesandpasswordsintheconf/tomcat-users.xmlfilearecase-sensitive.Theuserhastotypethemintothedialogwindowusingupper-andlowercaselettersexactlyastheyappearinconf/tomcat-users.xml.

Example15-4showstheweb.xmlelementsthataredesignedtoinitiateBASICauthenticationfortheURLpattern/sqlJsp.jsp.

Example15-4.Asecurity-constraintinitiatesauthenticationwithaJSPfile

<!--Beginningofweb.xmldeploymentdescriptor-->

<security-constraint>

Page 573: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<web-resource-collection>

<web-resource-name>JSPdatabasecomponent</web-resource-name>

<url-pattern>/sqlJsp.jsp</url-pattern>

<http-method>GET</http-method>

<http-method>POST</http-method>

</web-resource-collection>

<auth-constraint>

<role-name>dbadmin</role-name>

</auth-constraint>

<user-data-constraint>

<transport-guarantee>CONFIDENTIAL</transport-guarantee>

</user-data-constraint>

</security-constraint>

<login-config>

<auth-method>BASIC</auth-method>

</login-config>

<security-role>

<role-name>dbadmin</role-name>

</security-role>

<!--Restofweb.xmldeploymentdescriptor-->

Thesecurity-constraintelementinExample15-4containsaweb-resource-collectionelement.Thiselementspecifiesthefollowingconstraintsthatapplytoanyrequestsfor/sqlJsp.jsp:

Page 574: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

TheconstraintsapplytoanyGETorPOSTrequests(asspecifiedbythehttp-methodelements).

Theauth-constraintelementnestedinsidesecurity-constraintcontainstherole-namedbadmin.Therefore,therequestormustentertheproperusernameandpassword(asspecifiedinthetomcat-users.xmlfile)andbeassociatedwiththedbadminrole.Onlythosewhohavethedbadminrolecangainaccesstotheprotectedwebresource,eveniftheyenteraproperusernameandpassword.

Figure15-1showsthedialogboxthatNetscape7.1produceswhenTomcatisusingBASICauthentication.TheURLisusedishttps://localhost:8443/home/sqlJsp.jsp.

Figure15-1.Abrowserdialogwindowrequestsanameandpassword

NoticethattheURLusesasecureconnectiontorequesttheJSP:anHTTPSprotocolandport8443onTomcat.

Figure15-2showsabrowserwindowafteraclienthasfailedauthentication.

Figure15-2.Aserverstatuscode401pageasviewedinthewebbrowser

Page 575: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

SeeAlso

TheTomcatdocumentationandRecipe15.2onsettingupSSLforusewithauthentication:http://jakarta.apache.org/tomcat/tomcat-4.1-doc/ssl-howto.html;Recipe3.9onrestrictingrequestsforcertainservlets;Recipe15.5onloggingoutauser;Recipe15.6-Recipe15.9onusingJAAS.

Page 576: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe15.4UsingForm-BasedAuthentication

Problem

Youwanttodesignyourownformtoreceivetheuser'snameandpasswordduringBASICauthentication.

Solution

Usethelogin-configelementinthedeploymentdescriptorandgiveitsnestedauth-methodelementavalueof"FORM".

Discussion

TheservletAPIoffersanalternativetousingplain-vanillaBASICauthentication:form-basedauthentication.Thismethodallowsyoutodesignyourownformforreceivingtheuser'snameandpassword,aswellasspecifyingtheinformativepagethattheserverssendtotheclientiftheuser'sauthenticationfails.ThisgivesyoutheabilitytoprovideamuchmorefriendlyandcustomizeduserinterfaceforapplicationsinvolvingBASICauthentication.

Theform-basedmethodshouldstillbecombinedwithSSLandtheHTTPSprotocolsothatthenamesandpasswordsareencryptedastheytravelthroughthenetwork.

Example15-5showstheform-basedsetupforthewebapplication'sdeploymentdescriptor.ItdiffersfromRecipe15.3ssetupinonearea:the

Page 577: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

login-configelement,whichisemphasizedinthefollowingcodesample.

Example15-5.Theweb.xmlelementsdesignedforform-basedauthentication

<!--Beginningofweb.xmldeploymentdescriptor-->

<security-constraint>

<web-resource-collection>

<web-resource-name>JSPdatabasecomponent</web-resource-name>

<url-pattern>/sqlJsp.jsp</url-pattern>

<http-method>GET</http-method>

<http-method>POST</http-method>

</web-resource-collection>

<auth-constraint>

<role-name>dbadmin</role-name>

</auth-constraint>

<user-data-constraint>

<transport-guarantee>CONFIDENTIAL</transport-guarantee>

</user-data-constraint>

</security-constraint>

<login-config>

<auth-method>FORM</auth-method>

<form-login-config>

<form-login-page>/login.html</form-login-page>

<form-error-page>/loginError.jsp</form-error-page>

</form-login-config>

Page 578: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

</login-config>

<security-role>

<role-name>dbadmin</role-name>

</security-role>

<!--Restofweb.xmldeploymentdescriptor-->

Theauth-methodelementincludesthetext"FORM".Theform-login-configelementspecifiesthelogin(/login.html)andauthenticationfailurepage(/loginError.html)thatyourapplicationuses.Theforwardslash(/)precedingthefilenamesmeanstonavigatetothepagefromthewebapplication'srootdirectory.

Almostbymagic,ifauserrequestsaprotectedresourceinyourapplication,theserversendshimthelogin.htmlpage(inthisexample)insteadofinitiatingthetypicalbehaviorinwhichthebrowserdisplaysitsowndialogwindow.Ifthenameandpasswordtheuserentersturnsouttobeincorrect,theserverrouteshisrequesttotheloginError.htmlpage.

Example15-6showsthelogin.htmlpage,forreference.

Example15-6.Theloginform

<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.0Transitional//EN">

<html>

<head>

<title>Welcome</title>

</head>

<bodybgcolor="#ffffff">

<h2>PleaseLogintotheApplication</h2>

<formmethod="POST"action="j_security_check">

Page 579: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<tableborder="0"><tr>

<td>Entertheusername:</td><td>

<inputtype="text"name="j_username"size="15">

</td>

</tr>

<tr>

<td>Enterthepassword:</td><td>

<inputtype="password"name="j_password"size="15">

</td>

</tr>

<tr>

<td><inputtype="submit"value="Submit"></td>

</tr>

</table>

</form>

</body>

</html>

Figure15-3showswhatthisformlookslikeinawebbrowser.

Figure15-3.Aformforusewithform-basedauthentication

Page 580: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Withform-basedauthentication,theformtag'sactionattributemusthavethevalue"j_security_check".Theinputelementsfortheusernameandpasswordmustspecifythevalues"j_user_name"and"j_password",respectively,fortheirnameattributes.

Figure15-4showstheHTMLpagethattheserversendstheuserifherauthenticationfails.

Figure15-4.Form-basedauthenticationallowstheinclusionofyourownlogin-failurepage

Example15-7showsthesourceforthispage.Theform-basedapproachismorepredictableandfriendlierthanthevariousbrowsers'methodsfordealingwithBASICauthentication.

Page 581: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Example15-7.TheserverdisplaystheloginError.jsppagewhenauthenticationfails

<html>

<head>

<title>LoginError</title>

</head>

<bodybgcolor="#ffffff">

<h2>WeApologize,ALoginErrorOccurred</h2>

Pleaseclick<ahref="http://localhost:8080/home/sqlJsp.jsp">here</a>foranothertry.

<%--Or,dynamicallylisthyperlinkstoyourprotectedresourceshere,perhapsbygetting

themfromadatabaseorconfigurationfile,insteadofhard-codingalinkintotheerror

page.--%>

</body>

</html>

SeeAlso

TheTomcatdocumentationandRecipe15.2onsettingupSSLforusewithauthentication:http://jakarta.apache.org/tomcat/tomcat-4.1-doc/ssl-howto.html;Recipe3.9onrestrictingrequestsforcertainservlets;Recipe15.5onloggingoutauser;Recipe15.6-Recipe15.9onusingJAAS.

Page 582: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe15.5LoggingOutaUser

Problem

Youwanttologoutauserinasystemthatusesform-basedauthentication.

Solution

Callinvalidate()ontheuser'sHttpSessionobject.

Discussion

Invalidatingauser'sHttpSessionobjectwilllogtheuseroutinanapplicationthatusesform-basedauthentication.Naturally,thiscodeinvolvescallingHttpSession.invalidate().Example15-8displayssomeinformationaboutalogged-inuser,thenlogshimoutbyinvalidatinghissession.Thenexttimethisuserrequestsaprotectedresource,thewebapplicationwillsendhimtotheconfiguredloginpage,becausehehasbeenloggedoutoftheapplication.

Example15-8.Loggingoutauser

packagecom.jspservletcookbook;

importjavax.servlet.*;

importjavax.servlet.http.*;

publicclassLogoutServletextendsHttpServlet{

Page 583: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

publicvoiddoGet(HttpServletRequestrequest,

HttpServletResponseresponse)throwsServletException,

java.io.IOException{

HttpSessionsession=request.getSession();

response.setContentType("text/html");

java.io.PrintWriterout=response.getWriter();

out.println(

"<html><head><title>AuthenticatedUserInfo</title></head><body>");

out.println("<h2>Loggingoutauser</h2>");

out.println("request.getRemoteUser()returns:");

//getthelogged-inuser'sname

StringremUser=request.getRemoteUser();

//Istherequest.getRemoteUser()returnvaluenull?If

//so,thentheuserisnotauthenticated

out.println(remUser==null?"Notauthenticated.":remUser);

out.println("<br>");

out.println("request.isUserInRole(\"dbadmin\")returns:");

//Findoutwhethertheuserisinthedbadminrole

booleanisInRole=request.isUserInRole("dbadmin");

out.println(isInRole);

out.println("<br>");

//logouttheuserbyinvalidatingtheHttpSession

session.invalidate();

out.println("</body></html>");

}//doGet

publicvoiddoPost(HttpServletRequestrequest,

HttpServletResponseresponse)throwsServletException,

java.io.IOException{

doGet(request,response);

}//doPost

Page 584: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

}//LogoutServlet

Alogged-inuserwhorequeststhisservletseestheoutputinFigure15-5.TheservletdisplaysthereturnvaluesofHttpServletRequest.getRemoteUser()(theusername)andHttpServletRequest.isUserInRole().Thelattermethodreturnsabooleanvalueindicatingwhethertheuserisassociatedwiththerolespecifiedbythemethod'sStringparameter.

Figure15-5.Aservletshowssomeuser-relatedinformationbeforeloggingouttheuser

Theservlettheninvalidatestheuser'ssessiontologherout.RerequestingtheservletproducestheoutputshowninFigure15-6.

Figure15-6.Theservlet'soutputindicatesalogged-outuser

Page 585: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

SeeAlso

TheTomcatdocumentationandRecipe15.2onsettingupSSLforusewithauthentication:http://jakarta.apache.org/tomcat/tomcat-4.1-doc/ssl-howto.html;Recipe3.9onrestrictingrequestsforcertainservlets;Recipe15.6-Recipe15.9onusingJAAS.

Page 586: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe15.6UsingJAAStoCreateaLoginModule

Problem

YouwanttousetheJavaAuthenticationandAuthorizationService(JAAS)tocreateanauthenticationmodulethataservletorJSPcanuse.

Solution

Createajavax.security.auth.spi.LoginModuleclassforyourapplication,thenstoretheclassunderWEB-INF/classesorWEB-INF/lib(inaJARfile).

Discussion

TheJAASisasecurityAPIthatcanbeusedtocreatestandalone,pluggableauthenticationorauthorizationtoolsforJavaapplications.PluggablemeansthattheJAASsecuritycodeisnotboundtoaparticularapplication;itisstoredinaJARfileandcanbedroppedorpluggedintowebapplicationsandothertypesofJavaprograms.

JAASisaJavaversionofaframeworknamedPluggableAuthenticationModule(PAM).Here'salinktoapaperonthatverytopic:http://java.sun.com/security/jaas/doc/pam.html.

Forthesakeofclarity,Recipe15.5-Recipe15.7describeasimple

Page 587: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

exampleofJAASauthenticationthatrequirestwoclasses,andoneservletthatusestheJAASAPI.Inourexamples,theseclassesarestoredinWEB-INF/classes.However,manyorganizationshaveacomplexsecurityarchitecturethatcallsforamoreextensiveauthenticationandauthorizationmodel,andthusmoreJavacodeandobjects.Inthesecases,you'llwanttocreateaseparatepackagenameforyourJAAScode,archiveitinaJARfile,andplaceitinWEB-INF/libforwebapplicationstouse.

TakethefollowingstepstouseJAASforauthenticatingwebclients:

1. MakesureyouhaveinstalledtheJAASpackagesforusewithawebapplication.JAAShasbeenintegratedintotheJava21.4SDK,soyoucanuseJAASifTomcatoryourapplicationserverisusingthisversionofJava.SeethefollowingwebsiteifyouareusingJava1.3,whichrequiresyoutodownloadandinstallJAASasaJavaextension:http://java.sun.com/products/jaas/index-10.html.

CreateaLoginModuleclasstohandletheauthentication.ThisclassmustbestoredinWEB-INF/classesorinaJARfileplacedinWEB-INF/lib.

CreateaCallbackHandlerclassthatdealswithinteractionwiththeclienttogetitsusernameandpassword.StorethisclasswithyourLoginModule.

CreateaJAASconfigurationfilethatspecifieswhichLoginModule(s)youareusingforauthentication.PlacetheconfigurationfileinalocationwheretheJAAS-relatedcodecanreadit(seethedescriptionoftheconfigurationfileinRecipe15.7).

IncludeaLoginContextobjectinservletcodeandcallitslogin()method.

Authenticationcheckswhetherauserorclienthasaparticularidentity,whichis

Page 588: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

typicallyoneofasetofusernamesandpasswords.JAAScanalsobeusedforauthorization,whichspecifiestheextentofaccesstodataauserhasoncesheissuccessfullyauthenticated.Thisrecipefocusessolelyonauthentication.

Inordertomakeclearerarathercomplexmatter,Ihavebrokenthesestepsupintothreerecipes:

Thisrecipedescribessteps1-3.

Recipe15.6showshowtocreatetheJAASconfigurationfile.

Recipe15.7usestheJAASauthenticationclassesinaservlet.

Example15-9showsaclassthatimplementsthejavax.security.auth.spi.LoginModuleinterface.Itperformsmostoftheworkinidentifyingclients,andusespackagesthatarepartoftheJAASAPI(emphasizedwithboldinthecodesample).YouhavetomakethisclassavailabletotheservletenginebyplacingitinWEB-INF/classesorinaJARfilestoredinWEB-INF/lib.

Example15-9.TheLoginModuleforwebauthentication

packagecom.jspservletcookbook;

importjava.util.Map;

importjava.sql.*;

importjavax.naming.Context;

importjavax.naming.InitialContext;

importjavax.naming.NamingException;

importjavax.security.auth.spi.LoginModule;

Page 589: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

importjavax.security.auth.*;

importjavax.security.auth.callback.*;

importjavax.security.auth.login.*;

importjavax.sql.*;

publicclassDataSourceLoginModuleimplementsLoginModule{

//Theseinstancevariableswillbeinitializedbythe

//initialize()method

CallbackHandlerhandler;

Subjectsubject;

MapsharedState;

Mapoptions;

privatebooleanloginPassed=false;

publicDataSourceLoginModule(){}//no-argumentsconstructor

publicvoidinitialize(Subjectsubject,CallbackHandlerhandler,

MapsharedState,Mapoptions){

this.subject=subject;

this.handler=handler;

this.sharedState=sharedState;

this.options=options;

}

publicbooleanlogin()throwsLoginException{

Stringname="";

Stringpass="";

Contextenv=null;

Connectionconn=null;

Statementstmt=null;

Page 590: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

ResultSetrs=null;

DataSourcepool=null;

booleanpassed=false;

try{

//CreatetheCallBackarraytopasstothe

//CallbackHandler.handle()method

Callback[]callbacks=newCallback[2];

//Don'tusenullargumentswiththeNameCallbackconstructor!

callbacks[0]=newNameCallback("Username:");

//Don'tusenullargumentswithPasswordCallback!

callbacks[1]=newPasswordCallback("Password:",false);

handler.handle(callbacks);

//GettheusernameandpasswordfromtheCallBacks

NameCallbacknameCall=(NameCallback)callbacks[0];

name=nameCall.getName();

PasswordCallbackpassCall=(PasswordCallback)callbacks[1];

pass=newString(passCall.getPassword());

//LookupourDataSourcesothatwecanchecktheusernameand

//password

env=(Context)newInitialContext().lookup("java:comp/env");

pool=(DataSource)env.lookup("jdbc/oracle-8i-athletes");

if(pool==null)

thrownewLoginException(

"InitializingtheDataSourcefailed.");

Page 591: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

//TheSQLforcheckinganameandpasswordinatablenamed

//athlete

Stringsql="select*fromathletewherename='"+name+"'";

Stringsqlpass="select*fromathletewherepasswrd='"+pass+"'";

//GetaConnectionfromtheconnectionpool

conn=pool.getConnection();

stmt=conn.createStatement();

//Checktheusername

rs=stmt.executeQuery(sql);

//IftheResultSethasrows,thentheusernamewas

//correctandnext()returnstrue

passed=rs.next();

rs.close();

if(!passed){

loginPassed=false;

thrownewFailedLoginException(

"Theusernamewasnotsuccessfullyauthenticated");

}

//Checkthepassword

rs=stmt.executeQuery(sqlpass);

passed=rs.next();

if(!passed){

loginPassed=false;

Page 592: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

thrownewFailedLoginException(

"Thepasswordwasnotsuccessfullyauthenticated");

}else{

loginPassed=true;

returntrue;

}

}catch(Exceptione){

thrownewLoginException(e.getMessage());

}finally{

try{

//closetheStatement

stmt.close();

//ReturntheConnectiontothepool

conn.close();

}catch(SQLExceptionsqle){}

}//finally

}//login

publicbooleancommit()throwsLoginException{

//We'renotdoinganythingspecialhere,sincethisclass

//representsasimpleexampleofloginauthenticationwithJAAS.

//Justreturnwhatlogin()returned.

returnloginPassed;

}

Page 593: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

publicbooleanabort()throwsLoginException{

//Resetstate

booleanbool=loginPassed;

loginPassed=false;

returnbool;

}

publicbooleanlogout()throwsLoginException{

//Resetstate

loginPassed=false;

returntrue;

}//logout

}//DataSourceLoginModule

AclassthatimplementsLoginModulehastoimplementtheinterface'sfivedeclaredmethods:initialize(),login(),commit(),abort(),andlogout().login()initiatesthemaintaskofcheckingtheusernameandpasswordanddeterminingwhethertosuccessfullyauthenticatetheclient.Sincethisisasimpleexample,theDataSourceLoginModulefocusesonthelogin()method.TheothermethodsinExample15-9simplyresettheobject'sstatesothatitcanperformanotherauthentication,althoughamorecomplexloginprocessinvolvesothertasks,suchassettingupauthorization-relatedobjectsfortheauthenticateduser.

JAASisaquitecomprehensiveframework.RefertoSunMicrosystems'documentation(http://java.sun.com/products/jaas/)forguidanceindevelopingmoreadvancedJAASprogramsthanthosedescribedinthisrecipe.

Page 594: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

JAASseparatestheresponsibilityforinteractingwiththeclient(suchasgettingtheusernameandpassword)andperformingauthenticationintoCallbackHandlersandLoginModules,respectively.TheLoginModuleinExample15-9usesaCallbackHandlertogettheusernameandpassword,thenchecksthisinformationbyaccessingatablefromanOracle8idatabase.ThemoduleusesaJNDIlookuptogetaccesstothedatabase,whichChapter21explainsindetail.

Basically,theLoginModuleborrowsaConnectionfromadatabase-connectionpool,usesSQLSELECTstatementstochecktheclient'snameandpassword,thenreturnstheConnectiontothesharedpoolbyclosingit.

TheCallbackHandlerinExample15-10getstheclient'susernameandpasswordfromHTTPrequestparameters.Theclass'sconstructorincludesaServletRequestargument,fromwhichtheclasscanderiverequestparametersbycallingServletRequest'sgetParameter()method.Thisprocesswillbecomemuchclearerwhenyouseehowtheservlet(seeExample15-11inRecipe15.7)usestheseclassestoperformtheauthentication.

Example15-10.ACallbackHandlerforuseinwebauthentication

packagecom.jspservletcookbook;

importjavax.security.auth.callback.*;

importjavax.servlet.ServletRequest;

publicclassWebCallbackHandlerimplementsCallbackHandler{

privateStringuserName;

privateStringpassword;

Page 595: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

publicWebCallbackHandler(ServletRequestrequest){

userName=request.getParameter("userName");

password=request.getParameter("password");

}

publicvoidhandle(Callback[]callbacks)throwsjava.io.IOException,

UnsupportedCallbackException{

//Addtheusernameandpasswordfromtherequestparametersto

//theCallbacks

for(inti=0;i<callbacks.length;i++){

if(callbacks[i]instanceofNameCallback){

NameCallbacknameCall=(NameCallback)callbacks[i];

nameCall.setName(userName);

}elseif(callbacks[i]instanceofPasswordCallback){

PasswordCallbackpassCall=(PasswordCallback)callbacks[i];

passCall.setPassword(password.toCharArray());

}else{

thrownewUnsupportedCallbackException(callbacks[i],

"TheCallBacksareunrecognizedinclass:"+getClass().

getName());

}

}//for

}//handle

Page 596: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

}

JusttosummarizehowtheLoginModuleandCallbackHandlerfittogetherbeforeyoumoveontothenexttworecipes,oneoftheLoginContext'sconstructorstakesaCallbackHandlerasitssecondparameter,asinthefollowingcode:

WebCallbackHandlerwebcallback=newWebCallbackHandler(request);

LoginContextlcontext=null;

try{

lcontext=newLoginContext("WebLogin",webcallback);

}catch(LoginExceptionle){//respondtoexception...}

Recipe15.7showshowtocreateaJAASconfigurationfile,whichspecifiestheLoginModule(s)thatcertainapplicationswilluseduringauthentication.

SeeAlso

SunMicrosystems'JAASdeveloper'sguide:http://java.sun.com/j2se/1.4.2/docs/guide/security/jaas/JAASLMDevGuide.htmlalistofJAAStutorialsandsampleprograms:http://java.sun.com/j2se/1.4.2/docs/guide/security/jaas/JAASRefGuide.htmltheJavadocrelatingtoJAASconfigurationfiles:http://java.sun.com/j2se/1.4.1/docs/api/javax/security/auth/login/Configuration.htmlRecipe15.9onusingJAASwithaJSP.

Page 597: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe15.7CreatingtheJAASConfigurationFile

Problem

YouwanttocreatetheJAASconfigurationfile.

Solution

Createtheconfigurationfile,thenspecifytheconfiguration'slocationonyourfilesysteminthe${java.home}/jre/lib/security/java.securityfile.

Discussion

UsingJAASalsoinvolveswritingaconfigurationfiletoidentifytheLoginModule(s)thataparticularapplicationwilluse.TheconfigurationfileinExample15-11specifiesanapplicationnamed"WebLogin."

Example15-11.AJAASconfigurationfile

WebLogin{

com.jspservletcookbook.DataSourceLoginModulerequisite;

};

Althoughonlyonemoduleisspecifiedinthisrecipe,oneofthepowerfulfeaturesoftheJAASsecuritydesignistousemultipleLoginModulesorlayersinordertoauthenticateusers.Ausermighthavetobeauthenticatedinseveralwaysbeforeshegainsaccesstowebcomponentsanddata(e.g.,firstheririsesarescanned,thenshemust

Page 598: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

specifyausernameandpassword).

Theconfigurationfilespecifies:

ThefullyqualifiedclassnameoftheLoginModule(s).

A"Flag"value,whichisjustaconstantexpressionsuchas"required"or"requisite."Theexampleuses"requisite."Table15-1describesthedifferentFlagvalues.

Oneormore"options"(Example15-11doesnotidentifyanyoptions).Theoptionsrepresentaspace-separatedlistofname/valuepairs,suchasdebug="true"(youcanuseanyname/valuepairingyouwant).TheoptionsallowtheconfigurationfiletopasspropertiesandvaluestotheunderlyingLoginModule.

Table15-1.FlagvaluesforJAASconfigurationfiles

Flagname Description

RequiredTheLoginModuleisrequiredtosucceed,andoverallauthenticationfailsifaLoginModulemarked"required"fails.However,ifafailureoccurs,authenticationstillcontinuesdowntheLoginModulelist.

RequisiteTheLoginModuleisrequiredtosucceed,andruntimecontrolreturnstotheapplication(ratherthancontinuingwithanyotherlistedLoginModules)ifauthenticationfailureoccurs.

Sufficient

IftheLoginModulesucceeds,controlreturnstotheapplicationanddoesnotcontinuewithanyotherlistedLoginModules.Ifanauthenticationfailureoccurs,authenticationcontinueswithanyotherLoginModule.Inotherwords,thefailureofthisLoginModuledoesnotautomaticallyleadtothefailureofoverallauthentication,asin"required"or"requisite."

OptionalSuccessisnotrequiredwiththisLoginModule.Ifauthenticationsuccessorfailureoccurs,authenticationcontinueswithanyotherlistedLoginModules.

Thebasicstructureoftheconfigurationfilelookslikethis:

ApplicationName{

Page 599: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

ModuleNameFlagOptions;

ModuleNameFlagOptions;

ModuleNameFlagOptions;

};

AnotherApplication{

ModuleNameFlagOptions;

ModuleNameFlagOptions;

};

Again,youdonothavetousemultipleLoginModules.

SeethisJavadocpageformoredetailsonconfiguration:http://java.sun.com/j2se/1.4.1/docs/api/javax/security/auth/login/Configuration.html.

HowdoestheJAASimplementationfindtheconfigurationfile?Thedirectory${java.home}/jre/lib/securitycontainsafilenamedjava.security.Thisisa"properties"or"policy"fileinJavasecurityparlanceatextfilecontainingname/valuepairs.ThefollowinglineoftextprovidesthelocationoftheJAASconfigurationfilefortheauthenticationservletofExample15-11:

login.config.url.1=file:h:/home/.java.login.config

IfyouhaveotherJAASconfigurationfilesthatyouwanttocombinewiththisone,usesyntaxsimilartologin.config.url.2=file:h:/home/.my.config(notetheincrementednumber2),placedwithinthejava.securityfile.

Youcanuseanyfilenamingconvention;theconfigurationfilenamedoesnothavetobeginwithaperiod.

Page 600: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

AsingleJAASconfigurationfilecanspecifytheLoginModule(s)formultipleapplicationnames.Recipe15.8showsaservletthatusestheLoginModuledescribedinRecipe15.5.

SeeAlso

SunMicrosystems'JAASdeveloper'sguide:http://java.sun.com/j2se/1.4.2/docs/guide/security/jaas/JAASLMDevGuide.htmlalistofJAAStutorialsandsampleprograms:http://java.sun.com/j2se/1.4.2/docs/guide/security/jaas/JAASRefGuide.htmltheJavadocrelatingtoJAASconfigurationfiles:http://java.sun.com/j2se/1.4.1/docs/api/javax/security/auth/login/Configuration.htmlRecipe15.8onusingJAASwithaservlet;Recipe15.9onusingJAASwithaJSP.

Page 601: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe15.8UsingJAASinaServlet

Problem

YouwanttoauthenticateservletclientswithJAAS.

Solution

CreateaJavaBeanthatwrapsthefunctionalityoftheJAASAPIclassesthatyouhaveincludedinyourwebapplication.

Discussion

UsingJAASinaservletrequiresthatyouhaveaLoginModuleinstalledinyourwebapplication,eitherinWEB-INF/classesorstoredinaJARfileinWEB-INF/lib.

Example15-12showsaservletnamedLoginServletthatimplementsJAASauthentication.ThisservletusestheCallbackHandlerdescribedinRecipe15.5.ThisCallbackHandlermustalsobeplacedinWEB-INF/classesorincludedinaJARstoredinWEB-INF/lib.Abrowserrequestforthisservletlookslike:

http://localhost:8080/home/servlet/com.jspservletcookbookLoginServlet?userName=Bruce%20W%20Perry&password=bwp1968

UseaPOSTrequestfromanHTMLforminconjunctionwithSSL(Recipe15.2)ifyouwanttousethemuchmoresecurestrategyofkeepingusernamesandpasswordsoutofvisibleURLs.

Page 602: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Example15-12.Aservletforauthenticatingandlogginginclients

packagecom.jspservletcookbook;

importjavax.servlet.*;

importjavax.servlet.http.*;

importjavax.security.auth.login.LoginContext;

importjavax.security.auth.login.LoginException;

importjavax.security.auth.callback.CallbackHandler;

publicclassLoginServletextendsHttpServlet{

publicvoiddoGet(HttpServletRequestrequest,

HttpServletResponseresponse)

throwsServletException,java.io.IOException{

//TheCallbackHandlergetstheusernameandpasswordfrom

//requestparametersintheURL;therefore,theServletRequestis

//passedtotheCallbackHandlerconstructor

WebCallbackHandlerwebcallback=newWebCallbackHandler(request);

LoginContextlcontext=null;

booleanloginSuccess=true;

try{

lcontext=newLoginContext("WebLogin",webcallback);

//thismethodthrowsaLoginException

//ifauthenticationisunsuccessful

lcontext.login();

Page 603: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

}catch(LoginExceptionlge){

loginSuccess=false;

}

response.setContentType("text/html");

java.io.PrintWriterout=response.getWriter();

out.println(

"<html><head><title>Thanksforloggingin</title>"+

"</head><body>");

out.println("<h2>Yourloggedinstatus</h2>");

out.println(""+(loginSuccess?"Loggedin":

"FailedLogin"));

out.println("</body></html>");

}//doGet

publicvoiddoPost(HttpServletRequestrequest,

HttpServletResponseresponse)throwsServletException,

java.io.IOException{

doGet(request,response);

}//doPost

}//LoginServlet

Thisservlet:

1. CreatesaWebCallbackHandler(Example15-10)andpassestheServletRequestintotheconstructor(fromwherethe

Page 604: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

CallbackHandlergetstheclient'snameandpassword).

CreatesaLoginContextobjectwithtwoconstructorparameters:thenameoftheloginapplication(fromourconfigurationfileinRecipe15.6,"WebLogin")andtheWebCallbackHandlerobject.

CallstheLoginContext'slogin()method,whichbeneaththesurfacecallstheDataSourceLoginModule'slogin()method(fromExample15-9),inordertoperformauthentication.

Figure15-7showsthewebbrowseroutputwhenanattemptedloginusingthisservletsucceeds.

Figure15-7.TheLoginServletsignalssuccess

SeeAlso

Recipe15.6oncreatingaJAASLoginModule;Recipe15.7oncreatingtheJAASconfigurationfile;Chapter21onaccessingdatabaseswithservlets;SunMicrosystems'JAASdeveloper'sguide:http://java.sun.com/j2se/1.4.2/docs/guide/security/jaas/JAASLMDevGuide.htmlalistofJAAStutorialsandsampleprograms:http://java.sun.com/j2se/1.4.2/docs/guide/security/jaas/JAASRefGuide.htmltheJavadocrelatingtoJAASconfigurationfiles:http://java.sun.com/j2se/1.4.1/docs/api/javax/security/auth/login/Configuration.html

Page 605: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe15.9onusingJAASwithaJSP.

Page 606: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe15.9UsingJAASinaJSP

Problem

YouwanttouseaJSPandJAAStoauthenticateclients.

Solution

CreateaJavaBeanthatwrapsthefunctionalityoftheJAASAPIclassesthatyouhaveincludedinyourwebapplication.

Discussion

Recipe15.5-Recipe15.7covertheJAASbasics,sothisrecipefocusesonadaptingaJSPtotheJAASsecurityAPI.

TheJSPinthisrecipeusesaJavaBeantoperformthelogin.

TheJavaBeaninExample15-13hastwoproperties(intheformofinstancevariables):aServletRequestandabooleanvalueindicatingwhetherthenameandpasswordhavepassedthelogintest.ThebeanpassestheServletRequesttotheWebCallbackHandlerconstructor;theWebCallbackHandlerultimatelyextractstheusernameandpasswordfromrequestparameters.

Example15-13.AJavaBeanusestheJAASAPItoperformauthentication

packagecom.jspservletcookbook;

Page 607: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

importjavax.servlet.ServletRequest;

importjavax.security.auth.login.LoginContext;

importjavax.security.auth.login.LoginException;

publicclassLoginBean{

//privatebeaninstancevariablesorproperties

privateServletRequestreq;

booleanloginSuccess;

publicLoginBean(){}//bean'sno-argsconstructor

publicbooleangetLoginSuccess()throwsLoginException{

//theServletRequestpropertyhastobesetbeforethis

//methodiscalled,becausethat'swherewegetthe

//usernameandpasswordfrom

if(req==null)

thrownewIllegalStateException(

"TheServletRequestcannotbenullingetLogin()");

WebCallbackHandlerwebcallback=newWebCallbackHandler(req);

try{

LoginContextlcontext=newLoginContext(

"WebLogin",webcallback);

//CalltheLoginContext'slogin()method;ifitdoesn't

//throwanexception,themethodreturnstrue

lcontext.login();

returntrue;

Page 608: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

}catch(LoginExceptionlge){

//loginfailedbecausetheLoginContext.login()method

//threwaLoginException

returnfalse;

}

}//getLoginSuccess

publicvoidsetReq(ServletRequestrequest){

if(request==null)

thrownewIllegalArgumentException(

"ServletRequestargumentwasnullin:"+

getClass().getName());

this.req=request;

}//setReq

}//LoginBean

ThebeandependsonitsServletRequestpropertybeingsetproperlybeforethegetLoginSuccess()methodiscalled.ThismethodperformstheloginbyusingthefamiliarLoginContextclassanditslogin()method(thatis,familiarifyoureadRecipe15.5!).

TheJavaobjectusingthebeanknowsthattheloginsucceededorfailedbasedonthebooleanreturnvalueofthegetLoginSuccess()method.TheobjectusingthebeaninthiscaseisaservletinstanceoriginatingfromtheJSPinExample15-14.

TheJSPincludesthejsp:useBeanstandardactiontocreateaninstanceoftheLoginBean(inavariablenamedjaasBean).ThenthecodeusesJSTLtagsto:

Page 609: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

1. Setthebean'sServletRequestproperty(namedreq)tothecurrentrequest(usingc:set).

FindoutwhethertheloginsucceededbyusingtheELsyntaxtocallthebean'sgetLoginSuccess()method.

ThisrecipecombinesmanyJava-relatedtechnologies.SeeChapter23foradescriptionoftheJSTLanditsassociatedELsyntax.

Example15-14.AJSPthatlogsinusersusingtheJAASAPIandaJavaBean

<%@tagliburi="http://java.sun.com/jstl/core"prefix="c"%>

<html>

<head><title>AuthenticatingJSP</title></head>

<body>

<h2>Hereisyourloginstatus...</h2>

<jsp:useBeanid="jaasBean"class="com.jspservletcookbook.LoginBean"/>

<%--Thebean's'req'propertyissetusingthe'request'propertyoftheExpression

Language'spageContextimplicitobject--%>

<c:settarget="${jaasBean}"value="${pageContext.request}"

property="req"/>

<c:choose>

<c:whentest="${jaasBean.loginSuccess}">

Loggedinsuccessfully.

Page 610: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

</c:when>

<c:otherwise>

Loginfailed.

</c:otherwise>

</c:choose>

</body>

</html>

TheLoginBeanhasagetLoginSuccess()methodthatreturnsfalseiftheloginfails,andtrueifitsucceeds.WiththeEL,youcancallanyofabean'saccessormethodswiththeterminology:

beanname.beanpropertyname

Thebeanpropertynamepartrepresentstheactualpropertyname,notthenameofthemethod,eventhoughtheendresultofusingthissyntaxisthattheaccessormethodassociatedwiththatpropertygetscalled.Therefore,Example15-14getsthereturnvalueofthegetLoginSuccess()methodbyusing:

${jaasBean.loginSuccess}

Ifthisexpressionreturnstrue,theJSPdisplaysthetext"Loggedinsuccessfully."Otherwise,itshows"Loginfailed."

Figure15-8showstheJSP'sbrowserdisplaywhenaloginfails.

Figure15-8.AJSPsignalsaloginfailure

Page 611: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

SeeAlso

Recipe15.6oncreatingaJAASLoginModule;Recipe15.7oncreatingtheJAASconfigurationfile;Recipe15.8onusingJAASwithaservlet;Chapter23ontheJSTL;SunMicrosystems'JAASdeveloper'sguide:http://java.sun.com/j2se/1.4.2/docs/guide/security/jaas/JAASLMDevGuide.htmlalistofJAAStutorialsandsampleprograms:http://java.sun.com/j2se/1.4.2/docs/guide/security/jaas/JAASRefGuide.htmltheJavadocrelatingtoJAASconfigurationfiles:http://java.sun.com/j2se/1.4.1/docs/api/javax/security/auth/login/Configuration.html

Page 612: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Chapter16.Binding,Accessing,andRemovingAttributesinWebApplications

Introduction

Recipe16.1.SettingServletContextAttributesinServlets

Recipe16.2.SettingServletContextAttributesinJSPs

Recipe16.3.AccessingorRemovingServletContextAttributesinServlets

Recipe16.4.AccessingorRemovingServletContextAttributesinJSPs

Recipe16.5.SettingSessionAttributesinServlets

Recipe16.6.SettingSessionAttributesinJSPs

Recipe16.7.AccessingorRemovingSessionAttributesinServlets

Recipe16.8.AccessingorRemovingSessionAttributesinJSPs

Recipe16.9.SettingRequestAttributesinServlets

Recipe16.10.SettingRequestAttributesinJSPs

Recipe16.11.AccessingorRemovingRequestAttributesinServlets

Recipe16.12.AccessingorRemovingRequestAttributesinJSPs

Page 613: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Introduction

AnattributeisaJavaobjectthatservletcodecanbind,orstore,inacertainscope,suchasaServletContext,asession,orarequest.Theobjectcantemporarilystoreandshareasmallpieceofdatainawaythatisnototherwiseavailabletoservletdevelopers.Then,whentheapplicationnolongerhasusefortheobject,yourcodecanremove,orunbindit,andthewebcontainermakestheobjectavailableforgarbagecollection.

Thischapterdescribeshowtoworkwithattributesinallthreescopes:ServletContext,session,andrequest.IfyouneedtomakeanobjectavailabletoalloftheservletsandJSPsinacontext,thenyoucanbindtheobjecttoaServletContext.Iftheapplicationcallsforanobjectsuchasa"shoppingcart"tobeboundtoasession(seeChapter11),youcansettheobjectasasessionattribute.Finally,iftheapplicationrequirestwoservletsthatcommunicateviaaRequestDispatchertoshareanobject,thentheservletscanuseanobjectattributeboundtoarequestscope.

Sincesessionsandrequestsareassociatedwithnumeroususersinabusywebapplication,developershavetopayattentiontothesizeandresourceuseofanyobjectsthatareboundasattributestorequestsorsessions.

Page 614: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe16.1SettingServletContextAttributesinServlets

Problem

Youwanttomakeanobjectavailabletoallservletsinacontextorwebapplication.

Solution

BindanobjecttotheServletContextusingthejavax.servlet.ServletContext.setAttribute()method.

Discussion

AServletContextattributeisavailabletoallservletsandJSPsinacontextorwebapplication.HerearethestepstobindanobjecttoaServletContext:

1. CreatetheJavaclassthatyouwanttobindtoaServletContext.

PlacetheclassintheWEB-INF/classesdirectory,includingthenecessarypackage-relateddirectories.YoucanalsostoretheclassinaJARfileinWEB-INF/lib.

CreateaservletthatbindstheobjecttotheServletContextusingthejavax.servlet.ServletContext.setAttribute()method.

AccesstheobjectusingServletContext.getAttribute()in

Page 615: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

(other)servletswheneveritisneeded.

I'llfirstshowtheobjectthatthisrecipebindstotheServletContext.TherecipethendemonstratesaservletthatstorestheobjectattributeintheServletContext.Example16-1showsasimpleobjectwrappedaroundajava.util.Maptype.UsetheMaptostoreacharacteristicofeachrequestmadetothewebapplication.Inthisexample,eachMapkeyistheIPaddressoftheclientmakingtherequest.EachMapvalueisthedateitrequestedtheservlet.

Example16-1.TheobjectthataservletbindstotheServletContext

packagecom.jspservletcookbook;

importjava.util.Collections;

importjava.util.HashMap;

importjava.util.Iterator;

importjava.util.Map;

importjava.util.Set;

publicclassContextObject{

privateMapmap;

publicContextObject(){

map=Collections.synchronizedMap(newHashMap());

}

publicvoidput(Objectkey,Objectvalue){

if(key==null||value==null)

thrownewIllegalArgumentException(

"InvalidparameterspassedtoContextObject.put");

Page 616: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

map.put(key,value);

}

publicStringgetValues(){

StringBufferbuf=newStringBuffer("");

Setset=map.keySet();

//youhavetoexplicitlysynchronizewhenanIteratorisused

synchronized(map){

Iteratori=set.iterator();

while(i.hasNext())

buf.append((String)i.next()+"<br>");

}//synchronized

returnbuf.toString();

}

publicStringtoString(){

returngetClass().getName()+"["+map+"]";

}//toString

}

TheContextObjectclasshasmethodstoaddkeysandvaluestotheMap(put(Objectkey,Objectvalue))aswellastooutputtheMap'scurrentkeyvalues(getValues()).TheMapissynchronized,whichisessentiallythread-safe;itiscreatedintheContextObject'sconstructorinthefollowingmanner:

map=Collections.synchronizedMap(newHashMap());

Page 617: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

WhenyougenerateaMapusingthestaticjava.util.Collections.synchronizedMap()method,onlyonethreadatatimecancalltheMap'smethods.ThisisimportantwithServletContextattributesthatmaybeaccessedbyseveralservletsand/ormultiplethreadsatthesametime.

Example16-2showstheskeletonoftheContextBinderservletthatbindsaninstanceoftheContextObjectclassinExample16-1totheServletContext.

Example16-2.AservletbindsanobjecttotheServletContext

packagecom.jspservletcookbook;

importjavax.servlet.*;

importjavax.servlet.http.*;

publicclassContextBinderextendsHttpServlet{

publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throws

ServletException,java.io.IOException{

//bindanobjecttotheServletContext

getServletContext().setAttribute(

"com.jspservletcookbook.ContextObject",newContextObject());

//displaysomeHTML

...

}//enddoGet

}

TheservletmethodgetServletContext()returnsa

Page 618: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

javax.servlet.ServletContextinstance.Youthencallthatinstance'ssetAttribute()methodwiththeStringattributenameandtheboundobjectasparameters.Asaconvention,youshouldconsidernamingattributesaftertheirfullyqualifiedclassnameinthiscase,"com.jspservletcookbook.ContextObject."

SeeAlso

Recipe16.2onsettingServletContextattributesinJSPs;Recipe16.3onaccessingorremovingaServletContextattribute;Recipe16.5-Recipe16.8onhandlingsessionattributesinservletsandJSPs;Recipe16.9-Recipe16.12onhandlingrequestattributesinservletsandJSPs;Recipe14.5onusingaServletContexteventlistener;theJavadocforjavax.servlet.ServletContextAttributeListener:http://java.sun.com/j2ee/1.4/docs/api/javax/servlet/ServletContextAttributeListener.html

Page 619: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe16.2SettingServletContextAttributesinJSPs

Problem

YouwanttostoreanobjectattributeintheServletContextusingaJSP.

Solution

UsetheJSTLc:settagtobindanobjecttoapplicationscope.TheJSTLusestheapplicationimplicitobjecttorepresenttheServletContext,whichisalsothescopeusedfortheobjectattributesdiscussedinthepreviousrecipe.

Discussion

JSPdeveloperscanusetheJSTLcoretagsandthejsp:useBeanstandardactiontoimplementthesamefunctionalityastheservletinRecipe16.1.Liketheprograminthatrecipe,theupcomingJSPstoresintheServletContextanobjectattributethatcontainsajava.util.Maptype.TheMapstoreskey/valuepairsthatareaccessedbyotherservletsorJSPsinthesamecontext.

HerearethestepstobindanattributetotheServletContextusingaJSP:

1. CreatetheJavaclassthatyouwillinstantiateandbindtotheServletContext.

Page 620: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

PlacetheJavaclassintheWEB-INF/classesdirectory,includinganypackage-relateddirectories(iftheclassisnamedcom.jspservletcookbook.ContextObjectthenplacetheclassinWEB-INF/classes/com/jspservletcookbook),orinWEB-INF/libiftheclassisstoredinaJARfile.

CreatetheJSPthatwillbindtheobjectattributetotheServletContext.StoretheJSPinthewebapplication'stop-leveldirectory.

IfthewebcontainerdoesnotalreadyprovidetheJSTL-relatedcomponents,includetheminWEB-INF/lib(seeChapter23)sothattheJSPcanusethesetaglibraries.

FirstIshowtheobjectattributethattheJSPbindstotheServletContext.Example16-3isthesameJavaclassasExample16-1,exceptforthegetMap()method,whichreturnstheMaptypethatthisobjectusestostoreinformation.IaddedthismethodtomaketheMapavailabletothec:setcoretag(seeExample16-4).BecausethetwocodesamplesareexactlythesameexceptforthegetMap()method,Example16-3hasbeenabbreviatedtoshowjustthecreationofthesynchronizedmapanditsgettermethod(seeExample16-1fortheotherpartsoftheclass).

Example16-3.TheobjectattributeboundtotheServletContextbyaJSP

packagecom.jspservletcookbook;

importjava.util.Collections;

importjava.util.HashMap;

importjava.util.Iterator;

importjava.util.Map;

importjava.util.Set;

Page 621: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

publicclassContextObject{

privateMapmap;

publicContextObject(){

map=Collections.synchronizedMap(newHashMap());

}

publicMapgetMap(){

returnmap;

}

//seeExample16-1fortheotherpartsoftheclass

}

Example16-4doestheworkofcreatinganinstanceoftheobjectattributeandthenbindingtheattributetotheServletContext.ThecodecreatestheContextObjinstance(whichisstoredintheServletContext)withthejsp:useBeanstandardaction.Thenthec:setJSTLcoretagstoresthisobjectinapplicationscope,whichisanaliasfortheServletContext.TheContextObjclassstoresinformationwithaMaptypethatitcontains.ThiscodeinExample16-4storesdataintheServletContextattribute:

<c:settarget=

"${applicationScope[\"com.jspservletcookbook.ContextObject\"].map}"

value="${date}"property="${pageContext.request.remoteAddr}"/>

ThevalueofthetargetattributehastheeffectofcallinggetMap()ontheContextObjobject.Thecodethencreatesanewkey-valuepairintheMap,consistingoftheremoteIPaddressoftheclientmakingtherequest(thekey)andthecurrentdate(thevalue).Ichosethisinformationatrandomtodemonstratehowtostorepiecesofdataina

Page 622: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

ServletContextattributeusingtheJSTLandJSPs.Yourowncodemaystoredataofpracticalvaluetoyourapplicationsuchasacustomer'suniqueIDandtheitemthatheispurchasing.

Example16-4.ThecontextBind.jspfile

<%@tagliburi="http://java.sun.com/jstl/core"prefix="c"%>

<html>

<head><title>ContextbindingJSP</title></head>

<body>

<h2>HereistheboundContextObject</h2>

//createaninstanceofContextObject;storeitasaPagescopedattribute

<jsp:useBeanid="contextObj"class=

"com.jspservletcookbook.ContextObject"/>

//createaninstanceofDate;storeitasaPagescopedattribute

<jsp:useBeanid="date"class="java.util.Date"/>

//bindtheobjecttotheServletContextrepresentedbythe

//'application'implicitobject

<c:setvar=

"com.jspservletcookbook.ContextObject"value="${contextObj}"scope=

"application"/>

//createanewkey/valuepairintheboundobject'sMap

<c:settarget=

"${applicationScope[\"com.jspservletcookbook.ContextObject\"].map}"

value="${date}"property="${pageContext.request.remoteAddr}"/>

</body>

</html>

Afterlookingatthiscode,youmaywonderwhytheContextObjectvariableiseffectivelynamedtwice,oncebyjsp:useBeanwhenit

Page 623: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

createstheobject(givingtheobjectanidornamecontextObj)andagainbyc:setwhenitbindstheobjecttotheServletContext(andcreatingthenamecom.jspservletcookbook.ContextObject).

Byconvention,youshouldnametheattributeafteritsfullyqualifiedclassname.However,youcannotusethisformatwithjsp:useBean,becausethisactioncreatesaJavavariableintheunderlyingservlet.TheJavavariableisnamedcontextObj.

TheJSPcontainercreatesaservletbehindthescenestoimplementeachJSPpage.

Youcannotincludeperiod(.)characterswhennamingJavavariables,sothecoderenamestheobjectinc:set'svarattributewhentheobjectisboundtotheServletContext.

SeeAlso

Chapter23onusingtheJSTL;Recipe16.1onsettingServletContextattributesinservlets;Recipe16.4onaccessingorremovingaServletContextattributeinaJSP;Recipe16.5-Recipe16.8onhandlingsessionattributesinservletsandJSPs;Recipe16.9-Recipe16.12onhandlingrequestattributesinservletsandJSPs;Recipe14.5onusingaServletContexteventlistener;theJavadocforjavax.servlet.ServletContextAttributeListener:http://java.sun.com/j2ee/1.4/docs/api/javax/servlet/ServletContextAttributeListener.html

Page 624: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe16.3AccessingorRemovingServletContextAttributesinServlets

Problem

YouwanttoaccessaServletContextattributetoworkwithitincode,orcompletelyremoveit.

Solution

UsetheServletContext.getAttribute(StringattributeName)methodtoaccesstheattribute.UsetheServletContext.removeAttribute(StringattributeName)

methodtoremovetheattributefromtheServletContext.

Discussion

ThecodeinExample16-5getstheServletContextattributeandstoresitinalocalvariable.Thenthecodeaddsanewkey/valuetotheattribute(whichcontainsajava.util.Maptypeforstoringthekeysandvalues).Later,theservletprintsoutalistoftheattribute'skeys,whichareIPaddressesassociatedwithrequeststotheservlet.

Example16-5.AccessingaServletContextattributeinaservlet

packagecom.jspservletcookbook;

importjavax.servlet.*;

Page 625: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

importjavax.servlet.http.*;

publicclassContextAccessorextendsHttpServlet{

publicvoiddoGet(HttpServletRequestrequest,

HttpServletResponseresponse)throwsServletException,

java.io.IOException{

//getaServletContextattribute

ContextObjectcontextObj=(ContextObject)

getServletContext().getAttribute(

"com.jspservletcookbook.ContextObject");

if(contextObj!=null)

contextObj.put(request.getRemoteAddr(),""+

newjava.util.Date());

//displaythecontextattributevalues

response.setContentType("text/html");

java.io.PrintWriterout=response.getWriter();

out.println(

"<html><head><title>ContextAttribute</title></head><body>");

if(contextObj!=null){

out.println("<h2>ServletContextAttributeValues</h2>");

out.println(contextObj.getValues());

}else{

out.println("<h2>ServletContextAttributeisNull</h2>");

}

out.println("</body></html>");

}//enddoGet

}

Example16-1inRecipe16.1showstheContextObjectsourcecode.Here,theContextObjectput()methodpassesitskeyandvalueparameterstotheMapmethodofthesamename,exceptthattheContextObjectput()methoddoesnotallownullvaluesforeither

Page 626: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

itskeysorvalues.

Ifyouwanttoremovethesameattributethatwasboundbythisrecipe,calltheServletContext.removeAttribute()methodwiththeattributenameasaparameter:

getServletContext().removeAttribute(

"com.jspservletcookbook.ContextObject");

Aftertheattributeremovalcodeexecutes,anyfurthercallstoServletContext.getAttribute()usingthesameattributenamewillreturnnull.

SeeAlso

Recipe16.1andRecipe16.2onsettingServletContextattributesinservletsandJSPs;Recipe16.5-Recipe16.8onhandlingsessionattributesinservletsandJSPs;Recipe16.9-Recipe16.12onhandlingrequestattributesinservletsandJSPs;Recipe14.5onusingaServletContexteventlistener;theJavadocforjavax.servlet.ServletContextAttributeListener:http://java.sun.com/j2ee/1.4/docs/api/javax/servlet/ServletContextAttributeListener.html

Page 627: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe16.4AccessingorRemovingServletContextAttributesinJSPs

Problem

YouwanttoaccessorremoveaServletContextattributeinaJSP.

Solution

Usethec:outJSTLcoretagtodisplaythevalueofanattributeandthec:removetagtoremovetheattributefromtheServletContext.

Discussion

BynowyouareprobablyfamiliarwiththeobjectattributethatthepreviousrecipesstoredintheServletContextunderthenamecom.jspservletcookbook.ContextObject.Ifyouarenot,Recipe16.1andRecipe16.2showthesourcecodeforthisclassandhowitisboundasanattributetoaservletandaJSP.ThisrecipeshowstheJSTLtagsthatyoucanuseinJSPcodetoaccessthisattributeandoptionallyremoveorunbindit.

Example16-6includesthetaglibdirectivethatisrequiredforusingJSTL1.0tagsinaJSP.Thec:outtagthenaccessestheServletContextattributeinthetag'svalueattribute.ThetaggetsthevalueoftheServletContextattributebyusingtheapplicationScopeJSTLimplicitobject,whichisajava.util.Maptype.

Page 628: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Example16-6.AccessinganapplicationattributeinaJSP

<%@tagliburi="http://java.sun.com/jstl/core"prefix="c"%>

//HTMLorotherpresentationcodehere...

<c:outvalue=

"${applicationScope[\"com.jspservletcookbook.ContextObject\"].values}"

escapeXml="false"/>

AnimplicitobjectisanobjectthattheJSTLautomaticallymakesavailabletothedeveloper.YouusethetermapplicationScopewithin${...}characters,andthistermevaluatestoajava.util.MapofanyobjectattributesthatareboundtotheServletContext.

Thecode:

${applicationScope[\"com.jspservletcookbook.ContextObject\"].values}

usesELsyntaxtoaccesstheServletContextattributenamedcom.jspservletcookbook.ContextObjectandgetitsvaluesproperty,whicheffectivelycallsthegetValues()methodontheContextObjectobject.ThismethoddisplaysallthekeysoftheMapcontainedbyContextObject,separatedbyanHTMLlinebreak(<br>).TheattributeescapeXml="false"preventsthe<and>charactersin<br>frombeingescaped(andbeingreplacedby&lt;and&gt;,respectively),whichwouldpreventitsproperdisplayinawebbrowser.

IfIwantedtomaketheContextObjectmoreuniversal,IcouldincludeaJavaBeanpropertyallowingtheuseroftheclasstosetthelineseparator,sothattheoutputofthegetValues()methodcouldbeusedindifferentcontexts,notjustHTML.

Page 629: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Figure16-1showstheresultofaccessingaJSPthatusesthiscodeinabrowser.

Figure16-1.AccessingaServletContextboundattributeinaJSP

ToremovetheattributefromtheServletContext,usethec:removeJSTLtag.Thistagremovesthenamedvariablefromthespecifiedscope:

<c:removevar=

"com.jspservletcookbook.ContextObject"scope="application"/>

applicationisanaliasfortheServletContext.AfteraJSPthatcontainsthistagisexecuted,anyfurtherattemptstoaccessaServletContextattributeofthesamenamewillreturnnull.

SeeAlso

Chapter23onusingtheJSTL;Recipe16.1andRecipe16.2onsettingServletContextattributesinservletsandJSPs;Recipe16.3onaccessingorremovingServletContextattributesinservlets;Recipe

Page 630: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

16.5-Recipe16.8onhandlingsessionattributesinservletsandJSPs;Recipe16.9-Recipe16.12onhandlingrequestattributesinservletsandJSPs;Recipe14.5onusingaServletContexteventlistener;theJavadocforjavax.servlet.ServletContextAttributeListener:http://java.sun.com/j2ee/1.4/docs/api/javax/servlet/ServletContextAttributeListener.html

Page 631: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe16.5SettingSessionAttributesinServlets

Problem

Youwanttostoreanobjectattributeinasession.

Solution

Usethejavax.servlet.http.HttpSessionclass'ssetAttribute()method.

Discussion

ThemechanismforplacingobjectattributesinsessionsisverysimilartostoringobjectsintheServletContext,whichRecipe16.1described.Thedifferenceliesinthescopeoftheobjects;inotherwords,whichusersandhowmanyconcurrentuserscanaccesstheboundobjects.

Asessionrepresentstheinteractionofauserwithawebsite.Thesequenceofwebpagesorcomponentsthatasingleuserrequestsfromawebsiterepresentsasinglesession(detailedinChapter11).Therefore,whenyoustoreanobjectinstanceinasessionattribute,everyuserwhoparticipatesinsessionsinteractswithhisowninstanceofthatobjectattribute.WithServletContextattributes,however,alloftheapplication'susersinteractwiththesameattributeinstance,sinceeachwebapplicationhasonlyoneServletContextandeachcontextisassociatedwithoneattributeinstance.

AdistributedwebapplicationhasoneServletContextinstanceperJavavirtual

Page 632: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

machine(JVM).InsteadofusingtheServletContexttostoreinformationgloballyfortheapplication,theServletContextJavadocmakesbriefmentionofusingadatabaseinstead,toensurethatservletsinadistributedapplicationareaccessingthesamedata.SeetheServletContextJavadocat:http://java.sun.com/j2ee/1.4/docs/api/javax/servlet/ServletContext.html.

Ashoppingcartstoringauser'sitemchoicesisanexampleofanobjectthatwebdeveloperstypicallystoreasasessionattribute.Example16-7showsafragmentofservletcodeforstoringanobjectinasession.

Example16-7.Storinganobjectattributeinasession

<!--thiscodeappearsintheservlet'sdoGetordoPostmethod,whicheverisappropriate-

->

//Createasessionifonedoesnotexistyet

HttpSessionsession=request.getSession();

//bindanobjectattributeinthesession

if(session!=null)

session.setAttribute(

"com.jspservletcookbook.ContextObject",newContextObject());

Gainaccesstoasessioninaservletbyusingthejavax.servlet.http.HttpServletRequestobject'sgetSession()method.ThencallHttpSession.setAttribute(),passinginthenameoftheattributeandaninstanceoftheobjectattribute.ThecodeinExample16-7usesthesameContextObjectthatExample16-1showed(Recipe16.1).TheContextObjectusesasynchronizedjava.util.Maptypetohandlemultiplethreadsthatmightbeusingtheattributeconcurrently.

Payattentiontothepossibilityofmultiplethreadsaccessingasessionobject

Page 633: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

attribute.Accordingtotheservletspecificationv2.4(ChapterSRV.7.7.1),"Multipleservletsexecutingrequestthreadsmayhaveactiveaccesstoasinglesessionobjectatthesametime.Thedeveloperhastheresponsibilityforsynchronizingaccesstosessionresourcesasappropriate."

SeeAlso

Recipe16.1-Recipe16.4onhandlingServletContextattributesinservletsandJSPs;Recipe16.7onaccessingorremovingsessionattributesinservlets;Recipe16.6andRecipe16.8onhandlingsessionattributesinJSPs;Recipe16.9-Recipe16.12onhandlingrequestattributesinservletsandJSPs;Recipe14.6onusingasessioneventlistener;theJavadocforjavax.servlet.http.HttpSessionAttributeListener:http://java.sun.com/j2ee/1.4/docs/api/javax/servlet/http/HttpSessionAttributeListener.html

Page 634: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe16.6SettingSessionAttributesinJSPs

Problem

YouwanttobindanobjecttoasessioninaJSP.

Solution

Usethejsp:useBeanandc:settagstocreateaninstanceofanobjectandassignitasanattributetothesession.

Discussion

TheJSTLcoretagsandthejsp:useBeanstandardactioncanbeusedtomanagesessionattributesinJSPs.Example16-8bindsanobjectattributetoasession,displaysavaluefromtheobject,andthenshowsthesessionIDoftheclientwhorequestedtheJSP.TheboundobjectistheContextObjectthatIhaveusedthroughoutthischapterasthestoredattribute.Itcontainsajava.util.MaptypeforstoringtheIPaddressesofuserswhorequesttheJSP(seeExample16-1andtheaccompanyingdescriptionofthecode).

Example16-8.SettingasessionattributeinaJSP

<%@tagliburi="http://java.sun.com/jstl/core"prefix="c"%>

<html>

<head><title>ContextbindingJSP</title></head>

<body>

<h2>HerearethevaluesfromtheboundContextObject</h2>

Page 635: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<%--CreateinstancesoftheContextObjectandDateclasses--%>

<jsp:useBeanid="contextObj"class=

"com.jspservletcookbook.ContextObject"/>

<jsp:useBeanid="date"class="java.util.Date"/>

<%--Bindtheobjectattributetothesessionscope--%>

<c:setvar=

"com.jspservletcookbook.ContextObject"value="${contextObj}"scope=

"session"/>

<%--Putavalueintheobject,thendisplaythevalue--%>

<c:settarget=

"${sessionScope[\"com.jspservletcookbook.ContextObject\"].map}"value=

"${date}"property="${pageContext.request.remoteAddr}"/>

<c:outvalue="${sessionScope[\"com.jspservletcookbook.ContextObject\"].

values}"escapeXml="false"/>

<h2>HereisthesessionID</h2>

<c:outvalue="${pageContext.session.id}"/>

</body>

</html>

ThiscodefromExample16-8bindstheobjecttothesession:

<c:setvar=

"com.jspservletcookbook.ContextObject"value="${contextObj}"scope=

"session"/>

TheonlydifferencebetweenExample16-8andtheJSPofRecipe16.2,whichbindstheobjecttotheServletContext,isthevalueofthescopeattributeinthec:settag(sessioninthiscase).Insimilarfashion,thec:settagsetsavalueinthesessionattributebyreferringtothesessionScopeimplicitvariable:

<c:settarget=

Page 636: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

"${sessionScope[\"com.jspservletcookbook.ContextObject\"].map}"value=

"${date}"property="${pageContext.request.remoteAddr}"/>

TheELmechanismautomaticallymakesavailablethesessionScopeimplicitvariable,whichrepresentsajava.util.Maptypethatstoresanyobjectvariablesinsessionscope.

Ifyouhaveanattributenamethatdoesnotincludeperiodcharactersinit,youcanprovidetheattributenamewithoutanyfurthercontext,andtheELwillsearchthepage,request,session,andapplicationscopesforanattributeofthatname.Forexample,thefollowingELsyntaxreturnsasessionobjectattributenamedcontextObjwithoutusinganimplicitvariable(ornullifthatsessionattributedoesnotexist)tofurtherqualifythename:

${contextObj}

SeeAlso

Chapter23onusingtheJSTL;Recipe16.1-Recipe16.4onhandlingServletContextattributesinservletsandJSPs;Recipe16.7onaccessingorremovingsessionattributesinservlets;Recipe16.8onaccessingorremovingsessionattributesinJSPs;Recipe16.9-Recipe16.12onhandlingrequestattributesinservletsandJSPs;Recipe14.6onusingasessioneventlistener;theJavadocforjavax.servlet.http.HttpSessionAttributeListener:http://java.sun.com/j2ee/1.4/docs/api/javax/servlet/http/HttpSessionAttributeListener.html

Page 637: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe16.7AccessingorRemovingSessionAttributesinServlets

Problem

Youwanttoaccessorremoveasessionattributeinaservlet.

Solution

Usethejavax.servlet.http.HttpSession.getAttribute(String

attributeName)methodtoaccesstheattribute.UsetheremoveAttribute(StringattributeName)methodtoremovetheattributefromthesession.

Discussion

Toaccessasessionattribute,youmustfirstbindtheattributetoasession,asinRecipe16.5.Theobjectattributeisnowavailabletotheuserassociatedwiththatsession.Example16-9accessesanattributenamedcom.jspservletcookbook.ContextObject.Theexamplejustshowsthecoderelatingtoaccessinganattributefromthesession.Example16-5inRecipe16.3showstheentireservletanddoGet()methodforaccessinganobjectattribute.

TheHttpSession.getAttribute()methodreturnsanObjecttype,sothereturnvaluehastobecasttotheappropriatetypebeforecallinganymethodsonit.

Page 638: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Example16-9.Gainingaccesstothesessionattributeinaservlet

packagecom.jspservletcookbook;

...

<!--thiscodeappearsintheservlet'sdoGetordoPostmethod,whicheverisappropriate.

TheContextObjectclassisstoredinWEB-INF/classes/com/jspservletcookbook/-->

//Createasessionifonedoesnotexistyet

HttpSessionsession=request.getSession();

//Thislocalvariablewillholdtheobjectattribute

ContextObjectcontextObj=null;

//getaccesstoanobjectattributeinthesession

if(session!=null)

contextObj=(ContextObject)session.getAttribute(

"com.jspservletcookbook.ContextObject");

//ensurethecontextObjisnotnullbeforecallinganymethods

if(contextObj!=null)

out.println(contextObj.getValues());

<!--restofservletclassanddoGetordoPostmethodgoeshere-->

Youmusttakethesestepsbeforeaccessingasessionattribute:

1. Compiletheclassoftheobjectthatwillbestoredinthesession.

PlacethisclassinWEB-INF/classesorinWEB-INF/libifit'sstoredinaJARfile.

Page 639: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Makesureaservlet,JSP,orotherwebcomponentsetstheattributetothesessionwiththeHttpSession.setAttribute()method.

Removingthesessionattributefromaservlet

Toremoveanattribute,callHttpSession.removeAttribute()withthenameoftheattribute.Usethefollowingcodeinaservlettoremovetheattributethischapterhasbeenworkingwith:

HttpSessionsession=request.getSession();

<!--HttpSession.removeAttributewillhavenoeffectifanattributeofthatname

doesnotexist-->

if(session!=null)

session.removeAttribute("com.jspservletcookbook.ContextObject");

Nowtheattributeisnolongeravailableinthesessionassociatedwiththeuserthatrequestedtheservlet.Thesessionattributeisstillavailableinothersessionswhereitmaybestored(albeitintheformofadifferentinstance).Eachuserisassociatedwithaspecificsession,andeachsessioncancarryitsowninstanceoftheobjectattribute.

WhenyouremovetheattributefromtheServletContext,ontheotherhand,itisnolongeravailabletoanyusers,becausethereisonlyoneServletContextforeachnondistributedwebapplication.

SeeAlso

Recipe16.1-Recipe16.4onhandlingServletContextattributesinservletsandJSPs;Recipe16.5onsettingsessionattributesinservlets;

Page 640: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe16.6onsettingsessionattributesinJSPs;Recipe16.8onaccessingorremovingsessionattributesinJSPs;Recipe16.9-Recipe16.12onhandlingrequestattributesinservletsandJSPs;Recipe14.6onusingasessioneventlistener;theJavadocforjavax.servlet.http.HttpSessionAttributeListener:http://java.sun.com/j2ee/1.4/docs/api/javax/servlet/http/HttpSessionAttributeListener.html

Page 641: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe16.8AccessingorRemovingSessionAttributesinJSPs

Problem

YouwanttoaccessorremoveasessionattributeinaJSP.

Solution

Usethec:outJSTLcoretagtodisplaythevalueofanattributeandthec:removetagtoremovetheattributefromthesession.

Discussion

Herearethestepstoaccessorremoveasession-scopedvariablewiththeJSTLandaJSP:

1. MakesurethatyourwebapplicationisabletousetheJSTL(i.e.,youhavetheproperJARfilessuchasjstl.jarandstandard.jarinyourWEB-INF/libdirectory;seeChapter23forinstructions).

Includethetaglibdirective,whichmakestheJSTLcoretagsavailabletotheJSP(seetheupcomingcode).

Makesuretheobjectattributeisboundtothesessioninthefirstplace,eitherbythesameJSPthataccessestheattribute,orbyanotherwebcomponent(suchasaservlet).

Thecodeinthisrecipeshowshowtoreferenceasession-scoped

Page 642: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

variable,asopposedtoaServletContextattribute(showninRecipe16.4).ThiscodeusesthesessionScopeimplicitobjectoftheEL,whichisanautomaticallyavailablevariableinELformatthatcontainsanysession-scopedobjectattributes.ThiscoderepresentsaportionofaJSPthatdisplaysthevaluescontainedinanattributenamedcom.jspservletcookbook.ContextObject.

Example16-4inRecipe16.2showsacompleteJSPthataccessesobjectattributes.Recipe16.2accessesaServletContextattributeinaJSP,ratherthanasession-scopedattribute.

<%@tagliburi="http://java.sun.com/jstl/core"prefix="c"%>

//HTMLorotherpresentationcodehere...

<c:outvalue=

"${sessionScope[\"com.jspservletcookbook.ContextObject\"].values}

escapeXml="false"/>

TheescapeXml="false"partofthec:outtagtellsthetagtoleavecharactersthatarepartofthetag'soutputsuchas<and>unescaped(inotherwords,donotconvertthemtocharacterentitiessuchas&lt;and&gt;).

ThisJSPcoderemovesasession-scopedvariableusingthec:removecoretag:

<c:removevar=

"com.jspservletcookbook.ContextObject"scope="session"/>

TheobjectattributeisnolongeravailablefortheindividualsessionassociatedwiththeuserthatrequestedthisJSP.Inotherwords,thec:removetagdoesnotremoveallsessionattributesofthespecified

Page 643: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

name,justthesessionattribute(s)associatedwithanyuserwhorequeststheJSPcontainingthec:removetag.

SeeAlso

Chapter23onusingtheJSTL;Recipe16.1-Recipe16.4onhandlingServletContextattributesinservletsandJSPs;Recipe16.5onsettingsessionattributesinservlets;Recipe16.6onsettingsessionattributesinJSPs;Recipe16.7onaccessingorremovingsessionattributesinservlets;Recipe16.9-Recipe16.12onhandlingrequestattributesinservletsandJSPs;Recipe14.6onusingasessioneventlistener;theJavadocforjavax.servlet.http.HttpSessionAttributeListener:http://java.sun.com/j2ee/1.4/docs/api/javax/servlet/http/HttpSessionAttributeListener.html

Page 644: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe16.9SettingRequestAttributesinServlets

Problem

Youwanttouseaservlettostoreanattributeinarequest.

Solution

Usethejavax.servlet.ServletRequest.setAttribute()method.

Discussion

TheServletRequest.setAttribute()methodisoftenusedincodethatdynamicallyforwardsrequestsorincludescontentwithajavax.servlet.RequestDispatcher.

WebapplicationsthatuseRequestDispatcherstosharerequestsbetweenwebcomponentscancommunicatebetweenthesecomponentsusingrequestattributes.BoththerecipientoftheRequestDispatcher.forward()methodandtheincludedfileorpageinvolvedwiththeRequestDispatcher.include()methodhaveaccesstotheoriginalorenclosingrequest.Therefore,thesewebcomponentscanalsoaccessanyobjectattributesthatarestoredinthoserequests.

TheservletinExample16-10createsaninstanceofaContextObject,storessomeinformationintheobjectbycallingitsput()method,andthenplacestheobjectintheHttpServletRequestunderthename

Page 645: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

"com.jspservletcookbook.ContextObject."TheservletthenusesaRequestDispatchertoforwardtherequest(includingtheattribute)andresponsetotheservletpath/displayAttr.Thewebcomponentmappedtothatservletpathnowhasaccesstothepreviouslycreatedrequestattribute.

Example16-10.Bindinganobjecttoarequest

packagecom.jspservletcookbook;

importjavax.servlet.*;

importjavax.servlet.http.*;

publicclassRequestBinderextendsHttpServlet{

publicvoiddoGet(HttpServletRequestrequest,

HttpServletResponseresponse)throwsServletException,

java.io.IOException{

//bindanobjecttotherequest

ContextObjectcontextObj=newContextObject();

contextObj.put(request.getRemoteAddr(),""+newjava.util.Date());

request.setAttribute(

"com.jspservletcookbook.ContextObject",contextObj);

//useRequestDispatchertoforwardrequesttoanotherservlet

//mappedtotheservletpath'/displayAttr'

RequestDispatcherdispatcher=request.getRequestDispatcher(

"/displayAttr");

dispatcher.forward(request,response);

}//doGet

Page 646: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

}

Example16-11showstheservletthatreceivestheforwardedrequest.TheRequestDisplayservletismappedinweb.xmltothe/displayAttrservletpath.ThisservletgetstherequestattributefromtheHttpServletRequestobjectbycallinggetAttribute()withtheattributename:com.jspservletcookbook.ContextObject.SincethereturnvalueofgetAttribute()istypedtoObject,thecodemustcasttheresulttoContextObject.

Example16-11.ThetargetofRequestDispatcher.forwardhasaccesstotherequestattribute

packagecom.jspservletcookbook;

importjavax.servlet.*;

importjavax.servlet.http.*;

publicclassRequestDisplayextendsHttpServlet{

publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throws

ServletException,java.io.IOException{

ContextObjectobj=(ContextObject)request.getAttribute(

"com.jspservletcookbook.RequestObject");

response.setContentType("text/html");

java.io.PrintWriterout=response.getWriter();

out.println(

"<html><head><title>RequestAttribute</title></head><body>");

out.println("<h2>Requestattributevalues</h2>");

//displaythekeysofthejava.util.Mapstoredintherequestobject

//attribute

if(obj!=null)

Page 647: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

out.println(obj.getValues());

out.println("</body></html>");

}//enddoGet

}

MakesuretocheckwhethertheServletRequest.getAttribute()returnvalueisnullbeforecallinganyoftheobjectattribute'smethods.ThegetAttribute()methodreturnsnulliftherequestdoesnotcontainanattributeofthespecifiedname.

SeeAlso

Recipe16.1-Recipe16.4onhandlingServletContextattributesinservletsandJSPs;Recipe16.5-Recipe16.8onhandlingsessionattributesinservletsandJSPs;Recipe16.10onsettingrequestattributesinJSPs;Recipe16.11andRecipe16.12onaccessingorremovingrequestattributesinservletsandJSPs;theJavadocforjavax.servlet.ServletRequestAttributeListener:http://java.sun.com/j2ee/1.4/docs/api/javax/servlet/ServletRequestAttributeListener.html

Page 648: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe16.10SettingRequestAttributesinJSPs

Problem

YouwanttosetarequestattributeusingaJSP.

Solution

UsetheJSTLcoretagsandthejsp:useBeanstandardactiontocreateaninstanceofanobjectandbindittotherequest.

Discussion

TheJSPinExample16-12storesacom.jspservletcookbook.ContextObjectintherequestscopebyfirstcreatinganinstanceofthatobjectwithjsp:useBean.AsinRecipe16.2andRecipe16.6,thecodeusesthec:settagtobindtheobjecttotherequest,butthistimegivesitsscopeattributeavalueofrequest.

YoushouldstoretheclassesfortheobjectsthatJSPsuseasrequestattributesinWEB-INF/classes,orinWEB-INF/libiftheclassispartofaJARfile.

TheJSPinExample16-12isexactlyliketheJSPcodeshowninRecipe16.2andRecipe16.6,exceptthistimethecodeusestherequestScopeimplicitobjecttofetchtherequestattributeandgiveitanewpropertyandvalue.TherequestScopeisusedinELsyntax(seeChapter23)toaccessrequestattributes.

Page 649: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Example16-12.SettingarequestattributeandforwardingtherequestinaJSP

<%@tagliburi="http://java.sun.com/jstl/core"prefix="c"%>

<jsp:useBeanid="contextObj"class=

"com.jspservletcookbook.ContextObject"/>

<jsp:useBeanid="date"class="java.util.Date"/>

<c:setvar="com.jspservletcookbook.ContextObject"value=

"${contextObj}"scope="request"/>

<c:settarget=

"${requestScope[\"com.jspservletcookbook.ContextObject\"].map}"value=

"${date}"property="${pageContext.request.remoteAddr}"/>

<jsp:forwardpage="/displayAttr"/>

Aftersettingtherequestattributeandgivingitsomevalues,theJSPforwardstherequesttotheservletpath/displayAttr.TheservletorJSPmappedtothatpathhasaccesstothenewrequestattribute.

SeeAlso

Chapter23onusingtheJSTL;Recipe16.1-Recipe16.4onhandlingServletContextattributesinservletsandJSPs;Recipe16.5-Recipe16.8onhandlingsessionattributesinservletsandJSPs;Recipe16.11andRecipe16.12onaccessingorremovingrequestattributesinservletsandJSPs;theJavadocforjavax.servlet.ServletRequestAttributeListener:http://java.sun.com/j2ee/1.4/docs/api/javax/servlet/ServletRequestAttributeListener.html

Page 650: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe16.11AccessingorRemovingRequestAttributesinServlets

Problem

Youwantaservlettoaccessorremovearequestattribute.

Solution

Usethejavax.servlet.ServletRequest.getAttribute()andjavax.servlet.ServletRequest.removeAttribute()

methods,includingthenameoftheattributeasthemethodparameter.

Discussion

Example16-13isderivedfromthedoGet()methodofExample16-11inRecipe16.9(refertothatclassifyouneedtoreviewthecompletecodeofaservlethandlingrequestattributes).Example16-13getsanobjectattributefromtheHttpServletRequestobject,whichisthedoGet()method'sfirstparameter.

TheservletcontainercreatesanHttpServletRequestobjectandpassesitasthefirstparametertoalloftheHttpServlet'sservicemethods,includingdoGet()anddoPost().

Example16-13callsoneoftheattribute'smethods,thenremovestherequestattribute.

Page 651: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Example16-13.Aservletaccessesandremovesarequestattribute

publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)

throwsServletException,java.io.IOException{

ContextObjectobj=(ContextObject)request.getAttribute(

"com.jspservletcookbook.ContextObject");

response.setContentType("text/html");

java.io.PrintWriterout=response.getWriter();

out.println(

"<html><head><title>RequestAttribute</title></head><body>");

//displaytheattribute'sMapkeys

out.println("<h2>Requestattributevalues</h2>");

if(obj!=null)

out.println(obj.getValues());

//Thismethodcallmaynotbenecessaryasrequestattributes

//persistonlyaslongastherequestisbeinghandled,

//accordingtotheServletRequestAPIdocumentation.

request.removeAttribute("com.jspservletcookbook.ContextObject");

out.println("</body></html>");

}//doGet

Iftheattributedoesnotexistintherequest(becauseitwasnotboundtotherequestinthefirstplace),ServletRequest.getAttribute()returnsnull.Makesuretheservletcodechecksforanullvaluebeforeitcallstheobject'smethods.Inaddition,theServletRequest.getAttribute()methodreturnsanObjecttype,soensurethattheservletcodecaststhereturnvaluetothepropertypebeforecallingtheexpectedtype'smethods.

Page 652: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

SeeAlso

Recipe16.1-Recipe16.4onhandlingServletContextattributesinservletsandJSPs;Recipe16.5-Recipe16.8onhandlingsessionattributesinservletsandJSPs;Recipe16.12onaccessingorremovingrequestattributesinJSPs;Chapter6onincludingcontentinservletsandJSPs;theJavadocforjavax.servlet.ServletRequestAttributeListener:http://java.sun.com/j2ee/1.4/docs/api/javax/servlet/ServletRequestAttributeListener.html

Page 653: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe16.12AccessingorRemovingRequestAttributesinJSPs

Problem

YouwanttouseaJSPtoaccessorremovearequestattribute.

Solution

UsetheJSTLcoretagsc:outandc:removetoaccessandoptionallyremovetheattribute.

Discussion

Example16-14accessesanobjectattributethatisboundtotheHttpServletRequest.TheJSPaccessesthisattributebyusingELsyntaxinsidethec:outJSTLtag.

Example16-12inRecipe16.10forwardsarequestattributetoaservletusingthejsp:forwardstandardaction.TheJSPinthatexamplecanforwarditsrequestattributetotheJSPinExample16-14byusingthecode:

<jsp:forwardpage="/requestDisplay.jsp"/>

Thecode:

"${requestScope[\"com.jspservletcookbook.ContextObject\"].

values}"

usestherequestScopeJSTLimplicitobject.Thisvariable,whichthe

Page 654: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

JSTLautomaticallymakesavailabletoEL-relatedcode,isajava.util.Maptypecontaininganyattributesboundtotherequestscope.Thecodethendisplaysthevaluestheattributecontainsbyaccessingtheobjectattribute'svaluesproperty(seeRecipe16.1foradiscussionoftheobjectusedforstoringanattributeinvariousscopesthroughoutthischapter).

Example16-14.AccessingandremovingarequestattributewiththeJSTL

<%@tagliburi="http://java.sun.com/jstl/core"prefix="c"%>

<html>

<head><title>RequestreadingJSP</title></head>

<body>

<h2>HerearethevaluesfromtheboundRequestObject</h2>

<c:outvalue=

"${requestScope[\"com.jspservletcookbook.ContextObject\"].

values}"escapeXml="false"/>

<%--c:removemaynotbenecessaryasrequestattributespersistonlyaslongasthe

requestisbeinghandled--%>

<br>Removingrequestattributewithc:remove...<c:removevar=

"com.jspservletcookbook.ContextObject"scope="request"/>

</body>

</html>

Thec:removetagremovestheattributenamedinitsvarattributefromthespecifiedscope.Usescope="request"becauseyouareremovingthisattributefromtheJSP'srequestscope.Figure16-2showstheoutputofthedisplayRequest.jsppageinawebbrowser.

Figure16-2.Thebrowserdisplayafteraccessingand

Page 655: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

removingarequestattributeinaJSP

TheJSPthatappearsinthebrowser'saddressfield,requestBind.jsp,actuallysettheattributeandforwardedtherequest(seeRecipe16.10).Whencodeusesjsp:forward,theoriginalJSPremainsinthebrowser'saddressfield,eventhoughthebrowserdisplaystheoutputoftheJSPtargetedbytheforwardaction.

SeeAlso

Chapter23onusingtheJSTL;Recipe16.1-Recipe16.4onhandlingServletContextattributesinservletsandJSPs;Recipe16.5-Recipe16.8onhandlingsessionattributesinservletsandJSPs;Recipe16.11onaccessingorremovingrequestattributesinservlets;theJavadocforjavax.servlet.ServletRequestAttributeListener:http://java.sun.com/j2ee/1.4/docs/api/javax/servlet/ServletRequestAttributeListener.html

Page 656: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Chapter17.EmbeddingMultimediainJSPs

Introduction

Recipe17.1.EmbeddinganAppletinaJSPUsingjsp:plugin

Recipe17.2.EmbeddinganAppletinaJSPUsingtheHTMLConverter

Recipe17.3.AutomaticallyCreatingHTMLTemplateforIncludingFlashFiles

Recipe17.4.WritingHTMLTemplatetoEmbedaFlashFile

Recipe17.5.EmbeddingFlashinaServlet

Recipe17.6.EmbeddingaQuickTimeMovieinaJSP

Recipe17.7.EmbeddinganSVGFileinaJSP

Recipe17.8.EmbeddingaBackgroundSoundtrackinaJSP

Page 657: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Introduction

Mostwebsitesincludesometypeofmultimediaandinteractiveprograms,suchasdigitalvideos,digitalaudiofiles,MacromediaFlashmovies,andJavaapplets.Therefore,JavawebsitesoftenintegratethistypeofcontentwithservletsandJavaServerPages(JSPs).ThischapterexplainsthebasicsofembeddingmultimediainJavawebcomponents.Thisprocessinvolvesincludingtheobjectandembedtagsinyourcomponent'sHTMLoutput.

AJSPisthepreferredchoiceforcombiningmultimediawithdynamiccontent,becauseyoucanmakethetagsthatyouusetoembedthemultimediaapartoftheJSP'sHTMLtemplatetext.However,Recipe17.5alsoshowshowtoincludemultimediaaspartofaservlet'soutput.

Ifthepagecontainingthemultimediacontentdoesnothavetoincludeanyothertypeofdynamicoutput,justuseastaticHTMLpageinsteadofexecutingJSPsandservlets.AstaticpagetypicallyrequiresfewerserverresourcestorespondtoHTMLpagerequests.

Page 658: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe17.1EmbeddinganAppletinaJSPUsingjsp:plugin

Problem

Youwanttousethejsp:pluginstandardactiontoexecuteaJavaappletwiththeJavaPlug-insoftware.

Solution

Usethejsp:pluginactionpositionedintheareaofaJSPwhereyouwanttheapplettoappear.

Discussion

TheJSPspecificationprovidesastandardaction,jsp:plugin,whichproducestheobjectandembedtagsthataredesignedtoallowbrowserstoloadaJavaapplet.TheactionwillruntheappletusingSunMicrosystems'sJavaPlug-inorinitiatethedownloadofthePlug-iniftheuserhasnotyetinstalledthePlug-in.

TheJavaPlug-inisdesignedtoexecuteanappletusingSunMicrosystems'sJava2RuntimeEnvironment,ratherthananyJavaruntimeprovidedbythebrowser.TheinstallationoftheJavaJREorSoftwareDevelopmentKitautomaticallyinstallstheJavaPlug-in.

Usenestedjsp:paramelementstoprovidetheappletwithany

Page 659: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

necessaryparameterandvaluepairs.Thejsp:paramelementsmustbenestedwithinasinglejsp:paramselement.

Example17-1showsaJSPfilethatusesjsp:plugintoembedanappletnamedClock.class.Inthiscase,theClock.classfileislocatedinthesamedirectoryastheJSPinExample17-1.

ThisappletoriginatesfromSunMicrosystems'ssampleapplets:http://java.sun.com/products/plugin/1.4.1/demos/plugin/applets/Clock/example1.html

Example17-1.EmbeddingaJavaappletwithjsp:plugin

<%@tagliburi="http://java.sun.com/jstl/core"prefix="c"%>

<jsp:useBeanid="date"class="java.util.Date"/>

<html>

<head><title>AClockinaJSP</title></head>

<body>

<h2>Thetime...</h2>

<jsp:plugintype="applet"code="Clock.class"codebase=

"http://localhost:8080/home/applets"jreversion="1.4.1">

<jsp:params>

<jsp:paramname="scriptable"value="false"/>

</jsp:params>

<jsp:fallback>

Sorry,weareunabletostarttheJavaplugin<br/>

</jsp:fallback>

Page 660: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

</jsp:plugin>

<br/><c:outvalue="${date}"/>

</body>

</html>

UserswhohaveinstalledInternetExplorerforWindowsdependonanHTMLobjecttagtoprovidethedirectionforloadingtheapplet.InbrowsersthatsupporttheNetscape-styleplug-in,theHTMLusesit'sembedtag.Thejsp:pluginstandardactiongeneratesHTMLthatshouldworkwithbothbrowsertypes(butyoustillshouldtesttheresultingJSP,ofcourse).

Example17-2showstheHTMLtagsgeneratedbythejsp:pluginactionwhentheInternetExplorer5.5andtheNetscapebrowsersrequesttheJSPinExample17-1.

Example17-2.HTMLtagsgeneratedbythejsp:pluginactionforloadingaJavaapplet

<OBJECTclassid=

clsid:8AD9C840-044E-11D1-B3E9-00805F499D93codebase=

"http://java.sun.com/products/plugin/1.2.2/jinstall-1_2_2-win.cab#

Version=1,2,2,0">

<PARAMname="java_code"value="Clock.class">

<PARAMname="java_codebase"value="http://localhost:8080/home/applets">

<PARAMname="type"value="application/x-java-applet;version=1.4.1">

<PARAMname="scriptable"value="false">

<COMMENT>

<EMBEDtype="application/x-java-applet;version=1.4.1"pluginspage=

Page 661: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

"http://java.sun.com/products/plugin/"java_code=

"Clock.class"java_codebase=

"http://localhost:8080/home/applets"scriptable="false"/>

<NOEMBED>

Sorry,weareunabletostarttheJavaplugin<br/>

</NOEMBED>

</COMMENT>

</OBJECT>

Figure17-1showstheJSPwiththeembeddedapplet.

Figure17-1.AJSPwithanembeddedapplet

SeeAlso

TheJavaPlug-intechnologypage:http://java.sun.com/products/plugin/;

Page 662: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe17.2onembeddinganappletusingtheSunMicrosystemsHTMLConverter.

Page 663: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe17.2EmbeddinganAppletinaJSPUsingtheHTMLConverter

Problem

YouwanttousetheJavaPlug-inHTMLConvertertooltogeneratethetagsforembeddinganapplet.

Solution

UsetheHTMLConvertertoolwithinhtmlconverter.jar,whichislocatedinthelibdirectoryofthedirectorywhereyouhavetheJavaSDKinstalled.

Discussion

AbusydevelopercanlettheJavaPlug-inHTMLConvertertoolproducetheHTMLtagsthatareresponsibleforloadingJavaapplets.TheJavaPlug-inisaJava-basedtoolthatallowsappletstoberunintheSunMicrosystemsJava2runtimeenvironment,ratherthanwithinthewebbrowser'sJavaruntimeenvironment.TheJavaPlug-inisinstalledonyourmachinewhenyouinstalltheJRE,includingtheinstallationoftheSDK.

TheHTMLConvertertoolwillconvertaspecifiedJSPfilethatcontainsanappletHTMLtag,replacingtheapplettagwithamorecomplextagcollectionthatallowsmostbrowserstoloadtheJavaapplet.TheConverterleavestherestofyourJSPcodeuntouched;itonlyreplacestheJSP'sapplettag.

HereishowtousetheHTMLConvertertool:

Page 664: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

1. WritetheJSPfile,addinganapplettag.Example17-3showsaJSPthatembedsaClock.classappletreference.ThisJSP,ratherredundantly,dynamicallywritesatimestringbeneaththeapplet.IincludedthiscodetoshowthattheConverterdoesnotchangetheJSPcode;itjustalterstheapplettagtemplatetextincludedwiththeJSP.

Example17-3.AJSPwithanapplettag

<%@tagliburi="http://java.sun.com/jstl/core"prefix="c"%>

<jsp:useBeanid="date"class="java.util.Date"/>

<html>

<head><title>AClockinaJSP</title></head>

<body>

<h2>Thetime...</h2>

<appletcode="Clock.class"codebase="http://localhost:8080/home/applets">

</applet>

<br/><c:outvalue="${date}"/>

</body>

</html>

Openacommand-linewindowtothelibdirectoryofyourSDKinstallation,suchasH:\j2sdk1.4.1_01\lib.

Typejava-jarhtmlconverter.jar-gui.ThiscommandlaunchestheSwingversionoftheHTMLConvertertool.Figure17-2showswhatthetoollookslike.

Figure17-2.TheHTMLConverter(GUIversion)

Page 665: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

TheHTMLConvertercanalsoberunfromthecommandline.SeetheJavaPlug-inDeveloperGuideforsupportedoptions:http://java.sun.com/j2se/1.4.1/docs/guide/plugin/.

4. Ifyouwanttochooseaback-upfolderwherethetoolsavestheoldJSPfile(withtheapplettag),usetheHTMLConverterGUIwindowtochoosethisfolder.

Clickthe"Convert..."buttonwiththeJSPfilespecifiedinthetoptextfield,andtheConverterwilloverwritetheoriginalfilewithadditionalobjectandembedtags.

Example17-4showsthecodethatreplacedtheapplettaginExample17-3(inboldfont),aswellasthecodethattheconvertertooldidnotmodify.

Example17-4.TheobjectandembedtagsproducedbytheHTMLConverter

Page 666: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<%@tagliburi="http://java.sun.com/jstl/core"prefix="c"%>

<jsp:useBeanid="date"class="java.util.Date"/>

<html>

<head><title>AClockinaJSP</title></head>

<body>

<h2>Thetime...</h2>

<!--"CONVERTED_APPLET"-->

<!--HTMLCONVERTER-->

<OBJECT

classid=

"clsid:8AD9C840-044E-11D1-B3E9-00805F499D93"

codebase=

"http://java.sun.com/products/plugin/autodl/jinstall-1_4-windows-

i586.cab#Version=1,4,0,0"

>

<PARAMNAME=CODEVALUE="Clock.class">

<PARAMNAME=CODEBASEVALUE="http://localhost:8080/home/applets">

<PARAMNAME="type"VALUE="application/x-java-applet;version=1.4">

<PARAMNAME="scriptable"VALUE="false">

<COMMENT>

<EMBED

type="application/x-java-applet;version=1.4"

CODE="Clock.class"

JAVA_CODEBASE="http://localhost:8080/home/applets"

scriptable=false

pluginspage=

"http://java.sun.com/products/plugin/index.html#download">

<NOEMBED>

</NOEMBED>

</EMBED>

Page 667: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

</COMMENT>

</OBJECT>

<!--

<APPLETCODE="Clock.class"JAVA_CODEBASE=

"http://localhost:8080/home/applets">

</APPLET>

-->

<!--"END_CONVERTED_APPLET"-->

<br/><c:outvalue="${date}"/>

</body>

</html>

UsersmayhavetroubleloadingtheappletintheirbrowsersiftheyhaveseveralinstalledversionsoftheJavaPlug-in.ThisoccurswhenuserssteadilyupgradetheirJREorJavaSDKversions,whichinstallthecorrespondingversionoftheJavaPlug-in.ThesimplestsolutioninthesecasesistouninstalltheoldJavaPlug-ins.

SeeAlso

TheJavaPlug-intechnologypage:http://java.sun.com/products/plugin/;Recipe17.1onembeddingaJavaappletusingthejsp:pluginstandardJSPaction.

Page 668: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe17.3AutomaticallyCreatingHTMLTemplateforIncludingFlashFiles

Problem

YouwanttoautomaticallygeneratetherequiredHTMLforembeddingaFlashfileinawebcomponent.

Solution

FromwithinMacromediaFlash6,usethe"File Publish"menucommandtooutputanHTMLfilethatincludestheobjectandembedtags.

Discussion

Withan.swffileopeninMacromediaFlash6,usethe"File Publish"menucommandtocreateanHTMLfile.ThisfileincludesthenecessarytagstoembedtheFlashmovieyouareworkingoninawebcomponent.ThencutandpastethesetagsandattributesintoyourJSP.Example17-5showstheoutputfromusingthismenucommandwithan.swffilenamedexample.swf.

Example17-5.AutomaticallygeneratedtemplatetextfromwithintheFlashapplication

<HTML>

<HEAD>

<metahttp-equiv=Content-Typecontent="text/html;charset=ISO-8859-1">

Page 669: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<TITLE>example</TITLE>

</HEAD>

<BODYbgcolor="#FFFFFF">

<!--URL'susedinthemovie-->

<!--textusedinthemovie-->

<!--DeductionsPaycheckSDIAnnualSalaryMedicareSocial

securityESPP401k$#%FederalStateMarriedSingleactions-->

<OBJECTclassid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"

codebase=

"http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.

cab#version=6,0,0,0"WIDTH="550"HEIGHT="400"id="example"ALIGN=""

>

<PARAMNAME=movieVALUE="example.swf">

<PARAMNAME=qualityVALUE=high><PARAMNAME=bgcolorVALUE=#FFFFFF>

<EMBEDsrc="example.swf"quality=highbgcolor=#FFFFFFWIDTH="550"HEIGHT=

"400"NAME="example"ALIGN=""

TYPE="application/x-shockwave-flash"PLUGINSPAGE=

"http://www.macromedia.com/go/getflashplayer">

</EMBED>

</OBJECT>

</BODY>

</HTML>

YourJSPprobablyalreadyincludestheboilerplateHTMLsuchasthebodytag;therefore,youonlyhavetocutandpastethenoncommented,emphasizedcodeinExample17-5.

Theexample.swffileresidesinthesamedirectoryastheHTMLfileinthisexample.

Page 670: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Example17-6inthenextrecipeshowsaJSPfilewiththesametypeofFlash-relatedobjectandembedtagsasthoseillustratedinthisrecipe.Figure17-3showstheautomaticallygeneratedHTMLfilefromExample17-5.

Figure17-3.HTMLtemplatetextwithanembeddedFlashfile

ThedisplayedFlashmovieisderivedfromoneoftheFlashsamplesthataccompaniestheFlash6application:Paycheck_calculator.swf.

Page 671: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

SeeAlso

Macromediatechnicalnotespage:http://www.macromedia.com/support/flash/technotes.html;anarticleaboutalternativetechniquestousingtheembedtag:http://www.macromedia.com/devnet/mx/dreamweaver/articles/flash_satay.html

Page 672: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe17.4WritingHTMLTemplatetoEmbedaFlashFile

Problem

YouwanttowritetheHTMLtemplatetexttoembedaFlashfileinyourJSP.

Solution

UsetheobjectandembedtagssothattheHTMLisreadcorrectlybythebrowsersthatsupporteitherofthesetags.

Discussion

YoumaynothavetheMacromediaFlashapplicationthatcanautomaticallygeneratetheHTMLwhichisnecessarytoembedaFlashfile(Recipe17.4).Inthiscase,writetherequiredHTMLtemplatetextforembeddingaFlashmovieinsideaJSP.

Example17-6showsaJSPwithanembeddedFlashfile(theembeddedfilehasa.swfextension).Thesameconceptappliestothisexampleastotheotherrecipes:theobjecttagisfortheInternetExplorerWindowsbrowser,whichembedsthemediafileasanActiveXcontrol,notaNetscape-styleplug-in.Theembedtag,nestedinsidetheobjecttag,isdesignedtoembedtheFlashfileinNetscapeandotherbrowsersthatsupportNetscape-styleplug-ins.

Example17-6isderivedfromatechnicalnoteathttp://www.macromedia.com/support/flash/technotes.html.

Page 673: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Example17-6.AJSPcontainsanembeddedfile

<%@tagliburi="http://java.sun.com/jstl/core"prefix="c"%>

<jsp:useBeanid="date"class="java.util.Date"/>

<html>

<head><title>FlashinaJSP</title></head>

<body>

<h2>EnjoytheFlashMovie</h2>

<OBJECTCLASSID=

"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"CODEBASE=

"http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#

version=6,040,0"width="293"height="423"

>

<PARAMname="movie"VALUE="coolFlashMov.swf">

<PARAMname="quality"VALUE="high">

<PARAMname="bgcolor"VALUE="#FFFFFF">

<EMBEDSRC=

"coolFlashMov.swf"quality="high"width="293"height="423"

bgcolor="#FFFFFF"type="application/x-shockwave-flash"PLUGINSPAGE=

"http://www.macromedia.com/go/getflashplayer"

>

</EMBED>

</OBJECT>

<br/><c:outvalue="${date}"/>

</body>

Page 674: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

</html>

BoththeembedandobjecttagsaredesignedtoprompttheendusertodownloadtherequiredversionoftheFlashplug-inorActiveXcontroliftheydonotalreadyhaveitinstalled.

SeeAlso

Macromediatechnicalnotespage:http://www.macromedia.com/support/flash/technotes.html;anarticleaboutalternativetechniquestousingtheembedtag:http://www.macromedia.com/devnet/mx/dreamweaver/articles/flash_satay.html

Page 675: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe17.5EmbeddingFlashinaServlet

Problem

YouwanttoembedaFlashfileinaservlet'soutput.

Solution

Usethejavax.servlet.RequestDispatcher.include(request,response)

methodinthedoGet()methodoftheservletthatincludesthenecessaryHTMLtemplatetext.

Discussion

TheservletcanincludetheHTMLfragmentthatloadstheFlashmovieintothepagebyusingaRequestDispatcher.Thisprocessissimilartoserver-sideincludesintraditionalCommonGatewayInterface(CGI)programs.Whentheservletreceivesarequest,itincludesthetextfragmentcontainingtheFlash-relatedtagsinitsHTMLoutput.ThisdesignseparatestheservletitselffromthetagsandparametersthatloadtheFlashmovie,sothateachoftheseentitiesevolvesindependently.Forexample,youcanchangethefilenameoftheFlashmovieorsomeoftheobjectorembedparameterswithoutrecompilingtheservletcode.

Example17-7isaservletthatusesaRequestDispatchertoincludethetextshowninExample17-8.Thetextappearsinaflash.txtfilethatisstoredatthetoplevelofthewebapplication.

RequestDispatcherstypicallyincludetheoutputofservletsandJSPs,notjust

Page 676: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

textfragments.SeeChapter6formoredetailedRequestDispatcher-relatedrecipes.

Example17-7.AservletusesaRequestDispatchertoincludeobjectandembedtags

packagecom.jspservletcookbook;

importjavax.servlet.*;

importjavax.servlet.http.*;

publicclassFlashServletextendsHttpServlet{

publicvoiddoGet(HttpServletRequestrequest,

HttpServletResponseresponse)throwsServletException,

java.io.IOException{

response.setContentType("text/html");

java.io.PrintWriterout=response.getWriter();

out.println(

"<html><head><title>EmbeddedFlashcontent</title></head><body>");

RequestDispatcherdispatcher=request.getRequestDispatcher(

"/flash.txt");

dispatcher.include(request,response);

out.println("</body></html>");

}//doGet

publicvoiddoPost(HttpServletRequestrequest,

HttpServletResponseresponse)throwsServletException,

java.io.IOException{

Page 677: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

doGet(request,response);

}//doPost

}

Example17-8showsthetextfragmentincludedbytheservletinExample17-7.

Example17-8.Anincludedtextfragment(flash.txt)thataservletusestoembedFlash

<OBJECTclassid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"codebase=

"http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#

version=6,0,0,0"WIDTH="550"HEIGHT="400"id="example"ALIGN=""

>

<PARAMNAME=movieVALUE="/home/example.swf">

<PARAMNAME=qualityVALUE=high>

<PARAMNAME=bgcolorVALUE=#FFFFFF>

<EMBEDsrc="/home/example.swf"quality=highbgcolor=#FFFFFFWIDTH=

"550"HEIGHT="400"NAME="example"ALIGN=""TYPE=

"application/x-shockwave-flash"PLUGINSPAGE=

"http://www.macromedia.com/go/getflashplayer">

</EMBED>

</OBJECT>

TheresultinawebbrowserlooksexactlylikeFigure17-3.

SeeAlso

Chapter6ondynamicallyincludingcontentintoservlets;Macromedia

Page 678: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

technicalnotespage:http://www.macromedia.com/support/flash/technotes.html;anarticleaboutalternativetechniquestousingtheembedtag:http://www.macromedia.com/devnet/mx/dreamweaver/articles/flash_satay.html

Page 679: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe17.6EmbeddingaQuickTimeMovieinaJSP

Problem

YouwanttoembedaQuickTimemovieinyourJSP.

Solution

Usetheembedtagnestedinsidetheobjecttag.TheobjecttaghastocontaintheCLASSIDattributewiththepropervalue.

Discussion

SimilartousingtheJavaPlug-in,aJSPusestheembedtaginsideofanHTMLobjecttagtoproperlyloadoneofAppleComputer'sQuickTimemovies.YoumustincludetheCLASSIDattributevalueexactlyasExample17-9specifies.YoualsomustincludethesameCODEBASEattributevalue.IftheuserhasanInternetExplorerWindowsbrowser,buthasnotyetinstalledtheQuickTimeActiveXcontrol,theCODEBASEattributevaluespecifieswheretheusercandownloadit.

Example17-9.EmbeddingaQuickTimemovieinaJSP

<%@tagliburi="http://java.sun.com/jstl/core"prefix="c"%>

<jsp:useBeanid="date"class="java.util.Date"/>

<html>

Page 680: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<head><title>QuickTimeinaJSP</title></head>

<body>

<h2>LadiesandGentlemen,TheWho</h2>

<OBJECTCLASSID=

"clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B"WIDTH="320"

HEIGHT="256"CODEBASE="http://www.apple.com/qtactivex/qtplugin.cab">

<PARAMname="SRC"VALUE="http://www.parkerriver.com/films/who_bene2.mov">

<PARAMname="AUTOPLAY"VALUE="true">

<PARAMname="CONTROLLER"VALUE="true">

<EMBEDSRC=

"http://www.parkerriver.com/films/who_bene2.mov"

WIDTH="240"HEIGHT="196"

AUTOPLAY="true"CONTROLLER=

"true"PLUGINSPAGE="http://www.apple.com/quicktime/download/">

</EMBED>

</OBJECT>

<br/><c:outvalue="${date}"/>

</body>

</html>

IfthebrowserusesNetscape-styleplug-ins,thentheembedtagwillinitiatetheloadingoftheQuickTimemovie.TheJSPinExample17-6properlyloadedthemovieintotheSafariwebbrowseronmyMacintoshlaptop,forinstance.Oneoftheadvantagesoftheembedtagisthatyoucanuseanumberofproprietaryattributesthattheembeddedobject,suchasQuickTime,understands.Example17-9specifiesthatthemovieshouldstartplayingassoonasthebrowserhasloadedenoughdata(AUTOPLAY="true")aswellasthatthebrowsershouldshowthemovie

Page 681: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

controls,whichletstheuserstoporstartthemovie(CONTROLLER="true").

Figure17-4showstheQuickTimemovieembeddedintheJSPofExample17-9.

Figure17-4.AQuickTimemovieembeddedinaJSP

SeeAlso

AppleComputer'sguideonembeddingQuickTimeinWebpages:http://www.apple.com/quicktime/authoring/embed.html;Recipe17.3-Recipe17.5onembeddingaFlashfile;Recipe17.7onembeddinganSVGfileinaJSP;Recipe17.8onembeddingabackgroundsoundtrack.

Page 682: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe17.7EmbeddinganSVGFileinaJSP

Problem

YouwanttodisplayaScalableVectorGraphics(SVG)imageinsideaJSP.

Solution

UsetheembedHTMLelementtopositiontheSVGintheJSP.

Discussion

DeveloperstypicallyusetheembedtagtoplaceanSVGfileinanHTMLfileorJSP.SVGisanXML-basedgraphicstechnologythatprovidesdevelopersanddesignersleverageinproducinganddisplayinginteractivegraphics.

BrowsersusespecialSVGviewerapplicationstohandletheembeddedSVGfiles.AdobeSystem'sSVGViewerapplicationcanbedownloadedfromhttp://www.adobe.com/svg/viewer/install/.Corel'sSVGViewercanbedownloadedfromhttp://www.corel.com/svgviewer/.

Example17-10embedsanSVGfilenamedtestLogo.svgandpointstheusertotheAdobeSVGViewerdownloadsiteiftheyhavenotinstalledanSVGViewerapplication.

Page 683: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

SVGfileshaveextensionsofeither.svgor(incompressedform).svgz,eventhoughtheyareXMLfiles.

Example17-10.AnSVGgraphicsfileembeddedinaJSP

<%@tagliburi="http://java.sun.com/jstl/core"prefix="c"%>

<jsp:useBeanid="date"class="java.util.Date"/>

<html>

<head><title>SVGinaJSP</title></head>

<body>

<h2>AScalableVectorGraphicsexample</h2>

<embedsrc=

'<c:outvalue="${param.svg_source}"/>.svg'width=

"200"height="200"type="image/svg-xml"pluginspage=

"http://www.adobe.com/svg/viewer/install/"

>

<br/><c:outvalue="${date}"/>

</body>

</html>

Example17-10showshowtoplaceanSVGwithinotherJSPcodeelements,suchasthetaglibdirectiveandthejsp:useBeanstandardaction.Example17-10alsodynamicallyloadsanSVGbasedontherequestparameternamedsvg_source.ThecodeusestheJSTLc:outtagandtheEL'sparamimplicitobjecttooutputtheparametervalue(seeChapter23ontheJSTL).

Figure17-5showstheresultofrequestingtheJSPinExample17-10,includingthenameoftheSVGfileasarequestparameter.Therequest

Page 684: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

URLlookslike:

http://localhost:8080/home/svg.jsp?svg_source=testLogo

Figure17-5.AJSPpageshowsanSVGgraphicsfile

TheSVGshowninFigure17-5isderivedfromAdobeSystemsInc.,whichcreatestheAdobeSVGViewerandanSVG-enabledgraphicsapplication,AdobeIllustrator.

SeeAlso

SVGspecificationsattheW3Consortium:http://www.w3.org/Graphics/SVG/Overview.htm8;Adobe'sSVGViewerinstallpage:http://www.adobe.com/svg/viewer/install/;Recipes17-3-5onembeddingaFlashfileinservletsandJSPs;Recipe17.6onembeddingaQuickTimemovieinaJSP.

Page 685: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe17.8EmbeddingaBackgroundSoundtrackinaJSP

Problem

YouwanttoembedanaudiofileinyourJSP.

Solution

UsetheembedtagintheJSP.Usethehiddenattributeifyouwanttohidetheaudiocontrols;otherwise,specifyawidthandheightattributeforshowingtheaudiocontrols.

Discussion

TheembedtagisusedtoincludeanaudiofilewithaJSP,sothatwhenauserrequeststheJSP,thebrowserplaysmusic.Specifically,thebrowserisdesignedtodetecttheMIMEtypeoftheembeddedfile,thenactivateahelperapplicationsuchasQuickTimeorRealAudiotohandletheembeddedfileandplaythemusic.

Example17-11showsaJSPthatembedsanMPEG,audiolayer3(MP3)file.TheJSPdisplayssomeinformationabouttheartistbasedonarequestparameter;thisrandominformationisincludedtoshowhowtocombineJSPcodewiththeembedtag.Theembedtagincludeswidthandheightattributestoshowtheaudiocontrolsinthewebpage.Thecontrolsallowtheusertoturnthevolumeoffordowniftheydonotwanttobeserenadedwhilesurfing.

Example17-11.AJSPwithanembeddedaudiofile

Page 686: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<%@tagliburi="http://java.sun.com/jstl/core"prefix="c"%>

<c:setvar="artist"value="${param.artist}"/>

<html>

<head><title>ChooseYourTunes</title></head>

<body>

<h2>Youchosemusicfromtheartist<c:outvalue="${artist}"/></h2>

<embedsrc="ConstantCraving.mp3"width="240"height="160">

</embed>

</body>

</html>

Figure17-6showstheoutputfromtheJSPinExample17-11.

Figure17-6.EmbeddedsongfilecontrolsinaJSP

SeeAlso

Recipe17.1andRecipe17.2onembeddingaJavaappletinaJSP;

Page 687: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe17.3-Recipe17.5onembeddingaFlashfileinaJSP;Recipe17.6onembeddingaQuickTimemovie;Recipe17.7onembeddinganSVGfile.

Page 688: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Chapter18.WorkingWiththeClientRequest

Introduction

Recipe18.1.ExaminingHTTPRequestHeadersinaServlet

Recipe18.2.ExaminingHTTPRequestHeadersinaJSP

Recipe18.3.UsingaFiltertoAlterRequestHeaders

Recipe18.4.AutomaticallyRefreshingaServlet

Recipe18.5.AutomaticallyRefreshingaJSP

Recipe18.6.CountingtheNumberofWebApplicationRequests

Page 689: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Introduction

Anumberofwebapplicationsmustexaminetheclientrequestbeforesendingaresponse.Anexampleisaservletthathastoread(orsniff)thebrowsertype(oftenthroughtheUser-Agentheader).ServletsorotherwebcomponentsreadinformationabouttherequestbyexaminingHTTPrequestheaders.Theseheadersarecomposedofheadernamesfollowedbycoloncharactersandtheirvalues,suchasAccept-Language:en.Theheadersprecedeanymessagebodythattheclientissendingtotheserver,suchastextthathasbeenpostedfromanHTMLform.

HereisanexampleofagroupofrequestheaderssentwitharequestforaJSPnamedcontextBind.jsp:

GET/home/contextBind.jspHTTP/1.1

User-Agent:Opera/5.02(WindowsNT4.0;U)[en]

Host:localhost:9000

Accept:text/html,image/png,image/jpeg,image/gif,image/x-xbitmap,*/*

Accept-Language:en

Accept-Encoding:deflate,gzip,x-gzip,identity,*;q=0

Cookie:mycookie=1051567248639;JSESSIONID=1D51575F3F0B17D26537338B5A29DB1D

Connection:Keep-Alive

TherecipesinthischaptershowhowtoexaminerequestheaderswithservletandJSPs,usefilterstoalterrequests,automaticallyrefreshservletsandJSPs,andcountthenumberofapplicationrequests.

Page 690: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe18.1ExaminingHTTPRequestHeadersinaServlet

Problem

YouwanttoexaminetheHTTPrequestheadersinaservlet.

Solution

Usethejavax.servlet.http.HttpServletRequest.getHeaderNames(

)andgetHeader()methodstoaccessthenamesandvaluesofvariousrequestheaders.

Discussion

TheHttpServletRequest.getHeaderNames()methodreturnsalloftherequestheadernamesforanincomingrequest.YoucanthenobtainthevalueofaspecificheaderbyprovidingtheheadernametothemethodHttpServletRequest.getHeader()method.Example18-1getsanEnumerationofheadernamesintheservlet'sdoGet()method,andthendisplayseachheaderandvalueonitsownlineintheresultingHTMLpage.

Example18-1.Aservletdisplaysrequestheadersandvalues

packagecom.jspservletcookbook;

Page 691: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

importjava.util.Enumeration;

importjavax.servlet.*;

importjavax.servlet.http.*;

publicclassRequestHeaderViewextendsHttpServlet{

publicvoiddoGet(HttpServletRequestrequest,

HttpServletResponseresponse)throwsServletException,

java.io.IOException{

//getanEnumerationofalltherequestheadernames

Enumerationenum=request.getHeaderNames();

response.setContentType("text/html");

java.io.PrintWriterout=response.getWriter();

out.println(

"<html><head><title>RequestHeaderView</title></head><body>");

out.println("<h2>RequestHeaders</h2>");

Stringheader=null;

//displayeachrequestheadernameandvalue

while(enum.hasMoreElements()){

header=(String)enum.nextElement();

//getHeaderreturnsnullifarequestheaderofthatnamedoesnot

//existintherequest

out.println("<strong>"+header+"</strong>"+":"+

request.getHeader(header)+"<br>");

}

out.println("</body></html>");

}//doGet

}

Figure18-1showstheRequestHeaderViewservlet'soutput.

Page 692: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Figure18-1.Aservletshowstherequestheadernamesandvalues

SeeAlso

Recipe18.2onexaminingrequestheadersinaJSP;Recipe18.3onusingafiltertowraptherequestandforwarditalongthefilterchain;Recipe18.6onusingalistenertotrackrequests;Chapter7onhandlingrequestparametersandJavaBeanpropertieswithservlets,JSPs,andfilters.

Page 693: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe18.2ExaminingHTTPRequestHeadersinaJSP

Problem

YouwanttouseaJSPtodisplaytherequestheadersandvalues.

Solution

Usethec:forEachandc:outJSTLtagstoviewtheheadernamesandvalues.

Discussion

TheJSTLv1.0makesallexistingrequestheadersavailableviatheheaderimplicitobject.TheJSTLautomaticallymakesthisvariableavailabletoJSPs;theheaderobjectevaluatestoajava.util.Maptype.

InExample18-2,thec:forEachtagiteratesoverthisMapandstoreseachheadernameandvalueintheloopvariablenamedbyc:forEach'svarattribute(inExample18-2it'scalledreq).Thec:forEachvarattributeisimplementedasajava.util.Map.Entrytype,whichisadatatypethatstoreskeysandtheirvalues.Thec:outtagdisplayseachheadernamebyusingELformat:${req.key}.Consequentlyc:outdisplaysthevaluewith${req.value}.

Example18-2.Viewingtherequestheadernamesand

Page 694: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

valuesinaJSP

<%@tagliburi="http://java.sun.com/jstl/core"prefix="c"%>

<html>

<head><title>RequestHeaders</title></head>

<body>

<h2>HerearetheRequestHeadernamesandvalues</h2>

<c:forEachvar="req"items="${header}">

<strong><c:outvalue=

"${req.key}"/></strong>:<c:outvalue="${req.value}"/><br>

</c:forEach>

</body>

</html>

Figure18-2showstheresultinabrowserofrequestingthedisplayHeaders.jsppage.

Figure18-2.AJSPpageshowsrequestheadersusingJSTLtags

Page 695: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

SeeAlso

Chapter23onusingtheJSTL;Recipe18.2onexaminingrequestheadersinaservlet;Recipe18.3onusingafiltertowraptherequestandforwarditalongthefilterchain;Recipe18.6onusingalistenertotrackrequests;Chapter7onhandlingrequestparametersandJavaBeanpropertieswithservlets,JSPs,andfilters.

Page 696: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe18.3UsingaFiltertoAlterRequestHeaders

Problem

YouwanttouseafiltertochangetherequestheadersbeforeaservletorJSPreceivestherequest.

Solution

Wraptherequestinyourowncustomrequestclass.PasstherequestwrapperordecoratorclasstotheFilterChain.doFilter()method,insteadoftheoriginalrequestdestination.

Discussion

Thejavax.servlet.http.HttpServletRequestWrapperisaconvenienceclassthatyoucanextendtoprovideadditionalfunctionalityforanHTTPrequest.Hereishowtoalterandforwardarequestusingafilter:

1. CreateaclassthatextendsHttpServletRequestWrapper.

Placethisclassinthewebapplication'sWEB-INF/classes(includingpackage-relateddirectories)directoryorWEB-INF/libiftheclassispartofaJARfile.

Createaclassthatimplementsjavax.servlet.Filter,suchasExample18-3.ThisclassusesyourcustomrequestwrapperclasstoenclosetheServletRequestparameteroftheFilter.doFilter()

Page 697: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

method.

StorethefilterclassinWEB-INF/classesorWEB-INF/lib(ifit'sinaJAR).

Registerthefilterinweb.xml.Inthisrecipe,thefilterismappedtoalloftherequestsinthewebapplicationwiththeURLmapping/*.

Example18-3showsthefilterclassthatpassestherequest-wrapperclassalongthefilterchain.ThefileisnamedRequestFilter;thewrapperclassisnamedReqWrapper.

Example18-3.AfilterthatwrapstheHttpServletRequest

packagecom.jspservletcookbook;

importjavax.servlet.*;

importjavax.servlet.http.*;

publicclassRequestFilterimplementsFilter{

privateFilterConfigconfig;

/**CreatesnewRequestFilter*/

publicRequestFilter(){}

publicvoidinit(FilterConfigfilterConfig)throwsServletException{

this.config=filterConfig;

}

publicvoiddoFilter(ServletRequestrequest,

ServletResponseresponse,FilterChainchain)throwsjava.io.IOException,

ServletException{

Page 698: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

ReqWrapperwrapper=null;

ServletContextcontext=null;

//createtherequestwrapperobject,aninstanceofthe

//ReqWrapperclass.Theclientrequestispassedinto

//ReqWrapper'sconstructor

if(requestinstanceofHttpServletRequest)

wrapper=newReqWrapper((HttpServletRequest)request);

//usetheServletContext.logmethodtologparamnames/values

if(wrapper!=null){

context=config.getServletContext();

context.log("Query:"+wrapper.getQueryString());}

//continuetherequest,responsetonextfilterorservlet

//destination

if(wrapper!=null)

chain.doFilter(wrapper,response);

else

chain.doFilter(request,response);

}//doFilter

publicvoiddestroy(){

/*calledbeforetheFilterinstanceisremoved

fromservicebythewebcontainer*/

}//destroy

}

Example18-3usestheservletcontexttologtheReqWrapper'squerystring.TheReqWrapperclassaddsaparametertothequerystring,but

Page 699: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

youcouldmakethisclassimplementwhateverbehavioryouneedinyourownapplication.Example18-4showsthefilter-mappingentriesinthedeploymentdescriptor(web.xml),whichensuresthateveryapplicationrequestpassesthroughthisfilter.

Example18-4.Thefiltermappinginweb.xml

<filter>

<filter-name>RequestFilter</filter-name>

<filter-class>com.jspservletcookbook.RequestFilter</filter-class>

</filter>

<filter-mapping>

<filter-name>RequestFilter</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

TheReqWrapperisasimpleexampleofanHttpServletRequestWrappersubclassthatencapsulatestheoriginalrequest.ThisclassoverridesthegetQueryString()methodinordertoaddaparametertotherequest'squerystring.

Toaccessthenewfilterparameter,youmustcallgetQueryString()ontherequestonceitreachesitsdestinationservlet,thenparsethegetQueryString()returnvalueforindividualparameters.UsingtheELwillnotworkwithrequestwrappersthatoverridegetQueryString():

//doesnotreturnthenewparametervalue

//addedbytheoverriddengetQueryString

//method

${param.filter}

Therequestthatpassesthroughthefilteristheparameterto

Page 700: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

ReqWrapper'sconstructor,sothefilter(inExample18-3)wrapstherequestwiththiscode:

wrapper=newReqWrapper((HttpServletRequest)request);

AURLsenttotheapplicationcontainingthequerystringname=Brucedisplaysthefollowingtextintheserverlog(asaresultoftheServletContext.logmethod):

Query:name=Bruce&filter=com.jspservletcookbook.ReqWrapper.

Example18-5isthecodefortheReqWrapperobject.

Example18-5.TheReqWrapperclassforencapsulatingtheHttpServletRequest

packagecom.jspservletcookbook;

importjavax.servlet.*;

importjavax.servlet.http.HttpServletRequestWrapper;

importjavax.servlet.http.HttpServletRequest;

publicclassReqWrapperextendsHttpServletRequestWrapper{

privatestaticfinalStringAMP="&";

publicReqWrapper(HttpServletRequestrequest){

super(request);

}

publicStringgetQueryString(){

Stringquery=null;

//getthequerystringfromthewrappedrequestobject

Page 701: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

query=((HttpServletRequest)getRequest()).getQueryString();

//adda'filter'parametertothisquerystringwiththeclass

//nameasthevalue

if(query!=null)

returnquery+AMP+"filter="+getClass().getName();

else

return"filter="+getClass().getName();

}//getQueryString

}

Themethodcallchain.doFilter(wrapper,response)attheendofExample18-3passestherequest(wrappedinourowncustomclass)andresponsetothenextfilter,ortothedestinationservletorJSPifnootherfiltersareregistered.

SeeAlso

Recipe18.1andRecipe18.2onexaminingrequestheadersinaservletandaJSPrespectively;Recipe18.3onusingafiltertowraptherequestandforwarditalongthefilterchain;Recipe18.6onusingalistenertotrackrequests;Chapter7onhandlingrequestparametersandJavaBeanpropertieswithservlets,JSPs,andfilters.

Page 702: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe18.4AutomaticallyRefreshingaServlet

Problem

Youwanttoautomaticallyrefreshaservlet-generatedpageataspecifiedinterval.

Solution

AddaRefreshresponseheader,usingthejavax.servlet.http.HttpServletResponseobject.

Discussion

SupposethatyourservletismonitoringaRedSoxversusYankeesbaseballgame.Youwanttobeabletoallowausertofollowthegamealmostpitchbypitch,andhaveyourwebapplicationconstantlyupdatethestatusofthegame.IfyouaddaRefreshresponseheadertoyourclientresponse,thebrowserwillcontinuallyrefreshthepageaccordingtothespecifiedinterval.

Example18-6addsaresponseheaderthatthewebcontainerwillsendtotheclientintheformatRefresh:60,whichmeans"requestthispageagainin60seconds."

Example18-6.Refreshingaservletevery60seconds

packagecom.jspservletcookbook;

Page 703: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

importjavax.servlet.*;

importjavax.servlet.http.*;

publicclassAutoServletextendsHttpServlet{

publicvoiddoGet(HttpServletRequestrequest,

HttpServletResponseresponse)throwsServletException,

java.io.IOException{

//clientbrowserwillrequestthepageevery60seconds

response.addHeader("Refresh","60");

response.setContentType("text/html");

java.io.PrintWriterout=response.getWriter();

out.println(

"<html><head><title>ClientRefresh</title></head><body>");

out.println("<h2>WelcometotheRedSox-Yankeesseries...</h2>");

//MoreHTMLordynamiccontent

out.println("</body></html>");

}//doGet

}

Therearesomecaveatstothisapproachiftheenduserwalksawayfromherdesk,herbrowserwillblithelycontinuetorequestthepage.Ifyourservletdoesn'timposesomecontroloverthis,youcouldaddalotofunnecessaryloadtoyourapplication.Oneexampleofasolutiontothisproblemistokeeptrackofhowmanytimestheservlethasbeenrefreshedwithasessionattribute(detailedinChapter16).Ifthenumberoftimesexceedsacertainlimit,youcouldstopaddingtheheadertotheresponse.Example18-7showspartofadoPost()methodbodyforkeepingtrackofauser'srefreshcount.

Example18-7.Trackingauser'srefreshcount

Page 704: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

//insidedoPost(ordoGet)method

HttpSessionsession=request.getSession();

Longtimes=(Long)session.getAttribute("times");

//createsessionattributeifitdoesn'texist

if(times==null)

session.setAttribute("times",newLong(0));

//localvariable'temp'willholdthesessionattributevalue

longtemp=1;

//incrementtheattributevaluetoaccountforthisrequest

if(times!=null)

temp=times.longValue()+1;

if(temp<60)//onlyallow60refreshes;aboutanhour'sworth

response.addHeader("Refresh","60");

//updatethesessionattributevalue

session.setAttribute("times",newLong(temp));

ThiscodeworksequallywellinsideofadoGet()method.

SeeAlso

Recipe18.5onautomaticallyrefreshingaJSP;Recipe18.1andRecipe18.2onexaminingrequestheadersinaservletandaJSP;Recipe18.3onusingafiltertowraptherequestandforwarditalongthefilterchain;Recipe18.6onusingalistenertotrackrequests.

Page 705: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe18.5AutomaticallyRefreshingaJSP

Problem

YouwanttorefreshaJSPrequestataspecifiedinterval.

Solution

UseaJSPscriptletthataddsaRefreshresponseheadertotheresponse.

Discussion

ThefollowingscriptletcodeaddsaRefreshheaderthatspecifiesa60-secondintervalforrefreshingtheJSP.PlacethiscodeatthetopoftheJSPbeforeanycontentappears:

<%response.addHeader("Refresh","60");%>

IfyouwanttorefreshtheJSPtoanotherwebcomponentorpage,usethissyntax:

<%response.addHeader("Refresh","10;

http://localhost:8080/home/thanks.jsp");%>

SeeAlso

Example18-6inRecipe18.4onrefreshingaservlet;Example18-7inRecipe18.4onlimitingthenumberofautomaticrefreshesofaservlet;Recipe18.1andRecipe18.2onexaminingrequestheadersinaservlet

Page 706: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

andaJSP,respectively;Recipe18.3onusingafiltertowraptherequestandforwarditalongthefilterchain;Recipe18.6onusingalistenertotrackrequests.

Page 707: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe18.6CountingtheNumberofWebApplicationRequests

Problem

Youwanttocountthenumberofrequestshandledbyawebapplication.

Solution

Useajavax.servlet.ServletRequestListenertobenotifiedwheneveranHTTPrequestisinitialized.

Discussion

Arequestlistenerisagoodcandidatefortrackingrequests,becausethewebcontainernotifiesthelistenerofnewrequestsbycallingitsrequestInitialized()method.Example18-8keepstrackoftherequestcountwithastaticclassvariablenamedreqCount.TheprogramincrementsthisvariableinasynchronizedblockwithintherequestInitialized()method.

TheServletContextisusedtologamessageabouttherequestsothatyoucanobservethelistenerbehavior.However,abusyproductionapplicationthatlogsinformationabouteveryrequesttypicallyrepresentsaninefficientuseofwebcontainerresources.Thistypeofloggingactivityshouldbereservedfordevelopmentapplications.

Example18-8.Arequestlistenerclassforcountingapplicationrequests

Page 708: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

packagecom.jspservletcookbook;

importjavax.servlet.*;

importjavax.servlet.http.*;

publicclassReqListenerimplementsServletRequestListener{

privatestaticlongreqCount;

publicvoidrequestInitialized(ServletRequestEventsre){

//usedforloggingpurposes

ServletContextcontext=sre.getServletContext();

//Usedtogetinformationaboutanewrequest

ServletRequestrequest=sre.getServletRequest();

//ThestaticclassvariablereqCountisincrementedinthisblock;

//theincrementingofthevariableissynchronizedsothatone

//threadisnotreadingthevariablewhileanotherincrementsit

synchronized(context){

context.log(

"Requestfor"+

(requestinstanceofHttpServletRequest?

((HttpServletRequest)request).getRequestURI():

"Unknown")+";Count="+++reqCount);

}//synchronized

}

publicvoidrequestDestroyed(ServletRequestEventsre){

//Calledwhentheservletrequestisgoingooutofscope.

Page 709: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

}//requestDestroyed

}

YoucanaccessthenewServletRequestinthetwoServletRequestListenermethodsbycallingServletRequestEvent.getServletRequest().YoumustcasttheServletRequestreturnvaluetoanHttpServletRequesttocallthelatterclass'smethods.Example18-8accessesthenewHttpServletRequestsinordertocallthoseobject'sgetRequestURI()method,whichprovidespartoftheinformationthecodeincludesinaloggingmessage.

YoumustregistertheServletRequestListenerinweb.xml:

<listener>

<listener-class>com.jspservletcookbook.ReqListener</listener-class>

</listener>

Thewebcontainerthencreatesaninstanceofthelistenerwhenitstartsup.Hereisanexampleofaserver-logentrywhenarequestismadetotheapplicationwithinwhichtherequestlistenerisregistered:

2003-05-3007:22:21Requestfor/home/servlet/com.jspservletcookbook.SessionDisplay;

Count=2

ForTomcat,thislinewouldbedisplayedinthelogfilefoundin<Tomcat-installation-directory>/logs.

SeeAlso

Page 710: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe18.1andRecipe18.2onexaminingrequestheadersinaservletandaJSP;Recipe18.3onusingafiltertowraptherequestandforwarditalongthefilterchain;Chapter7onhandlingrequestparametersandJavaBeanpropertieswithservlets,JSPs,andfilters.

Page 711: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Chapter19.FilteringRequestsandResponses

Introduction

Recipe19.1.MappingaFiltertoaServlet

Recipe19.2.MappingaFiltertoaJSP

Recipe19.3.MappingMoreThanOneFiltertoaServlet

Recipe19.4.ChangingtheOrderinWhichFiltersareAppliedtoServlets

Recipe19.5.ConfiguringInitializationParametersforaFilter

Recipe19.6.OptionallyBlockingaRequestwithaFilter

Recipe19.7.FilteringtheHTTPResponse

Recipe19.8.UsingFilterswithRequestDispatcherObjects

Recipe19.9.CheckingFormParameterswithaFilter

Recipe19.10.BlockingIPAddresseswithaFilter

Page 712: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Introduction

ServletfilteringwasintroducedwiththeservletAPIv2.3in2001.Filteringisapowerfultechnologyforservletdevelopers,whocanuseittogeneratechainsofJavaclassesthatexecuteinsequenceinresponsetoclientrequests.

DevelopersbeginbycreatingoneormoreJavaclassesthatimplementthejavax.servlet.Filterinterface.Theseclassescanundertakeanumberofactionspriortoaservlet'srequesthandling,creatingachainofactionsbeforetherequestisdeliveredtoitsdestination(includingblockingtherequestaltogether).Theseactionsinclude,accordingtotheFilterAPIdocumentation:

Authenticationofrequests

Dataencryption

Datacompression

Logging

ExtensibleStylesheetLanguageTransformation(XSLT)filtering

Imageconversion

AccesstheJavadocfortheFilterinterfaceat:http://java.sun.com/j2ee/1.4/docs/api/javax/servlet/Filter.html.

Registerafilterinthedeploymentdescriptor,andthenmapthe

Page 713: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

registeredfiltertoeitherservletnamesorURLpatternsinyourapplication'sdeploymentdescriptor.Whenthewebcontainerstartsupyourwebapplication,itcreatesaninstanceofeachfilterthatyouhavedeclaredinthedeploymentdescriptor.Thefiltersexecuteintheorderthattheyaredeclaredinthedeploymentdescriptor.

Page 714: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe19.1MappingaFiltertoaServlet

Problem

Youwanttomaporapplyafiltertoanindividualservlet.

Solution

Usethefilterandfilter-mappingelementsinweb.xmltoassociatethefilterwiththeservlet.

Discussion

Thewebcontainerfindsoutaboutthefiltersthatyouwanttoapplytoaservletbyusinginformationinthedeploymentdescriptor.ThefilterelementassociatesafilternamewithaJavaclassthatimplementsthejavax.servlet.Filterinterface.Thefilter-mappingelementthenassociatesindividualfilterswithURLmappingsorpaths,similartotheservlet-mappingelementthatyouhaveprobablyusedbeforeinweb.xml.Example19-1showsadeploymentdescriptorfromtheservletAPIv2.3thatincludesthemappingofafilternamedLogFiltertotheservletpath/requestheaders.

Example19-1.Mappingafiltertoaservlet

<?xmlversion="1.0"encoding="ISO-8859-1"?>

<!DOCTYPEweb-app

PUBLIC"-//SunMicrosystems,Inc.//DTDWebApplication2.3//EN"

"http://java.sun.com/dtd/web-application_2_3.dtd"

Page 715: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

>

<web-app>

<!--registerthefilter-->

<filter>

<filter-name>LogFilter</filter-name>

<filter-class>com.jspservletcookbook.LogFilter</filter-class>

</filter>

<filter-mapping>

<filter-name>LogFilter</filter-name>

<url-pattern>/requestheaders</url-pattern>

</filter-mapping>

<!--registertheservlettowhichthefilterismapped-->

<servlet>

<servlet-name>requestheaders</servlet-name>

<servlet-class>com.jspservletcookbook.RequestHeaderView</servlet-class>

</servlet>

<!--HereistheURLmappingfortherequestheadersservlet-->

<servlet-mapping>

<servlet-name>requestheaders</servlet-name>

<url-pattern>/requestheaders</url-pattern>

</servlet-mapping>

</web-app>

Whenaclientsendsarequesttotheservletpath/requestheaders,thewebcontainerappliestheLogFilterfiltertotherequest.Thisservletpath,asin:

http://localhost:8080/home/requestheaders

Page 716: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

istheonlyservletpathtowhichthisfilterisapplied.Asyoumighthaveguessed,theLogFilterlogssomeinformationabouttherequestbeforetherequestcontinuesalongtoitsservletdestination.Example19-2showsthefilterclassfortheLogFilterinExample19-1.

Thisfilterclassprovidestheadditionalbenefitofshowingyouhowtologamessageinsideofafilter!

Makesureto:

Createthefilterwithaconstructorthatdoesnottakeanyparameters

Givethefilterclassapackagename

StorethefilterintheWEB-INF/classesdirectoryofthewebapplication,includingitspackage-relateddirectories

Mapthefiltertotheservletinweb.xml,asinExample19-1

Example19-2.Afilterthatlogssomeinformation

packagecom.jspservletcookbook;

importjavax.servlet.*;

importjavax.servlet.http.*;

importorg.apache.log4j.Logger;

importorg.apache.log4j.PropertyConfigurator;

publicclassLogFilterimplementsFilter{

Page 717: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

privateFilterConfigconfig;

privateLoggerlog;

//CreatesnewLogFilter

publicLogFilter(){}

publicvoidinit(FilterConfigfilterConfig)throwsServletException{

this.config=filterConfig;

//loadtheconfigurationforthisapplication'sloggersusingthe

//servletLog.propertiesfile

PropertyConfigurator.configure(config.getServletContext().

getRealPath("/")+

"WEB-INF/classes/servletLog.properties");

log=Logger.getLogger(LogFilter.class);

log.info("Loggerinstantiatedin"+getClass().getName());

}//init

publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,

FilterChainchain)throwsjava.io.IOException,ServletException{

HttpServletRequestreq=null;

if(log!=null&&(requestinstanceofHttpServletRequest)){

req=(HttpServletRequest)request;

log.info(

"Requestreceivedfrom:"+req.getRemoteHost()+"for:"+

req.getRequestURL());}

//passrequestbackdownthefilterchain

chain.doFilter(request,response);

}//doFilter

Page 718: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

publicvoiddestroy(){

/*calledbeforetheFilterinstanceisremoved

fromservicebythewebcontainer*/

log=null;

}

}

ThisfilterlogstheremotehostoftheclientrequestandtheURLthattheclientrequested.Hereisanexampleoftheloggedinformation:

INFO-Requestreceivedfrom:localhostfor:http://localhost:8080/home/requestheaders

Thefilterusesthelog4jlibrary(seeChapter14)fromtheApacheSoftwareFoundation.

Sincethefirstparametertothefilter'sdofilter()methodisajavax.servlet.ServletRequesttype,thisparametermustbecasttoanHttpServletRequesttocallmethodssuchasHttpServletRequest.getRemoteHost().

SeeAlso

Recipe7.9onusingafiltertoreadrequestparametervalues;Recipe11.11onusingafiltertomonitorsessionattributes;Recipe18.3onusingafiltertoaltertherequest;Recipe19.2-Recipe19.4onmappingfilterstowebcomponents;Recipe19.5onconfiguringfilterinitializationparameters;Recipe19.6onblockingrequests;Recipe19.7onfilteringtheHttpServletResponse;Recipe19.8onusingfilterswithRequestDispatchers;Recipe19.9onusingfilterstocheckrequestparameters;Recipe19.10onusingfilterstodisallowrequestsfromcertainIPaddresses.

Page 719: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe19.2MappingaFiltertoaJSP

Problem

YouwanttohavethewebcontainerapplyafiltertorequestsforacertainJSPpage.

Solution

Usetheurl-patternchildelementofthefilter-mappingelementinthedeploymentdescriptortomapthefiltertotheJSP.

Discussion

MapafiltertoaJSPbyspecifyingthepathtotheJSPpageusingthefilter-mappingelement'surl-patternsubelement.Example19-3showsaweb.xmlconfigurationthatmapsthefilterinExample19-2totherequestHeaders.jsp.

Example19-3.MappingafiltertoaJSP

<!--topofweb.xmldeploymentdescriptor-->

<filter>

<filter-name>LogFilter</filter-name>

<filter-class>com.jspservletcookbook.LogFilter</filter-class>

</filter>

<filter-mapping>

Page 720: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<filter-name>LogFilter</filter-name>

<url-pattern>/displayHeaders.jsp</url-pattern>

</filter-mapping>

<!--restofdeploymentdescriptor-->

Youcancreateanumberoffiltermappingsforasinglefilter,eachwiththeirowntypeofURLpattern.

WiththeconfigurationofExample19-3,anyrequestsfor/displayHeaders.jspwillpassthroughthefilternamedLogFilter.Example19-2showsthesourcecodefortheLogFilterclass.Thecodelogsamessageabouttherequest,beforetherequestispassedalongthefilterchaintotheJSP.Theloggedmessagelookslike:

INFO-Requestreceivedfrom:localhostfor:http://localhost:8080/home/

displayHeaders.jsp

TheJSPitselfdoesnothavetobeconfiguredinaspecialwayforthefiltertobeappliedtoit.YoucanapplythefiltertoallJSPswiththisconfiguration:

<filter-mapping>

<filter-name>LogFilter</filter-name>

<url-pattern>*.jsp</url-pattern>

</filter-mapping>

TheURLpattern*.jspisanextensionmappingthatassociatestheLogFilterwithanyofthewebapplication'scomponentsthatendwith.jsp.

SeeAlso

Page 721: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe7.9onusingafiltertoreadrequestparametervalues;Recipe11.11onusingafiltertomonitorsessionattributes;Recipe18.3onusingafiltertoalterthenforwardtherequest;Recipe19.3onmappingmorethanonefiltertoaservlet;Recipe19.4onchangingtheorderfiltersareappliedtoaservlet;Recipe19.5onconfiguringfilterinitializationparameters;Recipe19.6onblockingrequests;Recipe19.7onfilteringtheHttpServletResponse;Recipe19.8onusingfilterswithRequestDispatchers;Recipe19.9onusingfilterstocheckrequestparameters;Recipe19.10onusingfilterstodisallowrequestsfromcertainIPaddresses.

Page 722: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe19.3MappingMoreThanOneFiltertoaServlet

Problem

YouwantrequestsforaservletorJSPtopassthroughmorethanonefilter.

Solution

MapeachfiltertotheservletorJSPusingfilter-mappingelementsinthedeploymentdescriptor.Thefiltersareappliedtotheservletintheordertheyappearinthedeploymentdescriptor.

Discussion

Yourwebapplicationmaydefineseveraldifferentfilterswithaspecificpurpose.Forinstance,onefiltermightlogmessages,whileanotherfilterauthenticatesusers.Itisstraightforwardtocreateafilterchainthatapplieseachfilterinaspecifiedordertoaservlet.Youusethefilter-mappingelementtomapeachfiltertothetargetservlet(orJSP).Thewebcontainerthenappliesthefilterstothetargetintheorderthatthefilter-mappingelementsaredefinedinthedeploymentdescriptor.

Example19-4configurestwofilters:AuthenFilterandLogFilter.Thefilter-mappingelementsforthesefiltersthenmaptheservletnamerequestheaderstoeachofthesefilters.Theorderofthefilter-mappingelementsinExample19-4specifiesthattheauthenticationfilter(AuthenFilter)mustbeappliedtotheservletnamedrequestheadersfirst,followedbytheLogFilter.

Page 723: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Tomapafiltertoaservletname,theservlethastoberegisteredinweb.xml.Example19-4registerstherequestheadersservletbeneaththefilterandfilter-mappingelements.

Example19-4.Mappingmorethanonefiltertoaservlet

<!--topofweb.xmldeploymentdescriptor-->

<filter>

<filter-name>AuthenFilter</filter-name>

<filter-class>com.jspservletcookbook.AuthenticateFilter</filter-class>

</filter>

<filter>

<filter-name>LogFilter</filter-name>

<filter-class>com.jspservletcookbook.LogFilter</filter-class>

</filter>

<filter-mapping>

<filter-name>AuthenFilter</filter-name>

<servlet-name>requestheaders</servlet-name>

</filter-mapping>

<filter-mapping>

<filter-name>LogFilter</filter-name>

<servlet-name>requestheaders</servlet-name>

</filter-mapping>

<!--servletdefinitions-->

<servlet>

<servlet-name>requestheaders</servlet-name>

<servlet-class>com.jspservletcookbook.RequestHeaderView</servlet-class>

</servlet>

<!--servlet-mappingsectionofweb.xml-->

Page 724: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<servlet-mapping>

<servlet-name>requestheaders</servlet-name>

<url-pattern>/requestheaders</url-pattern>

</servlet-mapping>

<!--restofdeploymentdescriptor-->

Whenauserrequeststherequestheadersservletusingtheservletpath/requestheaders,asspecifiedintheservlet-mappingelement,therequestpassesthroughtheAuthenFilterandLogFilterbeforeitreachesitsservletdestination.

Thesameprocessappliestoafilter-mappingthatusesaurl-patternelementinsteadofaservlet-nameelement.Theorderofthefilter-mappingelementsinthedeploymentdescriptordeterminestheorderofthefiltersappliedtothewebcomponentsthatmatchtheurl-pattern.

SeeAlso

Recipe7.9onusingafiltertoreadrequestparametervalues;Recipe11.11onusingafiltertomonitorsessionattributes;Recipe18.3onusingafiltertoalterthenforwardtherequest;Recipe19.4onchangingtheorderfiltersareappliedtoaservlet;Recipe19.5onconfiguringfilterinitparameters;Recipe19.6onblockingrequests;Recipe19.7onfilteringtheHttpServletResponse;Recipe19.8onusingfilterswithRequestDispatchers;Recipe19.9onusingfilterstocheckrequestparameters;Recipe19.10onusingfilterstodisallowrequestsfromcertainIPaddresses.

Page 725: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe19.4ChangingtheOrderinWhichFiltersareAppliedtoServlets

Problem

Youwanttochangetheorderinwhichfiltersareappliedtowebcomponents.

Solution

Changetheorderoffilter-mappingelementsinthedeploymentdescriptor.

Discussion

Theorderoffilter-mappingelementsinweb.xmldeterminestheorderinwhichthewebcontainerappliesthefiltertotheservlet.Example19-5reversestheorderofthefilter-mappingelementsthatmaptwofilterstotheservletnamedrequestheaders,comparedwithRecipe19.3.TheLogFilteristhusappliedtotheservletbeforetheAuthenFilter.Anyrequestsfortheservletpassthroughachain:LogFilter AuthenFilter requestheadersservlet.

Example19-5.Reversingtheorderoffilter-mappingelements

<!--LogFilterappliestotherequestheadersservlet

beforeAuthenFilter-->

Page 726: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<filter-mapping>

<filter-name>LogFilter</filter-name>

<servlet-name>requestheaders</servlet-name>

</filter-mapping>

<filter-mapping>

<filter-name>AuthenFilter</filter-name>

<servlet-name>requestheaders</servlet-name>

</filter-mapping>

SeeAlso

Recipe7.9onusingafiltertoreadrequestparametervalues;Recipe11.11onusingafiltertomonitorsessionattributes;Recipe18.3onusingafiltertoalterthenforwardtherequest;Recipe19.1-Recipe19.3onmappingfilterstowebcomponents;Recipe19.5onconfiguringfilterinitparameters;Recipe19.6onblockingrequests;Recipe19.7onfilteringtheHttpServletResponse;Recipe19.8onusingfilterswithRequestDispatchers;Recipe19.9onusingfilterstocheckrequestparameters;Recipe19.10onusingfilterstodisallowrequestsfromcertainIPaddresses.

Page 727: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe19.5ConfiguringInitializationParametersforaFilter

Problem

Youwanttomakeaninitialization(init)parameteravailabletoafilter.

Solution

Usetheinit-paramchildelementofthefilterelementtodeclaretheinitializationparameteranditsvalue.Insidethefilter,accesstheinitparameterbycallingtheFilerConfigobject'sgetInitParametermethod.

Discussion

Example19-6showsafilterdeclaredinthedeploymentdescriptor.Thefilterincludesaninitparameternamedlog-id.

Example19-6.Afilterdeclaredinthedeploymentdescriptorwithaninitparameter

<filter>

<filter-name>LogFilter</filter-name>

<filter-class>com.jspservletcookbook.LogFilter</filter-class>

<init-param>

<param-name>log-id</param-name>

<param-value>A102003</param-value>

</init-param>

Page 728: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

</filter>

Example19-7showsthecodeyouwoulduseinsidethefiltertoaccesstheinitparameteranditsvalue.ThecodeinitializestheFilterConfigobjectinitsinitmethod,whichiscalledoncewhenthewebcontainercreatesaninstanceofthefilter.Thecodethengetsthevalueofthefilter'sinitparameterbycalling:

Stringid=config.getInitParameter("log-id");

MakesurethatthecodecheckswhetherthereturnvaluefromgetInitParameterisnullbeforethecodedoessomethingwiththatobject.

Example19-7.Accessinganinitparamvalueinafilter

packagecom.jspservletcookbook;

importjavax.servlet.*;

importjavax.servlet.http.*;

importorg.apache.log4j.Logger;

importorg.apache.log4j.PropertyConfigurator;

publicclassLogFilterimplementsFilter{

privateFilterConfigconfig;

privateLoggerlog;

//CreatesnewLogFilter

publicLogFilter(){}

publicvoidinit(FilterConfigfilterConfig)throwsServletException{

this.config=filterConfig;

Page 729: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

//loadtheconfigurationforthisapplication'sloggers

//usingtheservletLog.propertiesfile

PropertyConfigurator.configure(config.getServletContext().

getRealPath("/")+

"WEB-INF/classes/servletLog.properties");

log=Logger.getLogger(LogFilter.class);

log.info("Loggerinstantiatedin"+getClass().getName());

}

publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,

FilterChainchain)throwsjava.io.IOException,ServletException{

HttpServletRequestreq=null;

Stringid=config.getInitParameter("log-id");

if(id==null)

id="unknown";

if(log!=null&&(requestinstanceofHttpServletRequest)){

req=(HttpServletRequest)request;

log.info("Logid:"+id+":Requestreceivedfrom:"+

req.getRemoteHost()+"for"+req.getRequestURL());}

chain.doFilter(request,response);

}//doFilter

publicvoiddestroy(){

/*calledbeforetheFilterinstanceisremoved

fromservicebythewebcontainer*/

log=null;

}

}

Page 730: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Hereishowthelogoutputappears:

INFO-Logid:A102003:Requestreceivedfrom:localhostforhttp://localhost:8080/

home/requestheaders

YoucanalsousetheFilterConfigobject'sgetInitParameterNamesmethodtogetalloftheinitparameternamesinajava.util.Enumerationobject.

SeeAlso

Recipe7.9onusingafiltertoreadrequestparametervalues;Recipe11.11onusingafiltertomonitorsessionattributes;Recipe18.3onusingafiltertoalterthenforwardtherequest;Recipe19.1-Recipe19.4onmappingfilterstowebcomponents;Recipe19.6onblockingarequest;Recipe19.7onfilteringtheHttpServletResponse;Recipe19.8onusingfilterswithRequestDispatchers;Recipe19.9onusingfilterstocheckrequestparameters;Recipe19.10onusingfilterstodisallowrequestsfromcertainIPaddresses.

Page 731: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe19.6OptionallyBlockingaRequestwithaFilter

Problem

Youwanttheoptiontoblockarequestwithafilter.

Solution

DonotcalltheFilterChainobject'sdoFilter()methodinsideofthefilter.Outputtheresponsetotheclientinsideofthefilter'sdoFilter()methodinstead.

Discussion

Afilterblocksarequestfromgettingtoawebcomponent,suchasaservlet,JSP,orHTMLpage,bynevercallingFilterChain.doFilter()insidethefilter'sowndoFilter()method.

TheBlockFilterclassinExample19-8attemptstoauthenticatetheuserbasedonarequestparameter.Iftheauthenticationfails,thefilterusestheresponseobjecttooutputaresponsetotheclient,andtherequestiseffectivelyblockedfromreachingtherequestedservlet.Afiltercanoutputthefinalresponsetotheclient,notjustinitiateitsfilteringtasks.

Example19-8.Afilteroptionallyblockstherequestandissuesaresponseitself

Page 732: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

packagecom.jspservletcookbook;

importjava.io.PrintWriter;

importjava.io.IOException;

importjavax.servlet.*;

importjavax.servlet.http.*;

publicclassBlockFilterimplementsFilter{

privateFilterConfigconfig;

/**CreatesnewBlockFilter*/

publicBlockFilter(){}

publicvoidinit(FilterConfigfilterConfig)throwsServletException{

this.config=filterConfig;

}

publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,

FilterChainchain)throwsIOException,ServletException{

HttpServletRequestreq=null;

booleanauthenticated=false;

PrintWriterout=null;

if(requestinstanceofHttpServletRequest){

req=(HttpServletRequest)request;

Stringuser=req.getParameter("user");//gettheusername

authenticated=authenticateUser(user);//authenticatetheuser

}

if(authenticated){

Page 733: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

//theyareauthenticated,sopassalongtherequest

chain.doFilter(request,response);

else{

//havethefiltersendbacktheresponse

response.setContentType("text/html");

out=response.getWriter();

out.println(

"<html><head><title>AuthenticationResponse</title>");

out.println("</head><body>");

out.println("<h2>Sorryyourauthenticationattemptfailed</h2>");

out.println("</body></html>");

}

}//doFilter

publicvoiddestroy(){

/*calledbeforetheFilterinstanceisremoved

fromservicebythewebcontainer*/

}

privatebooleanauthenticateUser(StringuserName){

//authenticatetheuserusingJNDIandadatabase,forinstance

//returnfalsefordemonstrationpurposes

returnfalse;

}//authenticateUser

}

Thecodeauthenticatestheuserbygettingthehypotheticalusernameas

Page 734: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

arequestparameter.Thenameistheparameterforthefilter'sauthenticateUser()method,whichreturnsfalsetodemonstratethefilter'sresponsetotheclient.ThefilterusesthePrintWriterfromthejavax.servlet.ServletResponseobject,whichisaparametertothedoFilter()method.ThePrintWritersendsHTMLbacktotheclient.Figure19-1showstheresponseoutputinawebbrowser.

Figure19-1.TheHTMLpagereturnedbyablockingfilter

Ifyouregularlyusefilterstosendresponsestoaclient,considercreatingaJavaBeantocustomizetheresponse.StorethebeanclassinitspackagebeneathWEB-INF/classes,andusethebeaninsidethefilter.

SeeAlso

Recipe7.9onusingafiltertoreadrequestparametervalues;Recipe11.11onusingafiltertomonitorsessionattributes;Recipe18.3onusingafiltertoalterthenforwardtherequest;Recipe19.1-Recipe19.4onmappingfilterstowebcomponents;Recipe19.5onconfiguringinitparametersforafilter;Recipe19.7onfilteringtheHTTPresponse;Recipe19.8onusingfilterswithRequestDispatchers;Recipe19.9on

Page 735: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

usingfilterstocheckrequestparameters;Recipe19.10onusingfilterstodisallowrequestsfromcertainIPaddresses.

Page 736: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe19.7FilteringtheHTTPResponse

Problem

Youwanttochangetheresponsewithafilterwhiletheclientrequestisenroutetotheservlet.

Solution

Changethejavax.servlet.ServletResponseinsidethefilter'sdoFilter()methodbywrappingtheresponsewithyourownobject.ThenpassthewrappedresponseasaparameterintotheFilterChain.doFilter()method.

Discussion

Herearethestepsforchangingaresponsewithafilterandawrapperclass:

1. CreateaJavaclassthatextendsjavax.servlet.http.HttpServletResponseWrapper.

Placethisclass,includingitspackage-relateddirectories,inWEB-INF/classes.

Usethewrapperclassinthefiltertowraptheresponseobject,whichisaparametertothefilter'sdoFilter()method.

Callthechain.doFilter()methodwiththewrappedresponseasaparameter.

Page 737: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Example19-9showstheJavaclassthatwewillusetowraptheresponseobject.

Ifyouarejustmakingasimpleresponsechange,youdonothavetogotothetroubleofusinganHttpServletResponseWrapperclass.Thiscodeinsideofafilter'smethodaddsaheadertotheresponse,thencallsthechain.doFilter()methodwiththealteredresponse:

if(responseinstanceofHttpServletResponse){

//casttoHttpServletResponsetocall

//addHeader

myHttpResponse=

((HttpServletResponse)response);

myHttpResponse.addHeader("WWW-Authenticate",

"BASICrealm=\"Admin\"");

chain.doFilter(request,response);}

TheResponseWrapperclasscontainstheskeletonofanewmethodnamedgetWebResource.Iwanttoshowthemechanicsofwrappingtheresponseinafilter,sohavekeptthiswrapperclassverysimple.

AlltheotherHttpServletResponse-derivedmethodcallsaredelegatedtothewrappedresponseobject,whichistheconvenienceofextendingHttpServletResponseWrapper.

Example19-9.AnHttpServletResponseWrapperclassforuseinafilter

packagecom.jspservletcookbook;

importjavax.servlet.*;

importjavax.servlet.http.HttpServletResponseWrapper;

importjavax.servlet.http.HttpServletResponse;

publicclassResponseWrapperextendsHttpServletResponseWrapper{

Page 738: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

publicResponseWrapper(HttpServletResponseresponse){

super(response);

}

publicStringgetWebResource(StringresourceName){

//ImplementamethodtoreturnaStringrepresenting

//theoutputofawebresource

//SeeRecipe13.5

return"resource";//forthecompiler...

}//getWebResource

}

Example19-10showsthedoFilter()methodinsidethefilterthatusesthisResponseWrapperclass.

TheclassextendingHttpServletResponseWrappermustbeplacedbeneathWEB-INF/classes,withadirectorystructurethatmatchesitspackagename.

Example19-10.ThedoFilter()methodofafilterthatusesaHttpServletResponseWrapperclass

publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,

FilterChainchain)throwsjava.io.IOException,ServletException{

if(responseinstanceofHttpServletResponse){

chain.doFilter(request,

newResponseWrapper((HttpServletResponse)response));

Page 739: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

}else{

chain.doFilter(request,response);

}

}//doFilter

Thecodecallsthechain.doFilter()methodandpassesinthewrappedresponseasaparameter.Thewebresourceattheendofthechainhasaccesstothecustomizedresponseobjectandcancalltheadditionalmethodtheresponsewrapperclasshasdefined.AlltheothermethodcallsontheHttpServletResponseobject,suchasgetWriter()orgetOutputStream(),arepassedthroughtothewrappedresponseobject.

SeeAlso

Recipe7.9onusingafiltertoreadrequestparametervalues;Recipe11.11onusingafiltertomonitorsessionattributes;Recipe18.3onusingafiltertoaltertherequest;Recipe19.1-Recipe19.4onmappingfilterstowebcomponents;Recipe19.5onconfiguringinitparametersforafilter;Recipe19.6onblockingarequest;Recipe19.8onusingfilterswithRequestDispatchers;Recipe19.9onusingfilterstocheckrequestparameters;Recipe19.10onusingfilterstodisallowrequestsfromcertainIPaddresses.

Page 740: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe19.8UsingFilterswithRequestDispatcherObjects

Problem

Youwanttoapplyafiltertoaservletwhoseoutputisincludedinanotherservlet.

Solution

Usethejavax.servlet.RequestDispatcherobjecttoincludetheservlet'soutput.Configurethefilterinweb.xmlwithadispatcherelementcontainingthecontent"INCLUDE"(servletAPIv2.4andaboveonly!).

Discussion

TheservletAPIv2.4introducedanewtwistforworkingwithRequestDispatchers.Usingthefilter-mappingelementinthedeploymentdescriptor,youcanspecifythatthefilterappliestoaservletthatispartofaRequestDispatcherincludeorforwardaction.

Example19-11showsaweb.xmlconfigurationforafilter.

Example19-11.ApplyingafiltertoaservletusingaRequestDispatcher

<?xmlversion="1.0"encoding="ISO-8859-1"?>

Page 741: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<web-appxmlns="http://java.sun.com/xml/ns/j2ee"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation=

"http://java.sun.com/xml/ns/j2ee

http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"version="2.4">

<filter>

<filter-name>LogFilter</filter-name>

<filter-class>com.jspservletcookbook.LogFilter</filter-class>

</filter>

<filter-mapping>

<filter-name>LogFilter</filter-name>

<url-pattern>/requestheaders</url-pattern>

<dispatcher>REQUEST</dispatcher>

<dispatcher>INCLUDE</dispatcher>

</filter-mapping>

ThedispatcherelementsintheexampleconfigurationspecifythattheLogFilterappliestorequestsfortheservletpath/requestheaders,aswellastoanyRequestDispatchersthatincludetheoutputoftheservletpath/requestheaders.

Similarly,ifyouwanttoinitiateafilterwhenyouareusingaRequestDispatchertoforwardarequesttoanothercomponent,usetheFORWARDvaluewiththedispatcherelement,asin:

<filter-mapping>

<filter-name>LogFilter</filter-name>

<url-pattern>/requestheaders</url-pattern>

<dispatcher>REQUEST</dispatcher>

<dispatcher>FORWARD</dispatcher>

</filter-mapping>

Example19-12showsaservlet'sdoGetmethodthatcreatesaRequestDispatcherspecifyingthepath/requestheaders.Thiscodeincludestheservletoutputrepresentedbythatpath.BecauseofExample19-11sconfigurationinweb.xml,however,thewebcontainerappliesthe

Page 742: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

LogFilterbeforetheservletmappedtothe/requestheaderspathisexecuted.

Example19-12.Aservletincludesanotherservlet'soutput,triggeringafilter

publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)

throwsServletException,java.io.IOException{

/*Theoutputoftheservletatpath"/requestheaders"will

beincludedinthisservlet'soutput,butfirsttherequest

willpassthroughtheLogFilterbeforeitissenttothe

"/requestheaders"servlet*/

RequestDispatcherdispatch=request.getRequestDispatcher(

"/requestheaders");

dispatch.include(request,response);

}

Figure19-2illustratestheprocessoffiltersandRequestDispatchers.

Figure19-2.Alogfilterintervenesbetweenaservlet,includinganotherservlet'soutput

Page 743: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

InFigure19-2,awebclientrequeststheservletatpath/home/servlet1,with/homerepresentingthecontextpath.Theservlet1componentusesaRequestDispatchertoincludetheoutputofservlet2.Basedonafilter-mappingelementinweb.xml,anyrequestsforservlet2involvingaRequestDispatcherincludeactionmustfirstpassthroughthelogfilter.Thisfilterisconfiguredwithafilterelementinweb.xmlwiththename"LogFilter"(Figure19-2doesnotshowthisconfiguration;seeExample19-11).

ThistypeofRequestDispatcherset-upisonlysupportedbyServletAPIv2.4andabove.

SeeAlso

Chapter6onincludingcontentusingRequestDispatchers;Recipe7.9onusingafiltertoreadrequestparametervalues;Recipe11.11onusingafiltertomonitorsessionattributes;Recipe18.3onusingafiltertoalterthenforwardtherequest;Recipe19.1-Recipe19.4onmappingfilterstowebcomponents;Recipe19.5onconfiguringinitparametersforafilter;Recipe19.6onblockingarequest;Recipe19.7onfilteringtheHTTPresponse;Recipe19.9onusingfilterstocheckrequest

Page 744: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

parameters;Recipe19.10onusingfilterstodisallowrequestsfromcertainIPaddresses.

Page 745: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe19.9CheckingFormParameterswithaFilter

Problem

Youwanttouseafiltertocheckthevaluesthatauserhasenteredintoaform.

Solution

UsethedeploymentdescriptortomapthefiltertotheservletorJSPthatisthetargetoftheform.

Discussion

FiltersofferanalternativetoJavaScriptandotherserver-sidelanguagesforcheckingwhethertheuserhasenteredvalidvaluesintoHTMLformfields.ThefilterinthisrecipeinitiatesabasiccheckoftherequestparameterstodetermineiftheyarenullortheemptyString.

Example19-13isaJSPthatcontainsanHTMLform.TheJSPincludessomeembeddedJSTLtagsthatfillinthetextfieldswithanycorrectvaluesiftheformisreturnedtotheuserforcorrections.Inmostcases,auserfillsinthevastmajorityofthefieldscorrectly,butmightmakeamistakeinoneortwoofthem.Youdonotwanttomakehimfilloutallofthefieldsagain.

Example19-13.AJSPcontainingaformforuserstofillout

Page 746: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<%@tagliburi="http://java.sun.com/jstl/core"prefix="c"%>

<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.0Transitional//EN">

<html>

<head>

<title>PersonalInformation</title>

</head>

<bodybgcolor="#ffffff">

<c:iftest="${!(emptyerrorMsg)}">

<fontcolor="red"><c:outvalue="${errorMsg}"/></font>

</c:if>

<h2>Pleaseenteryournameandemailaddress</h2>

<table>

<formaction="/home/thanks.jsp">

<tr><tdvalign="top">Firstname:</td>

<tdvalign="top">

<inputtype="text"name="first"size="15"value=

'<c:outvalue="${first}"/>'>

</td>

<tdvalign="top">Middleinitial:</td>

<tdvalign="top">

<inputtype="text"name="middle"size="2"value=

'<c:outvalue="${middle}"/>'>

</td>

</tr>

<tr>

<tdvalign="top">Lastname:</td>

Page 747: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<tdvalign="top">

<inputtype="text"name="last"size="20"value=

'<c:outvalue="${last}"/>'>

</td></tr>

<tr>

<tdvalign="top">Youremail:</td>

<tdvalign="top">

<inputtype="text"name="email"size="20"value=

'<c:outvalue="${email}"/>'>

</td></tr>

<tr><tdvalign="top"><inputtype="submit"value="Submit"></td>

<td></td></tr>

</form>

</table>

</body>

</html>

WhentheusersubmitsExample19-13,thebrowsersendstheforminformationtotheURLspecifiedintheformtag'sactionattribute:aJSPpagenamedthanks.jsp.ThedeploymentdescriptormapsthefilterinExample19-14totheURLthanks.jsp.Thefilterisdesignedtocheckthefields'valuestodetermineiftheuserleftanyofthemblankand,ifso,returntheusertotheform(namedform.jsp).

Makesuretodevelopallfilterswithaconstructorthatdoesnottakeanyarguments.

Page 748: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Example19-14.Thefilterthatchecksparametersvalues

packagecom.jspservletcookbook;

importjava.io.IOException;

importjava.util.Enumeration;

importjavax.servlet.*;

importjavax.servlet.http.*;

publicclassCheckFilterimplementsFilter{

privateFilterConfigconfig;

publicCheckFilter(){}

publicvoidinit(FilterConfigfilterConfig)throwsServletException{

this.config=filterConfig;

}

publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,

FilterChainchain)throwsIOException,ServletException{

//Getalltheparameternamesassociatedwiththeformfields

Enumerationparams=request.getParameterNames();

booleanrejected=false;

//Cyclethrougheachoneoftheparameters;ifanyofthem

//areempty,callthe'reject'method

while(params.hasMoreElements()){

if(isEmpty(request.getParameter((String)params.

nextElement()))){

Page 749: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

rejected=true;

reject(request,response);

}//if

}//while

//Passtherequesttoitsintendeddestination,ifeverything

//isokay

if(!rejected)

chain.doFilter(request,response);

}//doFilter

privatebooleanisEmpty(Stringparam){

if(param==null||param.length()<1){

returntrue;

}

returnfalse;

}

privatevoidreject(ServletRequestrequest,ServletResponseresponse)

throwsIOException,ServletException{

//Createanerrormessage;storeitinarequestattribute

request.setAttribute("errorMsg",

"Pleasemakesuretoprovideavalidvalueforallofthetext"+

"fields.");

Enumerationparams=request.getParameterNames();

StringparamN=null;

//Createrequestattributesthattheform-relatedJSPwill

Page 750: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

//usetofillintheformfieldsthathavealreadybeen

//filledoutcorrectly.Thentheuserdoesnothavetofill

//intheentireformalloveragain.

while(params.hasMoreElements()){

paramN=(String)params.nextElement();

request.setAttribute(

paramN,request.getParameter(paramN));

}

//UseaRequestDispatchertoreturntheusertotheformin

//ordertofillinthemissingvalues

RequestDispatcherdispatcher=request.

getRequestDispatcher("/form.jsp");

dispatcher.forward(request,response);

}//reject

publicvoiddestroy(){

/*calledbeforetheFilterinstanceisremoved

fromservicebythewebcontainer*/

}

}

TheJavacommentsinExample19-14explainwhatisgoingoninthisfilter.Basically,theuserisreturnedtotheform,whichdisplaysanerrormessageifanyoftherequestparametersareempty.Example19-15showshowtheCheckFilterismappedinweb.xml.Iftheuserfillsintheformcorrectly,hisrequestissenttothethanks.jsppagewithoutinteruptionbythefilter.

Page 751: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Example19-15.TheCheckFilterisregisteredandmappedinweb.xml

<!--startofweb.xml...-->

<filter>

<filter-name>CheckFilter</filter-name>

<filter-class>com.jspservletcookbook.CheckFilter</filter-class>

</filter>

<filter-mapping>

<filter-name>CheckFilter</filter-name>

<url-pattern>/thanks.jsp</url-pattern>

</filter-mapping>

<!--restofweb.xml...-->

Figure19-3showsanHTMLformthatwaspartiallyfilledoutandsubmitted.Thefiltersenttheformbacktotheuserwithamessage(inaredfont).

Figure19-3.AfilterforwardsanerrormessagetoaJSP

Page 752: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

SeeAlso

Chapter6onincludingcontentusingRequestDispatchers;Recipe19.8onusingfilterswithRequestDispatchers;Recipe7.9onusingafiltertoreadrequestparametervalues;Recipe18.3onusingafiltertoalterthenforwardtherequest;Recipe19.1-Recipe19.4onmappingfilterstowebcomponents;Recipe19.5onconfiguringinitparametersforafilter;Recipe19.6onblockingarequest;Recipe19.7onfilteringtheHTTPresponse.

Page 753: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe19.10BlockingIPAddresseswithaFilter

Problem

YouwanttouseafilterthatcheckstheIPaddressassociatedwiththerequest.

Solution

UseafilterthatcallstheHttpServletRequest'sgetRemoteAddr()methodinsidethedoFilter()methodandblockstherequestbynotcallingchain.doFilter().

Discussion

Atypicaluseofafilterinawebapplicationistochecktherequesttomakesureit'sacceptable.Let'ssayyoursecuritydivisionhasdiscoveredthatacertainrangeofIPaddressesrepresentnastyclientsyouwanttorebuffthosefolkswitha"403Forbidden"HTTPresponse.

Example19-16blocksanyclientIPaddressbeginningwith"192.168."

Example19-16.AfilterforblockingacertainrangeofIPaddresses

packagecom.jspservletcookbook;

importjava.io.IOException;

importjava.util.StringTokenizer;

Page 754: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

importjavax.servlet.*;

importjavax.servlet.http.*;

publicclassIPFilterimplementsFilter{

privateFilterConfigconfig;

publicfinalstaticStringIP_RANGE="192.168";

publicIPFilter(){}

publicvoidinit(FilterConfigfilterConfig)throwsServletException{

this.config=filterConfig;

}

publicvoiddoFilter(ServletRequestrequest,

ServletResponseresponse,

FilterChainchain)throwsIOException,ServletException{

Stringip=request.getRemoteAddr();

HttpServletResponsehttpResp=null;

if(responseinstanceofHttpServletResponse)

httpResp=(HttpServletResponse)response;

//BreakuptheIPaddressintochunksrepresentingeachbyte

StringTokenizertoke=newStringTokenizer(ip,".");

intdots=0;

Stringbyte1="";

Stringbyte2="";

Page 755: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Stringclient="";

//

while(toke.hasMoreTokens()){

++dots;

//Thistokenisthefirstnumberseriesorbyte

if(dots==1){

byte1=toke.nextToken();

}else{

//Thistokenisthesecondnumberseriesorbyte

byte2=toke.nextToken();

break;//onlyinterestedinfirsttwobytes

}

}//while

//PiecetogetherhalfoftheclientIPaddresssoitcanbe

//comparedwiththeforbiddenrangerepresentedby

//IPFilter.IP_RANGE

client=byte1+"."+byte2;

//iftheclientIPfitstheforbiddenrange...

if(IP_RANGE.equals(client)){

httpResp.sendError(HttpServletResponse.SC_FORBIDDEN,

"Thatmeansgoodbyeforever!");

}else{

//Clientisokay;sendthemontheirmerryway

Page 756: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

chain.doFilter(request,response);

}

}//doFilter

publicvoiddestroy(){

/*calledbeforetheFilterinstanceisremoved

fromservicebythewebcontainer*/

}

}

Thefilterobtainstheclient'sIPaddresswiththeServletRequest'sgetRemoteAddr()method.ThefilterthanparsesthereturnvaluetodetermineiftheIPaddressfallsintothe"192.168"range.IftheIPaddressdoesfallintothisrange,thenthecodecallstheHttpServletResponsesendError()methodwiththe"403Forbidden"typeHTTPstatuscode,asin:

httpResp.sendError(HttpServletResponse.SC_FORBIDDEN,

"Thatmeansgoodbyeforever!");

Thismethodcalleffectivelyshortcircuitstherequestbypreventingtheuserfromreachingtheiroriginaldestination.IftheIPaddressisacceptable,thecodecallschain.doFilter(),whichpassestherequestandresponseobjectsalongthefilterchain.Inthiscase,theapplicationdoesnotmapanyotherfilterstothanks.jsp,sothewebcontainerinvokesthatJSPpage.

Example19-17showsthemappingforthisfilterinweb.xml.ThefilterismappedtoallrequestswiththeURLmapping"/*."

Example19-17.ThemappingoftheIP-blockingfilter

<filter>

<filter-name>IPFilter</filter-name>

Page 757: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<filter-class>com.jspservletcookbook.IPFilter</filter-class>

</filter>

<filter-mapping>

<filter-name>IPFilter</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

Figure19-4showsthepagethewebbrowserwilldisplayiftheclientIPaddressisblocked.

Figure19-4.AfilteredoutIPaddressreceivesanHTTPStatus403message

SeeAlso

Chapter9onhandlingerrorsinwebapplications;Recipe19.8onusingfilterswithRequestDispatchers;Recipe18.3onusingafiltertoalterthenforwardtherequest;Recipe19.1-Recipe19.4onmappingfilterstowebcomponents;Recipe19.5onconfiguringinitparametersforafilter;Recipe19.7onfilteringtheHTTPresponse;Recipe19.9on

Page 758: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

checkingformparameterswithafilter.

Page 759: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Chapter20.ManagingEmailinServletsandJSPs

Introduction

Recipe20.1.PlacingtheEmail-RelatedClassesonyourClasspath

Recipe20.2.SendingEmailfromaServlet

Recipe20.3.SendingEmailfromaServletUsingaJavaBean

Recipe20.4.AccessingEmailfromaServlet

Recipe20.5.AccessingEmailfromaServletUsingaJavaBean

Recipe20.6.HandlingAttachmentsfromanEmailReceivedinaServlet

Recipe20.7.AddingAttachmentstoanEmailinaServlet

Recipe20.8.ReadingaReceivedEmail'sHeadersfromaServlet

Page 760: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Introduction

ThischapterdescribeshowtomanageemailinyourservletsusingtheJavaMailandJavaBeansActivationFramework(JAF)APIs.JavaMailprovidesJavaclassesfordealingwithmostaspectsofcreating,sending,andaccessingemail.TheJAFisaseparateAPIforhandlingthedatatypesandMultipurposeInternetMailExtension(MIME)typesyoumayencounterwhengeneratingemail,suchasthemanydifferentkindsoffileattachments.BothoftheseAPIsareapartoftheJava2EnterpriseEdition(J2EE)platform.

JavaMailmodelsanemailsystemwithclassesthatrepresentmailsessions(thejavax.mail.Sessionclass),messagestores(thejavax.mail.Storeclass),folders(thejavax.mail.Folderclass,suchastheINBOXfolder),emailmessages(javax.mail.Message),andemailaddresses(thejavax.mail.internet.InternetAddressclass).Forexample,anemailmessageissimilartoaJavaBean,withsettermethodstobuildthevariousmessagecomponents(e.g.,setFrom(),setRecipients(),setSubject(),etc.).

Thefollowingrecipesshowhowtomanagebasicemailmessagingusingasingleservlet,aswellasmethodsforseparatingtheresponsibilityforemailingandhandlingHTTPrequestsintoJavaBeansandservlets.

Page 761: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe20.1PlacingtheEmail-RelatedClassesonyourClasspath

Problem

Youwanttousethejavax.mailandrelatedJavapackagestohandleemailinaservlet.

Solution

DownloadtheZIPfilescontainingthemail.jarandactivation.jararchives.AddtheseJARfilestoashareddirectoryforJARfileswhosecontentsareloadedbythewebcontainer.Ifthisdirectorytypeisnotavailable,addthemail.jarandactivation.jarfilestotheWEB-INF/libdirectoryofyourwebapplication.

Discussion

IfyourclasspathforcompilingservletsalreadyincludestheJARfilesmadeavailablebyyourwebcontainer(suchastheJARfilesinTomcat'scommon/libdirectory),testifanemail-relatedservletsuchasExample20-1compilessuccessfully.Ifthecompilerreportsthatthepackagesjavax.mailandjavax.mail.internetdonotexist,youmustaddtheproperJARfilestoyourclasspath.

SeeRecipe4.3onusingAnttoincludeTomcat'sJARfilesinyourclasspath.

Page 762: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Downloadthemail.jarcomponentfromhttp://java.sun.com/products/javamail/.ThedownloadedfileisaZIParchivecontainingthemail.jararchive.Thisfileincludestherequiredpackagesforhandlingemailinaservlet,suchasjavax.mailandjavax.mail.internet.

ThendownloadtheJAFfromhttp://java.sun.com/products/javabeans/glasgow/jaf.html.Servletscanusetheseclasses,aspartofthejavax.activationpackage,tohandlethedifferentdatatypesthatcanbetransferredwithemailmessages,suchasfileattachments.

YoucanhandlebasicfileattachmentsusingtheJavaMailAPIalone(withoutJAF),asinRecipe20.5andRecipe20.6.SeeRecipe20.7forexamplesofhowtousesomeofthejavax.activationclassestoaddfileattachmentstoemails.

Addthemail.jarandactivation.jararchivestotheWEB-INF/libdirectoryofyourwebapplicationtomaketheJavaMailandJAFpackagesavailabletoaservlet.

SeeAlso

TheSunMicrosystemsJavaMailAPIpage:http://java.sun.com/products/javamail/;theJAFwebpage:http://java.sun.com/products/javabeans/glasgow/jaf.html;Recipe20.2onsendingemailfromaservlet;Recipe20.3onsendingemailusingaJavaBean;Recipe20.4coveringhowtoaccessemailinaservlet;Recipe20.5onaccessingemailwithaJavaBean;Recipe20.6onhandlingattachmentsinaservlet;Recipe20.7onaddingattachmentstoanemailmessage;Recipe20.8onreadinganemail'sheaders.

Page 763: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe20.2SendingEmailfromaServlet

Problem

Youwanttosendemailsfromaservlet.

Solution

Importthejavax.mailandjavax.mail.internetpackagesatthetopoftheservletsourcecode.CreateasendMessage()method(oramethodwithadifferentname)thatcanbecalledfromtheservletmethodsdoGet()ordoPost().

Discussion

ThesendMessage()methodinExample20-1usestheJavaMailAPItoconnectwithamailserver,constructanemailmessage,andthensendthatmessagetooneormorerecipients.Theservletobtainsthevariouscomponentsofanemailthetargetemailaddress,thesender'saddress,thesubjectfield,andtheemail'sbodycontentfromrequestparameters.Theservletcanhandleaformsubmittedbyaclientusingawebbrowser.

Theformtagmightlooklikethis:

<formmethod="POST"action=

"/home/servlet/com.jspservletcookbook.EmailServlet">

Example20-1callsthesendMessage()methodfromtheservicemethoddoPost().ThesendMessage()methodparameterscomprisethepartsofanemail:theSMTPserver,therecipientofthe

Page 764: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

email(thevariableto),the"from"addressofthesender,theemailsubject,andtheemail'scontent.

Example20-1.Aservletsendsemailbasedonrequestparametervalues

packagecom.jspservletcookbook;

importjava.io.IOException;

importjava.io.PrintWriter;

importjava.util.Properties;

importjavax.mail.*;

importjavax.mail.internet.*;

importjavax.servlet.*;

importjavax.servlet.http.*;

publicclassEmailServletextendsHttpServlet{

//defaultvalueformailserveraddress,incasetheuser

//doesn'tprovideone

privatefinalstaticStringDEFAULT_SERVER="mail.attbi.com";

publicvoiddoPost(HttpServletRequestrequest,

HttpServletResponseresponse)throwsServletException,

java.io.IOException{

//obtainthevaluesforemailcomponentsfrom

//requestparameters

StringsmtpServ=request.getParameter("smtp");

if(smtpServ==null||smtpServ.equals(""))

smtpServ=DEFAULT_SERVER;

Stringfrom=request.getParameter("from");

Stringto=request.getParameter("to");

Page 765: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Stringsubject=request.getParameter("subject");

StringemailContent=request.getParameter("emailContent");

response.setContentType("text/html");

java.io.PrintWriterout=response.getWriter();

out.println(

"<html><head><title>Emailmessagesender</title></head><body>");

try{

sendMessage(smtpServ,to,from,subject,emailContent);

}catch(Exceptione){

thrownewServletException(e.getMessage());

}

out.println(

"<h2>Themessagewassentsuccessfully</h2>");

out.println("</body></html>");

}//doPost

privatevoidsendMessage(StringsmtpServer,Stringto,Stringfrom,

Stringsubject,StringemailContent)throwsException{

Propertiesproperties=System.getProperties();

//populatethe'Properties'objectwiththemail

//serveraddress,sothatthedefault'Session'

//instancecanuseit.

properties.put("mail.smtp.host",smtpServer);

Sessionsession=Session.getDefaultInstance(properties);

MessagemailMsg=newMimeMessage(session);//anewemailmessage

Page 766: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

InternetAddress[]addresses=null;

try{

if(to!=null){

//throws'AddressException'ifthe'to'emailaddress

//violatesRFC822syntax

addresses=InternetAddress.parse(to,false);

mailMsg.setRecipients(Message.RecipientType.TO,addresses);

}else{

thrownewMessagingException(

"Themailmessagerequiresa'To'address.");

}

if(from!=null){

mailMsg.setFrom(newInternetAddress(from));

}else{

thrownewMessagingException(

"Themailmessagerequiresavalid'From'address.");

}

if(subject!=null)

mailMsg.setSubject(subject);

if(emailContent!=null)

mailMsg.setText(emailContent);

//Finally,sendthemailmessage;throwsa'SendFailedException'

Page 767: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

//ifanyofthemessage'srecipientshaveaninvalidaddress

Transport.send(mailMsg);

}catch(Exceptionexc){

throwexc;

}

}//sendMessage

publicvoiddoGet(HttpServletRequestrequest,

HttpServletResponseresponse)throwsServletException,

java.io.IOException{

//doGet()callsdoPost()...

doPost(request,response);

}//doGet

}//EmailServlet

Theservletinteractswithamailserverinthefollowingmanner:

1. Thecodecreatesajavax.mail.Sessionobject,whichcontainsvariousdefaultsandpropertyvalues(suchasmail.smtp.host)thattheotherJavaMailobjectswilluse.YoucanshareasingleSessionobjectinanapplication.

ThecodecreatesaMimeMessageobject(passingintheSessionasaconstructorparameter).

TheservletthenpopulatestheMimeMessagewithanemail'svariouscomponents,suchasthe"to"and"from"emailaddresses,theemailsubject,aswellasthemessagecontent.

Page 768: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Thecodesendstheemailusingthejavax.mail.Transportstaticsend()method.

SeeAlso

TheSunMicrosystemsJavaMailAPIpage:http://java.sun.com/products/javamail/;Recipe20.1onaddingJavaMail-relatedJARstoyourwebapplication;Recipe20.3onsendingemailusingaJavaBean;Recipe20.4coveringhowtoaccessemailinaservlet;Recipe20.5onaccessingemailwithaJavaBean;Recipe20.6onhandlingattachmentsinaservlet;Recipe20.7onaddingattachmentstoanemailmessage;Recipe20.8onreadinganemail'sheaders.

Page 769: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe20.3SendingEmailfromaServletUsingaJavaBean

Problem

YouwanttouseaJavaBeanorhelperclasstosendemailfromaservlet.

Solution

DevelopaJavaclassthatimplementsasendMessage()method(justanameIgaveit)toconstructanemailandsendit.StorethenewclassintheWEB-INF/classesfolderofthewebapplication,includingtheclass'spackage-relatedfolders.

Discussion

YoumaychoosetoseparatetheresponsibilitiesofhandlingHTTPrequestsandmanagingemailbyencapsulatingthesetasksinseparateclasses.AJavaBeanthatprovidestheessentialfunctionofsendingemailfitsthebillhere.

Recipe20.5andRecipe20.6showJavaBeansthatareusedtoaccessemailandhandleattachments.Abeanthatdoeseverythingemail-relatedgrowsfairlylargeinsize,sodevelopersmustmakeadesigndecisionaboutwhethertoseparatethesetasksintodifferentJavaBeans(orutilityclasses)thatcanbeusedfromservlets.

CreatethebeanandstoreitintheWEB-INF/classesfolder.Example20-

Page 770: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

3showsthedoGet()methodofanHttpServletusingaJavaBeantosendanemail.Example20-2showsthebeanclassitself.ThedifferencebetweenthesendMessage()methodofExample20-1andtheoneinExample20-2isinthewaythebeanreceivesthevariousemailparts,suchastherecipient'semailaddress.Thebeanstoresthesepartsaspropertiesandusessettermethodstoprovidethepropertyvalues.

Ontheotherhand,Example20-1usesrequestparametersandmethodargumentstoprovidethesevalues.

Example20-2.AJavaBeanusedtosendemail

packagecom.jspservletcookbook;

importjava.io.IOException;

importjava.io.PrintWriter;

importjava.util.Properties;

importjavax.mail.*;

importjavax.mail.internet.*;

publicclassEmailBean{

publicEmailBean(){}

//setdefaults

privatefinalstaticStringDEFAULT_CONTENT="Unknowncontent";

privatefinalstaticStringDEFAULT_SUBJECT="Unknownsubject";

privatestaticStringDEFAULT_SERVER=null;

privatestaticStringDEFAULT_TO=null;

privatestaticStringDEFAULT_FROM=null;

Page 771: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

static{

//setMaildefaultsbasedonapropertiesfile

java.util.ResourceBundlebundle=

java.util.ResourceBundle.

getBundle("com.jspservletcookbook.mailDefaults");

DEFAULT_SERVER=bundle.getString("DEFAULT_SERVER");

DEFAULT_TO=bundle.getString("DEFAULT_TO");

DEFAULT_FROM=bundle.getString("DEFAULT_FROM");

}//static

//JavaBeanproperties

privateStringsmtpHost;

privateStringto;

privateStringfrom;

privateStringcontent;

privateStringsubject;

publicvoidsendMessage()throwsException{

Propertiesproperties=System.getProperties();

//populatethe'Properties'objectwiththemail

//serveraddress,sothatthedefault'Session'

//instancecanuseit.

properties.put("mail.smtp.host",smtpHost);

Sessionsession=Session.getDefaultInstance(properties);

MessagemailMsg=newMimeMessage(session);//anewemailmessage

InternetAddress[]addresses=null;

try{

if(to!=null){

Page 772: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

//throws'AddressException'ifthe'to'emailaddress

//violatesRFC822syntax

addresses=InternetAddress.parse(to,false);

mailMsg.setRecipients(Message.RecipientType.TO,addresses);

}else{

thrownewMessagingException(

"Themailmessagerequiresa'To'address.");

}

if(from!=null){

mailMsg.setFrom(newInternetAddress(from));

}else{

thrownewMessagingException(

"Themailmessagerequiresavalid'From'address.");

}

if(subject!=null)

mailMsg.setSubject(subject);

if(content!=null)

mailMsg.setText(content);

//Finally,sendthemailmessage;throwsa'SendFailedException'

//ifanyofthemessage'srecipientshaveaninvalidaddress

Transport.send(mailMsg);

}catch(Exceptionexc){

throwexc;

Page 773: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

}

}//sendMessage

//Thesettermethodsareallthesamestructure,

//sowe'rejustshowingtwo

publicvoidsetSmtpHost(Stringhost){

if(check(host)){

this.smtpHost=host;

}else{

this.smtpHost=DEFAULT_SERVER;

}

}//setSmtpHost

publicvoidsetTo(Stringto){

if(check(to)){

this.to=to;

}else{

this.to=DEFAULT_TO;

}

}//setTo

/*--Notshown:'setter'methodscontinuewithexactlythesamestructurefor

'from','subject',and'content'--*/

privatebooleancheck(Stringvalue){

if(value==null||value.equals(""))

returnfalse;

returntrue;

}//check

Page 774: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

}

Example20-3usesthejava.util.ResourceBundleclasstosetdefaultpropertyvaluesforvariablessuchasthenameoftheserver.ThemailDefaults.propertiesfileisstoredinWEB-INF/classes/com/jspservletcookbook.Hereisanexampleofthepropertiesfile'scontents:

DEFAULT_SERVER=smtp.comcast.net

[email protected]

[email protected]

Thebeanallowsthesettingofthevariousemailpartswiththefollowingmethods(Example20-3doesnotshowallofthem):setSmtpHost(),setTo(),setFrom(),setSubject(),andsetContent().

TheservletinExample20-3createsaninstanceofanEmailBean,setsthevariouspartsoftheemailmessage,thencallsthesendMessage()method.Example20-3showsonlythedoGet()method.Theservlet'sdoPost()methodcouldcalldoGet()asin:doGet(request,response).

Example20-3.AservletusestheJavaBeantosendemail

publicvoiddoGet(HttpServletRequestrequest,

HttpServletResponseresponse)

throwsServletException,java.io.IOException{

response.setContentType("text/html");

java.io.PrintWriterout=response.getWriter();

out.println(

"<html><head><title>Emailmessagesender</title></head><body>");

EmailBeanemailer=newEmailBean();

emailer.setSmtpHost("mail.attbi.com");

Page 775: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

emailer.setTo("[email protected]");

emailer.setFrom("[email protected]");

emailer.setSubject("Thisisnotspam!");

emailer.setContent("PleasecallASAP.");

try{

emailer.sendMessage();

}catch(Exceptione){thrownewServletException(e);}

out.println("</body></html>");

}//doGet

ThebeanitselfthrowsMessagingExceptionsif,forinstance,the"to"emailaddressthattheuserprovidesisinaninvalidformat.Thebeanrethrowsanyexceptionsthatitcatcheswhilebuildingandsendingtheemail.

SeeAlso

Recipe20.4coveringhowtoaccessemailinaservlet;Recipe20.5onaccessingemailwithaJavaBean;Recipe20.6onhandlingattachmentsinaservlet;Recipe20.7onaddingattachmentstoanemailmessage;Recipe20.8onreadinganemail'sheaders.

Page 776: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe20.4AccessingEmailfromaServlet

Problem

Youwanttoaccessanddisplaythecontentofemailinaservlet.

Solution

UsetheJavaMailAPIandamethodinsidetheservlettohandleanddisplaythevaluesofemailmessages.

Discussion

FetchingemailmessagesusingJavaMailandaservletisastraightforwardprocess:

1. Importthejavax.mailandjavax.mail.internetpackagesatthetopoftheservletsourcecode.

Insidetheservlet'smail-fetchingmethod,createajavax.mail.Sessionobjecttohandlethismailsession.

Getamessagestoreobject(ajavax.mail.Store)fromthesessiontorepresentthePOP3mailaccount.

ConnecttotheStoreusingtheconnect(Stringhost,Stringuser,Stringpassword)methodoftheStoreobject(thereareoverloadedversionsofthismethod).TheStoreisdesignedtoauthenticateauserandconnectwithamailserver.

Page 777: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

AccesstheINBOXfolderfromthemessagestore.

ObtainanymessagesthatfoldercontainsasaMessage[]type,thendowhateveryouwantwitheachmessage,iteratingthroughthearray.

Example20-4fetchesemailmessagesbycallingitshandleMessages()methodinthedoGet()servicemethod.

Example20-4.Aservletthatfetchesemailmessages

packagecom.jspservletcookbook;

importjava.io.IOException;

importjava.io.PrintWriter;

importjava.util.Properties;

importjavax.mail.*;

importjavax.mail.internet.*;

importjavax.servlet.*;

importjavax.servlet.http.*;

publicclassMailAccessorextendsHttpServlet{

privatefinalstaticStringDEFAULT_SERVER="mail.attbi.com";

publicvoiddoGet(HttpServletRequestrequest,

HttpServletResponseresponse)throwsServletException,

java.io.IOException{

response.setContentType("text/html");

java.io.PrintWriterout=response.getWriter();

out.println("<html><head><title>EmailReader</title></head><body>");

//Thismethodaccessesanyemailanddisplaysthecontents

Page 778: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

handleMessages(request,out);

out.println("</body></html>");

}//doGet

privatevoidhandleMessages(HttpServletRequestrequest,

PrintWriterout)throwsIOException,ServletException{

//ObtainuserauthenticationinformationforaPOPserver,

//usedtoaccessemail.Thisinformationisstoredina

//HttpSessionobject

HttpSessionhttpSession=request.getSession();

Stringuser=(String)httpSession.getAttribute("user");

Stringpassword=(String)httpSession.getAttribute("pass");

StringpopAddr=(String)httpSession.getAttribute("pop");

StorepopStore=null;

Folderfolder=null;

if(!check(popAddr))

popAddr=MailAccessor.DEFAULT_SERVER;

try{

//basiccheckfornulloremptyuserandpassword

if((!check(user))||(!check(password)))

thrownewServletException(

"Avalidusernameandpasswordisrequired.");

Propertiesproperties=System.getProperties();

//Obtaindefault'Session'forthisinteractionwith

//amailserver

Sessionsession=Session.getDefaultInstance(properties);

//Obtainamessagestore(i.e.,aPOP3emailaccount,from

//theSessionobject

popStore=session.getStore("pop3");

Page 779: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

//connecttothestorewithauthenticationinformation

popStore.connect(popAddr,user,password);

//GettheINBOXfolder,openit,andretireveanyemails

folder=popStore.getFolder("INBOX");

if(!folder.exists())

thrownewServletException(

"An'INBOX'folderdoesnotexistfortheuser.");

folder.open(Folder.READ_ONLY);

Message[]messages=folder.getMessages();

intmsgLen=messages.length;

if(msgLen==0){

out.println(

"<h2>TheINBOXfolderdoesn'tcontainanyemail"+

"messages.</h2>");}

//foreachretrievedmessage,usedisplayMessagemethodto

//displaythemailmessage

for(inti=0;i<msgLen;i++){

displayMessage(messages[i],out);

out.println("<br/><br/>");

}

}catch(Exceptionexc){

out.println(

"<h2>Sorry,anerroroccurredwhileaccessingtheemail"+

"messages.</h2>");

out.println(exc.toString());

}finally{

Page 780: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

try{

//closethefolderandthestoreinthefinallyblock

//if'true'parameter,anydeletedmessageswillbeexpunged

//fromtheFolder

if(folder!=null)

folder.close(false);

if(popStore!=null)

popStore.close();

}catch(Exceptione){}

}

}//printMessages

privatevoiddisplayMessage(Messagemsg,PrintWriterout)

throwsMessagingException,IOException{

if(msg!=null&&msg.getContent()instanceofString){

if(msg.getFrom()[0]instanceofInternetAddress){

out.println(

"Messagereceivedfrom:"+

((InternetAddress)msg.getFrom()[0]).getAddress()+

"<br/>");

}

out.println("Messagecontenttype:"+msg.getContentType()+

"<br/>");

out.println("Messagebodycontent:"+

(String)msg.getContent());

}else{

out.println(

"<h2>Thereceivedemailmessagewasnotofatext"+

"contenttype.</h2>");

Page 781: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

}//outerif

}//displayMessage

privatebooleancheck(Stringvalue){

if(value==null||value.equals(""))

returnfalse;

returntrue;

}//check

}

ThedisplayMessage()methoddisplayseachmessage's"from"address,themessage'scontenttype(i.e.,theMIMEtypeasintext/plain),andtheemail'scontent.YoucangettheStringfromatypicalemailmessagethatcontainsjustheadersandthetextmessagebycallingMessage.getContent().Gettingthe"from"addressisalittletrickier:

out.println("Messagereceivedfrom:"+

((InternetAddress)msg.getFrom()[0]).getAddress()+"<br/>");

TheMessage.getFrom()methodreturnsanarrayofjavax.mail.Addressobjects.Thiscodeisdesignedtoaccessthefirstemailaddress,sinceanemailistypicallysentbyonepartytoitsrecipient(notincludingthosemaliciousspammers,ofcourse).

Thecodeaccessesthefirstarraymember,caststhereturnvaluetoajavax.mail.InternetAddress,thencallsgetAddress()onthatobject,whichreturnstheStringemailaddress.

Figure20-1showstheservlet'sreturnvalueinabrowserwindow.Sincetheservletreceivesitsemailauthenticationinformationfromsession

Page 782: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

attributes,thefirstrequesttargetsaJSP,whichsetsthesessionattributes.ThentheJSPforwardstherequesttotheMailAccessorservlet.Theservletdisplayseachreceivedemailseparatedbytwolinebreaks.Inotherwords,theinformationtheservletdisplaysabouteachemailincludeswhosenttheemail,themail'scontenttype,andthecontentofthemessageitself.

Figure20-1.Aservletfetchesanddisplaystwoemailmessages

SeeAlso

Chapter16onsettingsessionattributes;Chapter25onaccessingajavax.mail.SessionJNDIobjectonBEAWebLogic;SunMicrosystem'sJavaMailAPIpage:http://java.sun.com/products/javamail/;Recipe20.1onaddingJavaMail-relatedJARstoyourwebapplication;Recipe20.2onsendingemailusingaservlet;Recipe20.3onsendingemailusingaJavaBean;Recipe20.5onaccessingemailwithaJavaBean;Recipe20.6onhandlingattachmentsinaservlet;Recipe20.7onaddingattachmentstoanemailmessage;Recipe20.8onreadinganemail'sheaders.

Page 783: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe20.5AccessingEmailfromaServletUsingaJavaBean

Problem

YouwanttouseaJavaBeanorhelperclasstoaccessanddisplayemailmessages.

Solution

AddthehandleMessages()anddisplayMessage()methodsfromExample20-4totheJavaBeanclassdefinedinExample20-2.ThenusetheJavaBeanfromaservlet'sdoGet()ordoPost()method.

Discussion

WhenwelastencounteredtheEmailBeaninExample20-2itcontainedasendMessage()method,alongwithseveralproperty"setter"methods(suchassetSmtpHost(Stringhost)).IfyouaddthehandleMessages()anddisplayMessage()methodsfromExample20-4tothissameclass,youcanusetheJavaBeantobothsendandaccessemail.

ThiscodeinhandleMessages()fromExample20-4needstobechangedtoincludetheEmailBeanclassname:

//staticreferencetoaconstantvalue

if(!check(popAddr))

popAddr=EmailBean.DEFAULT_SERVER;

Page 784: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

However,theEmailBeanclasswillhavegrownquitelargeasaresultofaddingthetwomethods,soyoumightcreatetwoJavaBeansoneforsendingmailandanotherforaccessingit.Example20-5createsandusesaninstanceofaspecialemailJavaBean.YoumuststorethebeanclassintheWEB-INF/classesdirectoryorinaJARfileinWEB-INF/lib.

Example20-6alsoshowsaJavaBeanthatdefineshandleMessages()anddisplayMessage()fordealingwithemailattachments.

Example20-5.AservletusesaJavaBeantoaccessemailmessages

publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)

throwsServletException,java.io.IOException{

response.setContentType("text/html");

java.io.PrintWriterout=response.getWriter();

out.println(

"<html><head><title>Emailmessagesender</title></head><body>");

EmailBeanemailer=newEmailBean();

emailer.setSmtpHost("mail.attbi.com");

emailer.handleMessages(request,out);

out.println("</body></html>");

}//doGet

SeeAlso

Page 785: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

SunMicrosystem'sJavaMailAPIpage:http://java.sun.com/products/javamail/;Recipe20.1onaddingJavaMail-relatedJARstoyourwebapplication;Recipe20.2onsendingemailfromaservlet;Recipe20.3onsendingemailusingaJavaBean;Recipe20.4coveringhowtoaccessemailinaservlet;Recipe20.6onhandlingattachmentsinaservlet;Recipe20.7onaddingattachmentstoanemailmessage;Recipe20.8onreadinganemail'sheaders.

Page 786: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe20.6HandlingAttachmentsfromanEmailReceivedinaServlet

Problem

Youwanttoreadanemailmessageandsaveanyattachmentsfromaservlet.

Solution

UsetheJavaMailAPIandaspecialJavaBeantosavetheInputStreamsfromattachedfilestoaspecifiedfolder.

Discussion

AccessingemailusuallyinvolvesauthenticatingauserwithaPOPaccount,thenconnectingwiththemailserveranddownloadinganyemailmessages.Example20-6usestheSession,Store,Folder,andMessageclassesfromtheJavaMailAPItodownloadanarrayofMessagesfromaparticularuser'semailaccount.However,theservletinRecipe20.4wasdesignedtodealonlywithMessageswhosecontentwasoftypeString(thereturnvalueoftheMessage.getContent()method).

IftheMessage'scontentisoftypeMultipart,thentheprocessofhandlingattachmentsmirrorsthepeelingofanonionmorecodeisinvolved.Example20-6separatestheemail-relatedcodeintoaJavaBeanthatcanbeusedfromaservlet.Thebean'sdisplayMessage()methodteststhecontentofeachMessage.IfthecontentisoftypeMultipart,thenthecodeexamineseachcontained

Page 787: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

BodyPart.

PictureaMultipartmessagetypeasacontainer.Thecontainer'sheadersarelikeanyotheremailmessage'sheaders(butwithdifferentvalues).ThecontainerenclosesBodyParts,whicharelikemessagesinsideofmessages.SomeBodyPartsrepresentthetextmessageaccompanyingaMultipartemailmessage.OtherBodyPartsrepresenttheattachedfiles,suchasaMicrosoftWordfileorJPEGimage.

IftheBodyPart'scontentisaString,thenthebeandisplaysthetextmessage.Otherwise,thebeanassumestheBodyPartisanattachedfile;itsavesthefiletoaspecialattachmentsfolder.You'reprobablyalreadyfamiliarwiththehandleMessages()code,soyoucanskiptothedisplayMessage()method,whichdealswithsavinganyfileattachments.

Example20-6.AJavaBeanthathandlesattachmentsanddeliversabrowsermessage

packagecom.jspservletcookbook;

importjava.io.*;

importjava.util.Properties;

importjavax.mail.*;

importjavax.mail.internet.*;

importjavax.servlet.*;

importjavax.servlet.http.*;

publicclassAttachBean{

/*NOTSHOWN:privatebeanfields(or,properties);defaultvariables;

andthesendMessagemethod

Page 788: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

SeeExample20-2*/

publicAttachBean(){}

privatevoidhandleMessages(HttpServletRequestrequest,

PrintWriterout)throwsIOException,ServletException{

/*gettheuserandpasswordinformationforaPOP

accountfromanHttpSessionobject*/

HttpSessionhttpSession=request.getSession();

Stringuser=(String)httpSession.getAttribute("user");

Stringpassword=(String)httpSession.getAttribute("pass");

StringpopAddr=(String)httpSession.getAttribute("pop");

StorepopStore=null;

Folderfolder=null;

if(!check(popAddr))

popAddr=AttachBean.DEFAULT_SERVER;

try{

if((!check(user))||(!check(password)))

thrownewServletException(

"Avalidusernameandpasswordisrequiredtocheckemail.");

Propertiesproperties=System.getProperties();

Sessionsession=Session.getDefaultInstance(properties);

popStore=session.getStore("pop3");

popStore.connect(popAddr,user,password);

folder=popStore.getFolder("INBOX");

if(!folder.exists())

thrownewServletException(

"An'INBOX'folderdoesnotexistfortheuser.");

folder.open(Folder.READ_ONLY);

Page 789: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Message[]messages=folder.getMessages();

intmsgLen=messages.length;

if(msgLen==0)

out.println(

"<h2>TheINBOXfolderdoesnotyetcontainany"+

"emailmessages.</h2>");

for(inti=0;i<msgLen;i++){

displayMessage(messages[i],out);

out.println("<br/><br/>");

}//for

}catch(Exceptionexc){

out.println(

"<h2>Sorry,anerroroccurredwhileaccessing"+

"theemailmessages.</h2>");

out.println(exc.toString());

}finally{

try{

if(folder!=null)

folder.close(false);

if(popStore!=null)

popStore.close();

}catch(Exceptione){}

}

}//handleMessages

Page 790: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

privatevoiddisplayMessage(Messagemsg,PrintWriterout)

throwsMessagingException,IOException{

if(msg!=null){

/*getthecontentofthemessage;themessagecould

beanemailwithoutattachments,oranemail

withattachments.ThemethodgetContent()willreturnan

instanceof'Multipart'ifthemsghasattachments*/

Objecto=msg.getContent();

if(oinstanceofString){

//justdisplaysomeinfoaboutthemessagecontent

handleStringMessage(msg,(String)o,out);

}elseif(oinstanceofMultipart){

//savetheattachment(s)toafolder

Multipartmpart=(Multipart)o;

Partpart=null;

Filefile=null;

FileOutputStreamstream=null;

InputStreaminput=null;

StringfileName="";

//eachMultipartismadeupof'BodyParts'that

//areoftype'Part'

for(inti=0;i<mpart.getCount();i++){

part=mpart.getBodyPart(i);

ObjectpartContent=part.getContent();

if(partContentinstanceofString){

handleStringMessage(msg,(String)partContent,

out);

Page 791: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

}else{//handleasafileattachment

fileName=part.getFileName();

if(!check(fileName)){//defaultfilename

fileName="file"+

newjava.util.Date().getTime();}

//writetheattachment'sInputStreamtoafile

file=newFile(attachFolder+

System.getProperty("file.separator")+fileName);

stream=newFileOutputstream(file);

input=part.getInputStream();

intch;

while((ch=input.read())!=-1){

stream.write(ch);}

input.close();

out.println(

"Handledattachmentnamed:"+

fileName+"<br/><br/>");

}//if

}//for

}//elseifinstanceofmultipart

}else{

out.println(

"<h2>Thereceivedemailmessagereturnednull.</h2>");

}//ifmsg!=null

}//displayMessage

Page 792: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

privatevoidhandleStringMessage(Partpart,StringemailContent,

PrintWriterout)throwsMessagingException{

if(partinstanceofMessage){

Messagemsg=(Message)part;

if(msg.getFrom()[0]instanceofInternetAddress){

out.println("Messagereceivedfrom:"+

((InternetAddress)msg.getFrom()[0]).getAddress()+

"<br/>");

}

out.println(

"Messagecontenttype:"+msg.getContentType()+

"<br/>");

out.println("Messagecontent:"+emailContent+"<br/>");

}

}

privatebooleancheck(Stringvalue){

if(value==null||value.equals(""))

returnfalse;

returntrue;

}//check

/*NOTSHOWN:various'setter'methodsforthebean'sproperties

SeeExample20-2*/

}//AttachBean

OncethedisplayMessage()codeidentifiesaBodyPartasanattachedfile,itreceivesthebytesthatrepresentthefileasanInputStream.ABodyPartimplementsthePartinterface,which

Page 793: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

definesthemethodgetInputStream().ThecodesavesthefileusingtheInputStreamandthejava.io.FileOutputStreamclass.

Example20-7showsthedoGet()methodofaservletusingcom.jspservletcookbook.AttachBean.

Example20-7.Aservlet'sdoGet()methodusesaJavaBeantodealwithemailattachments

publicvoiddoGet(HttpServletRequestrequest,

HttpServletResponseresponse)

throwsServletException,java.io.IOException{

response.setContentType("text/html");

java.io.PrintWriterout=response.getWriter();

out.println(

"<html><head><title>Emailmessagesender</title></head><body>");

AttachBeanemailer=newAttachBean();

emailer.setSmtpHost("mail.attbi.com");

emailer.setAttachFolder(getServletContext().getRealPath("/")+"attachments");

emailer.handleMessages(request,out);

out.println("</body></html>");

}//doGet

Figure20-2showsthemessagesthattheservlet(usingtheJavaBean)displaysinabrowser.Thefirstemailisasimpletextmessagewithoutattachments.Thesecondemailcontainstwoattachments;itsMIMEtypeismultipart/mixed.

Figure20-2.Aservletdisplaysinformationaboutreceivedattachmentsandmessages

Page 794: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

SeeAlso

SunMicrosystem'sJavaMailAPIpage:http://java.sun.com/products/javamail/;Recipe20.1onaddingJavaMail-relatedJARstoyourwebapplication;Recipe20.2onsendingemailfromaservlet;Recipe20.3onsendingemailusingaJavaBean;Recipe20.4coveringhowtoaccessemailinaservlet;Recipe20.5onaccessingemailwithaJavaBean;Recipe20.7onaddingattachmentstoanemailmessage;Recipe20.8onreadinganemail'sheaders.

Page 795: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe20.7AddingAttachmentstoanEmailinaServlet

Problem

Youwanttobuildanemailmessagewithattachmentsinaservlet.

Solution

UsetheJavaMailAPIforbasicemailmessaging,andthetheJavaBeansActivationFramework(JAF)togeneratethefileattachments.

Discussion

TheJAFclassesprovidefine-grainedcontroloversettingupafileattachmentforanemailmessage.

IfyouareusingboththeJavaMailAPIandtheJAF,makesuretoimportthepackagesinyourservletclass:

importjavax.activation.*;

importjavax.mail.*;

importjavax.mail.internet.*;

//classdefinitioncontinues

ThesendMessage()methodinExample20-8createsanewemailmessage(specifically,anewjavax.mail.internet.MimeMessage),addsitstextmessage,andinsertsafileattachmentinsidethemessage.ThemethodthensendsthemessageusingthecodeyoumayhaveseeninRecipe20.2andRecipe20.3:

Page 796: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Transport.send(mailMsg);

Toaccomplishthis,thecodecreatesacontainer(ajavax.mail.Multipartobject)andtwojavax.mail.BodyPartsthatmakeupthethecontainer.ThefirstBodyPartisatextmessage(usedusuallytodescribethefileattachmenttotheuser),whilethesecondBodyPartisthefileattachment(inthiscase,aMicrosoftWordfile).ThenthecodesetsthecontentoftheMimeMessagetotheMultipart.Inanutshell,theMimeMessage(anemailmessage)containsaMultipart,whichitselfiscomposedoftwoBodyParts:theemail'stextmessageandanattachedfile.

IfyouwanttolookattheheadersofaMimeMessagethatcontainsattachments,callthegetAllHeaders()methodontheMimeMessage.SeeRecipe20.8fordetails.

Example20-8.Makingemailattachmentinaservlets

packagecom.jspservletcookbook;

importjava.io.*;

importjava.util.Properties;

importjavax.activation.*;

importjavax.mail.*;

importjavax.mail.internet.*;

importjavax.servlet.*;

importjavax.servlet.http.*;

publicclassEmailAttachServletextendsHttpServlet{

Page 797: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

//defaultvalueformailserveraddress,incasetheuser

//doesn'tprovideone

privatefinalstaticStringDEFAULT_SERVER="mail.attbi.com";

publicvoiddoPost(HttpServletRequestrequest,

HttpServletResponseresponse)throwsServletException,

java.io.IOException{

response.setContentType("text/html");

java.io.PrintWriterout=response.getWriter();

out.println(

"<html><head><title>Emailmessagesender</title></head><body>");

StringsmtpServ=request.getParameter("smtp");

if(smtpServ==null||smtpServ.equals(""))

smtpServ=DEFAULT_SERVER;

Stringfrom=request.getParameter("from");

Stringto=request.getParameter("to");

Stringsubject=request.getParameter("subject");

try{

sendMessage(smtpServ,to,from,subject);

}catch(Exceptione){

thrownewServletException(e.getMessage());

}

out.println(

"<H2>Yourattachmenthasbeensent.</H2>");

out.println("</body></html>");

}//doPost

publicvoiddoGet(HttpServletRequestrequest,

HttpServletResponseresponse)throwsServletException,

java.io.IOException{

doPost(request,response);

Page 798: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

}//doGet

privatevoidsendMessage(StringsmtpServ,Stringto,Stringfrom,

Stringsubject)throwsException{

Multipartmultipart=null;

BodyPartbpart1=null;

BodyPartbpart2=null;

Propertiesproperties=System.getProperties();

//populatethe'Properties'objectwiththemail

//serveraddress,sothatthedefault'Session'

//instancecanuseit.

properties.put("mail.smtp.host",smtpServ);

Sessionsession=Session.getDefaultInstance(properties);

MessagemailMsg=newMimeMessage(session);//anewemailmessage

InternetAddress[]addresses=null;

try{

if(to!=null){

//throws'AddressException'ifthe'to'emailaddress

//violatesRFC822syntax

addresses=InternetAddress.parse(to,false);

mailMsg.setRecipients(Message.RecipientType.TO,addresses);

}else{

thrownewMessagingException(

"Themailmessagerequiresa'To'address.");

}

if(from!=null){

mailMsg.setFrom(newInternetAddress(from));

Page 799: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

}else{

thrownewMessagingException(

"Themailmessagerequiresavalid'From'address.");

}

if(subject!=null)

mailMsg.setSubject(subject);

//Thisemailmessage'scontentisa'Multipart'type

//TheMIMEtypeforthemessage'scontentis'multipart/mixed'

multipart=newMimeMultipart();

//Thetextpartofthismultipartemailmessage

bpart1=newMimeBodyPart();

StringtextPart=

"Hello,justthoughtyou'dbeinterestedinthisWordfile.";

//createtheDataHandlerobjectforthetextpart

DataHandlerdata=newDataHandler(textPart,"text/plain");

//setthetextBodyPart'sDataHandler

bpart1.setDataHandler(data);

//addthetextBodyParttotheMultipartcontainer

multipart.addBodyPart(bpart1);

//createtheBodyPartthatrepresentstheattachedWordfile

bpart2=newMimeBodyPart();

//createtheDataHandlerthatpointstoaFile

FileDataSourcefds=newFileDataSource(newFile(

"h:/book/chapters/chap1/chap1.doc"));

//Makesurethattheattachedfileishandledas

//theappropriateMIMEtype:application/mswordhere

Page 800: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

MimetypesFileTypeMapftm=newMimetypesFileTypeMap();

//thesyntaxhereistheMIMEtypefollowedby

//spaceseparatedextensions

ftm.addMimeTypes("application/msworddocDOC");

fds.setFileTypeMap(ftm);

//TheDataHandlerisinstantiatedwiththe

//FileDataSourcewejustcreated

DataHandlerfileData=newDataHandler(fds);

//theBodyPartwillcontainthewordprocessingfile

bpart2.setDataHandler(fileData);

//addthesecondBodyPart,theonecontainingtheattachment,to

//theMultipartobject

multipart.addBodyPart(bpart2);

//finally,setthecontentoftheMimeMessagetothe

//Multipartobject

mailMsg.setContent(multipart);

//sendthemailmessage;throwsa'SendFailedException'

//ifanyofthemessage'srecipientshaveaninvalidadress

Transport.send(mailMsg);

}catch(Exceptionexc){

throwexc;

}//try

}//sendMessage

}//EmailAttachServlet

Page 801: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

ThecommentsinExample20-8explainwhathappenswhenyouusethejavax.activationclassestocreateafileattachmentoftheintendedMIMEtype.Themostconfusingpartiscreatingajavax.activation.FileDataSourcethatpointstothefilethatyouwanttoattachtotheemailmessage.ThecodeusestheFileDataSourcetoinstantiatethejavax.activation.DataHandler,whichisresponsibleforthecontentofthefileattachment.

//createtheDataHandlerthatpointstoaFile

FileDataSourcefds=newFileDataSource(newFile(

"h:/book/chapters/chap1/chap1.doc"));

MakesurethattheMimeMessageidentifiestheattachedfileasaMIMEtypeofapplication/msword,sothattheuser'semailapplicationcantrytohandletheattachmentasaMicrosoftWordfile.SettheFileTypeMapoftheFileDataSourcewiththefollowingcode:

//Makesurethattheattachedfileishandledas

//theappropriateMIMEtype:application/mswordhere

MimetypesFileTypeMapftm=newMimetypesFileTypeMap();

//thesyntaxhereistheMIMEtypefollowedby

//spaceseparatedextensions

ftm.addMimeTypes("application/msworddocDOC");

fds.setFileTypeMap(ftm);

AMimetypesFileTypeMapisaclassthatassociatesMIMEtypes(likeapplication/msword)withfileextensionssuchas.doc.

MakesureyouassociatethecorrectMIMEtypewiththefilethatyouaresendingasanattachment,sinceyouexplicitlymakethisassociationinthecode.Seehttp://java.sun.com/j2ee/1.4/docs/api/javax/activation/MimetypesFileTypeMap.htmlforfurtherdetails.

Page 802: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Thenthecodeperformsthefollowingsteps:

1. CreatesaDataHandlerbypassingthisFileDataSourceinasaconstructorparameter.

SetsthecontentoftheBodyPartwiththatDataHandler.

AddstheBodyParttotheMultipartobject(whichinturnrepresentsthecontentoftheemailmessage).

SeeAlso

SunMicrosystem'sJavaMailAPIpage:http://java.sun.com/products/javamail/;theJAFwebpage:http://java.sun.com/products/javabeans/glasgow/jaf.html;Recipe20.1onaddingJavaMail-relatedJARstoyourwebapplication;Recipe20.2onsendingemailfromaservlet;Recipe20.3onsendingemailusingaJavaBean;Recipe20.4coveringhowtoaccessemailinaservlet;Recipe20.5onaccessingemailwithaJavaBean;Recipe20.6onhandlingattachmentsinaservlet;Recipe20.8onreadinganemail'sheaders.

Page 803: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe20.8ReadingaReceivedEmail'sHeadersfromaServlet

Problem

Youwanttoreadtheheadersfromanemailinaservlet.

Solution

UsetheJavaMailAPItoaccesseachemailmessage.CallthegetAllHeaders()methodofthePartinterface,theniteratethroughtheEnumerationreturnvaluetogetthenameandvalueofeachheader.

Discussion

Anadvancedemailprogram,suchasaspamfilter,isdesignedtoexamineanemail'sheaders,notjustitsmessageandfileattachments.

Aheaderiscomposedofaname,acoloncharacter(:),andavalue.Theheadersprovidedetailsabouttheemailmessage,suchaswhosentthemessageandthemailserver(s)thathandledthemessageduringitsnetworktravels.Anexampleheaderis:

To:<[email protected]>

TheJavaMailAPImakesiteasytolistanemail'sheaders.TheMessageobjecthasagetAllHeaders()method(viathePartinterfacethattheMessageclassimplements).Thismethodreturnsajava.util.Enumeration,holdingacollectionof

Page 804: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

javax.mail.Headerobjects.TogettheheadernameandvaluefromtheseHeaderobjects,justcalltheirgetName()andgetValue()methods.

ThePartinterfacealsohasagetHeader(StringheaderName)methodthatyoucanusetoobtainthevalueforaparticularheader.ThismethodreturnsaStringarraycontainingthevalue(s)fortheheaderofthatname.

Example20-9showsthesameservletfromRecipe20.4,revisedtolistboththemessagecontentsandtheheadervalues.Theheader-relatedcodeappearsinthedisplayMessage()method.

Example20-9.Aservletdisplaysemailheadernamesandvalues

packagecom.jspservletcookbook;

importjava.io.IOException;

importjava.io.PrintWriter;

importjava.util.Properties;

importjava.util.Enumeration;

importjavax.mail.*;

importjavax.mail.internet.*;

importjavax.servlet.*;

importjavax.servlet.http.*;

publicclassHeaderAccessorextendsHttpServlet{

privatefinalstaticStringDEFAULT_SERVER="mail.attbi.com";

Page 805: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

publicvoiddoGet(HttpServletRequestrequest,

HttpServletResponseresponse)throwsServletException,

java.io.IOException{

response.setContentType("text/html");

java.io.PrintWriterout=response.getWriter();

out.println("<html><head><title>EmailReader</title></head><body>");

handleMessages(request,out);

out.println("</body></html>");

}//doGet

privatevoidhandleMessages(HttpServletRequestrequest,

PrintWriterout)throwsIOException,ServletException{

HttpSessionhttpSession=request.getSession();

Stringuser=(String)httpSession.getAttribute("user");

Stringpassword=(String)httpSession.getAttribute("pass");

StringpopAddr=(String)httpSession.getAttribute("pop");

StorepopStore=null;

Folderfolder=null;

if(!check(popAddr))

popAddr=HeaderAccessor.DEFAULT_SERVER;

try{

if((!check(user))||(!check(password)))

thrownewServletException(

"Avalidusernameandpasswordisrequiredtocheckemail.");

Propertiesproperties=System.getProperties();

Sessionsession=Session.getDefaultInstance(properties);

popStore=session.getStore("pop3");

popStore.connect(popAddr,user,password);

folder=popStore.getFolder("INBOX");

Page 806: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

if(!folder.exists())

thrownewServletException(

"An'INBOX'folderdoesnotexistfortheuser.");

folder.open(Folder.READ_ONLY);

Message[]messages=folder.getMessages();

intmsgLen=messages.length;

if(msgLen==0)

out.println(

"<h2>TheINBOXfolderdoesnotyetcontainany"+

"emailmessages.</h2>");

for(inti=0;i<msgLen;i++){

displayMessage(messages[i],out);

out.println("<br/><br/>");

}//for

}catch(Exceptionexc){

out.println(

"<h2>Sorry,anerroroccurredwhileaccessingthe"+

"emailmessages.</h2>");

out.println(exc.toString());

}finally{

try{

if(folder!=null)

folder.close(false);

if(popStore!=null)

popStore.close();

Page 807: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

}catch(Exceptione){}

}

}//handleMessages

privatevoiddisplayMessage(Messagemsg,PrintWriterout)

throwsMessagingException,IOException{

if(msg!=null&&msg.getContent()instanceofString){

if(msg.getFrom()[0]instanceofInternetAddress){

out.println(

"Messagereceivedfrom:"+

((InternetAddress)msg.getFrom()[0]).getAddress()+"<br/>");

}

out.println("Messagecontenttype:"+msg.getContentType()+

"<br/>");

out.println(

"Messagebodycontent:"+(String)msg.getContent());

//Listeachoftheemailheadersusingaultag

out.println("<ul>");

Headerhead=null;

Enumerationheaders=msg.getAllHeaders();

while(headers.hasMoreElements()){

head=(Header)headers.nextElement();

out.println(

"<li>"+head.getName()+":"+head.getValue()+"</li>");

}//while

out.println("</ul>");

}else{

out.println(

"<h2>Thereceivedemailmessagewasnot"+

Page 808: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

"atextcontenttype.</h2>");

}

}//displayMessage

privatebooleancheck(Stringvalue){

if(value==null||value.equals(""))

returnfalse;

returntrue;

}

}

Figure20-3showsthebrowserdisplayoftheservletinExample20-9.Eachoftheheadersisprecededbyabulletcharacter,followedbytheheadername,acolon,andtheheadervalue.

Figure20-3.Aservletaccessesanemailanddisplaysitsheaders

Page 809: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

SeeAlso

SunMicrosystem'sJavaMailAPIpage:http://java.sun.com/products/javamail/;Recipe20.1onaddingJavaMail-relatedJARstoyourwebapplication;Recipe20.2onsendingemailfromaservlet;Recipe20.3onsendingemailusingaJavaBean;Recipe20.4coveringhowtoaccessemailinaservlet;Recipe20.5onaccessingemailwithaJavaBean;Recipe20.6onhandlingattachmentsinaservlet;Recipe20.7onaddingattachmentstoanemailmessage.

Page 810: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Chapter21.AccessingDatabasesIntroduction

Recipe21.1.AccessingaDatabasefromaServletWithoutDataSource

Recipe21.2.ConfiguringaDataSourceinTomcat

Recipe21.3.UsingaDataSourceinaServletwithTomcat

Recipe21.4.CreatingaDataSourceonWebLogic

Recipe21.5.UsingaJNDILookuptogetaDataSourcefromWebLogic

Recipe21.6.UsingaDataSourcefromWebLogicinaJSP

Recipe21.7.CallingaStoredProcedurefromaServlet

Recipe21.8.CallingaStoredProcedurefromaJSP

Recipe21.9.ConvertingaResultSettoaResultObject

Recipe21.10.ExecutingSeveralSQLStatementsWithinaSingleTransaction

Recipe21.11.UsingTransactionswithJSPs

Recipe21.12.FindingInformationaboutaResultSet

Page 811: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Introduction

IfyouareaJavawebdeveloperwhohasneverwrittendatabase-relatedcode,Ihavesomeadviceforyou:don'tholdyourbreathuntilyoureceivethistypeofassignment!

TheserecipesshowyouhowtoaccessadatabaseresourcebyusingaJavaNamingandDirectoryInterface(JNDI)lookup,whichisthemostefficient(andprobablythemostcommon)methodofaccessingdatabaseresourcesinaportablemanner.JNDIisaJavaAPIthatisdesignedtostoreobjectsinahierarchicaltreestructure,similartoafilesystemcomposedofdirectories,subdirectories,andfiles.ServletsandJSPscanthenusethemethodsoftheJNDIAPI(shownbyseveralexamplesinthischapter)toobtainreferencesfromJavaobjects,suchasJavaBeans,andusethemintheirprograms.

Fordatabasecode,thisusuallymeansjavax.sql.DataSourceobjects,whicharefactoriesfordatabaseconnections.TheDataSourcesprovide"connectionpools,"anotherveryimportantwebdatabasetool.Connectionpoolsaregroupsofdatabaseconnectionssharedbyservlets,JSPs,andotherclasses.ApplicationserverssuchasWebLogicusuallyallowyoutodeterminehowmanyconnectionsarestoredinthepool,whichdatabasetablecanbeusedbytheservertoautomaticallytestaconnectiontodetermineifitisfittobereturnedtothesharedpool,andotherpoolproperties.

TheserecipesexplainthebasicsofsettingupaconnectionpoolonbothTomcatandWebLogic.

Therecipesalsocoversomeotherpracticaldatabasetopics,suchashowtocallstoredproceduresinservletsandJSPs,aswellashowtoincludemorethanoneStructuredQueryLanguage(SQL)statementinatransaction.

Page 812: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe21.1AccessingaDatabasefromaServletWithoutDataSource

Problem

YouwanttoaccessadatabasefromaservletwithoutaDataSourceconfigurationforthedatabase.

Solution

UsetheJavaDatabaseConnectivity(JDBC)APItoaccessajava.sql.Connectionobjectthatconnectstheservletwiththedatabase.

Discussion

Onoccasion,developersrequireaquick,lesselegantsolutiontoaccessingadatabase.Thisrecipeexplainshowtousethejava.sql.DriverManagerclasstoobtainaconnectiontoadatasourceinaservlet.TheDriverManagerclasscommunicateswithadatabasedriver,whichissoftwarethatallowsJavacodetointeractwithaparticulardatabase,suchasMySQLorOracle.

Thepreferreddesignistouseajavax.sql.Datasourcetogetadatabaseconnectionfromaconnectionpool,asdescribedinRecipe21.2-Recipe21.6.

Example21-1accomplishesthistaskinitsdoGet()servicemethod.

Page 813: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Example21-1.AservletaccessesadatabaseusingtheJDBCAPI

packagecom.jspservletcookbook;

importjava.sql.*;

importjavax.servlet.*;

importjavax.servlet.http.*;

publicclassDatabaseServletextendsHttpServlet{

publicvoiddoGet(HttpServletRequestrequest,

HttpServletResponseresponse)throwsServletException,

java.io.IOException{

Stringsql="select*fromathlete";

Connectionconn=null;

Statementstmt=null;

ResultSetrs=null;

ResultSetMetaDatarsm=null;

response.setContentType("text/html");

java.io.PrintWriterout=response.getWriter();

out.println(

"<html><head><title>ServletDatabaseAccess</title></head><body>");

out.println("<h2>Databaseinfo</h2>");

out.println("<tableborder='1'><tr>");

try{

Page 814: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

//loadthedatabasedriver

Class.forName("oracle.jdbc.driver.OracleDriver");

//TheJDBCURLforthisOracledatabase

Stringurl="jdbc:oracle:thin:@192.168.0.2:1521:ORCL";

//Createthejava.sql.Connectiontothedatabase,usingthe

//correctusernameandpassword

conn=DriverManager.getConnection(url,"scott","tiger");

//CreateastatementforexecutingsomeSQL

stmt=conn.createStatement();

//ExecutetheSQLstatement

rs=stmt.executeQuery(sql);

//Getinfoaboutthereturnvalueintheformof

//aResultSetMetaDataobject

rsm=rs.getMetaData();

intcolCount=rsm.getColumnCount();

//printcolumnnamesintableheadercells

for(inti=1;i<=colCount;++i){

out.println("<th>"+rsm.getColumnName(i)+"</th>");

}

out.println("</tr>");

while(rs.next()){

out.println("<tr>");

//printthevaluesforeachcolumn

Page 815: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

for(inti=1;i<=colCount;++i)

out.println("<td>"+rs.getString(i)+"</td>");

out.println("</tr>");

}

}catch(Exceptione){

thrownewServletException(e.getMessage());

}finally{

try{

//thiswillcloseanyassociatedResultSets

if(stmt!=null)

stmt.close();

if(conn!=null)

conn.close();

}catch(SQLExceptionsqle){}

}//finally

out.println("</table><br><br>");

out.println("</body>");

out.println("</html>");

}//doGet

}

Herearethestepsneededtorunaservlet,asshowninExample21-1:

Page 816: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

1. TaketheJARfilethatcontainsyourdatabasedriver,andstoreiteitherinacommonserverdirectory,suchasTomcat's<Tomcat-root>/common/libdirectoryorintheWEB-INF/libdirectoryofyourwebapplication.

ChangetheextensionoftheOracleJDBCdriver(suchasclasses12.zip)to.jar,sothattheJavaclassesthatitcontainscanbeloadedproperlyintotheJVM.

2. DerivethedatabaseURLfromvendorliterature,andtheusernameandpasswordforthedatabasefromadatabaseadministrator(thatmightbeyou!)orotherappropriatemeans.Thecodewillnotbeabletoaccessthedatabasewithoutavalidusernameandpassword.

Thedownsideofthisapproachisthatyouaremixingupsensitivedatabasesecurityinformationwithservletcode.Itmakesmoresensetoadoptthestrategiesthattheupcomingfiverecipesdescribe,beginningwithRecipe21.2,"ConfiguringaDataSourceinTomcat."

Figure21-1showstheresultofrunningthisservlet.

Figure21-1.Aservletthatdisplayssomedatabaseinformation

Page 817: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Chapter23ontheJSTLshowshowtouseaJSPtoaccessadatabasewithoutaDataSourceconfiguration.

SeeAlso

TheJDBCspecification:http://java.sun.com/products/jdbc/download.html;Recipe21.2-Recipe21.6onconfiguringandusingDataSourcesonTomcatandWebLogic;Recipe21.7andRecipe21.8oncallingstoredproceduresfromservletsandJSPs;Recipe21.9onconvertingajava.sql.ResultSetobjecttoajavax.servlet.jsp.jstl.sqlResult;Recipe21.10andRecipe21.11onusingtransactionsinservletsandJSPs;Recipe21.12onfindingoutinformationaboutaResultSet.

Page 818: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe21.2ConfiguringaDataSourceinTomcat

Problem

Youwanttoconfigureajavax.sql.DataSourceforuseinaservletwiththeTomcatwebcontainer.

Solution

CreatearesourceelementinTomcat'sserver.xmlfileandanassociatedresource-refelementintheweb.xmldeploymentdescriptor.

Discussion

TomcatmakesiteasytosetupaconnectionpoolsothatservletsandJSPscanefficientlysharedatabaseconnections.Inwebsitesthathavemanysimultaneoususers,aconnectionpoolimprovesefficiencybysharingexistingdatabaseconnections,ratherthancreatinganewconnectionandtearingitdowneverytimeanapplicationhastousethedatabase.

AnotherbenefitofconfiguringaconnectionpoolisthatyoucanchangethedatabasesystemthataservletorJSPisusingwithouttouchingtheJavacode,becausethedatabaseresourceisconfiguredoutsideoftheservletorJSP.

HerearethestepsforconfiguringaDataSourcewithTomcat:

1. CreateaResourceandaResourceParamselementinserver.xml,orintheXMLfilethatyouhaveplacedinTomcat's

Page 819: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

webappsdirectory.TheseelementsdescribetheJNDIobjectyouarecreatinginordertoprovideyourservletsorJSPswithaDataSource.

Addaresource-refelementtoweb.xml,whichallowsthecomponentsintheassociatedwebapplicationtoaccesstheconfiguredDataSource.

Example21-2showstheResourceandaResourceParamselementsinserver.xml.ThisexampledescribesaDataSourcethatconnectswithanOracle8idatabase.

Example21-2.Theresourceelementinserver.xml

<Resourcename="jdbc/oracle-8i-athletes"scope=

"Shareable"type="javax.sql.DataSource"auth=

"Container"description="HomeOracle8iPersonalEdition"/>

<ResourceParamsname="jdbc/oracle-8i-athletes">

<parameter>

<name>driverClassName</name>

<value>oracle.jdbc.driver.OracleDriver</value>

</parameter>

<parameter>

<name>url</name>

<value>jdbc:oracle:thin:@192.168.0.2:1521:ORCL</value>

</parameter>

<parameter>

<name>username</name>

<value>scott</value>

</parameter>

Page 820: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<parameter>

<name>password</name>

<value>tiger</value>

</parameter>

</ResourceParams>

CreateaResourceandResourceParamselementforeachdatabasethatyourapplicationuses.Example21-3showstheresource-refelementassociatedwiththeResourcespecifiedbyExample21-2.

Example21-3.Aresource-refelementspecifiesaDataSourceinweb.xml

<!--topofweb.xmlfile-->

<resource-ref>

<res-ref-name>jdbc/oracle-8i-athletes</res-ref-name>

<res-type>javax.sql.DataSource</res-type>

<res-auth>Container</res-auth>

</resource-ref>

<!--restofweb.xmlfile-->

TheJNDIpathtothisDataSource,whichyouuseinaJNDIlookup(seethenextrecipe),isjdbc/oracle-8i-athletes.

Theservlet2.4APIdoesnotrequiretheweb.xmlelementssuchasresource-reftoappearinaspecificorder.Theservlet2.3APIspecifiestheordertheseelementsmustappearinwithaDocumentTypeDefinition(DTD).SeeChapter1.

Page 821: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

SeeAlso

TheJDBCspecification:http://java.sun.com/products/jdbc/download.html;Recipe21.3onusingaDataSourceinaservletwithTomcat;Recipe21.4-Recipe21.6onconfiguringandusingDataSourceswithservletsandJSPsonWebLogic;Recipe21.7andRecipe21.8oncallingstoredproceduresfromservletsandJSPs;Recipe21.9onconvertingajava.sql.ResultSetobjecttoajavax.servlet.jsp.jstl.sqlResult;Recipe21.10andRecipe21.11onusingtransactionsinservletsandJSPs;Recipe21.12onfindingoutinformationaboutaResultSet.

Page 822: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe21.3UsingaDataSourceinaServletwithTomcat

Problem

YouwanttouseaDataSourcethatyouhaveconfiguredwithTomcat.

Solution

UsetheJNDIAPIclassestoobtaintheDataSource,thenaccessadatabaseconnectionfromthatDataSource.

Discussion

Useclassesfromthejavax.namingpackagetoaccesstheconfiguredDataSource.Forexample,useajavax.naming.InitialContextobjecttolookupaDataSourcethathasbeenboundasaJNDIobject.

Thejavax.namingpackageisapartoftheJavaPlatformStandardEdition1.3and1.4.

Example21-4instantiatesajavax.sql.DataSourceinstancevariableinitsinit()method,whichtheservletcontainercallswhenitcreatesaservletinstance.InTomcat,JNDIobjectsarestoredundertherootlevelspecifiedbythe"java:comp/env"string.

Page 823: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Example21-4.UsingaDataSourceinaservlet

packagecom.jspservletcookbook;

importjava.sql.*;

importjavax.naming.Context;

importjavax.naming.InitialContext;

importjavax.naming.NamingException;

importjavax.sql.*;

importjavax.servlet.*;

importjavax.servlet.http.*;

publicclassDbServletextendsHttpServlet{

DataSourcepool;

publicvoidinit()throwsServletException{

Contextenv=null;

try{

env=(Context)newInitialContext().lookup("java:comp/env");

//LookupaDataSource,whichrepresentsaconnectionpool

pool=(DataSource)env.lookup("jdbc/oracle-8i-athletes");

if(pool==null)

thrownewServletException(

"'oracle-8i-athletes'isanunknownDataSource");

}catch(NamingExceptionne){

Page 824: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

thrownewServletException(ne.getMessage());

}//try

}

publicvoiddoGet(HttpServletRequestrequest,

HttpServletResponseresponse)

throwsServletException,java.io.IOException{

Stringsql="select*fromathlete";

Connectionconn=null;

Statementstmt=null;

ResultSetrs=null;

ResultSetMetaDatarsm=null;

//StartbuildingtheHTMLpage

response.setContentType("text/html");

java.io.PrintWriterout=response.getWriter();

out.println(

"<html><head><title>TypicalDatabaseAccess</title></head><body>");

out.println("<h2>Databaseinfo</h2>");

out.println("<tableborder='1'><tr>");

try{

//GetaConnectionfromtheconnectionpool

conn=pool.getConnection();

//CreateaStatementobjectthatcanbeusedtoexecute

//aSQLquery

Page 825: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

stmt=conn.createStatement();

//executeasimpleSELECTquery

rs=stmt.executeQuery(sql);

//GettheResultSetMetaDataobjectsowecandynamically

//displaythecolumnnamesintheResultSet

rsm=rs.getMetaData();

intcolCount=rsm.getColumnCount();

//printcolumnnamesintableheadercells

for(inti=1;i<=colCount;++i){

out.println("<th>"+rsm.getColumnName(i)+"</th>");

}

out.println("</tr>");

//whiletheResultSethasmorerows...

while(rs.next()){

out.println("<tr>");

//Printeachcolumnvalueforeachrowwiththe

//ResultSet.getString()method

for(inti=1;i<=colCount;++i)

out.println("<td>"+rs.getString(i)+"</td>");

out.println("</tr>");

}//while

}catch(Exceptione){

thrownewServletException(e.getMessage());

Page 826: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

}finally{

try{

//WhenaStatementobjectisclosed,anyassociated

//ResultSetisclosed

if(stmt!=null)

stmt.close();

//VERYIMPORTANT!ThiscodereturnstheConnectiontothe

//pool

if(conn!=null)

conn.close();

}catch(SQLExceptionsqle){}

}

out.println("</table></body></html>");

}//doGet

}

Example21-4getsaDataSourcebyusingtheaddressconfiguredinTomcat(Recipe21.2;jdbc/oracle-8i-athletes)inaJNDIlookup.Thiscodelookslikethis:

env=(Context)newInitialContext().lookup("java:comp/env");

//LookupaDataSource,whichrepresentsaconnectionpool

pool=(DataSource)env.lookup("jdbc/oracle-8i-athletes");

ThecodethenobtainsadatabaseconnectionfromtheconnectionpoolbycallingtheDataSourceobject'sgetConnection()method.ItisveryimportanttocalltheConnectionobject'sclose()methodwhentheservletisfinishedwithit,becausethismethodcallreturnsthesharedConnectiontothepool.

Page 827: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

RequestingtheservletofExample21-4inabrowsercreatesoutputthatlooksjustlikeFigure21-1.

Chapter23ontheJSTLshowshowtouseaJSPtoaccessadatabasewithaDataSourceconfiguration.

SeeAlso

TheJDBCspecification:http://java.sun.com/products/jdbc/download.html;Recipe21.1onaccessingadatabasefromaservletwithoutaconnectionpool;Recipe21.2onconfiguringaDataSourceonTomcat;Recipe21.4-Recipe21.6onconfiguringandusingDataSourcewithservletsandJSPsonWebLogic;Recipe21.7andRecipe21.8oncallingstoredproceduresfromservletsandJSPs;Recipe21.9onconvertingajava.sql.ResultSetobjecttoajavax.servlet.jsp.jstl.sqlResult;Recipe21.10andRecipe21.11onusingtransactionsinservletsandJSPs;Recipe21.12onfindingoutinformationaboutaResultSet.

Page 828: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe21.4CreatingaDataSourceonWebLogic

Problem

Youwanttocreateajavax.sql.DataSourceonBEAWebLogicforuseinyourservlets.

Solution

UsetheWebLogicconsoletoconfigureanewconnectionpool,thenconfigureanewDataSourceassociatedwiththatpool.

Discussion

ConfiguringaWebLogicDataSourceinvolvesthefollowingsteps:

1. LogintotheWebLogicconsole,whichallowsyoutomanagetheWebLogicserverfromabrowser.TheURLfortheconsoleistypicallyhttp://<localhost:7001>/console(substituteyourhostnamefor"localhost"andtheportnumberthatmatchesyourownWebLogicconfiguration).

ClickonYour-domain-name Services JDBC ConnnectionPoolsonthemenutreeintheconsole'slefthandcolumn.Thenclickon"ConfigureanewJDBCConnectionPool...".

Intheresultingwindow,enteranamefortheconnectionpool,theJDBCURL(e.g.,jdbc:oracle:thin:@192.168.0.2:1521:ORCL),theDriverclassname(e.g.,oracle.jdbc.driver.OracleDriver),aswellastheusernameandpasswordinthe"Properties"textfield.Figure

Page 829: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

21-2showsaconfiguredconnectionpoolnamed"OraclePool."Rememberthisnameyou'llneedittoconfigureaDataSourcefurtheralongintheprocess.

Figure21-2.CreatingaconnectionpoolwiththeWebLogicconsoleapplication

4. Clickonthe"Create"buttoninthiswindowtocreatetheconnectionpool,thenchoosethe"Targets"tab.Theresultingscreenallowsyoutochooseaservertowhichtheconnectionpoolwillapply.Afteryouhavechosentheserver,clickonthe"Apply"buttonintheTargetsscreen.Thenameofthenewpoolshouldappearinthelefthandmenuframe.

ClickonYour-domain-name Services JDBC DataSourcesandclickontheURL"ConfigureaNewJDBCDataSource...".Figure21-3showsaDataSourceconfigurationwindowthatincludestheDataSourcename("oracle-8i-athletes")underwhichWebLogicwillbindtheDataSourceasaJNDIobject.Thewindowalsohasatextfieldwhereyoumustenterthenameoftheconnectionpoolthatyoujustconfigured:"OraclePool."Clickthe"Create"buttontocreatethenew

Page 830: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

DataSource.Figure21-3showstheJDBCDataSourceswindow.

Takethesamestepsasinstep4withthe"Targets"screentoapplythisDataSourcetotheappropriateserver.Painless,right?

Figure21-3.CreatingaDataSourcewiththeWebLogicconsoleapplication

Figure21-4showstheWebLogicJNDItreewheretheDataSourcethatyouhavejustcreatedisbound.

Figure21-4.AviewoftheWebLogicJNDItreecontainingtheDataSource

Page 831: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

SeeAlso

TheJDBCspecification:http://java.sun.com/products/jdbc/download.html;Chapter2ondeployingservletsandJSPsonWebLogic;Recipe21.2andRecipe21.3onusingaDataSourceonTomcat;Recipe21.5andRecipe21.6onusingDataSourceswithservletsandJSPsonWebLogic.

Page 832: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe21.5UsingaJNDILookuptogetaDataSourcefromWebLogic

Problem

YouwanttouseaJNDIlookuptoaccessaWebLogicDataSource.

Solution

UsetheJNDIAPIandtheclassesinthejavax.namingpackagetogettheJNDIobjectthatyouhaveboundonWebLogic.

Discussion

AccessingaConnectionfromaWebLogicDataSourceandconnectionpoolusessimilarJavacodecomparedwithTomcat.

1. SetuptheconnectionpoolandDataSourcebyfollowingRecipe21.4sinstructions.

Intheservletcode,gettheDataSourcebyusingaJNDIlookup.Thisinvolvescreatinganinstanceofajavax.naming.InitialContextandthencallingitslookup()methodwiththenamethatyougaveyourDataSource(Recipe21.4).

GetaConnectionfromtheDataSourcebycallingtheDataSource'sgetConnection()method.

Example21-5createsaninstanceofanInitialContextbypassinginaHashtablethatcontainssomepropertyvalues.

Page 833: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Example21-5.AservletthatusesaWebLogicconnectionpool

packagecom.jspservletcookbook;

importjava.util.Hashtable;

importjava.sql.*;

importjavax.naming.Context;

importjavax.naming.InitialContext;

importjavax.naming.NamingException;

importjavax.sql.*;

importjavax.servlet.*;

importjavax.servlet.http.*;

publicclassWeblogicDbServletextendsHttpServlet{

DataSourcepool;

publicvoidinit()throwsServletException{

Contextenv=null;

Hashtableht=newHashtable();

//Createpropertynames/valuesthatwillbepassedto

//theInitialContextconstructor

ht.put(Context.INITIAL_CONTEXT_FACTORY,

"weblogic.jndi.WLInitialContextFactory");

//t3://localhost:7001isthedefaultvalue

//Addyourownvalueifnecessary:

Page 834: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

//ht.put(Context.PROVIDER_URL,"t3://localhost:7001");

try{

env=newInitialContext(ht);

pool=(javax.sql.DataSource)env.lookup(

"oracle-8i-athletes");

if(pool==null)

thrownewServletException(

"'oracle-8i-athletes'isanunknownDataSource");

}catch(NamingExceptionne){

thrownewServletException(ne);

}

}

publicvoiddoGet(HttpServletRequestrequest,

HttpServletResponseresponse)

throwsServletException,java.io.IOException{

Stringsql="select*fromathlete";

Connectionconn=null;

Statementstmt=null;

ResultSetrs=null;

ResultSetMetaDatarsm=null;

response.setContentType("text/html");

java.io.PrintWriterout=response.getWriter();

out.println(

Page 835: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

"<html><head><title>WeblogicDatabaseAccess</title></head><body>");

out.println("<h2>Databaseinfo</h2>");

out.println("<tableborder='1'><tr>");

try{

conn=pool.getConnection();

stmt=conn.createStatement();

rs=stmt.executeQuery(sql);

rsm=rs.getMetaData();

intcolCount=rsm.getColumnCount();

//printcolumnnames

for(inti=1;i<=colCount;++i){

out.println("<th>"+rsm.getColumnName(i)+"</th>");

}

out.println("</tr>");

while(rs.next()){

out.println("<tr>");

for(inti=1;i<=colCount;++i)

out.println("<td>"+rs.getString(i)+"</td>");

out.println("</tr>");

}

}catch(Exceptione){

Page 836: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

thrownewServletException(e.getMessage());

}finally{

try{

if(stmt!=null)

stmt.close();

//RETURNTHECONNECTIONTOTHEPOOL!

if(conn!=null)

conn.close();

}catch(SQLExceptionsqle){}

}

out.println("</table></body></html>");

}//doGet

}

OnceyouhaveaccessedaConnectionfromtheWebLogicconnectionpool,thecodecanexecutevariousSQLstatementsinordertointeractwiththeassociateddatabase.AlwayscalltheConnection'sclose()methodwhenyouarefinishedwiththeConnection,becausethismethodcallreturnsthesharedConnectiontothepool.

Example21-5cannotworkwithoutaproperlyconfiguredconnectionpoolandDataSource,whichisveryeasytodowiththeWebLogicconsole(asexplainedinRecipe21.4).

TheservletoutputlooksjustlikeFigure21-1,exceptforthedifferentURLinthewebbrowser'saddressfield(http://localhost:7001/dbServlet).

Page 837: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

SeeAlso

TheJDBCspecification:http://java.sun.com/products/jdbc/download.html;Recipe21.1onaccessingadatabasefromaservletwithoutaconnectionpool;Recipe21.2andRecipe21.3onusingaDataSourceonTomcat;Recipe21.6onusingaDataSourcewithaJSPonWebLogic;Recipe21.7andRecipe21.8oncallingstoredproceduresfromservletsandJSPs;Recipe21.9onconvertingajava.sql.ResultSetobjecttoajavax.servlet.jsp.jstl.sqlResult;Recipe21.10andRecipe21.11onusingtransactionsinservletsandJSPs;Recipe21.12onfindingoutinformationaboutaResultSet.

Page 838: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe21.6UsingaDataSourcefromWebLogicinaJSP

Problem

Youwanttousethejavax.sql.DataSourcethatyousetuponWebLogicinaJSP.

Solution

UseJSPscriptletstoaccesstheDataSourcewithaJNDIlookup,thenusetheJDBCAPIinthescriptletstoaccessthedatabase.

Discussion

TheJSPinExample21-6transplantscodefromaservletinsideofHTMLtemplatetext.TheJSPusesscriptlets,whichcontainJavacodewithin"<%%>"characters.

JSTLSQLtagsarepreferabletoscriptletsinaJSP;however,theJSTLimplementationIuseforthisbook'sexamplescannotaccessaDataSourcefromWebLogic'sJNDIimplementation.SeeRecipe23.6foranexamplethatusestheJSTLSQLtagswithaTomcatDataSource.

Example21-6importsthenecessaryclassesatthetopofthecodeusingthepagedirectiveanditsimportattribute.Otherwise,thisJSPaccomplisheseverythingthattheservletofthepriorrecipedoes,

Page 839: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

includingthedisplayofnearlyidenticaloutputinthewebbrowser(seeFigure21-1inRecipe21.1).

Example21-6.UsingaJSPscriptlettoaccessaWebLogicDataSource

<%@pageimport="java.util.Hashtable,java.sql.*,javax.naming.*,javax.sql.*"%>

<html>

<head><title>DatabaseQueryinWebLogic</title></head>

<body>

<h2>QueryingadatabasewithaJSPinWebLogic</h2>

<%

Contextenv=null;

DataSourcepool=null;

Hashtableht=newHashtable();

ht.put(Context.INITIAL_CONTEXT_FACTORY,

"weblogic.jndi.WLInitialContextFactory");

ht.put(Context.PROVIDER_URL,"t3://localhost:7001");

env=newInitialContext(ht);

//LookupthisDataSouceatthetopleveloftheWebLogicJNDItree

pool=(DataSource)env.lookup("oracle-8i-athletes");

Stringsql="select*fromathlete";

Connectionconn=null;

Statementstmt=null;

ResultSetrs=null;

ResultSetMetaDatarsm=null;%>

Page 840: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<tableborder='1'><tr>

<%

try{

//getajava.sql.Connectionfromthepool

conn=pool.getConnection();

stmt=conn.createStatement();//createajava.sql.Statement

//executeaSQLstatement,generatingaResultSet

rs=stmt.executeQuery(sql);

rsm=rs.getMetaData();

intcolCount=rsm.getColumnCount();

//printcolumnnames

for(inti=1;i<=colCount;++i){%>

<th><%=rsm.getColumnName(i)%></th>

<%}%>

</tr>

<%while(rs.next()){%>

<tr>

<%for(inti=1;i<=colCount;++i){%>

<td><%=rs.getString(i)%></td>

<%}//for%>

</tr>

<%}//while

}catch(Exceptione){

Page 841: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

thrownewJspException(e.getMessage());

}finally{

try{

stmt.close();

conn.close();

}catch(SQLExceptionsqle){}

}%>

</body>

</html>

AftermakingsurethatyouhaveproperlyconfiguredtheconnectionpoolandDataSourceintheWebLogicconsole,viewthisJSP'soutputbycopyingittoWebLogic'sdefaultwebapplication,thenrequestaURLinyourbrowserthatlookslikethisone:http://localhost:7001/sqlWeblogic.jsp.

SeeAlso

TheJDBCspecification:http://java.sun.com/products/jdbc/download.html;Chapter2ondeployingservletsandJSPsonWebLogic;Recipe21.1onaccessingadatabasefromaservletwithoutaconnectionpool;Recipe21.2andRecipe21.3onusingaDataSourceonTomcat;Recipe21.4andRecipe21.5onusingDataSourceswithservletsonWebLogic;Recipe21.7andRecipe21.8oncallingstoredproceduresfromservletsandJSPs;Recipe21.9onconvertingajava.sql.ResultSetobjecttoajavax.servlet.jsp.jstl.sqlResult;Recipe21.10andRecipe21.11onusingtransactionsinservletsandJSPs;Recipe21.12on

Page 842: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

findingoutinformationaboutaResultSet.

Page 843: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe21.7CallingaStoredProcedurefromaServlet

Problem

Youwanttocallastoredprocedurefromaservlet.

Solution

Usethejava.sql.CallableStatementclassinsideaservletservicemethod,suchasdoGet()ordoPost().

Discussion

DatabasedeveloperscreatestoredprocedurestypicallyforSQLcodethattheywanttoexecuteonaregularbasis,similartoaJavadeveloper'sreasonforcreatingamethod.AstoredprocedureisapieceofSQLthatthedatabasesystempre-compilesunderaspecificname.ThestoredprocedurethatIuseinthisrecipeisnamedaddEvent.

Naturally,awebdeveloperwhoisusingadatabasewillwanttocallthesestoredprocedures.Thejava.sql.CallableStatementclassencapsulatesaparticularstoredprocedure,sothatyoucanusethesetoolswithinJDBCcode.

Table21-1showsthetableschemaforthetablethataddEventuses.Thetablehasfourcolumns:EVENT_ID,NAME,LOCATION,andRACEDATE.

Table21-1.TheRACEEVENTdatabasetableschema

Page 844: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Name Null? Type

EVENT_ID NOTNULL NUMBER

NAME NOTNULL VARCHAR2(30)

LOCATION NOTNULL VARCHAR2(30)

RACEDATE DATE

Example21-7showstheaddEventdefinitionusingOracle8i'ssyntax.Thisstoredproceduretakesaneventname,location,anddateasarguments.IttheninsertsthesevaluesintoanewrowintheRACEEVENTtable.

Apieceofcodecalledasequencenamedlog_seqprovidesthevalueforthenewrow'sEVENT_IDcolumn.InOracle'sdatabasesystem,asequencecankeeptrackofalongsequenceofnumbers.Thedatabasedevelopercreatesthesequence,justastheywouldcreateastoredprocedure.

Example21-7.ASQLstoredproceduredesignedtoaddarowtotheEVENTtable

createorreplaceprocedureaddEvent(eventnameinvarchar2,

location_invarchar2,date_indate)

as--needtodoinsertsinraceevent

begin

insertintoraceeventvalues(log_seq.nextval,

eventname,location_,date_);

end;

Page 845: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

/

Ifyou'reusingadatabasetoolsuchasSQLPLUSfromthecommandline,calltheaddEventprocedureinthefollowingmanner:

execaddEvent('FalmouthTriathlon','FalmouthMA','26-Jul-2003');

Example21-8showshowyoucancalladdEventinaservlet.ThefollowingservletcallsthestoredprocedurefromdoGet()initsownaddRaceEventmethod.Thismethodhasajava.util.Listasanargument.TheListcontainsthevaluesthatthecodeusesasargumentstocalltheaddEventstoredprocedure.

Example21-8.AservletusesCallableStatementtocallthestoredprocedure

packagecom.jspservletcookbook;

importjava.sql.*;

importjava.util.ArrayList;

importjava.util.List;

importjava.util.Iterator;

importjavax.naming.Context;

importjavax.naming.InitialContext;

importjavax.naming.NamingException;

importjavax.sql.*;

importjavax.servlet.*;

importjavax.servlet.http.*;

publicclassStoredProcServletextendsHttpServlet{

DataSourcepool;

Page 846: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

publicvoidinit()throwsServletException{

Contextenv=null;

try{

env=(Context)newInitialContext().lookup("java:comp/env");

pool=(DataSource)env.lookup("jdbc/oracle-8i-athletes");

if(pool==null)

thrownewServletException(

"'oracle-8i-athletes'isanunknownDataSource");

}catch(NamingExceptionne){

thrownewServletException(ne);

}

}

publicvoiddoGet(HttpServletRequestrequest,

HttpServletResponseresponse)

throwsServletException,java.io.IOException{

StringeventName=request.getParameter("eName");

Stringlocation=request.getParameter("eLocation");

Stringdate=request.getParameter("eDate");

ListparamList=newArrayList();

paramList.add(eventName);

paramList.add(location);

paramList.add(date);

try{

addRaceEvent(paramList);

Page 847: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

}catch(SQLExceptionsqle){

thrownewServletException(sqle.getMessage());

}//try

response.setContentType("text/html");

java.io.PrintWriterout=response.getWriter();

out.println("<html><head><title>AddanEvent</title></head><body>");

out.println(

"<h2>TheEventnamed"+eventName+

"hasbeenaddedtothedatabase</h2>");

out.println("</body>");

out.println("</html>");

}//doGet

publicConnectiongetConnection(){

Connectionconn=null;

try{

conn=pool.getConnection();

}catch(SQLExceptionsqle){

thrownewServletException(sqle.getMessage());

}finally{

returnconn;

Page 848: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

}

}

publicvoidaddRaceEvent(Listvalues)throwsSQLException{

if(values==null)

thrownewSQLException(

"InvalidparameterinaddRaceEventmethod.");

Connectionconn=null;

conn=getConnection();

if(conn==null)

thrownewSQLException(

"InvalidConnectioninaddRaceEventmethod");

Iteratorit=values.iterator();

CallableStatementcs=null;

//CreateaninstanceoftheCallableStatement

cs=conn.prepareCall("{calladdEvent(?,?,?)}");

for(inti=1;i<=values.size();i++)

cs.setString(i,(String)it.next());

//CalltheinheritedPreparedStatement.executeUpdate()method

cs.executeUpdate();

//returntheconnectiontothepool

conn.close();

}//addRaceEvent

}

Page 849: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Example21-8getsaConnectionfromaconnectionpoolusingthetechniquesexplainedinthepriorrecipes.ThecodeusestheConnectiontocreateaCallableStatementthattheexamplecanusetocalltheunderlyingstoredprocedure:

cs=conn.prepareCall("{calladdEvent(?,?,?)}");

TheStringargumenttotheConnection'sprepareCallmethodcontainsquestionmarks(?)asplaceholdersforthestoredprocedure'sparameters.ThecodethencallstheCallableStatement'ssetString()methodtogivetheseplaceholdersvalues.Finally,thecodecallstheCallableStatement'sexecuteUpdate()methodtoexecuteaddEvent.

Ifcallingthestoredprocedurecausesadatabaseerror,theaddRaceEventmethodthrowsaSQLException.

Theservletreceivesvaluesforthenewrowfromrequestparameters.ThefollowingURLcallstheservletwiththreeparameters:eName,eLocation,andeDate:

http://localhost:8080/home/servlet/com.jspservletcookbook.

StoredProcServlet?eName=

Falmouth%20Triathlon&eLocation=Falmouth%20MA&eDate=26-July-2003

Figure21-5showstheservlet'soutputinawebbrowser.

Figure21-5.ThebrowseroutputoftheStoredProcServlet

Page 850: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

SeeAlso

TheJDBCspecification:http://java.sun.com/products/jdbc/download.html;Recipe21.1onaccessingadatabasefromaservletwithoutaconnectionpool;Recipe21.2andRecipe21.3onusingaDataSourceonTomcat;Recipe21.4-Recipe21.6onusingDataSourceswithservletsandJSPsonWebLogic;Recipe21.8oncallingastoredprocedurefromaJSP;Recipe21.9onconvertingajava.sql.ResultSetobjecttoajavax.servlet.jsp.jstl.sqlResult;Recipe21.10andRecipe21.11onusingtransactionsinservletsandJSPs;Recipe21.12onfindingoutinformationaboutaResultSet.

Page 851: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe21.8CallingaStoredProcedurefromaJSP

Problem

YouwanttocallastoredprocedurefromaJSP.

Solution

UsingaJSP2.0container,developanExpressionLanguage(EL)functionthatwillcallthestoredprocedureforyou.

Discussion

JSP2.0introducedfunctions,whicharestaticmethodsthatyoucancallinsideELstatements.

SeeChapter23ifyouneedtofamiliarizeyourselfwiththeEL.

Thisrecipeexplainsthestepsfordevelopingafunctionthatcallsastoredprocedure:

1. Createthestoredprocedureinyourdatabasesystem.

WritetheJavaclassthatimplementsthefunctionasastaticorclassmethod.

Page 852: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

DefinethefunctioninaTagLibraryDescriptor(TLD),whichisanXMLconfigurationfilethatyouincudewiththewebapplication.

IntheJSPitself,usethetaglibdirectivetodeclarethetaglibrarythatcontainsthefunction.

CallthefunctionintheJSP,usingtheproperprefixforyourtaglibrary.ThefunctionIuseinthisrecipelookslikethis:

<cbck:addRaceEvent("MyRace","AnytownUSA","11-Dec-2003")/>

Example21-9showstheJavaclassthatimplementsthisfunction.

Example21-9.TheJavaclassthatimplementsanELfunction

packagecom.jspservletcookbook;

importjava.sql.*;

importjavax.naming.Context;

importjavax.naming.InitialContext;

importjavax.naming.NamingException;

importjavax.sql.*;

publicclassStoredProcUtil{

privatestaticDataSourcepool;

privatestaticContextenv;

static{//staticinitializationoftheContextandDataSource

try{

Page 853: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

env=(Context)newInitialContext().lookup("java:comp/env");

pool=(DataSource)env.lookup("jdbc/oracle-8i-athletes");

if(pool==null)

thrownewException(

"'oracle-8i-athletes'isanunknownDataSource");

}catch(Exceptione){

System.out.println(e);

}

}//static

/*ThisstaticmethodwillbeconfiguredinaTLDfileandprovidethe

implementationforanELfunction.Anexampleuseofthefunctionis:

<cbck:addRaceEvent("MyRace","AnytownUSA","11-Dec-2003")/>*/

publicstaticvoidaddRaceEvent(Stringname,Stringlocation,Stringdate){

if((!check(name))||(!check(location))||(!check(date)))

thrownewIllegalArgumentException(

"InvalidparamvaluespassedtoaddRaceEvent()");

Connectionconn=null;

try{

conn=pool.getConnection();

if(conn==null)

thrownewSQLException(

"InvalidConnectioninaddRaceEventmethod");

CallableStatementcs=null;

Page 854: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

//CreateaninstanceoftheCallableStatement

cs=conn.prepareCall("{calladdEvent(?,?,?)}");

cs.setString(1,name);

cs.setString(2,location);

cs.setString(3,date);

//CalltheinheritedPreparedStatement.executeUpdate()method

cs.executeUpdate();

//returntheconnectiontothepool

conn.close();

}catch(SQLExceptionsqle){}

}//addRaceEvent

privatestaticbooleancheck(Stringvalue){

if(value==null||value.equals(""))

returnfalse;

returntrue;

}

}

TheaddRaceEvent()methodcreatesajava.sql.CallableStatement,whichcallstheunderlyingstoredprocedure(addEvent).Recipe21.7explainsthisprocess.

TheJavamethodthatimplementsthefunctionforaJSPmustbedefinedasstatic.

Page 855: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

ThisJavaclassmustbestoredinyourwebapplicationbeneaththeWEB-INF/classesdirectory(withasubdirectorystructurematchingitspackagename)orinaJARfilestoredinWEB-INF/lib.Forexample,theJavaclassofExample21-9shouldbestoredinWEB-INF/classes/com/jspservletcookbook/StoredProcUtil.class.

Example21-10showstheTLDfilethatdefinestheELfunction.

TheTLDfilehasa.tldextensionandlivesinaWEB-INFsubdirectoryofyourwebapplication,suchasWEB-INF/tlds.

Example21-10.TheTLDfileforconfiguringtheELfunction

<taglibxmlns="http://java.sun.com/xml/ns/j2ee"xmlns:xsi=

"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation=

"http://java.sun.com/xml/ns/j2eehttp://java.sun.com/xml/ns/j2ee/

web-jsptaglibrary_2_0.xsd"

version="2.0"

>

<tlib-version>1.0</tlib-version>

<jsp-version>2.0</jsp-version>

<short-name>cbck</short-name>

<uri>jspservletcookbook.com.tags</uri>

<description>Cookbookcustomtags</description>

<function>

<name>addRaceEvent</name>

Page 856: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<function-class>

com.jspservletcookbook.StoredProcUtil

</function-class>

<function-signature>

voidaddRaceEvent(java.lang.String,

java.lang.String,java.lang.String)

</function-signature>

</function>

<tag>

<!--defineacustomtaghereifyouhaveto-->

</tag>

</taglib>

Example21-10definesthefunctionwiththefunctiontaganditsname,function-class,andfunction-signatureattributes.Makesuretoincludethefullyqualifiedclassnameunderfunction-class.TheJSPcontainerknowshowtocallthefunctionbyinspectingthefunction-signature.Thissignatureincludesthereturntype("void"inthiscase),thefunctionname,andallofitsparametersspecifiedbytheirfullyqualifiedclassnames.

Example21-11isaJSPthatcallsourdefinedfunction.First,thetaglibdirectivedeclaresthetaglibraryandprefix("cbck")thatthefunctionuses.

Example21-11.AJSPusesanELfunctiontocallastoredprocedure

<%@tagliburi="jspservletcookbook.com.tags"prefix="cbck"%>

<html>

Page 857: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<head><title>CallingaStoredprocedure</title></head>

<body>

<h2>ThisJSPcallsastoredprocedurewithaJSP2.0function</h2>

${cbck:addRaceEvent("FalmouthTriathlon","FalmouthMA","26-Jul-2003")}

</body>

</html>

SincethisisafeatureoftheEL,thesyntaxencapsulatesthefunctioncallwithinthe"${}"characterstring.Nextcomestheprefix(cbck),acolon,andthefunctioncallitself:

${cbck:addRaceEvent("FalmouthTriathlon","FalmouthMA","26-Jul-2003")}

Thisprocessappearscomplicatedthefirsttimearound,butonceyoucreateyourfirstJSP2.0function,therestofthemwillbemucheasier!ThisfeaturedoesnotinvolvemuchmorethancreatingastaticJavamethod,configuringthefunctionwiththepropervaluesinanXMLfile,thencallingthefunctioninaJSP.Thisisaniftywaytocallstoredprocedures!

SeeAlso

TheJDBCspecification:http://java.sun.com/products/jdbc/download.html;Chapter23ontheJSTL;Chapter22oncreatingcustomtaglibraries;Recipe21.1onaccessingadatabasefromaservletwithoutaconnectionpool;Recipe21.2andRecipe21.3onusingaDataSourceonTomcat;Recipe21.5andRecipe21.6onusingDataSourceswithservletsandJSPsonWebLogic;Recipe21.7oncallingastoredprocedurefromaservlet;Recipe21.9onconvertingajava.sql.ResultSetobjecttoajavax.servlet.jsp.jstl.sql.Result;Recipe21.10andRecipe21.11onusingtransactionsinservletsandJSPs;Recipe21.12onfindingoutinformationaboutaResultSet.

Page 858: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe21.9ConvertingaResultSettoaResultObject

Problem

Youwanttoconvertajava.sql.ResultSettoajavax.servlet.jsp.jstl.sql.ResultobjectsothattheobjectcanbeusedwiththeJSTL.

Solution

Usethejavax.servlet.jsp.jstl.sql.ResultSupport.toResult()

method.

Discussion

TheResultinterfaceallowscodetoworkwithResultSetsintheformofJavaarraysorjava.util.Maps.TheJSTLtagsoftenusearraysorMapstoiteratethroughvalues(whichiswhytheyincludedtheResultinterfaceintheJSTLspecification).Therefore,youmightwanttoconvertaResultSettoaResult,thenhandtheResulttoaJSPthatusestheJSTLtags.

Example21-12isaservletthat:

1. CreatesaResultSetbyqueryingadatabase.

ConvertstheResultSettoaResult.

Page 859: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

ForwardstheResulttoaJSPbystoringtheResultasasessionattribute.

Example21-12.AservletconvertsaResultSettoaResult

packagecom.jspservletcookbook;

importjava.sql.*;

importjavax.naming.Context;

importjavax.naming.InitialContext;

importjavax.naming.NamingException;

importjavax.sql.*;

importjavax.servlet.jsp.jstl.sql.Result;

importjavax.servlet.jsp.jstl.sql.ResultSupport;

importjavax.servlet.*;

importjavax.servlet.http.*;

publicclassDbServletResultextendsHttpServlet{

DataSourcepool;

publicvoidinit()throwsServletException{

Contextenv=null;

try{

env=(Context)newInitialContext().lookup("java:comp/env");

pool=(DataSource)env.lookup("jdbc/oracle-8i-athletes");

Page 860: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

if(pool==null)

thrownewServletException(

"'oracle-8i-athletes'isanunknownDataSource");

}catch(NamingExceptionne){

thrownewServletException(ne);

}

}//init

publicvoiddoGet(HttpServletRequestrequest,

HttpServletResponseresponse)throwsServletException,

java.io.IOException{

Stringsql="select*fromathlete";

try{

//GetaResultobjectthatrepresentsthereturnvalueoftheSQL

//statement'select*fromathlete'

ResultjspResult=select(sql);

HttpSessionsession=request.getSession();

//storetheResultinasessionattribute,

//whereitcanbepassedto

//aJSPandusedwiththeJSTLtags

session.setAttribute(

"javax.servlet.jsp.jstl.sql.Result",jspResult);

RequestDispatcherdispatcher=request.getRequestDispatcher(

"/useResult.jsp");

dispatcher.forward(request,response);

Page 861: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

}catch(SQLExceptionsqle){

thrownewServletException(sqle.getMessage());}

}//doGet

privateResultselect(Stringsql)throwsSQLException{

if(sql==null||sql.equals(""))

thrownewSQLException("Invalidparameterinselectmethod");

ResultSetrs=null;

Connectionconn=null;

Resultres=null;

//GetaConnectionfromthepool

conn=pool.getConnection();

if(conn==null)

thrownewSQLException("InvalidConnectioninselectmethod");

PreparedStatementstmt=conn.prepareStatement(sql);

//CreatetheResultSet

rs=stmt.executeQuery();

//ConverttheResultSettoa

//ResultobjectthatcanbeusedwithJSTLtags

res=ResultSupport.toResult(rs);

stmt.close();//thiswillcloseanyassociatedResultSets

conn.close();//returnConnectiontopool

returnres;//returnResultobject

Page 862: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

}//select

}

Example21-12importsthenecessaryJavaclassesincludingtheResultandResultSupportclasses:

importjavax.servlet.jsp.jstl.sql.Result;

importjavax.servlet.jsp.jstl.sql.ResultSupport;

Theselect()methoddoestheimportantwork:creatingtheResultSet,convertingthisobjecttoaResult,andreturningtheResult.Hereisthecodethatperformstheconversion:

res=ResultSupport.toResult(rs);

TheResultSupportclass'sstatictoResult()methodtakesaResultSetasanargumentandreturnsaResult.

Theservlet'sdoGet()methodthencreatesasessionattributefromtheResultandusesaRequestDispatchertoforwardtherequesttoaJSP.TheJSPisnameduseResult.jsp.

Theuserinitiallyrequeststheservletinhisbrowser,andtheservletpassestherequesttotheJSP.TheuserthenseestheJSP'soutputintheirbrowser.

TheRequestDispatchercodelookslikethis:

RequestDispatcherdispatcher=request.getRequestDispatcher(

"/useResult.jsp");

dispatcher.forward(request,response);

Example21-13usestheJSTLcoretags(withthe"c"prefix).Thec:settaggainsaccesstothesessionattributeandstorestheattribute'svalueinaresultObjvariable.Thec:forEachandc:outtagsthendisplay

Page 863: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

thedatabasevaluesintheJSP.

Example21-13.TheJSPthatusesaResultobjectstoredasasessionattribute

<%@tagliburi="http://java.sun.com/jstl/core"prefix="c"%>

<%@tagliburi="http://java.sun.com/jstl/sql"prefix="sql"%>

<html>

<HEAD>

<TITLE>UsingaResultobject</TITLE>

</HEAD>

<bodybgcolor="white">

<h2>ViewDatabaseData</h2>

<%--storeasessionattribute(theResultobject)inavariablenamed'resultObj'--%>

<c:setvar="resultObj"value=

"${sessionScope[\"javax.servlet.jsp.jstl.sql.Result\"]}"/>

<tableborder="1"cellspacing="2">

<%--foreveryrowintheResult...--%>

<c:forEachitems="${resultObj.rows}"var="row">

<%--foreverycolumnintherow...--%>

<c:forEachitems="${row}"var="column">

<tr>

<tdalign="right">

<b><c:outvalue="${column.key}"/></b>

</td>

<td>

<c:outvalue="${column.value}"/>

</td></tr>

</c:forEach>

</c:forEach>

Page 864: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

</table>

</body>

</html>

Thesyntax"${sessionScope[\"javax.servlet.jsp.jstl.sql.Result\"]}"isnecessary,becausethesessionattributenamecontainsperiods(.).Otherwise,theELcanacccessascopedattribute,iftheattributeisnamedmyAttribute,usingthissimplersyntax:

${myAttribute}

Figure21-6showshowawebbrowserdisplaystheJSP'soutput.

Figure21-6.TheJSPpageoutputinawebbrowser

SeeAlso

TheJDBCspecification:http://java.sun.com/products/jdbc/download.html;Chapter23ontheJSTL;Chapter16onusingsessionattributes;Recipe21.1onaccessing

Page 865: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

adatabasefromaservletwithoutaconnectionpool;Recipe21.2andRecipe21.3onusingaDataSourceonTomcat;Recipe21.5andRecipe21.6onusingDataSourceswithservletsandJSPsonWebLogic;Recipe21.7andRecipe21.8oncallingstoredproceduresfromservletsandJSPs;Recipe21.10andRecipe21.11onusingtransactionsinservletsandJSPs;Recipe21.12onfindingoutinformationaboutaResultSet.

Page 866: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe21.10ExecutingSeveralSQLStatementsWithinaSingleTransaction

Problem

YouwanttoexecutemorethanoneSQLstatementwithinasingletransaction.

Solution

Usethejava.sql.ConnectionAPIandthesetAutoCommit(),commit(),androllback()methodstocreateatransaction.

Discussion

SomeSQLstatements,suchasthosethatupdatecustomerinformationintwodifferentdatabasetables,aremeanttobeexecutedonlyasagroup.Ifoneofthemdoesnotsucceed,thedatabaseisreturnedtoitspreviousstate.ThisisthepurposeofusingatransactioninyourJavacode.Atransactionisalogicalunitofdatabaseoperationsthatcanbe"rolledback"orcanceledasagroupifsomethinggoeswrongwithoneoftheoperations.

Onceyouhaveadatabaseconnection(aninstanceofjava.sql.Connection),youcancallvariousConnectionmethodstocreateatransaction.Herearethestepsforexecutingatransaction:

1. CalltheConnectionobject'ssetAutoCommit()methodwithfalseastheparameter.ThisturnsoffthedefaultbehaviorforJDBCcode,whichistocommiteachseparateSQLstatement

Page 867: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

insteadofautomaticallygroupingsequentialstatementsasasingletransaction.

FollowthesetAutoCommit()methodcallwiththedatabasecodethatyouwanttotreatasasingletransaction.

CalltheConnection'scommit()methodtocommittheSQLstatements,whichwritesanydatabasechangesassociatedwiththeSQL(suchasaDELETEorUPDATEstatement)totheunderlyingdatabasefile.

IntheareaofJavacodereservedfordealingwitherrorsorunexpectedconditions,suchasacatchblock,calltheConnection'srollback()method,whichrollsbacktheSQLthatwasincludedinthetransaction.

Example21-14isaservletthatillustratesthisprocess.

Example21-14.AservletthatusesaSQLtransaction

packagecom.jspservletcookbook;

importjava.sql.*;

importjavax.naming.Context;

importjavax.naming.InitialContext;

importjavax.naming.NamingException;

importjavax.sql.*;

importjavax.servlet.*;

importjavax.servlet.http.*;

publicclassDbServletTransextendsHttpServlet{

DataSourcepool;

Page 868: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

/*InitializetheDataSourceintheservlet'sinit()method

whichtheservletcontainercallsoncewhenitcreatesaninstanceof

theservlet*/

publicvoidinit()throwsServletException{

Contextenv=null;

try{

env=(Context)newInitialContext().lookup("java:comp/env");

pool=(DataSource)env.lookup("jdbc/oracle-8i-athletes");

if(pool==null)

thrownewServletException(

"'oracle-8i-athletes'isanunknownDataSource");

}catch(NamingExceptionne){

thrownewServletException(ne);

}

}//init

publicvoiddoGet(HttpServletRequestrequest,

HttpServletResponseresponse)throwsServletException,

java.io.IOException{

Connectionconn=null;

Statementstmt=null;

response.setContentType("text/html");

java.io.PrintWriterout=response.getWriter();

Page 869: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

out.println(

"<html><head><title>Usingtransactions</title></head><body>");

out.println(

"<h2>TheseSQLstatementsarepartofatransaction</h2>");

out.println("CallableStatement.executeUpdate()");

out.println("<br><br>");

out.println("Statement.executeUpdate()");

out.println("<br><br>");

try{

//Getaconnectionfromthepool

conn=pool.getConnection();

//DisplaythedefaultvaluesforsetAutoCommit()

//andtheisolationlevel

out.println("AutoCommitbeforesetAutoCommit():"+

conn.getAutoCommit()+"<br><br>");

out.println("Transactionisolationlevel:");

//justoutofcuriosity,displaytheexistingtransaction

//isolationlevel

witch(conn.getTransactionIsolation()){

case0:out.println("TRANSACTION_NONE<br><br>");break;

case1:out.println(

"TRANSACTION_READ_UNCOMMITTED<br><br>");break;

case2:out.println(

"TRANSACTION_READ_COMMITTED<br><br>");break;

case4:out.println(

Page 870: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

"TRANSACTION_REPEATABLE_READ<br><br>");break;

case8:out.println(

"TRANSACTION_SERIALIZABLE<br><br>");break;

default:out.println("UNKNOWN<br><br>");

}//switch

//setAutocommittofalsesothatindividualSQLstatementswill

//notbecommitteduntilConnection.commit()iscalled

conn.setAutoCommit(false);

//Transaction-relatedSQLbegins...

CallableStatementcs=null;

//CreateaninstanceoftheCallableStatement

cs=conn.prepareCall("{calladdEvent(?,?,?)}");

cs.setString(1,"SalisburyBeach5-Miler");

cs.setString(2,"SalisburyMA");

cs.setString(3,"14-Aug-2003");

//CalltheinheritedPreparedStatement.executeUpdate()method

cs.executeUpdate();

Stringsql="updateraceeventsetracedate='13-Aug-2003'"+

"wherename='SalisburyBeach5-Miler'";

intres=0;

stmt=conn.createStatement();

res=stmt.executeUpdate(sql);

//committhetwoSQLstatements

conn.commit();

Page 871: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

}catch(Exceptione){

try{

//rollbackthetransactionincaseofaproblem

conn.rollback();

}catch(SQLExceptionsqle){}

thrownewServletException(e.getMessage());

}finally{

try{

if(stmt!=null)

stmt.close();

if(conn!=null)

conn.close();

}catch(SQLExceptionsqle){}

}

out.println("</table></body></html>");

}//doGet

}

ThedoGet()methodinExample21-14displaysthedefaultvaluesfor"autocommitting"SQLstatementsandthetransactionisolationlevel(thelevelofdatabase-lockingthatoccursasthetransactionswithinyourJavacodeareinitiated).Forexample,ifyourSQLstatementsincludetheupdatingofdatabasefields,canotherusersofthedatabaseviewthenewcolumnvaluesbeforeyourtransactioniscommitted?Ifallowed,this

Page 872: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

typeofbehavioriscalledadirtyread.

Table21-2showsthedifferenttypesoftransactionisolationlevels,fromtheleasttomostrestrictivelevel.Twoothertermsneedaddressingbeforeyouinspectthistable:

Anon-repeatablereadoccurswhenonetransactionreadsarow,anothertransactionchangesthesamerow,andthefirsttransactionreadsthesamerowandreceivesthedifferentvalue.

AphantomreadhappenswhenonetransactionobtainsaresultsetbasedonaWHEREconditionandasecondtransactioninsertsanewrowthatsatisfiesthisWHEREcondition.ThefirsttransactionthenevaluatesthesamedatabasetableagainwiththesameWHEREconditionandretrievesthenew"phantom"row.

Table21-2.Transactionisolationlevels

Transactionisolationlevel

Returnvalueofjava.sql.Connection.

getTransactionIsolation()Definition

TRANSACTION_NONE 0 Thedatabasedriverdoesnotsupporttransactions.

TRANSACTION_READ_

UNCOMMITTED1 Anothertransactioncanseeuncommittedchanges;

"dirtyreads"areallowed.

TRANSACTION_READ_

COMMITTED2 Uncommittedchangesarenotvisibletoother

transactions.

TRANSACTION_

REPEATABLE_READ4

Uncommittedchangesarenotvisibletoothertransactions;nonrepeatablereadsarealsodisallowed.

TRANSACTION_

SERIALIZABLE8

Uncommittedchangesarenotvisibletoothertransactions;nonrepeatablereadsandphantomreadsarealsodisallowed.

Page 873: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Checkyourdatabasevendor'sspecificationsorliteratureforhowthedatabasesystemyouusehandlestransactionisolation.UsetheConnectionobject'sgetTransactionIsolation()methodtofindoutthevalueassociatedwithaparticulardatabasedriverthatJDBC-relatedcodeisusing.Thismethodreturnsanint.Forexample,a"2"returnvaluemeansthattheConnectionisassociatedwithaTRANSACTION_READ_COMMITTEDtransactionisolationlevel.

Example21-14runstwoSQLstatementswithinatransaction:itexecutesastoredprocedureandinitiatesanUPDATEstatement.Thenthecodecallscommit()ontheConnectionobjecttocommitanydatabasechangestotheunderlyingdatastore.IfthisSQLcodethrowsanexception,thetransactionisrolledbackwithacalltoConnection'srollback()method.ThismethodcallpreventsthepriorSQLstatementsfromhavinganyeffectontheunderlyingdatabase.

Figure21-7showstheoutputoftheservletinExample21-14,asitwouldappearinawebbrowser.

Figure21-7.Aservletwithadatabasetransactionprovidesbrowseroutput

SeeAlso

Page 874: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

TheJDBCspecification:http://java.sun.com/products/jdbc/download.html;Recipe21.1onaccessingadatabasefromaservletwithoutaconnectionpool;Recipe21.2andRecipe21.3onusingaDataSourceonTomcat;Recipe21.4-Recipe21.6onusingDataSourceswithservletsandJSPsonWebLogic;Recipe21.7andRecipe21.8oncallingstoredproceduresfromservletsandJSPs;Recipe21.11onusingtransactionsinJSPs;Recipe21.12onfindingoutinformationaboutaResultSet.

Page 875: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe21.11UsingTransactionswithJSPs

Problem

YouwanttorunSQLstatementswithin.atransactioninaJSP.

Solution

Usethesql:transactionJSTLtag.

Discussion

TheJSTLhasasql:transactiontagthatexecutesanynestedSQLactions(suchassql:update)inatransaction.

Thesql:transactiontagusesthesamejava.sql.Connectionmethodsthatyouwoulduseinatransaction-relatedservlet(Recipe21.10):setAutoCommit(false),commit(),androllback().

Example21-15usesaDataSourcethatisconfiguredinweb.xml,sothatnoneofthedatabase-relatedinformationappearsintheJSP.SeeRecipe23.6forhowtoconfigureaDataSourceinthedeploymentdescriptor.TheINSERTandSELECTSQLstatementsthatarenestedinsidethesql:transactiontagwillbothberolledbackifanyproblemsarisewithinthetransaction.

Page 876: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Example21-15.AJSPexecutesINSERTandSELECTSQLstatementsinatransaction

<%@tagliburi="http://java.sun.com/jstl/core"prefix="c"%>

<%@tagliburi="http://java.sun.com/jstl/sql"prefix="sql"%>

<html>

<HEAD>

<TITLE>UsingaTransactionwithaJSP</TITLE>

</HEAD>

<bodybgcolor="white">

<h2>ViewAthleteData</h2>

<sql:transaction>

<sql:update>

insertintoathletevalues(2,'RachelPerry','rlpbwp1996',

'24-Feb-1996','F')

</sql:update>

<sql:queryvar="resultObj">

select*fromathlete

</sql:query>

</sql:transaction>

<table>

<c:forEachitems="${resultObj.rows}"var="row">

<c:forEachitems="${row}"var="column">

<tr>

<tdalign="right">

<b><c:outvalue="${column.key}"/></b>

</td>

<td>

<c:outvalue="${column.value}"/>

</td></tr>

</c:forEach>

Page 877: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

</c:forEach>

</table>

</body>

</html>

AfterexecutingSQLwithinatransaction,theJSPdisplaysthedatabasetable'supdatedvalues.Thecontentofthesql:updateandsql:querytagsaretraditionalSQLstatements.

MakesuretoincludethepropertaglibdirectivetouetheJSTL1.0sqltaglibrary:

<%@tagliburi=

"http://java.sun.com/jstl/sql"prefix="sql"%>

Thesql:transactiontagalsohasanisolationattributeinwhichyoucanspecifyanisolationlevelforthetransaction(seeRecipe21.10).Hereisanexample:

<sql:transactionisolation="TRANSACTION_READ_COMMITTED">

<%--SQLstatementsandtagshere...--%>

</sql:transaction>

Figure21-8showstheoutputofthesqlTrans.jspfile.

Figure21-8.AJSPdisplaysanupdateddatabasetable

Page 878: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

SeeAlso

TheJDBCspecification:http://java.sun.com/products/jdbc/download.html;Chapter23ontheJSTLanditssqltaglibrary;Recipe21.1onaccessingadatabasefromaservletwithoutaconnectionpool;Recipe21.2andRecipe21.3onusingaDataSourceonTomcat;Recipe21.4-Recipe21.6onusingDataSourceswithservletsandJSPsonWebLogic;Recipe21.7andRecipe21.8oncallingstoredproceduresfromservletsandJSPs;Recipe21.10onusingtransactionsinservlets;Recipe21.12onfindingoutinformationaboutaResultSet.

Page 879: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe21.12FindingInformationaboutaResultSet

Problem

Youwanttodynamicallydiscoverdetailsabouttherowsandcolumnsinajava.sql.ResultSet.

Solution

UsetheResultSetMetaDataclassobtainedbycallingthejava.sql.ResultSet'sgetMetaData()method.

Discussion

Webdeveloperssometimesneedtoworkwithdatabasetablesthathaveunknowncolumnnamesandtypes.Thejava.sqlpackagecontainsaveryusefulResultSetMetaDatainterfacethatdefinesmethodsdesignedtoprovideinformationaboutajava.sql.ResultSet.AResultSetencapsulatestherowsreturnedbyaSELECTSQLstatement.

Example21-16showsaservletthatqueriesanOracle8idatabaseforaResultSet,thendisplaysthecolumnnames,thecolumnindex,theSQLtypeofthecolumn,andthenumberofcharactersthecolumnrequirestodisplayitsvalues.

Example21-16.AservletusestheResultSetMetaDataclass

Page 880: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

packagecom.jspservletcookbook;

importjava.sql.*;

importjavax.naming.Context;

importjavax.naming.InitialContext;

importjavax.naming.NamingException;

importjavax.sql.*;

importjavax.servlet.*;

importjavax.servlet.http.*;

publicclassDbMetaServletextendsHttpServlet{

DataSourcepool;

/*InitializetheDataSourceintheservlet'sinit()method

whichtheservletcontainercallsoncewhenitcreatesaninstanceof

theservlet*/

publicvoidinit()throwsServletException{

Contextenv=null;

try{

env=(Context)newInitialContext().lookup("java:comp/env");

pool=(DataSource)env.lookup("jdbc/oracle-8i-athletes");

if(pool==null)

thrownewServletException(

"'oracle-8i-athletes'isanunknownDataSource");

}catch(NamingExceptionne){

thrownewServletException(ne);

Page 881: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

}

}//init

publicvoiddoGet(HttpServletRequestrequest,

HttpServletResponseresponse)

throwsServletException,java.io.IOException{

Stringsql="select*fromathlete";

Connectionconn=null;

Statementstmt=null;

ResultSetrs=null;

ResultSetMetaDatarsm=null;

response.setContentType("text/html");

java.io.PrintWriterout=response.getWriter();

out.println(

"<html><head><title>DiscoveraResultSet</title></head><body>");

out.println("<h2>HereisInfoaboutthereturnedResultSet</h2>");

out.println("<tableborder='1'><tr>");

try{

//Getaconnectionfromthepool

conn=pool.getConnection();

//CreateaStatementwithwhichtorunsomeSQL

stmt=conn.createStatement();

//ExecutetheSQL

rs=stmt.executeQuery(sql);

//GetaResultSetMetaDataobjectfromtheResultSet

rsm=rs.getMetaData();

Page 882: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

intcolCount=rsm.getColumnCount();

//printcolumnnames

printMeta(rsm,"name",out,colCount);

//printcolumnindex

printMeta(rsm,"index",out,colCount);

//printcolumntype

printMeta(rsm,"columntype",out,colCount);

//printcolumndisplaysize

printMeta(rsm,"columndisplay",out,colCount);

}catch(Exceptione){

thrownewServletException(e.getMessage());

}finally{

try{

stmt.close();

conn.close();

}catch(SQLExceptionsqle){}

}

out.println("</table></body></html>");

}//doGet

privatevoidprintMeta(ResultSetMetaDatametaData,Stringtype,

Page 883: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

java.io.PrintWriterout,intcolCount)throwsSQLException{

if(metaData==null||type==null||out==null)

thrownewIllegalArgumentException(

"IllegalargspassedtoprintMeta()");

out.println("<tr>");

if(type.equals("table")){

out.println("<td><strong>Tablename</strong></td>");

for(inti=1;i<=colCount;++i){

out.println("<td>"+metaData.getTableName(i)+"</td>");

}

}elseif(type.equals("name")){

out.println("<td><strong>Columnname</strong></td>");

for(inti=1;i<=colCount;++i){

out.println("<td>"+metaData.getColumnName(i)+"</td>");

}

}elseif(type.equals("index")){

out.println("<td><strong>Columnindex</strong></td>");

for(inti=1;i<=colCount;++i){

out.println("<td>"+i+"</td>");

}

}elseif(type.equals("columntype")){

Page 884: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

out.println("<td><strong>Columntype</strong></td>");

for(inti=1;i<=colCount;++i){

out.println("<td>"+metaData.getColumnTypeName(i)+

"</td>");

}

}elseif(type.equals("columndisplay")){

out.println("<td><strong>Columndisplaysize</strong></td>");

for(inti=1;i<=colCount;++i){

out.println("<td>"+metaData.getColumnDisplaySize(i)+

"</td>");

}

}

out.println("</tr>");

}//printMeta

}

Example21-16usesResultSetMetaDatamethodstoobtaininformationabouteachofthecolumnsintheResultSet.ThecodecallsthesemethodsinsideitsprintMeta()method.Forexample,thecode:

metaData.getColumnName(1)

returnsthenameofthefirstcolumnthetableschemaspecifies,suchas"USER_ID."Figure21-9showstheservlet'sHTMLoutputinawebbrowser.

Page 885: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Figure21-9.AservletdisplaysmetainformationaboutaResultSet

Usethejava.sql.DatabaseMetaDatainterfacetogetalargeamountofinformationaboutthedatabasesystemassociatedwiththejava.sql.Connectionthecodeisusing.TheConnectionmethodgetMetaData()returnsanobjectthatimplementstheDatabaseMetaDatainterface.

SeeAlso

TheJDBCspecification:http://java.sun.com/products/jdbc/download.html;TheResultSetMetaDataclass:http://java.sun.com/j2se/1.4.1/docs/api/java/sql/ResultSetMetaData.html;Recipe21.1onaccessingadatabasefromaservletwithoutaconnectionpool;Recipe21.2andRecipe21.3onusingaDataSourceonTomcat;Recipe21.4-Recipe21.6onusingDataSourceswithservletsandJSPsonWebLogic;Recipe21.7andRecipe21.8oncallingstoredproceduresfromservletsandJSPs;Recipe21.10andRecipe21.11onusing

Page 886: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

transactionsinservletsandJSPs.

Page 887: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Chapter22.UsingCustomTagLibrariesIntroduction

Recipe22.1.CreatingaClassicTagHandler

Recipe22.2.CreatingaJSP1.2TLDforaClassicTagHandler

Recipe22.3.CreatingaJSP2.0TLDforaClassicTagHandler

Recipe22.4.PackagingaTagLibraryinaWebApplication

Recipe22.5.PackagingtheTagLibraryinaJARFile

Recipe22.6.UsingtheCustomTaginaJSP

Recipe22.7.HandlingExceptionsinaCustomTagClass

Recipe22.8.CreatingaSimpleTagHandler

Recipe22.9.CreatingaTLDforaSimpleTagHandler

Recipe22.10.UsingaSimpleTagHandlerinaJSP

Recipe22.11.CreatingaJSPTagFile

Recipe22.12.PackagingtheJSPTagFileinaWebApplication

Recipe22.13.PackagingtheJSPTagFileinaJAR

Recipe22.14.UsingaCustomTagAssociatedwithaTagFile

Recipe22.15.AddingaListenerClasstoaTagLibrary

Page 888: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Introduction

AverypowerfulfeatureofJavaServerPagestechnologyistheabilitytocreateyourownXMLtagsforuseinJSPs.CustomtagshavebeenapartoftheJSPspecificationsinceVersion1.1.JSP2.0isdedicatedtomakingcustomtagdevelopmentlesscomplexthanpriorversions.JSP2.0'sintroductionofsimpletaghandlersandtagfiles,whichwecoverinRecipe22.8-Recipe22.14,areabigpartofthisstrategy.

Let'sfamiliarizeourselveswithafewtermsbeforewemoveontocustomtagrecipes.AtagisaninstanceofanXMLelementandamemberofaspecifiednamespace.Forexample,theprefixforalltagsassociatedwiththiscookbookiscbck.TheJSPreferstoanindividualtagassociatedwiththecbcknamespace(say,themyTagtag)asfollows:

<cbck:myTag>whateverthistagdoes...</cbck:myTag>

TagsareXMLelements;therefore,theirnamesandattributesarecasesensitive.Acollectionoftagsthatprovidesimilarfunctionalityorthatlogicallycollaboratewitheachotheriscalledataglibrary.Developerscaninstalloneormoretaglibrariesinawebapplication.

AJavaclasscalledthetaghandlerprovidesthetag'sfunctionalityinaJSP.AcustomactionisatagthatyouinventforuseinJSPsandthatispoweredbehindthescenesbyatag-handlerobjectthatthewebcontainerkeepsinmemory.

AclassictaghandlerusesthetagextensionAPIthatevolvedfromJSPv1.1to1.2.AsimpletaghandlerisaJavaclassthatimplementstheSimpleTaginterface,whichJSP2.0introduced.

AtagfiledefinesacustomtaginJSPsyntax.Itisdesignedtomakelifeeasierfortagdevelopers.ThewebcontainergeneratesfromthetagfileaJavaclassthatimplementstheSimpleTaginterface,andthencreatesanobjectfromthatclasstointerpretthetag'suseinJSPs.

Page 889: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Finally,ataglibrarydescriptor(TLD)isanXMLfilethatprovidesamappingbetweenreferencestotaglibrariesinJSPs(withthetaglibdirective)andthetag-libraryclassesthatyouinstallinthewebapplication.ATLDisaconfigurationfile,similartoawebapplication'sdeploymentdescriptor.Therecipesinthischapterprovideexamplesofhowtocreateclassictaghandlers,simpletaghandlers,andtagfiles.Therecipesalsoshowhowtopackagethesecomponentsinwebapplications.

Page 890: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe22.1CreatingaClassicTagHandler

Problem

YouwanttocreateaclassicJSP1.2-styletaghandlerforacustomaction.

Solution

CreateaJavaclassthatextendsoneoftheTagsupportclassesinthejavax.servlet.jsp.tagextpackage,suchasBodyTagSupport.

Discussion

TherearenumeroustypesofcustomtagsyoucancreateforJSPs,suchasactionsthatignoretheirbodies(emptytags),actionsthatarenestedwithinothercustomactions,andcustomtagsthatusetheirbodycontent.Infact,entirebookshavebeendedicatedsolelytoJSPcustomtagdevelopment!Insteadofbeingexhaustiveinthisbook,IshowhowtocreateafairlysimpleclassictagthataddsanimagelogotoaJSPpagewithatextmessage.Youcantheninferdetailsforyourownprogrammingtasksfromthisexample.

Thesampletagisdesignedtoallowapagedesignertospecifyanlogo'simage,itswidthandheight,andatextmessagetositalongsidetheimage.

Example22-1showstheclassictaghandlerforthiscustomaction.ThisJavaclassextendsBodyTagSupport,sinceitusesthetag'snestedcontentforthelogo'stextmessage.

Page 891: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Example22-1.Aclassictaghandlerforinsertinganimageandmarkup

packagecom.jspservletcookbook;

importjavax.servlet.*;

importjavax.servlet.http.*;

importjavax.servlet.jsp.*;

importjavax.servlet.jsp.tagext.*;

/**ThistaggeneratesathumbnailimageusingtheHTMLimgtag,nexttoatextmessage.

TheuserspecifiesthecontentofthemessageandtheHeadinglevel(i.e.,<H1>-<H6>)*/

publicclassLogoTagextendsBodyTagSupport{

//Thesevariablerepresentthecustomtag'sattributes

privateStringheading=null;

privateStringimage=null;

privateStringwidth=null;

privateStringheight=null;

//thismethodassumesthatattributepropertieshavebeenset.

publicintdoStartTag()throwsJspException{

try{

inth=newInteger(heading).intValue();

if(!(h>0&&h<7))

thrownewJspException(

"The'heading'attributevaluemustbetween1and6inclusive.");

}catch(Exceptione){thrownewJspException(e.getMessage());}

returnEVAL_BODY_BUFFERED;

Page 892: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

}

publicintdoEndTag()throwsJspException{

JspWriterout=pageContext.getOut();

//the'images'directoryislocatedinthewebapp's

//rootdirectory

StringimgDir=((HttpServletRequest)pageContext.

getRequest()).getContextPath()+"/images/";

//getthetextprovidedbetweenthecustomaction's

//startandendtags

Stringmessage=getBodyContent().getString().trim();

try{

//buildtheHTMLimgtag

out.println("<imgsrc=\""+imgDir+image+"\"width=\""+width+

"\"height=\""+height+"\"align=\"left\">"+"<H"+heading+">"+

message+"</H"+heading+">");

}catch(java.io.IOExceptionio){}

returnEVAL_PAGE;

}//doEndTag

//methodsdesignedtosetattributevalues

publicvoidsetHeading(Stringlevel){

this.heading=level;

}

publicvoidsetImage(Stringname){

Page 893: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

this.image=name;

}

publicvoidsetWidth(Stringwidth){

this.width=width;

}

publicvoidsetHeight(Stringheight){

this.height=height;

}

//theJSPcontainermaycacheandreusetaghandlerobjects.

//thismethodreleasesinstancevariablessothatthetaghandler

//canbereusedafresh

publicvoidrelease(){

heading=null;

image=null;

width=null;

height=null;

}//release

}

ClassictaghandlersarelikeJavaBeans.Youdeclarethecustomtag'sattributesasinstancevariables,orproperties,anddefinesettermethodsforeachattribute.Ifyoujustwanttomanipulatethecustomtag'sbody,definethedoEndTag()method.WhentheJSPcontainerinvokesdoEndTag(),developerscanusethismethodtoevaluatethebodycontentthatthetaguserhasplacedbetweentheaction'sstartandendtags.Example22-1alsodefinesthedoStartTag()methodtocheck

Page 894: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

thatthetaguserhasincludedavalidvaluefortheheaderattribute(anumberbetweenoneandsix,inclusive,forthisexamplecode).

WhenthedoStartTag()methodisinvoked,anyattributevaluesthattheuserhassetareavailable,butthetag'sbodycontentisnot.

ThedoEndTag()methodusesthevarioustagattributevaluestobuildanimgandHtagthatresultsinthedisplayofasimplelogointheJSPpagewherethetagisused.Here'sanexampleofhowaJSPwouldusetheactiondefinedbythistaghandler:

<%--importthetaglibrarywith'taglib'directive--%>

<%@tagliburi="jspservletcookbook.com.tags"prefix="cbck"%>

<%--JSPpagecontinues...--%>

<%--Usethe'logo'tag--%>

<cbck:logoheading="1"image="stamp.gif"width="42"height="54">Thanksforvisiting</

cbck:logo>

Figure22-1showsaJSPthatusesthetagdefinedbyExample22-1.

Figure22-1.AJSPpageusesacustomtagthatdisplaysanimageandaheading

Page 895: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

TheJSPusingthistagoutputsHTMLthatlookslikethis:

<imgsrc="/home/images/stamp.gif"width="42"height="54"align="left">

<H1>Thanksforvisiting</H1>

Youmightrespondbyexclaiming,"ThedesignercanjustentertheseHTMLtagsmanually,andtheydon'thavetodealwiththecustomtag'ssyntax!"Thisisabsolutelytrue;however,thetagtakescareofthedefaultlocationfortheimagesdirectory,positionsandalignstheimage,andcheckswhethertheattributeleveliscorrect.Inotherwords,itperformsalotofroutineworkandremovesthepossibilityofsillytypographicalmistakes.

Alsoconsiderthatthisisasimpleexample;whatiftheimagewasaFlashfileinstead?AcustomtagcouldtakecareofallofthecomplexdetailsforembeddingtheFlashintheHTMLpageandgeneratingproprietaryattributevalues,leavingthegraphicalpositioningofthemediafileuptothetaguser.

Aniceruleofthumbwithcustomtagsisthis:leaveautomated,complex,ortediousworktothetaghandler,andreserveconfigurabledetailsforthetag'sattributes.

SeeAlso

TheJSP2.0specificationwebpage:http://jcp.org/en/jsr/detail?id=152;

Page 896: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe22.2andRecipe22.3oncreatingTLDfilesfortaglibraries;Recipe22.4andRecipe22.5onpackagingtaglibrariesinawebapplication;Recipe22.6onusingthecustomtaginaJSP;Recipe22.7onhandlingexceptionsintags;Recipe22.8andRecipe22.9oncreatingasimpletaghandler;Recipe22.10onusingthesimpletaghandlerinaJSP;Recipe22.11-Recipe22.14onusingaJSPtagfile;Recipe22.15onaddingalistenerclasstoataglibrary;thecustom-tagsectionsofHansBergsten'sJavaServerPages,ThirdEdition(O'Reilly).

Page 897: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe22.2CreatingaJSP1.2TLDforaClassicTagHandler

Problem

YouwanttocreateaJSP1.2TLDfileforoneormorecustomtags.

Solution

CreatetheXMLfileusingtheproperDOCTYPEdeclarationforaJSP1.2TLD.

Discussion

ATLDisanXMLfilethatdescribesyourcustomtags,thetag'sattributes(ifany),aswellastheJavaclassesthatprovidethetag'sfunctionality.TheJSPcontainerusesthisconfigurationfilewhenitinterpretscustomtagsthatappearinJSPpages.IfyouareusingaJSPv1.2container,yourtaglibrary'sTLDhastheDOCTYPEdeclarationshowninExample22-2.ThisTLDdescribesthetaghandlerofthepreviousrecipe.

Example22-2.TheTLDfileforaclassicJSP1.2taghandler

<?xmlversion="1.0"encoding="ISO-8859-1"?>

<!DOCTYPEtaglib

PUBLIC"-//SunMicrosystems,Inc.//DTDJSPTagLibrary1.2//EN"

"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">

Page 898: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<taglib>

<tlib-version>1.0</tlib-version>

<jsp-version>1.2</jsp-version>

<short-name>cbck</short-name>

<!--HereistheURIyouusewiththe'taglib'directiveintheJSP-->

<uri>com.jspservletcookbook.tags</uri>

<description>Cookbookcustomtags</description>

<tag>

<name>logo</name>

<!--makesuretousethefullyqualifedclassname-->

<tag-class>com.jspservletcookbook.LogoTag</tag-class>

<body-content>JSP</body-content>

<description>ThistagwritesalogoinsidetheJSP.</description>

<attribute>

<name>heading</name>

<!--Thelogotagrequiresthisattribute-->

<required>true</required>

<!--TheattributecantakeaJSPexpressionasavalue-->

<rtexprvalue>true</rtexprvalue>

<description>Theheadinglevelforthelogo;1through6.

</description>

</attribute>

<attribute>

<name>image</name>

<required>true</required>

<rtexprvalue>true</rtexprvalue>

<description>Theimagenameforthelogo.</description>

Page 899: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

</attribute>

<attribute>

<name>width</name>

<required>true</required>

<rtexprvalue>true</rtexprvalue>

<description>Theimagewidthforthelogo.</description>

</attribute>

<attribute>

<name>height</name>

<required>true</required>

<rtexprvalue>true</rtexprvalue>

<description>Theimageheightforthelogo.</description>

</attribute>

</tag>

</taglib>

InJSP1.2and2.0,aJSPcontainerautomaticallysearchesWEB-INF,aswellastheMETA-INFdirectoryofyourapplication'sJARfiles,foranyfilethatendswiththeextension.tld.

Because.tldisafixedextension,itismandatorytogiveyourtaglibrarydescriptorfilenamesthatendin.tld.

ThecontainerthenusestheinformationitfindsintheTLDtointerpretcustomtagsthatthewebapplicationmayuse.Forexample,thecontainermapstheurielementsitfindsintheTLDtotheURIsspecifiedbyanytaglibdirectivesinJSPfiles.Example22-2specifiesauriofcom.jspservletcookbook.tagsforthetaglibrarythatcontainsthelogotag.AtaglibdirectivethatusesthistaglibraryinaJSPlookslikethis:

Page 900: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<%@tagliburi="com.jspservletcookbook.tags"prefix="cbck"%>

WhenthelogotagappearslateronintheJSP,theJSPcontainerknowsthatthetagbelongsinthetaglibrarywiththecom.jspservletcookbook.tagsurivalue,andthecontainercanevaluatetheJSP'stagusebasedontheTLD'sspecificationofthetagclassandthetag'svariousattributes.BasedontheTLD,theJSPcontainerknowsthatthelogotag'sattributesareallrequired,soaJSPthatusesthelogotagandomitsanattributefailstocompile.

SeeAlso

TheJSP2.0specificationwebpage:http://jcp.org/en/jsr/detail?id=152;Recipe22.3oncreatingaJSP2.0TLDfilefortaglibraries;Recipe22.4andRecipe22.5onpackagingtaglibrariesinawebapplication;Recipe22.6onusingthecustomtaginaJSP;Recipe22.7onhandlingexceptionsintags;Recipe22.8andRecipe22.9oncreatingasimpletaghandler;Recipe22.10onusingthesimpletaghandlerinaJSP;Recipe22.11-Recipe22.14onusingaJSPtagfile;Recipe22.15onaddingalistenerclasstoataglibrary;thecustomtagsectionsofHansBergsten'sJavaServerPages,ThirdEdition(O'Reilly).

Page 901: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe22.3CreatingaJSP2.0TLDforaClassicTagHandler

Problem

YouwanttocreateaJSP2.0TLDfileforataglibrary.

Solution

Createataglibrarydescriptorwiththepropertaglibrootelement,includingthetaglib'svariousxmlnsattributesandvalues.

Discussion

IfyouareusinganyJSP2.0featureswithyourtaglibraryandTLD,suchasafunctionortag-fileelement,thenyoumustusetheJSP2.0-styleTLD,asshowninExample22-3.

TheJSP2.0TLDisbackwardcompatiblewithelementsdefinedintheJSP1.2DTD.ThereforeyoucanusethetaglibandtagelementsastheyarespecifiedinanyexistingJSP1.2TLDswhenyouupgradeyourTLDfiletoJSP2.0.Forexample,theonlydifferencebetweentheTLDinExample22-3andtheJSP1.2TLDinExample22-2isthetaglibstarttag,whichmusthaveexactlythesamecontentasshownhere.

Example22-3.TheJSP2.0TLDfileforourclassictaghandler

<taglibxmlns="http://java.sun.com/xml/ns/j2ee"

Page 902: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation=

"http://java.sun.com/xml/ns/j2ee

http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"

version="2.0"

>

<!--THERESTOFTHEXMLCONTENTISALMOSTEXACTLYTHESAMEASTHEJSP1.2TLDVERSION

EXCEPTFOR<jsp-version>2.0</jsp-version>AND<body-content>scriptless</body-content>.The

"scriptless"valuemeansthatthecontentofthetagcanonlybetemplatetext(suchas

HTMLcontent),ExpressionLanguagecode,orJSPactionelements,butnot"scripting"

elementssuchastheJSPcodedelineatedby<%%>-->

<tlib-version>1.0</tlib-version>

<jsp-version>2.0</jsp-version>

<short-name>cbck</short-name>

<uri>com.jspservletcookbook.tags</uri>

<description>Cookbookcustomtags</description>

<tag>

<name>logo</name>

<tag-class>com.jspservletcookbook.LogoTag</tag-class>

<body-content>scriptless</body-content>

<description>ThistagwritesalogoinsidetheJSP.</description>

<attribute>

<name>heading</name>

<required>true</required>

<rtexprvalue>true</rtexprvalue>

<description>

Theheadinglevelforthelogo;1through6.

</description>

</attribute>

Page 903: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<attribute>

<name>image</name>

<required>true</required>

<rtexprvalue>true</rtexprvalue>

<description>Theimagenameforthelogo.</description>

</attribute>

<attribute>

<name>width</name>

<required>true</required>

<rtexprvalue>true</rtexprvalue>

<description>Theimagewidthforthelogo.</description>

</attribute>

<attribute>

<name>height</name>

<required>true</required>

<rtexprvalue>true</rtexprvalue>

<description>Theimageheightforthelogo.</description>

</attribute>

</tag>

</taglib>

TheJSP2.0TLDisbasedonanXMLSchemafile,ratherthanaDTD(theXMLSchemafile:http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd).

XMLSchemasallowthedefinersofXMLdocumentstocreatemorecomplexelementsandattributesthanthoseallowedinDTDs.XMLSchemasarealsodesignedtobevalidXMLdocumentsthemselves,whichmakesiteasiertointegratethemwithXML-basedapplications.

Page 904: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

ThetaglibelementinExample22-3hasfourattributes.ThexmlnsattributespecifiesthattheTLDhasthesamedefaultnamespaceasallJ2EEdeploymentdescriptors:http://java.sun.com/xml/ns/j2ee.

AnamespaceisauniqueidentifierthathelpsavoidthecollisionoftwoXMLelementsofthesamename.Forexample,thetaglibelementthatispartofthehttp://java.sun.com/xml/ns/j2eenamespaceisdifferentfromataglibelementthatmightbedefinedaspartofthehttp://acme.comnamespace.Anamespacehastobeuniqueonlywithinitsdomain(suchasanInternetURL);itdoesnotnecessarilyrepresentanactualwebdocument.

Thexmlns:xsiattributespecifiesthenamespaceforasetofXMLelementsrelatedtoXMLSchemainstances.Thexsi:schemaLocationattributespecifiesthelocationoftheXMLSchemaonwhichthecurrentXMLdocumentisbased.

AnXMLSchemadescribesarelatedsetofelementsandattributes.AnXMLSchemainstanceisanXMLdocumentthatusesthepreviouslydefinedXMLelementsandattributes.ThisconceptissimilartoaJavaclassanditsobjectinstances.

Finally,thetaglibelement'sversionattributespecifiestheJSP-specificationversiononwhichthetaglibraryisbased,asinJSP2.0.

SeeAlso

TheXMLschemafilefortheJSP2.0TLD:http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd;Recipe22.2oncreatingaJSP1.2TLDfilefortaglibraries;Recipe22.4andRecipe22.5onpackagingtaglibrariesinawebapplication;Recipe22.6on

Page 905: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

usingthecustomtaginaJSP;Recipe22.7onhandlingexceptionsintags;Recipe22.8andRecipe22.9oncreatingasimpletaghandler;Recipe22.10onusingthesimpletaghandlerinaJSP;Recipe22.11-Recipe22.14onusingaJSPtagfile;Recipe22.15onaddingalistenerclasstoataglibrary;thecustomtagsectionsofHansBergsten'sJavaServerPages,ThirdEdition(O'Reilly).

Page 906: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe22.4PackagingaTagLibraryinaWebApplication

Problem

Youwanttomakeyourtaglibraryavailableinawebapplication.

Solution

PlaceyourTLDfileinWEB-INForaWEB-INFsubdirectory(withtheexceptionofWEB-INF/libandWEB-INF/classes).PlacethetaghandlerclassorclassesinWEB-INF/classes.

Discussion

PackagingyourtaglibraryoutsideofaJARfileistypicallyatwo-stepprocess:

1. StoretheTLDfileintheWEB-INFdirectoryoraWEB-INFsubdirectory,andaJSPcontainer(compliantwithVersions1.2and2.0)automaticallyconfiguresyourtaglibrary.TheTLDfilemusthavea.tldextension.Forexample,ifyoustoreamytags.tldinWEB-INF/tlds,thentheJSPcontainerautomaticallyfindsyourTLDfileandconfigureyourtaglibrary.

TheJSP2.0specificationstatesthatTLDsshouldnotbeplacedinWEB-INF/liborWEB-INF/classes.TheJSPcontainerwillnotlookfortheTLDsintheselocations.

Page 907: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

2. Makesurethetaghandlerclassesforyourtaglibraryhaveapackagename(suchascom.jspservletcookbook)andarestoredinWEB-INF/classesorinaJARfileinWEB-INF/lib.

Thenextrecipeshowshowtopackageyourtaglibrary,includingtheTLD,inaJARfile.

SeeAlso

TheXMLschemafilefortheJSP2.0TLD:http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd;Recipe22.2andRecipe22.3oncreatingTLDfilesfortaglibraries;Recipe22.5onpackagingtaglibrariesinaJARfile;Recipe22.6onusingthecustomtaginaJSP;Recipe22.7onhandlingexceptionsintags;Recipe22.8andRecipe22.9oncreatingasimpletaghandler;Recipe22.10onusingthesimpletaghandlerinaJSP;Recipe22.11-Recipe22.14onusingaJSPtagfile;Recipe22.15onaddingalistenerclasstoataglibrary;thecustom-tagsectionsofHansBergsten'sJavaServerPages,ThirdEdition(O'Reilly).

Page 908: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe22.5PackagingtheTagLibraryinaJARFile

Problem

YouwanttomakeyourtaglibraryavailableinaJARfile.

Solution

CreateaJARfilethatcontainsyourtaghandlerclassorclassesinthecorrectdirectorystructure(withsubdirectorynamesmatchingthepackagenames).PlacethetaglibrarydescriptorfileintheJAR'sMETA-INFdirectory.ThenputtheJARintheWEB-INF/libdirectoryofyourwebapplication.

Discussion

Tomakeyourtaglibraryportable,storeallofyourtaghandlerclassesandtagfilesinaJARfile.

InaJAR,storeanytagfilesinMETA-INF/tagsorasubdirectoryofMETA-INF/tags.Ifyoudon't,theJSPcontainerwillnotrecognizethemaslegitimatetagfiles.SeeRecipe22.11fordetails.

YoucangeneratethisJARfilefromadirectorythatcontainsyourtaglibraryclasses,includingtheirpackage-relatedsubdirectories.Forexample,thelogotagIdevelopedinthischapterhasapackagename

Page 909: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

ofcom.jspservletcookbook,sotherelativepathtothisfileiscom/jspservletcookbook/LogoTag.class.IncludeaMETA-INFdirectoryatthetoplevelofthedirectorywheretheclassesarestored(e.g.,inthesamedirectoryastheonecontainingcom).PlaceyourtaglibrarydescriptorfileintheMETA-INFdirectoryoraMETA-INFsubdirectory.

Ifyourlibraryincludesanytagfiles,placetheminMETA-INF/tagsorasubdirectoryofMETA-INF/tags.Changetothedirectorycontainingallthesesubdirectoriesandtypethefollowingcommandline,substitutingyourownJARfilenameforcookbooktags.jar:

jarcvfcookbooktags.jar.

Don'tforgetthatperiod(.)characterattheend.Thistellsthejartooltoincludeallofthefilesanddirectoriesthatthecurrentdirectorycontainsinthearchive.

Makesureyourcomputer'sPATHenvironmentvariableincludesthepathtothebindirectoryofyourJavaSDKinstallation,asinh:\j2sdk1.4.1_01\bin.ThisallowsyoutotypejaratthecommandlinetolaunchtheJavajartool.

Toinstallthetaglibrary,justtaketheresultingJARfileandmoveitintoyourwebapplication'sWEB-INF/libdirectory.

TheJSPcontainer(inJSP1.2and2.0)automaticallylooksintheJAR'sMETA-INFdirectoryfortheTLDfileyoudonothavetoincludeataglibelementintheweb.xmldeploymentdescriptor.

SeeAlso

TheJSP2.0specificationwebpage:http://jcp.org/en/jsr/detail?id=152;Recipe22.2andRecipe22.3oncreatingTLDfilesfortaglibraries;Recipe22.4onpackagingataglibraryinawebapplicationwithoutusing

Page 910: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

aJARfile;Recipe22.6onusingthecustomtaginaJSP;Recipe22.7onhandlingexceptionsintags;Recipe22.8andRecipe22.9oncreatingasimpletaghandler;Recipe22.10onusingthesimpletaghandlerinaJSP;Recipe22.11andRecipe22.14onusingaJSPtagfile;Recipe22.15onaddingalistenerclasstoataglibrary;thecustomtagsectionsofHansBergsten'sJavaServerPages,ThirdEdition(O'Reilly).

Page 911: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe22.6UsingtheCustomTaginaJSP

Problem

Youwanttouseacustomtagthatyouhavedevelopedandinstalled.

Solution

IncludeataglibdirectiveatthetopoftheJSP.Thetaglibdirectivemustidentifytheuriforyourtaglibrary,asthaturiisspecifiedinyourTLDfile.

Discussion

Tousethecustomtagsfromyourtaglibrary,theJSPhastohaveataglibdirective,asinExample22-4.TheuriattributematchestheuriyourTLDfilespecifies(seeRecipe22.5).Theprefixattributespecifiesthenamespaceforyourtags.Example22-4specifiestheprefixcbck;therefore,theJSPusesthelogotagfromthattaglibraryinthemannerof<cbck:logo>...</cbck:logo>.

Ifthetagenclosesbodycontent(it'snotanemptytag),makesuretoclosethetagproperly,asin</cbck:logo>asopposedto</logo>.

IftheJSPdoesnotusethetagasspecifiedintheTLD(forexample,ifitleavesoutamandatoryattribute),theJSPwillfailtocompilethefirsttimeitisrequested.

Page 912: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Example22-4.TheLogotagusedinaJSP

<%@tagliburi="jspservletcookbook.com.tags"prefix="cbck"%>

<html>

<head><title>Micasaessucasa</title></head>

<body>

<cbck:logoheading="<%=request.getParameter("level")%>"image="stamp.gif"width="42"

height="54">Thanksforvisiting</cbck:logo>

Here'salltheotherstuffthispagecontains...

</body>

</html>

InExample22-4,thelogotag'sheadingattributetakesaruntimeexpressionvaluesothattheusercandynamicallysettheattributevalue,asinthefollowingURL:http://localhost:8080/home/logoTest.jsp?level=1.

Figure22-2showsthewebbrowserdisplayforthisJSP.

Figure22-2.Thewebbrowserdisplayofacustomtagoutput

Page 913: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

SeeAlso

TheJSP2.0specificationwebpage:http://jcp.org/en/jsr/detail?id=152;Recipe22.2andRecipe22.3oncreatingTLDfilesfortaglibraries;Recipe22.4andRecipe22.5onpackagingataglibraryinawebapplication;Recipe22.7onhandlingexceptionsintags;Recipe22.8andRecipe22.9oncreatingasimpletaghandler;Recipe22.10onusingthesimpletaghandlerinaJSP;Recipe22.11-Recipe22.14onusingaJSPtagfile;Recipe22.15onaddingalistenerclasstoataglibrary;thecustomtagsectionsofHansBergsten'sJavaServerPages,ThirdEdition(O'Reilly).

Page 914: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe22.7HandlingExceptionsinaCustomTagClass

Problem

Youwantyourcustomtaghandlertodealwithanyexceptionsthrowninsidethetag.

Solution

ImplementtheTryCatchFinallyinterfaceinyourtaghandler.

Discussion

ThetagextensionAPIprovidestheTryCatchFinallyinterface,whichyoucanimplementinyourtaghandlerclasstowritecodedealingwithanyexceptionsthetaghandlermightthrow.IftheclassimplementsTryCatchFinally,itmustincludethemethodsdoCatch()anddoFinally().IndoCatch(),thecodehasaccesstoanyThrowableobjectthrownbydoStartTag()ordoEndTag(),forinstance.IndoFinally(),thecodeclosesanyresourcesthetaguses,suchasadatabaseconnection.

Ingeneral,thisinterfaceallowsthetaghandleritselftocatchandhandleanyexceptionsthatdonotaffecttheoutputoftheJSPenclosingthetag.Example22-5usesthesamecodeasExample22-1,butadditionalmethodsareaddedbyimplementingtheTryCatchFinallyinterface.

Example22-5.Alogotaghandlerthatcatchesany

Page 915: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

exceptions

packagecom.jspservletcookbook;

importjavax.servlet.*;

importjavax.servlet.http.*;

importjavax.servlet.jsp.*;

importjavax.servlet.jsp.tagext.*;

/**ThistaggeneratesathumbnailimageusingtheHTMLimgtag,nexttoatextmessage.

TheuserspecifiesthecontentofthemessageandtheHeadinglevel(i.e.,<H1>-<H6>)*/

publicclassLogoTagextendsBodyTagSupportimplementsTryCatchFinally{

privateStringheading=null;

privateStringimage=null;

privateStringwidth=null;

privateStringheight=null;

//thismethodassumesthatattributepropertieshavebeenset.

publicintdoStartTag()throwsJspException{

try{

inth=newInteger(heading).intValue();

if(!(h>0&&h<7))

thrownewJspException(

"The'heading'attributevaluemustbetween1and6"+

"inclusive.");

}catch(Exceptione){

thrownewJspException(e.getMessage());

}

Page 916: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

returnEVAL_BODY_BUFFERED;

}

publicintdoEndTag()throwsJspException{

JspWriterout=pageContext.getOut();

StringimgDir=((HttpServletRequest)pageContext.getRequest()).

getContextPath()+"/images/";

Stringmessage=getBodyContent().getString().trim();

try{

out.println("<imgsrc=\""+imgDir+image+"\"width=\""+

width+"\"height=\""+height+"\"align=\"left\">"+"<H"+

heading+">"+message+"</H"+heading+">");

}catch(java.io.IOExceptionio){}

returnEVAL_PAGE;

}//doEndTag

/*Thenexttwomethodshavetobeimplementedinthisclasssincetheclassimplements

TryCatchFinally*/

publicvoiddoCatch(Throwablet){

try{

//printtheexceptionmessageinsidetheJSPwherethetag

//appears

pageContext.getOut().println(t.getMessage()+"<br/>");

Page 917: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

}catch(java.io.IOExceptionio){}

}

publicvoiddoFinally(){

//donothinghere,sincewedon'thaveanyresourcesopen

//likedatabaseconnections

}

publicvoidsetHeading(Stringlevel){

this.heading=level;

}

/*THERESTOFTHESOURCECODEFROMEXAMPLE22-1CONTINUES...*/

}

Ifthetagthrowsanexception,thenthewebcontainerinvokesthedoCatch()methodandthetaghandlerprintstheexceptionmessagewheretheJSPwouldotherwiseoutputtheimageproducedbythetag.OurdoFinally()methoddoesnotdoanything,becausethiscodedoesnothaveanyopenresourcessuchasaFileInputStream.

SeeAlso

TheJSP2.0specificationwebpage:http://jcp.org/en/jsr/detail?id=152;Recipe22.2andRecipe22.3oncreatingTLDfilesfortaglibraries;Recipe22.4andRecipe22.5onpackagingataglibraryinawebapplication;Recipe22.6onusingthecustomtaginaJSP;Recipe22.8andRecipe22.9oncreatingasimpletaghandler;Recipe22.10onusingthesimpletaghandlerinaJSP;Recipe22.11-Recipe22.14onusingaJSPtagfile;Recipe22.15onaddingalistenerclasstoataglibrary;thecustomtagsectionsofHansBergsten'sJavaServerPages,ThirdEdition

Page 918: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

(O'Reilly).

Page 919: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe22.8CreatingaSimpleTagHandler

Problem

YouwanttocreateaJSP2.0simpletaghandler.

Solution

CreateaJavaclassthateitherimplementstheSimpleTaginterfaceorextendstheSimpleTagSupportclass.

Discussion

Inanefforttosimplifycustomtagdevelopment,theJSP2.0specificationaddedthejavax.servlet.jsp.tagext.SimpleTaginterfaceandtheSimpleTagSupportclass.TheSimpleTagSupportclassisdesignedtobethebaseclassfortaghandlersthatimplementSimpleTag.Thesetaghandlershavetoimplementjustonemethod,doTag().

TheJSP2.0specificationstatesthatvendorsshouldnotcachesimpletaghandlers,sodevelopersdonothavetoworryaboutthereuseoftaghandlerobjectsandreleasingobjectstateintheircode.

Example22-6mimicsthelogotaghandlercreatedinearlierrecipes,butusestheSimpleTagSupportclassfromtheJSP2.0APIinstead.

Page 920: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Example22-6.Asimpletaghandlerdisplayingalogo

packagecom.jspservletcookbook;

importjava.io.IOException;

importjavax.servlet.*;

importjavax.servlet.http.*;

importjavax.servlet.jsp.*;

importjavax.servlet.jsp.tagext.*;

/**ThistaggeneratesathumbnailimageusinganHTMLimgtag,alignednexttoatext

message.TheuserspecifiesthecontentofthemessageandtheHeadinglevel(i.e.,<H1>-

<H6>)*/

publicclassSimpleLogoTagextendsSimpleTagSupport{

privateStringheading=null;

privateStringimage=null;

privateStringwidth=null;

privateStringheight=null;

publicvoiddoTag()throwsJspException,IOException{

//JspContextprovidesaccesstotheJspWriterforgenerating

//textfromthetag.Youcanalsogetanystoredattributevalues

//usingJspContext

JspContextjspContext=getJspContext();

//thismethodassumesthatattributepropertieshavebeenset.

try{

inth=newInteger(heading).intValue();

if(!(h>0&&h<7))

thrownewJspException(

Page 921: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

"The'heading'attributevaluemustbetween1and6"+

"inclusive.");

}catch(Exceptione){thrownewJspException(e.getMessage());}

//GetaJspWritertoproducethetag'soutput

JspWriterout=jspContext.getOut();

//thevalueofthe'imgDir'attributeisthewebapp's/images

//directory;thedirectorypathisstoredinasessionattribute

StringimgDir=(String)jspContext.findAttribute("imgDir");

if(imgDir==null||"".equals(imgDir))

thrownewJspException(

"Noattributeprovidedspecifyingtheapplication's"+

"imagedirectory.");

//displaytheimgandHHTMLtags

out.println(newStringBuffer("<imgsrc=\"").append(imgDir).

append(image).append("\"width=\"").append(width).

append("\"height=\"").append(height).append("\"align=\"left\">").

append("<H").append(heading).append(">").toString());

//getJspBody()returnsa'JspFragment'object;calling'invoke()'

//onthisobjectwitha'null'parameterwillusetheJSPpage's

//JspWritertooutputthetag'snestedcontentintheJSP

getJspBody().invoke(null);

out.println(newStringBuffer("</H").append(heading).

append(">").toString());

}//doTag

//Attribute-relatedsettermethods

publicvoidsetHeading(Stringlevel){

Page 922: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

this.heading=level;

}

publicvoidsetImage(Stringname){

this.image=name;

}

publicvoidsetWidth(Stringwidth){

this.width=width;

}

publicvoidsetHeight(Stringheight){

this.height=height;

}

}//SimpleLogoTag

ThissimpletaghandleraccessesaJspContextobjectbycallingtheSimpleTagSupport'sgetJspContext()method.ThecodeusestheJspContexttoobtainthevalueofanattributestoredinthesession,aswellastoaccessaJspWritertogeneratethetag'soutput:

JspContextjspContext=getJspContext();

//furtheralonginthecode...

JspWriterout=jspContext.getOut();

//thevalueofthe'imgDir'attributeisthewebapp'simages

Page 923: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

//directory;itisstoredinasessionattribute

StringimgDir=(String)jspContext.findAttribute("imgDir");

//codecontinues...

CallingtheSimpleTagSupport'sgetJspBody()methodreturnsaJspFragmentobject,whichrepresentsachunkofJSPcodeasanobject.Callingthisobject'sinvoke()methodwithnullastheparameterdirectstheoutputofthefragmenttotheJspWriteravailabletothetaghandler:

//Getthetag'sbodycontentandoutputitusingtheJspWriter

//thatisavailablebycallingJspContext.getOut()

getJspBody().invoke(null);

ThiscodedisplaysthecontentortextthattheJSPdeveloperincludedwithinthecustomaction'sstartandendtags.Thetaghandlerusesthetag'sbodycontentasthetextuallogomessage.Figure22-1inRecipe22.1showswhattheJSPpagelookslikeinawebbrowser.

SeeAlso

TheJSP2.0specificationwebpage:http://jcp.org/en/jsr/detail?id=152;Recipe22.2andRecipe22.3oncreatingTLDfilesfortaglibraries;Recipe22.4andRecipe22.5onpackagingataglibraryinawebapplication;Recipe22.6onusingthecustomtaginaJSP;Recipe22.7onhandlingexceptionsintags;Recipe22.9oncreatingaTLDforasimpletaghandler;Recipe22.10onusingthesimpletaghandlerinaJSP;Recipe22.11-Recipe22.14onusingaJSPtagfile;Recipe22.15onaddingalistenerclasstoataglibrary;thecustomtagsectionsofHansBergsten'sJavaServerPages,ThirdEdition(O'Reilly).

Page 924: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe22.9CreatingaTLDforaSimpleTagHandler

Problem

YouwanttocreateaTLDforasimpletaghandler.

Solution

UsetheJSP2.0-styleTLDforthesimpletaghandler.

Discussion

ThesimpletaghandlerderivesfromtheJSP2.0API,soyoucanusetheTLDversionfromJSP2.0aswell.Example22-7showsthetaglibstarttagandthevariousxmlnsattributesthatyourTLDmustreproduceexactly.Then,unlessyouareusingJSP2.0TLDfeaturessuchasthetag-fileelement,youcanspecifythetagelementanditsnestedelementswiththesameXMLsyntaxthatyouusedforthepriorTLDversion.

Example22-7.AJSP2.0TLDfileforasimpletaghandler

<taglibxmlns="http://java.sun.com/xml/ns/j2ee"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation=

"http://java.sun.com/xml/ns/j2ee

http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"

version="2.0"

Page 925: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

>

<!--THERESTOFTHEXMLCONTENTISTHESAMEASTHEJSP1.2TLDVERSIONEXCEPTFOR<jsp-

version>2.0</jsp-version>-->

<tlib-version>1.0</tlib-version>

<jsp-version>2.0</jsp-version>

<short-name>cbck</short-name>

<uri>com.jspservletcookbook.tags</uri>

<description>Cookbookcustomtags</description>

<tag>

<name>simplelogo</name>

<tag-class>com.jspservletcookbook.SimpleLogoTag</tag-class>

<body-content>JSP</body-content>

<description>ThistagwritesalogoinsidetheJSP.</description>

<attribute>

<name>heading</name>

<required>true</required>

<rtexprvalue>true</rtexprvalue>

<description>

Theheadinglevelforthelogo;1through6.

</description>

</attribute>

<attribute>

<name>image</name>

<required>true</required>

<rtexprvalue>true</rtexprvalue>

<description>Theimagenameforthelogo.</description>

</attribute>

Page 926: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<attribute>

<name>width</name>

<required>true</required>

<rtexprvalue>true</rtexprvalue>

<description>Theimagewidthforthelogo.</description>

</attribute>

<attribute>

<name>height</name>

<required>true</required>

<rtexprvalue>true</rtexprvalue>

<description>Theimageheightforthelogo.</description>

</attribute>

</tag>

</taglib>

Tousethesimpletaghandlerinawebapplication,placetheTLDinasubdirectoryofWEB-INFlikeWEB-INF/tlds.Or,storetheTLDinaJARfile'sMETA-INFdirectoryorasubdirectorythereof.ThenputtheJARintheWEB-INF/libdirectory.

SeeAlso

TheJSP2.0specificationwebpage:http://jcp.org/en/jsr/detail?id=152;Recipe22.2-Recipe22.3oncreatingTLDfilesfortaglibraries;Recipe22.4-Recipe22.5onpackagingataglibraryinawebapplication;Recipe22.6onusingthecustomtaginaJSP;Recipe22.7onhandlingexceptionsintags;Recipe22.8oncreatingasimpletaghandler;Recipe22.10onusingthesimpletaghandlerinaJSP;Recipe22.11-Recipe22.14onusingaJSPtagfile;Recipe22.15onaddingalistenerclassto

Page 927: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

ataglibrary;thecustomtagsectionsofHansBergsten'sJavaServerPages,ThirdEdition(O'Reilly).

Page 928: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe22.10UsingaSimpleTagHandlerinaJSP

Problem

Youwanttouseacustomtagbasedonasimpletaghandler.

Solution

UsethetaglibdirectiveintheJSP,specifyingtheproperuriattributeforthetaglibrary.

Discussion

Makesuretopackagethetaglibrary,thesimpletaghandler,anditsassociatedTLD,asdescribedbyRecipe22.4andRecipe22.5andthenoteinRecipe22.9.Example22-8showstherestofthesetupneededtousethetaginaJSP.

Simpletaghandlersaredesignedtobeeasiertodevelop(byhavingonlyonemethodthatyouneedtoimplement:voiddoTag()).UsetheassociatedtagsinaJSPthesamewayyouusethetagsassociatedwithclassictaghandlers.

Example22-8.AJSPusesatagdefinedbyasimpletaghandler

Page 929: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<%@tagliburi="jspservletcookbook.com.tags"prefix="cbck"%>

<html>

<head><title>MeCasaSuCasa</title></head>

<body>

<%session.setAttribute("imgDir",(request.getContextPath()+

"/images/"));%>

<cbck:simplelogoheading=

"<%=request.getParameter(\"level\")%>"image=

"stamp.gif"width="42"height="54">

Thanksforvisitinghere</cbck:simplelogo>

Here'salltheotherstuffthispagecontains...

</body>

</html>

TheJSPinExample22-8obtainsthevalueforthelogotag'sheadingattributewithaJSPexpression.TheJSPpageuserprovidesthevalueintheURLasin:

http://localhost:8080/home/logoTest.jsp?level=1

TheJSP'soutputlooksthesameastheoutputshowninFigure22-1ofRecipe22.1.

SeeAlso

TheJSP2.0specificationwebpage:http://jcp.org/en/jsr/detail?id=152;Recipe22.2andRecipe22.3oncreatingTLDfilesfortaglibraries;Recipe22.4andRecipe22.5onpackagingataglibraryinawebapplication;Recipe22.6onusingthecustomtaginaJSP;Recipe22.7onhandlingexceptionsintags;Recipe22.8andRecipe22.9oncreatingasimpletaghandler;Recipe22.11-Recipe22.14onusingaJSPtagfile;Recipe22.15onaddingalistenerclasstoataglibrary;thecustomtagsectionsofHansBergsten'sJavaServerPages,ThirdEdition(O'Reilly).

Page 930: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe22.11CreatingaJSPTagFile

Problem

Youwanttocreateacustomtagintheformofatagfile.

Solution

CreatethetagfileusingJSPsyntaxandwithanextensionof.tagor.tagx.PlacethetagfileinWEB-INF/tagsorinMETA-INF/tagsinsideaJARfile,orinasubdirectoryofeitherofthesedirectories.

Discussion

JSP2.0introducedtagfiles,whicharecustomtagsthatyouwriteusingJSPsyntax.TagfilesaredesignedtoallowdeveloperswithlittleornoJavaexperiencetocreatesimpletagsusingonlyJSPandXMLelements.Inaddition,tagfilesdonotrequireaTLD,althoughyoucandescribeatagfileinaTLD(seeRecipe22.12).Ifyoucreatethetagfile,thendropitintheWEB-INF/tagsdirectory,theJSPcontainercompilesthefileintoataghandlerclassthefirsttimeitsassociatedtagisusedinaJSP.

TheJSPcontainerconvertsthetagfileintoaclassthatextendsjavax.servlet.jsp.tagext.SimpleTagSupport.SeeRecipe22.8formoredetailsonthatclass.

Tagfileshaveintroducedafewmoredirectivesandstandardactions,suchasthetagandattributedirectives,aswellasthejsp:doBody

Page 931: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

action.Example22-9showsthesenewsyntaxelements.Theexamplecreatesthesamelogotagwehaveworkedonthroughoutthischapter,butusestagfileformat.

Recipe22.14showshowtheresultingcustomtagcanbeusedinaJSP.

Example22-9usesatagdirectivetospecifythatthetag'sbodycontent(thetextthatappearsbetweenthestartandendtags)isscriptless.Thismeansthatthebodycontentcontainsonlytemplatetext,ELcode,andJSPactionelements.

Ifyouaredefininganemptytag,thebody-contentvalueis"empty."IfthetagacceptsJSPcodeinitsbody,use"JSP"forthisvalue.Thefourthbody-contentoptionis"tagdependent,"meaningthatthetagitselfinterpretsthecodeinitsbody(suchasSQLstatements).

SinceatagfilecanusenormalJSPsyntax,Example22-9usesataglibdirectivetousetheJSTL(seeChapter23).Thentheexampledefineseachoneofthetag'sattributes.

Rememberthattagandattributearedirectives,sotheircodestartswith"<%@."

Example22-9.AtagfilegeneratesacustomtagthatinsertsalogoinaJSP

Page 932: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<%@tagbody-content="scriptless"description="WritestheHTMLcodeforinsertingalogo."

%>

<%@taglibprefix="c"uri="http://java.sun.com/jstl/core"%>

<%@attributename="heading"required="true"rtexprvalue=

"true"description="Theheadinglevelforthelogo."%>

<%@attributename="image"required="true"rtexprvalue=

"true"description="Theimagenameforthelogo."%>

<%@attributename="width"required="true"rtexprvalue=

"true"description="Theimagewidthforthelogo."%>

<%@attributename="height"required="true"rtexprvalue=

"true"description="Theimageheightforthelogo."%>

<imgsrc="<c:outvalue="${imgDir}${image}"/>"width=

"<c:outvalue="${width}"/>"height="<c:outvalue=

"${height}"/>"align="left">

<H<c:outvalue="${heading}"/>><jsp:doBody/></H<c:outvalue="${heading}"/>>

TheattributesfortheattributedirectivearethesameastheattributesthatyouuseforaJSP1.2-styleTLDfile(seeRecipe22.2).Sinceatagfileacceptsplaintemplatetext,thisishowwehavesetuptheHTMLimgtagthatthetagfileisdesignedtogenerate.

Theimgtaggetsthevaluesforitsownattributesusingthec:outJSTLtagandtheEL(seeChapter23).Forexample,theexpression"${imgDir}"returnsthevalueforastoredobjectattributeofthesamename,whichspecifiesadirectorythatcontainstheimageusedinthelogo.Theexpression"${image}"returnsthevalueofthetag'simageattributewhich,bythislineofthecode,hasalreadybeensetbytheuser.

Thejsp:doBodystandardactionisaniftywaytooutputthetextbetweenthecustomaction'sstarttagandendtag.

Page 933: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Thejsp:doBodyaction,aswellasthetag,attribute,andvariable(notshowninthisrecipe)directives,canbeusedonlyintagfiles.

SeeAlso

TheJSP2.0specificationwebpage:http://jcp.org/en/jsr/detail?id=152;Recipe22.2andRecipe22.3oncreatingTLDfilesfortaglibraries;Recipe22.4andRecipe22.5onpackagingataglibraryinawebapplication;Recipe22.6onusingthecustomtaginaJSP;Recipe22.7onhandlingexceptionsintags;Recipe22.8andRecipe22.9oncreatingasimpletaghandler;Recipe22.10onusingthesimpletaghandlerinaJSP;Recipe22.12-Recipe22.14onusingaJSPtagfile;Recipe22.15onaddingalistenerclasstoataglibrary;thecustomtagsectionsofHansBergsten'sJavaServerPages,ThirdEdition(O'Reilly).

Page 934: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe22.12PackagingtheJSPTagFileinaWebApplication

Problem

Youwanttostorethetagfileforuseinawebapplication.

Solution

PlacethetagfileinWEB-INF/tagsorinMETA-INF/tagsinsideaJARfileorinasubdirectoryofeitherofthesedirectories.IfyoudothisyoudonotneedtodescribethetaginaTLDfile.

Discussion

TheJSPcontainerfindsthetagfilebyusingthetagDirattributeofthetaglibdirective.Inotherwords,thetagDirattributeprovidesthepathtothewebapplicationdirectorywhereyoustoredthetagfile.Here'sanexample:

<%@taglibprefix="cbck"tagdir="/WEB-INF/tags"%>

Aslongasyouplacethetagfile,whichhasa.tagextension(or.tagxextensionifthetagfileisinXMLsyntax)in/WEB-INF/tags,JSPscantousethetagassociatedwiththetagfile.

TheJSPhastopositionthetaglibdirectiveinthecodebeforetheJSPusestheassociatedcustomtag.

Page 935: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

TheJSP2.0TLDcanalsospecifythetagfileinthefollowingmanner:

<tag-file>

<name>dbSelect</name>

<path>/WEB-INF/tags/dbtags</path>

</tag-file>

ThisTLDentryspecifiesatagfilenameddbSelect.tag,whichresidesinthe/WEB-INF/tags/dbtagsdirectory.Thepathattributemustbeginwith"/META-INF/tags"ifthetagfileresidesinaJAR,and"/WEB-INF/tags"ifthetagfileislocatedinaWebArchive(WAR)fileorinanonarchivedwebapplication.

SeeAlso

TheJSP2.0specificationwebpage:http://jcp.org/en/jsr/detail?id=152;Recipe22.2andRecipe22.3oncreatingTLDfilesfortaglibraries;Recipe22.4andRecipe22.5onpackagingataglibraryinawebapplication;Recipe22.6onusingthecustomtaginaJSP;Recipe22.7onhandlingexceptionsintags;Recipe22.8andRecipe22.9oncreatingasimpletaghandler;Recipe22.10onusingthesimpletaghandlerinaJSP;Recipe22.13andRecipe22.14onpackagingatagfileandusingitinaJSP;Recipe22.15onaddingalistenerclasstoataglibrary;thecustomtagsectionsofHansBergsten'sJavaServerPages,ThirdEdition(O'Reilly).

Page 936: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe22.13PackagingtheJSPTagFileinaJAR

Problem

YouwanttostorethetagfileinaJARfile.

Solution

PlacethetagfileintheJAR'sMETA-INF/tagsdirectoryorasubdirectorythereof.

Discussion

DeveloperscommonlydistributetaglibrariesasJARfiles,particularlyiftheyhavedesignedthetaglibrarytobeportable.ForJSP2.0-styletaglibrariesthatareusingtagfiles,placethetagfileinMETA-INF/tagsorasubdirectoryofMETA-INF/tags.Thetagfilemusthavea.tagextension,ora.tagxextensionifit'satagfileinXMLsyntax.

ThenplacetheJARfileinWEB-INF/libofanywebapplicationcontainingJSPsthatwillusethetag.

SeeAlso

TheJSP2.0specificationwebpage:http://jcp.org/en/jsr/detail?id=152;Recipe22.2andRecipe22.3oncreatingTLDfilesfortaglibraries;Recipe22.4andRecipe22.5onpackagingataglibraryinawebapplication;Recipe22.6onusingthecustomtaginaJSP;Recipe22.7

Page 937: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

onhandlingexceptionsintags;Recipe22.8andRecipe22.9oncreatingasimpletaghandler;Recipe22.10onusingthesimpletaghandlerinaJSP;Recipe22.14onusingatagtagfilebasedonatagfile;Recipe22.15onaddingalistenerclasstoataglibrary;thecustomtagsectionsofHansBergsten'sJavaServerPages,ThirdEdition(O'Reilly).

Page 938: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe22.14UsingaCustomTagAssociatedwithaTagFile

Problem

Youwanttouseacustomtagassociatedwithatagfile.

Solution

UsethetaglibdirectiveintheJSP,beforethecodethatusesthetagfilerelatedtag.

Discussion

Thetaglibdirectiveidentifiesthetagwithitstagdirattribute,whichisthewebapplicationpathtothetagsdirectory.Example22-10usesthetagfromatagfilestoredat/WEB-INF/tags/logo.tag.

ThetagnameintheJSPisthesameasthetagfilename,withoutthe.tagextension.Theprefixattributerepresentsthecustomtag'snamespace,sotheentiretagisusedintheJSPas"<cbck:logoheading=...>...tagcontent...</cbck:logo>."

Example22-10.AJSPusesatagdefinedinatagfile

<%@taglibprefix="cbck"tagdir="/WEB-INF/tags"%>

<html>

<head><title>MeCasaSuCasa</title></head>

Page 939: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<body>

<%session.setAttribute("imgDir",(request.getContextPath()+"/images/"));%>

<cbck:logoheading="<%=request.getParameter(\"level\")%>"image=

"stamp.gif"width="42"height="54">

Thanksforvisitinghere...

</cbck:logo>

Here'salltheotherstuffthispagecontains...

</body>

</html>

Iusethesamebasiclogotagthroughoutthischaptertoillustratethevariouscustom-tagsyntaxdifferences.SeeRecipe22.2fordetailsonthelogotagitself.

SeeAlso

TheJSP2.0specificationwebpage:http://jcp.org/en/jsr/detail?id=152;Recipe22.2andRecipe22.3oncreatingTLDfilesfortaglibraries;Recipe22.4andRecipe22.5onpackagingataglibraryinawebapplication;Recipe22.6onusingthecustomtaginaJSP;Recipe22.7onhandlingexceptionsintags;Recipe22.8andRecipe22.9oncreatingasimpletaghandler;Recipe22.10onusingthesimpletaghandlerinaJSP;Recipe22.11-Recipe22.13onsettingupaJSPtagfile;Recipe22.15onaddingalistenerclasstoataglibrary;thecustomtagsectionsofHansBergsten'sJavaServerPages,ThirdEdition(O'Reilly).

Page 940: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe22.15AddingaListenerClasstoaTagLibrary

Problem

Youwanttoincludealistenerclasswithyourtaglibrary.

Solution

AddalistenerelementtoyourTLDfile.

Discussion

TheservletAPIincludes"applicationeventlisteners,"whicharespecialJavaclassesthatarenotifiedbythewebcontainerwhencertaineventsoccur,suchasthecreationofanewusersession(seeChapter11).Youcanincludelistenerclasseswithyourtaglibraries.Forexample,youmighthaveasession-relatedtagthatneedstoknowwhensessionsarecreatedordestroyed.

Thelistenerelementhasexactlythesamesyntaxasitmayappearintheweb.xmldeploymentdescriptor.Example22-11showsalistenerelementincludedinaJSPVersion2.0TLD.

Example22-11.AddingalistenerelementtoaJSP2.0TLD

<!--beginningoftheTLDfile.Thelistenerelementisnestedinthetaglibelement.SEE

CHAPTER11OR14FORLISTENERCODEEXAMPLES-->

Page 941: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<taglibxmlns="http://java.sun.com/xml/ns/j2ee"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation=

"http://java.sun.com/xml/ns/j2ee

http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"

version="2.0"

>

<tlib-version>1.0</tlib-version>

<jsp-version>2.0</jsp-version>

<short-name>cbck</short-name>

<uri>com.jspservletcookbook.tags</uri>

<description>Cookbookcustomtags</description>

<listener>

<listener-class>

com.jspservletcookbook.ReqListener

</listener-class>

</listener>

<tag>

<!--declareataghere.SeeExample22-2(Recipe22.2),Example22-3(recipe

22.3),or22-7(Recipe22.9)-->

</tag>

</taglib>

TheJSPspecificationrequirestheJSPcontainertoautomaticallyinstantiateandregisterthelistenersthatareassociatedwithtaglibraries.Alistenercanbeusedwithataglibrarytotrackthenumberofrequeststhewebapplicationisreceiving,asshownintheServletRequestListenerinExample18-8(Recipe18.6).

Page 942: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

JSP1.2'sTLDfileusesanXMLDTD.Therefore,theTLDelementsmustappearinaspecificsequence.Thelistenerelementisnestedinsidethetaglibelement;listenerappearsafteralloftheothernestedelementsexceptfortag.Youcanprecedeyourtagelementswiththelistenerelement.IntheJSP2.0TLD,ontheotherhand,youcanpositionthelistenerrightafterthetaglibrootelement.

StoreanylistenerclassesinthesameJARfileastheonecontaininganytaghandlerclasses.

Makesuretospecifythelistenerclassinthelistener-classelementasafullyqualifiedclassname,ortheJSPcontainerwillprobablyhavetroublefindingtheclass.

SeeAlso

Example18-8inRecipe18.6foranexampleofaclassthatimplementsthejavax.servlet.ServletRequestListener;Chapter11andChapter14forseverallistener-relatedrecipes;Recipe22.2oncreatingaJSP1.2TLDfile;Recipe22.3oncreatingaJSP2.0TLD;Recipe22.9oncreatingaTLDforasimpletaghandler;thecustomtagsectionsofHansBergsten'sJavaServerPages,ThirdEdition(O'Reilly).

Page 943: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Chapter23.UsingtheJSTLIntroduction

Recipe23.1.DownloadingtheJSTL1.0andUsingtheJSTLTagsinJSPs

Recipe23.2.DownloadingtheJavaWebServicesDeveloperPack

Recipe23.3.UsingtheCoreJSTLTags

Recipe23.4.UsingtheXMLCoreJSTLTags

Recipe23.5.UsingtheXMLTransformTags

Recipe23.6.UsingtheFormattingJSTLTags

Recipe23.7.UsingASQLJSTLTagwithaDataSourceConfiguration

Recipe23.8.UsingASQLJSTLTagWithoutaDataSourceConfiguration

Recipe23.9.AccessingScopedVariableswiththeEL

Recipe23.10.AccessingRequestParameterswiththeEL

Recipe23.11.UsingtheELtoAccessRequestHeaders

Recipe23.12.UsingtheELtoAccessOneRequestHeader

Recipe23.13.AccessingCookieswiththeEL

Recipe23.14.UsingtheELtoAccessJavaBeanProperties

Recipe23.15.UsingJSTLFunctions

Page 944: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Introduction

JavaServerPage'scustomtagsandtaghandlersaredesignedtohelpyouinventyourowntags.WhilethisisapowerfultoolforJavawebdevelopers,developingcustomtagsentailsasteeplearningcurveandcanbetimeconsuming.Luckily,somehard-workingvolunteersoftwaredevelopershavedevelopedabunchofhighlyusefultagsforyou.ThistagcollectioniscalledtheJavaServerPagesStandardTagLibrary(JSTL).TheJSTLspecificationarisesfromtheJavaCommunityProcess(JSR-052)andtheApacheJakartaProjecthasdevelopedaJSTLimplementation,theStandard1.0taglib.

TheJSTLhasverybroadfunctionality.Itincludestagsthat:

1. Setobjectattributesforwebapplications(c:set).

Outputtexttowebpages(c:outandx:out).

Iterateovercollectionsofdata(c:forEachandx:forEach).

Formatnumbers,dates,andcurrenciesusingdifferentinternationalstyles(e.g.,fmt:formatDate,fmt:formatNumber).

TransformXML(x:transform).

InteractwithdatabasesusingSQL(e.g.,sql:query,sql:update).

AllowyoutoembedfunctioncallsinJSPcodeandtemplatetext(e.g.,fn:substring()).ThisfunctionalityisavailableonlywithJSP2.0andJSTL1.1(seeRecipe23.14).

TheJSTLoriginatedaveryimportantnewJSPtechnology,theExpressionLanguage(EL).ThisisascriptinglanguagebasedgenerallyonJavaScriptandotherscriptingtoolsthat,withJSP2.0,canbe

Page 945: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

embeddedinHTMLtemplatetext.

TheELwasoncepartofJSTL1.0buthasnowmigratedtotheJSPspecification.TheELmustbeimplementedwithJSP2.0containerssuchasTomcat5.

ThischapterisdesignedtostartyouquicklywiththeJSTL,whichcommonlyhastobedownloadedandinstalledinawebapplication.ManywebcontainerseventuallyintegrateorhavealreadyintegratedaJSTLimplementationwiththeirservletandJSPengines.

Page 946: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe23.1DownloadingtheJSTL1.0andUsingtheJSTLTagsinJSPs

Problem

YouwanttodownloadandusetheJSTL.

Solution

DownloadtheJSTLdistribution,inaZIPorTARfile,fromtheApacheJakartaProject.

Discussion

TheApacheJakartaProjecthoststhereferenceimplementation(RI)fortheJSTL.AnRIissoftwarethatisdesignedtoimplementaparticularJavatechnologyspecificationinordertodemonstratehowthesoftwareisintendedtofunction.RIsarefreelyavailableforusebysoftwarevendorsanddevelopers.YoucandownloadthebinaryorsourcedistributionoftheJSTLfromhttp://jakarta.apache.org/taglibs/doc/standard-doc/intro.html.

UnpacktheZIPorTARfileintothedirectoryofyourchoice.Thiscreatesajakarta-taglibsdirectory.

ThisrecipeusestheStandardTaglibVersion1.0.3,animplementationoftheJSTL1.0.However,bythetimeyoureadthis,theJakartaTaglibssitewillhaveintroducedStandardTaglibVersion1.1,whichisanimplementationoftheJSTL1.1.Thenewversionincludessomenewfeaturessuchasfunctions,whicharedescribedinRecipe23.14.

Page 947: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Insidethestandard-1.0.3directoryisalibsubdirectory.ThisdirectorycontainsanumberofJARfiles,includingjstl.jarandstandard.jar.Thejstl.jarcontainstheJSTL1.0APIclasses;standard.jarisacollectionofJSTL1.0implementationclasses.AddalloftheJARfilesfoundinyourJSTLdistribution'slibdirectory(jakarta-taglibs/standard-1.0.3/libintheexample)toWEB-INF/lib.

JSTL1.1onlyrequirestheinstallationofjstl.jarandstandard.jarin/WEB-INF/libifyouareusingJ2SE1.4.2orhigher(aswellasServlet2.4andJSP2.0).

Table23-1describeseachoftheJARfilesfoundinthedistribution'slibdirectory(courtesyoftheStandardTaglib1.0documentation).

Table23-1.ContentsoftheJSTL1.0referenceimplementationlibdirectory

Filename Purpose

jstl.jar JSTL1.0APIclasses

standard.jar JSTL1.0implementationclasses

jaxen_full.jar Xpathengineclasses

jdbc2_0-stdext.jar JavaDatabaseConnectivity(JDBC)implementationclasses(alsoincludedwithJ2SE1.4)

saxpath.jar SimpleAPIforXpathparsing

xalan.jar ApacheXalanExtensibleStyleSheetTransformations(XSLT)processor

dom.jar,jaxp-api.jar,sax.jar,xercesImpl.jar JavaAPIforXMLProcessing(JAXP)1.2APIlibraries

Page 948: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

IntheJSPwhereyouwanttousetheJSTLtags,usethepropertaglibdirectiveshowninTable23-2.Forexample,ifyouuseallofthedifferentJSTLfunctions(core,XML,formatting,andSQL),yourJSPcontainsallofthefollowingtaglibdirectives,preferablyatthetopoftheJSPpage(theymustappearbeforethetagsareused).

Table23-2.ThetaglibdirectivesfordifferentJSTLfunctions,version1.0

JSTLlibrary taglibdirective

Core <%@tagliburi="java.sun.com/jstl/core"prefix="c"%>

XMLprocessing <%@tagliburi="java.sun.com/jstl/xml"prefix="x"%>

Formattingdata(suchasdatesandcurrencies)forinternationalusers

<%@tagliburi="java.sun.com/jstl/fmt"prefix="fmt"%>

SQLandDatabaseaccess <%@tagliburi="java.sun.com/jstl/sql"prefix="sql"%>

TheJavacommunityisnowworkingontheJSTLVersion1.1,whichwillrequireaJSP-2.0compatibleJSPcontainer.JSTL1.1willusethesedifferenturivaluesinthetaglibdirective:

http://java.sun.com/jsp/jstl/core,sotheentiretaglibdirectivewouldlooklike:<%@tagliburi="java.sun.com/jsp/jstl/core"prefix="c"%>

http://java.sun.com/jsp/jstl/xml,creatingataglibdirectiveof:<%@tagliburi="java.sun.com/jsp/jstl/xml"prefix="x"%>

http://java.sun.com/jsp/jstl/fmt,asusedinthetaglibdirective:<%@tagliburi="java.sun.com/jsp/jstl/fmt"prefix="fmt"%>

http://java.sun.com/jsp/jstl/sql,creatingataglibdirectiveof:<%@tagliburi="java.sun.com/jsp/jstl/sql"prefix="sql"%>

SeeAlso

Page 949: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

TheJakartaProject'sTaglibssite:http://jakarta.apache.org/taglibs/index.html;SunMicrosystem'sJSTLinformationpage:http://java.sun.com/products/jsp/jstl/;Recipe23.3onusingthecoretags;Recipe23.4andRecipe23.5onusingXML-relatedtags;Recipe23.6onusingtheformattingtags;Recipe23.7andRecipe23.8ontheJSTL'sSQLfeatures;Recipe23.9-Recipe23.14onusingtheELtoaccessscopedvariables,cookies,andJavaBeanproperties.

Page 950: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe23.2DownloadingtheJavaWebServicesDeveloperPack

Problem

YouwanttodownloadtheJavaWebServicesDeveloperPack(WSDP)sothatyoucanuseaJSTL1.1referenceimplementation.

Solution

VisittheSunMicrosystemsJavaWSDPdownloadsiteathttp://java.sun.com/webservices/jwsdp.

Discussion

TheJavaWSDPVersion1.2containsreferenceimplementationsoftheJSTL1.1,aswellasseveralotherwebtiertechnologies,includingtheServletAPI2.4andJSP2.0.TheWSDPisbundledwithTomcat5,soonceyouinstalltheWSDPyoucanexperimentwiththevarioustechnologies,includingJavaServerFaces,JavaArchitectureforXMLBinding(JAXB),JavaAPIforXMLProcessing,andJavaAPIforXML-basedRPC(Jax-RPC).

TheJavaWSDP1.2installsonbothWindowsandvariousUnixsystems,suchasSolarisandLinux.Recipe23.15showshowtouseJSTL1.1functions;IusetheWSDPforthisrecipe.

UsingTomcat5andthenewJSTL1.1featuressuchasfunctionsandtheembeddingofELcodeintemplatetextrequiresyoutousetheservletAPI2.4versionofweb.xml.SeeRecipe23.15formoredetailsonthisissue.

Page 951: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

SeeAlso

TheSunMicrosystemsJavaWSDPdownloadsiteat:http://java.sun.com/webservices/jwsdp;Recipe23.15onusingJSTL1.1functions;Sun'sJSTLinformationpage:http://java.sun.com/products/jsp/jstl/;Recipe23.3onusingthecoretags;Recipe23.4andRecipe23.5onusingXML-relatedtags;Recipe23.6onusingtheformattingtags;Recipe23.7andRecipe23.8ontheJSTL'sSQLfeatures;Recipe23.9-Recipe23.14onusingtheELtoaccessscopedvariables,cookies,andJavaBeanproperties.

Page 952: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe23.3UsingtheCoreJSTLTags

Problem

YouwanttousethecoreJSTLtagsinaJSP.

Solution

UsethetaglibdirectivewiththecoreuriattributevaluetomakethetagsavailableintheJSP.

Discussion

ThisrecipedemonstratesseveralJSTLtagsthatyouuseallthetime:c:set,c:out,c:forEach,andc:if.Herearethetagsummaries:

Thec:settagsetsobjectattributestopage,request,session,orapplicationscopes.

Thec:outtagdisplaystextliteralsorthevaluesofvariablesorbeanpropertiesinyourJSPs.

Thec:forEachtagiteratesoverMaps,Collections,andarrays.

Thec:iftagtestsexpressionsfortrueorfalsevalues,thenconditionallyexecutesthecodenestedinthec:ifbody.

RemembertousetheprefixforthecertainfunctionalareaoftheJSTL,suchasc,

Page 953: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

followedbyacolon,andthetagname,asin"c:forEach."

Example23-1isahelperclassthatIfindnecessarytoproperlyreturnaStringarrayofTimeZoneIDstotheJSPinExample23-2.

Example23-1.AhelperclasstohelpdisplayTimeZoneIDs

packagecom.jspservletcookbook;

importjava.util.TimeZone;

publicclassZoneWrapper{

publicZoneWrapper(){}

publicString[]getAvailableIDs(){

returnTimeZone.getAvailableIDs();

}

}

Example23-2showshowtouseanumberofthecoreJSTLtags.Thecodeusesthejsp:useBeanstandardactiontocreateZoneWrapper(Example23-1)andjava.util.Dateobjectsforusebythetags.

Example23-2.UsingcoreJSTL1.0tagsinaJSP

<%@tagliburi="http://java.sun.com/jstl/core"prefix="c"%>

Page 954: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<jsp:useBeanid="zone"class="com.jspservletcookbook.ZoneWrapper"/>

<jsp:useBeanid="date"class="java.util.Date"/>

<html>

<head><title>UsingtheCoreJSTLtags</title></head>

<body>

<h2>HerearetheavailableTimeZoneIDsonyoursystem</h2>

<c:iftest="${date.time!=0}">

<c:outvalue=

"Phew,timehasnotstoppedyet...<br/><br/>"escapeXml="false"/>

</c:if>

<%--Thevariable'zones'containsaStringarrayofTimeZoneIDs;itisstoredasa

'session'objectattribute.The'${zone.availableIDs}'expressionistheequivalentof

callingtheZoneWrapper.getAvailableIDs()method--%>

<c:setvar="zones"value="${zone.availableIDs}"scope="session"/>

<c:forEachvar="id"items="${zones}">

<c:outvalue="${id}<br/>"escapeXml="false"/>

</c:forEach>

</body>

</html>

Thec:iftagusesanELphrasetotestwhethertheDateobject'sgetTime()methodreturnsavaluethatisnotzero(ofcourseitdoes!I'mjustdemonstratinghowtousethec:iftag).

Page 955: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

${date.time!=0}

ThepriorcoderepresentsabooleanexpressionthatreturnstrueifDate.getTime()isgreaterthanzero.Iftrue,thenthecodeexecutesthenestedc:outtag,whichwritesamessagethattheclient'sbrowserdisplays.

TheescapeXml="false"codedisplaysthecharacters<br/><br/>correctlyintheHTMLoutputbythec:outtag.SeeTable23-3.

Example23-2setsanobjectattributetosessionscope.ThisobjectisaString[]typecontainingtimezoneIDs,suchas"Pacific/Tahiti."Thec:forEachtagtheniteratesoverallofthesearraymembers,displayingeachIDwiththec:outtag:

<c:forEachvar="id"items="${zones}">

<c:outvalue="${id}<br/>"escapeXml="false"/>

</c:forEach>

Thevarattributeofthec:forEachtagstoresthecurrentarraymemberasc:forEachcyclesoverthecollection.Thec:outtagusesanELexpressiontoaccessthevalueofthecurrentarraymember:

<c:outvalue="${id}<br/>"escapeXml="false"/>

IfyoudonotgivetheescapeXmlattributeafalsevaluewhenusingc:out,thecharacterentitycodesshowninTable23-3willdisplayinsteadoftheescapedcharacters.

Table23-3.Thec:outtag'sescapedcharacters

c:outvalueattributecharacter Characterentitycode

< &lt;

Page 956: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

> &gt;

& &amp;

` &#039;

" &#034;

Figure23-1showsapartoftheJSPusingthecodeinExample23-2.

Figure23-1.AJSPusingthevariouscoretagstodisplaytimezoneIDs

SeeAlso

Page 957: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe6.8onincludingcontentinaJSPwiththec:urltag;theJakartaProject'sTaglibssite:http://jakarta.apache.org/taglibs/index.html;theSunMicrosystemsJSTLinformationpage:http://java.sun.com/products/jsp/jstl/;Recipe23.4andRecipe23.5onusingXML-relatedtags;Recipe23.6onusingtheformattingtags;Recipe23.7andRecipe23.8ontheJSTL'sSQLfeatures;Recipe23.9-Recipe23.14onusingtheELtoaccessscopedvariables,cookies,andJavaBeanproperties.

Page 958: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe23.4UsingtheXMLCoreJSTLTags

Problem

YouwanttousetheJSTL'sXMLtagsinaJSP.

Solution

UsethevariousXMLtagsafterdeclaringthetaglibrarywiththepropertaglibdirective(uriattributeofhttp://java.sun.com/jstl/xmlforJSTL1.0orhttp://java.sun.com/jsp/jstl/xmlforJSTL1.1).

Discussion

ManywebdevelopershavetowriteprogramsthatparseorreadXMLtofindinformation,ortheyhavetowritecodethatdisplaystheencapsulatedXMLinformationinareadableformat.TheJSTLXMLtagsareanicetoolforthesetasks.Example23-3displayssomeinformationfromanAntbuild.xmlfile.(SeeChapter4ontheAnttoolifyouarenewtoAnt.)I'musingthisXMLfilejustforanexampleofhowtousetheXML-relatedJSTLtags.NoticethatthetaglibdirectivesatthetopofthepageallowtheuseoftheXMLandcoreJSTLtagsfurtheralonginthecode.

Example23-3.AJSPparsesanantbuildfile

<%@tagliburi="http://java.sun.com/jstl/xml"prefix="x"%>

<%@tagliburi="http://java.sun.com/jstl/core"prefix="c"%>

<html>

Page 959: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<head><title>UsingtheCoreXMLtags</title></head>

<body>

<h2>HerearethetargetandpropertyvaluesfromtheXMLfile</h2>

<c:importurl="http://localhost:8080/home/build.xml"var="buildXml"/>

<x:parsexml="${buildXml}"var="antDoc"/>

<h3>Firstthetargetnames...</h3>

<x:forEachselect="$antDoc/project/target">

<x:outselect="@name"/>

<x:ifselect="@depends">:depends=<x:outselect="@depends"/></x:if><br/>

</x:forEach>

<h3>Thenpropertynamesandvalues...</h3>

<x:forEachselect="$antDoc/project/target/property">

<x:outselect="@name"/>:value=<x:outselect="@value"/><br/>

</x:forEach>

</body>

</html>

Example23-3usesthec:importtagtoimportabuildfileandstoreitinavariablecalledbuildXml.Thethex:parsetagthenparsestheimporteddocumentintoaformorobjectthattheotherXMLtagscanworkwith.ThecodestorestheparsingresultinanothervariablenamedantDoc.

TheXMLJSTLtagsusesomeofthesametagnamesasthecorelibrary,butadifferentprefix("x").Thex:forEachtaginExample23-3usesanXPathexpressionasthevalueofthex:forEachselectattribute.

Page 960: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

XPathisanXMLtechnologythatisdesignedtosearchforandselectportionsor"nodesets"ofthehierarchicaltreerepresentedbyanXMLdocument.WhileanXPathtutorialiswellbeyondthescopeofthisrecipe(itislikealittleprogramminglanguageinitself),thereareplentyofonlinetutorialsandbooksonthesubject.YoucanstartattheSunMicrosystemswebservicestutorial,whichincludesadiscussionofXPath:http://java.sun.com/webservices/docs/1.3/tutorial/doc/.

Thex:forEachtagmakesnestedelementssuchasx:outavailabletoanynodesgrabbedbytheXPathexpression.ThecodeinExample23-3displaysthenameofeachAnttargetinthebuild.xmlfilebyfirstcollectingasetofallofthetargetelementswiththisexpression:

<%--thisXPathexpressionistheequivalentof"beginattheroot'project'element

andgetallofitsnested'target'elements"--%>

<x:forEachselect="$antDoc/project/target">

Example23-3outputsthenameofeachtargetwiththiscode:

<x:outselect="@name"/>

Theenclosingx:forEachtagestablishesthecontextoftheXPathexpressioninthisx:outtag.

Thefollowingcodestates"returntrueifthecurrentnodehasavaliddependsattribute."

<x:ifselect="@depends">

Ifthatexpressionreturnstrue,thenestedx:outtagoutputsthevalueofthedependsattribute.Figure23-2showstheresultofrequestingtheJSPofExample23-3inabrowser.I'veconvertedtheXMLinformation

Page 961: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

intoamorereadableformatforabrowser.XMLmavens(meaningthosewhocansiftthroughallofthesecrazyacronyms!)declarethatyoucanalsouseExtensibleStylesheetLanguageTransformations(XSLT)forconvertingXMLinformationtoHTMLorotherreadableforms.Thisisthenextrecipe'stopic.

Figure23-2.AJSPshowstheoutputofaparsedXMLfile

SeeAlso

TheJakartaProject'sTaglibssite:http://jakarta.apache.org/taglibs/index.html;SunMicrosystem'sJSTLinformationpage:http://java.sun.com/products/jsp/jstl/;Recipe23.3onusingthecoretags;Recipe23.5onusingtheXMLTransformtags;Recipe23.6onusingtheformattingtags;Recipe23.7andRecipe23.8ontheJSTL'sSQLfeatures;Recipe23.9-Recipe23.14onusingtheELtoaccessscopedvariables,cookies,andJavaBeanproperties.

Page 962: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe23.5UsingtheXMLTransformTags

Problem

YouwanttousetheJSTL'sXMLandXSLT-relatedtags.

Solution

UsethevariousXMLtagsafterdeclaringthetaglibrarywiththepropertaglibdirective(uriattributeofhttp://java.sun.com/jstl/xmlforJSTL1.0orhttp://java.sun.com/jsp/jstl/xmlforJSTL1.1).

Discussion

AnumberofwebsiteteamsmayalreadyhavedevisedstylesheetsfortransformingXMLintoHTML.Inaddition,youmaywanttoseparatemostoftheXMLtransformationresponsibilitiesfromJSPs,sothatJSPsfocusonlyonpresentingthetransformedinformation.TheJSTLprovidesXML-relatedtagstoeasilyintegratestylesheetsintoJSPs.Example23-4isanExtensibleStylesheetLanguage(XSL)documentthatconvertsanXMLfileintoHTML.ThestylesheetprovidesaconversionofanAntbuildfilesimilartotheonedescribedinRecipe23.3.

Example23-4.ThestylesheetfortransforminganXMLfile

<?xmlversion="1.0"encoding="ISO-8859-1"?>

<xsl:stylesheetxmlns:xsl="http://www.w3.org/1999/XSL/Transform"version="1.0">

<xsl:outputmethod="html"/>

Page 963: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<xsl:templatematch="/">

<html><head><title>Listofbuild.xmltargets

</title></head><bodybgcolor="white"><h2>Build.xmltargets</h2>

<xsl:apply-templates/>

</body></html>

</xsl:template>

<xsl:templatematch="/project">

<dl>

<xsl:for-eachselect="./target">

<dt><b>

<xsl:value-ofselect="@name"/></b>&#xA0;</dt>

<xsl:iftest="@depends">

<dd>depends=<xsl:value-ofselect="@depends"/>&#xA0;</dd>

</xsl:if>

</xsl:for-each><!--endfor-each-->

</dl>

</xsl:template>

<xsl:templatematch="text()">

<xsl:value-ofselect="normalize-space()"/>

</xsl:template>

</xsl:stylesheet>

HowdoyouapplythisXSLfiletothebuild.xmlfiletoproduceareadable

Page 964: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

format?Example23-5usesthex:transformtagtoassociateastylesheetwithanXMLfile.First,theJSPhastoimportboththestylesheetofthepriorexampleandtheXMLfilethisstylesheettransformsbyusingthec:importtag.Thec:importtagimportstheresourcespecifiedbyitsurlattributeandstoresitinavariable(e.g.,buildXml)thatthex:transformtagcanaccess.

Example23-5.AJSPdisplaystheresultofanXSLtransformation

<%@tagliburi="http://java.sun.com/jstl/xml"prefix="x"%>

<%@tagliburi="http://java.sun.com/jstl/core"prefix="c"%>

<c:importurl="http://localhost:8080/home/build.xml"var="buildXml"/>

<c:importurl="/WEB-INF/xslt/chap23.xsl"var="xslt"/>

<x:transformxml="${buildXml}"xslt="${xslt}"/>

Thex:transformtagmakesthetransformationprocessveryeasy,onceyou'veputtogetheravalidstylesheetfile.Thex:transformtag'sxmlattributespecifiestheXMLfilethatthex:transformtaghandlertransformsbyapplyingastylesheet.Thecodespecifiesthestylesheettouseinthetransformationwiththex:transformtag'sxsltattribute.

Thexmlandxsltattributesofx:transformresolvethevariablesthatrepresentthestylesheetandtheXMLfilebyusingtheEL,asin:

${buildXml}

Figure23-3showstheresultofrunningtheJSPofExample23-5.Inshort,x:transformprovidesyourveryownXSLTprocessorforuseintheJSP.

Page 965: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Figure23-3.AJSPshowstransformedXMLcontent

SeeAlso

TheJakartaProject'sTaglibssite:http://jakarta.apache.org/taglibs/index.html;theSunMicrosystemsJSTLinformationpage:http://java.sun.com/products/jsp/jstl/;Recipe23.2onusingthecoretags;Recipe23.3onusingthevariousXML-relatedtags;Recipe23.5onusingtheformattingtags;Recipe23.6andRecipe23.7ontheJSTL'sSQLfeatures;Recipe23.9-Recipe23.14onusingtheELtoaccessscopedvariables,requestheadersandparameters,cookies,andJavaBeanproperties.

Page 966: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe23.6UsingtheFormattingJSTLTags

Problem

YouwanttoformatadateoranumberusingtheJSTL.

Solution

Usethefmt:formatDateandfmt:formatNumberactions.

Discussion

Internationalizationor"i18n"istheprocessbywhichwebdevelopersdesigntheirwebsitestoaccommodatevisitorswhousedifferentlanguages.

Theterm"i18n"meansinternationalizationbeginswith"i,"isfollowedby18letters,andendswith"n."Itisdesignedtorelievethetediumofspellingoutthewordseveraltimes.

Localizationmeansaddingspecificresourcestoawebsitetoenablemessagessuchaswebpagegreetingstobetranslatedintothevisitor'slanguage.Forexample,youmightlocalizeasiteforJapanesevisitorsbyaddingresourcesthatcontainJapanesetranslationsoftextthatappearsonwebpages(Icovermorei18n-relatedJavacodeinChapter24).Example23-6usestheJSTLformattingtaglibrarytodisplaythecurrentdateandalargenumberinSwissandU.S.styles.

Page 967: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Example23-6.showingadateandanumberforU.S.andSwissaudiences

<%@tagliburi="http://java.sun.com/jstl/core"prefix="c"%>

<%--includethistaglibfori18nrelatedactions--%>

<%@tagliburi="http://java.sun.com/jstl/fmt"prefix="fmt"%>

<html>

<head><title>Formattingnumbersanddates</title></head>

<body>

<h2>DatesandnumbersinSwissandUSstyleformats</h2>

<%--createanobjectrepresentingthecurrentdate--%>

<jsp:useBeanid="now"class="java.util.Date"/>

<%--setthelocaletoGermanlanguage,Swisscountrycode--%>

<fmt:setLocalevalue="de_CH"/>

<strong>Swiss-styledate:</strong>

<%--outputthedate--%>

<fmt:formatDatetype=

"both"value="${now}"dateStyle="full"timeStyle="short"/>

<br/>

<strong>Swiss-stylenumber:</strong>

<%--outputtheequivalentofjava.util.Date.getTime()toshowhownumbersareformatted

--%>

<fmt:formatNumbervalue="${now.time}"/>

<br/><br/>

<%--resetthelocaletoEnglishlanguage,UScountrycode--%>

Page 968: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<fmt:setLocalevalue="en_US"/>

<strong>US-styledate:</strong>

<%--outputthedate--%>

<fmt:formatDatetype="both"value="${now}"dateStyle=

"full"timeStyle="short"/>

<br/>

<strong>US-stylenumber:</strong>

<fmt:formatNumbervalue="${now.time}"/>

<br/><br/>

</body>

</html>

Example23-6usesfmt:setLocaletosetthecontextforformattingdatesandnumbersfirsttoSwiss-German("de_CH"),thenbacktoU.S.English("en_US").

A"locale"representsaparticularcultural,geographic,orpoliticalregion.LocalesaretypicallyspecifiedbyaStringshowingalanguagecodefollowedbyanunderscore"_"andthecountrycode.SeeChapter24foranexpandeddiscussionofi18ntopics.

Bothfmt:formateDateandfmt:formatNumberusethecurrentlocaletoformattheirinformation.Thefmt:formateDatetaghasseveralattributesthataredesignedtoconfigurethedateformat.Thebothattributespecifieswhethertooutputonlythedate,thetime,orboththedateandtime,asinExample23-6.ThedateStyleandtimeStyleattributeshavesettingsthatderivefromthejava.text.DateFormat

Page 969: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

class.Example23-6specifiesa"full"datedisplaythatincludesthedayofweek,themonth,andtheyear.Thecodealsospecifiesa"short"timedisplay(suchas"8:07").

Figure23-4showstheJSPthatformatsdatesandnumbersforSwiss-GermanandU.S.Englishspeakers.ThereareseveralotherformattingrelatedJSTLtags,whichtherecipesofChapter24coverinmoredetail.

Figure23-4.Thefmt:formatDateandfmt:formateNumbertagsperformtranslationmagicinaJSP

SeeAlso

Chapter24onusingtheJSTL'sseverali18n-relatedtags;theJakartaProject'sTaglibssite:http://jakarta.apache.org/taglibs/index.html;theSunMicrosystemsJSTLinformationpage:http://java.sun.com/products/jsp/jstl/;Recipe23.3onusingthecoretags;Recipe23.5onusingtheXMLTransformtags;Recipe23.7andRecipe23.8ontheJSTL'sSQLfeatures;Recipe23.9-Recipe23.14onusingtheELtoaccessscopedvariables,cookies,andJavaBeanproperties.

Page 970: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe23.7UsingASQLJSTLTagwithaDataSourceConfiguration

Problem

Youwanttointeractwitharelationaldatabasebyconfiguringthejavax.sql.DataSourceinthedeploymentdescriptor.

Solution

Addacontext-paramelementtoweb.xml,creatingaparameternamedjavax.servlet.jsp.jstl.sql.dataSourcethatconnectswithaparticulardatabase.

Discussion

TheJSTLSQLtaglibraryallowsaJSPtointeractwithadatabaseusingcustomtags.JavaDatabaseConnectivity(JDBC)andtheclassesinthejavax.sqlpackageallowthistechnologytowork.ThefirststepinthisrecipeistoconfiguretheDataSourcethatthetagswillusetoconnectwithadatabase.

ADataSourceisafactoryforjava.sql.Connectionobjects,whichrepresentasocketconnectionwithaparticulardatabaseserversuchasMySQLorOracle.

Example23-7createsacontext-paramelementinweb.xml.Forthe

Page 971: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

JSTL'sSQLtagstoautomaticallyreceivetheirConnectionsfromthissetting,theparamnamemustbejavax.servlet.jsp.jstl.sql.dataSource.Theparamvaluecomprisescomma-separatedphrases:

[JDBCURL],[Drivername],[user],[password]

DeveloperscommonlyderivetheJDBCURLanddrivernamefromdatabasevendordocumentation(andoftenfrommailinglists,becausedebuggingbackenddatabaseconnectionswithJDBCcanbetricky!).ThecodeIshowherecontainsanexampleofaJDBCURLforOracle8iPersonalEdition.

Example23-7.Anexampleweb.xmlconfigurationforajavax.sql.Datasource

<!--topofweb.xmlfile-->

<context-param>

<param-name>javax.servlet.jsp.jstl.sql.dataSource</param-name>

<param-value>jdbc:oracle:thin:@192.168.0.2:1521:ORCL,

oracle.jdbc.driver.OracleDriver,scott,tiger</param-value>

</context-param>

<!--restofweb.xmlfile-->

TheJSTLsoftwareusesthesevaluestogenerateaDataSourceforitsSQLtags.TheadvantageofusinganexternalsettingfortheDataSourceisthattoswitchdatabases,youcanchangethevalueofthecontext-paramtotheconfigurationrepresentingthenewdatabasewithouttouchingtheJSPcode.TheJSPdealstransparentlywiththeSQLtagsandDataSourceobject.

Page 972: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

NowontotheJSP.RememberthattheSQLtags(theonesusingthe"sql"prefix)usetheDataSourcethatwejustsetwiththecontext-paramelementinweb.xml.

Webapplicationsalwayshaveaweb.xmlfileintheWEB-INFdirectory.SeeChapter1ifyouneedafurtherexplanation.

ThetaglibdirectivesatthetopofExample23-8arerequiredifyouwanttousetheJSTL1.0coreandSQLlibraries.

Example23-8.AJSPusesJSTLsqltagstodisplaydatabaseinformation

<%@tagliburi="http://java.sun.com/jstl/core"prefix="c"%>

<%@tagliburi="http://java.sun.com/jstl/sql"prefix="sql"%>

<html>

<head><title>DatabaseQuery</title></head>

<body>

<h2>QueryingadatabasefromaJSTLtag</h2>

<sql:queryvar="athletes">

SELECT*FROMathlete

</sql:query>

<tableborder="1">

<c:forEachvar="row"items="${athletes.rows}">

<tr>

<th>user_id</th>

<th>name</th>

Page 973: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<th>birthdate</th>

<th>passwrd</th>

<th>gender</th></tr>

<tr>

<td><c:outvalue="${row.user_id}"/></td>

<td><c:outvalue="${row.name}"/></td>

<td><c:outvalue="${row.birthdate}"/></td>

<td><c:outvalue="${row.passwrd}"/></td>

<td><c:outvalue="${row.gender}"/></td>

</tr>

</c:forEach>

</table>

</body>

</html>

Thesql:querytagusesitsnestedcontenttosendtheSQLSELECTstatement"select*fromathlete"toadatabase.ThedatabaseconnectionderivesfromtheDataSourceyouhavealreadyconfigured.Thestatementisdesignedto"selectallrowsfromthetablenamed`athlete.'"Thesql:querytagsavestheresultsetinajavax.servlet.jsp.jstl.sql.Resultobject,inavariablenamedathletes.

Resultobjectsareconvertedfromjava.sql.ResultSetobjects.Resultobjectshavemethods(suchasgetRows())thataredesignedtointeractwiththeJSTLSQLtags.

Thecode:

${athletes.rows}

Page 974: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

isanELphrasethatcallstheResultobject'sgetRows()method.Thismethodreturnsajava.util.SortedMap[]typeoranarrayofSortedMaps.Example23-8usesthec:forEachtagtoiterateoverthisarrayandcreateanHTMLtablerowoutofeachofthereturneddatabaserows.

Youcanusethisformofcodetodisplaythecolumnnamesofaresultset(`athletes'isthevariablestoringtheresultset):

<c:forEachvar="col"items=

"${athletes.columnNames}">

<c:outvalue="${col}"/>

</c:forEach>

ThenextrecipeshowshowaJSPaccomplishesthissametaskwithoutacontext-paramconfiguringtheDataSource.

TrytostickwiththestrategyofsettingtheDataSourceinweb.xml,becauseitrepresentsabettersoftwaredesignthanclutteringupaJSPwithaDataSourceconfiguration.

Figure23-5showstheJSPdisplayingthedatabaserowinformationinawebbrowser.

Figure23-5.DisplayingdatabaseinformationinaJSP

Page 975: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

SeeAlso

Chapter21onworkingwithdatabases;theJakartaProject'sTaglibssite:http://jakarta.apache.org/taglibs/index.html;theSunMicrosystemsJSTLinformationpage:http://java.sun.com/products/jsp/jstl/;Recipe23.3onusingthecoretags;Recipe23.5onusingtheXMLTransformtags;Recipe23.6onusingtheformattingtags;Recipe23.8onusingaSQLJSTLtagwithoutaDataSourceconfiguration;Recipe23.9-Recipe23.14onusingtheELtoaccessscopedvariables,cookies,andJavaBeanproperties.

Page 976: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe23.8UsingASQLJSTLTagWithoutaDataSourceConfiguration

Problem

YouwanttospecifytheDataSourcefortheJSTLSQLtagsinsideaJSP.

Solution

Usethesql:setDataSourcetagtoestablishaDataSourcefortheotherSQLtags,suchassql:query.

Discussion

YoucanexplicitlysettheDataSourcefortheJSTLSQLtagsinaJSPusingsql:setDataSourceanditsdataSourceattribute.Example23-9createsthesameDataSourceasRecipe23.6andstoresitinavariablenameddSource.Thesql:querytagthenspecifiesthisDataSourcewithitsowndataSourceattribute.ThecodeotherwiseaccomplishesthesametaskasExample23-8:theJSPsendsaSELECTSQLstatementtothedatabasesystem,thendisplaystheresults.

Example23-9.Usingthesql:setDataSourcetag

<%@tagliburi="http://java.sun.com/jstl/core"prefix="c"%>

<%@tagliburi="http://java.sun.com/jstl/sql"prefix="sql"%>

<html>

Page 977: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<head><title>DatabaseQuery</title></head>

<body>

<h2>QueryingadatabasefromaJSTLtag</h2>

<sql:setDataSourcedataSource=

"jdbc:oracle:thin:@192.168.0.2:1521:ORCL,oracle.jdbc.driver.OracleDriver,scott,tiger"

var="dSource"scope="application"/>

<sql:queryvar="athletes"dataSource="dSource">

SELECT*FROMathlete

</sql:query>

<tableborder="1">

<c:forEachvar="row"items="${athletes.rows}">

<tr>

<th>user_id</th>

<th>name</th>

<th>birthdate</th>

<th>passwrd</th>

<th>gender</th></tr>

<tr>

<td><c:outvalue="${row.user_id}"/></td>

<td><c:outvalue="${row.name}"/></td>

<td><c:outvalue="${row.birthdate}"/></td>

<td><c:outvalue="${row.passwrd}"/></td>

<td><c:outvalue="${row.gender}"/></td>

</tr>

</c:forEach>

</table>

</body>

</html>

Page 978: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

ThecodestorestheDataSourceinanapplication-scopedvariable,sothatanotherJSPcanaccesstheDataSourcethisway:

<sql:queryvar="athletes"dataSource="${dSource}">

SELECT*FROMathlete

</sql:query>

Theonlydifferencebetweenthissql:queryusageandExample23-9isthatthevalueofthedataSourceattributehastoberesolvedusingtheEL;thetaghastofindandgetthevalueofanapplication-scopedvariable(aservletcontextattribute)named"dSource."

YoucanalsospecifyaDataSourceintheJSTLSQLtagsasaJavaNamingandDirectoryInterface(JNDI)string,butwewillreservediscussionofthattopicforChapter21,whichcoversusingdatabaseswithservletsandJSPs.

SeeAlso

Chapter21onworkingwithdatabases;theJakartaProject'sTaglibssite:http://jakarta.apache.org/taglibs/index.html;theSunMicrosystemsJSTLinformationpage:http://java.sun.com/products/jsp/jstl/;Recipe23.3onusingthecoretags;Recipe23.4andRecipe23.5onusingtheXMLtags;Recipe23.6onusingtheformattingtags;Recipe23.7andRecipe23.8onusingtheSQLJSTLtags;Recipe23.9-Recipe23.14onusingtheELtoaccessscopedvariables,cookies,andJavaBeanproperties.

Page 979: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe23.9AccessingScopedVariableswiththeEL

Problem

YouwanttograbanddisplaythevalueofanobjectattributeusingaJSTLcustomtag.

Solution

UsetheELandthec:outtagtogetthevalueofanattributethathasbeenstoredinacertainscope.

Discussion

Anobjectsuchasajava.util.Date,ajava.lang.Integer,oranobjectthatyoudesign,canbestoredinfourdifferentscopes:

page,sothatit'sonlyavailableintheservletorJSPwhereitiscreated

requestscope,whichmakestheobjectavailabletoanypagesthatinteractwiththeJSPusingaRequestDispatcher,suchasarequestthatisforwardedfromoneJSPtoanother

sessionscopestoresobjectattributesforanyservletsorJSPsthatparticipateinthesamesession(seeChapter11)

applicationscope,whichrepresentstheentireservletcontextfor

Page 980: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

onewebapplication

Example23-10usesthec:setJSTLtagtosetavariablenamedcom.jspservletcookbook.SessionObjecttosessionscope.Thenc:outaccessesanddisplaysthevalueofthevariable.

Example23-10.Accessingthevalueofanobjectstoredinsessionscope

<%@tagliburi="http://java.sun.com/jstl/core"prefix="c"%>

<html>

<head><title>AccessingaScopedValue</title></head>

<body>

<h2>HereisthevalueoftheSession-ScopedAttribute</h2>

<c:setvar=

"com.jspservletcookbook.SessionObject"value=

"Myobjectattribute.<br/>"scope="session"/>

<c:outvalue=

"${sessionScope[\"com.jspservletcookbook.SessionObject\"]}"escapeXml="false"/>

</body>

</html>

Byconvention,objectattributesarenamedafterfullyqualifiedJavaclasses(usually,aftertheJavatypeofthestoredobject).Therefore,theattributenamehasperiodcharacters(.)init.Thisisthepurposeofthesyntax${sessionScope[\"com.jspservletcookbook.SessionObject\"]}

Iftheattributenamedoesnotcontainperiods,thenyoucanuseanELexpressionconsistingofjustthevariablename,withoutthesessionScopeJSTLimplicitobject,inordertoaccesstheobjectattribute:

Page 981: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<c:outvalue=

"${SessionObject}"escapeXml="false"/>

Ifyoujustincludethescopedobject'sname,asinthepriorcodefragment,thentheJSTLwillsearchthepage,request,session,andapplicationscopesforanattributeofthatname,returningnulliftheJSTLdoesnotfindone.

YoumustusetherequiredcharactersofanELexpression(thedollarsignandcurlybracessurroundingtheexpression:"${...}").Otherwisethec:outtagwilljustoutputaStringliteralsuchas"SessionObject."

SeeAlso

TheJakartaProject'sTaglibssite:http://jakarta.apache.org/taglibs/index.html;SunMicrosystem'sJSTLinformationpage:http://java.sun.com/products/jsp/jstl/;Recipe23.3onusingthecoretags;Recipe23.4andRecipe23.5onusingtheXMLtags;Recipe23.6onusingtheformattingtags;Recipe23.7andRecipe23.8onusingtheSQLJSTLtags;Recipe23.10-Recipe23.14onusingtheELtoaccessrequestparameters,cookies,andJavaBeanproperties.

Page 982: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe23.10AccessingRequestParameterswiththeEL

Problem

YouwanttoaccessarequestparameterusingtheELinaJSP.

Solution

UsetheparamimplicitobjectinyourJSPcode.

Discussion

TheJSTLprovidesanimplicitobjectnamedparamthatyoucanusetogetarequestparameter.Simplyfollowtheterm"param"withaperiodandtheparametername.UsethisterminologywiththeELtooutputthevalueofarequestparameterwiththec:outtag.Example23-11displaysagreetingwiththevisitor'sname.Therequestmightlooklike:

http://localhost:8080/home/welcome.jsp?name=Bruce%20Perry

IftheURLdoesnotincludethe"name"parameter,theJSPdisplaysthemessage"HelloEsteemedVisitor."

Example23-11.UsingtheJSTLinaJSPtodisplaytheresultofarequestparameter

<%@tagliburi="http://java.sun.com/jstl/core"prefix="c"%>

Page 983: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<html>

<head><title>AccessingaScopedValue</title></head>

<body>

<h2>Hello

<c:choose>

<c:whentest="${emptyparam.name}">

EsteemedVisitor

</c:when>

<c:otherwise>

<c:outvalue="${param.name}"/>

</c:otherwise>

</c:choose>

</h2>

</body>

</html>

ThecodetestswhethertherequestcontainsavaluefornamebyusingtheemptyELkeyword:

<c:whentest="${emptyparam.name}">

Thec:choose,c:when,andc:otherwisetagsarelikeif/then/elsestatementsinJavacode.Iftherequestparameternamedoesnothaveavalue,thebrowserwilldisplay"EsteemedVisitor".Otherwise,itdisplaysthevalueofname.

Figure23-6showsaJSPdisplayingthemessage,includingtheparametervalue.

Page 984: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Figure23-6.HumbleoutputofaJSPusingtheparamJSTLimplicitobject

SeeAlso

Chapter18onworkingwiththeclientrequest;theJakartaProject'sTaglibssite:http://jakarta.apache.org/taglibs/index.html;SunMicrosystem'sJSTLinformationpage:http://java.sun.com/products/jsp/jstl/;Recipe23.3onusingthecoretags;Recipe23.4andRecipe23.5onusingtheXMLtags;Recipe23.6onusingtheformattingtags;Recipe23.7andRecipe23.8onusingtheSQLJSTLtags;Recipe23.11-Recipe23.14onusingtheELtoaccessrequestheaders,cookies,andJavaBeanproperties.

Page 985: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe23.11UsingtheELtoAccessRequestHeaders

Problem

YouwanttousetheELtoaccessthevalueofvariousHTTPrequestheaders.

Solution

UsetheheaderimplicitobjectthattheELmakesavailableforcustomtags.

Discussion

Theheaderimplicitobjectisajava.util.Maptypethatcontainsarequestheadervaluemappedtoeachheaderkey(whichistheheadername,suchas"accept"or"user-agent").Webclients(usuallybrowsers)sendtheseheadersorname/valuepairsalongwiththewebaddressofthepagetheyareinterestedin.

Example23-12usesthec:forEachiterationtagtocyclethrougheachoftheMap'sstoredrequestheaders.ThevariablereqHeadstoresthecurrentheader/valuepair.ThecodeusestheELtodisplaytheheadername("${reqHead.key}")andheadervalue("${reqHead.value}").

Example23-12.UsingtheJSTLtodisplayrequestheaders

<%@tagliburi="http://java.sun.com/jstl/core"prefix="c"%>

Page 986: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<html>

<head><title>Requestheaderdisplay</title></head>

<body>

<h2>HerearealltheRequestHeaders</h2>

<%--'header'representsajava.util.Maptypeholdingrequest-headernamesandvalues--%>

<c:forEachvar="reqHead"items="${header}">

<strong><c:outvalue=

"${reqHead.key}"/></strong>:<c:outvalue="${reqHead.value}"/><br/>

</c:forEach>

</body>

</html>

Figure23-7showstheresultofrequestingthisJSPinawebbrowser.

Figure23-7.DisplayingrequestheadersinaJSP

Page 987: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

SeeAlso

Chapter18onworkingwiththeclientrequest;theJakartaProject'sTaglibssite:http://jakarta.apache.org/taglibs/index.html;SunMicrosystem'sJSTLinformationpage:http://java.sun.com/products/jsp/jstl/;Recipe23.3onusingthecoretags;Recipe23.4andRecipe23.5onusingtheXMLtags;Recipe23.6onusingtheformattingtags;Recipe23.4andRecipe23.5onusingtheSQLJSTLtags;Recipe23.12-Recipe23.14onusingtheELtoaccessonerequestheader,cookies,andJavaBeanproperties.

Page 988: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe23.12UsingtheELtoAccessOneRequestHeader

Problem

YouwanttousetheELtoaccessthevalueofoneparticularHTTPrequestheader.

Solution

UsetheheaderValuesimplicitobjectthattheELmakesavailableforcustomtags.

Discussion

TheheaderValuesimplicitobjectisajava.util.MaptypethatcontainsaStringarray(aString[]type)foreveryheadername.Example23-13displaysonlythevalueofthe"user-agent"requestheader,whichidentifiesthetypeofbrowsertheclientisusing.

Example23-13.UsingtheJSTLtodisplayrequestheaders

<%@tagliburi="http://java.sun.com/jstl/core"prefix="c"%>

<html>

<head><title>UserAgent</title></head>

<body>

<h2>Hereisyouruseragent</h2>

Page 989: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<%--'headerValues'representsajava.util.MaptypeholdingaString[]typeforevery

requestheader--%>

<strong><c:outvalue=

"${headerValues[\"user-agent\"][0]}"/></strong>

</body>

</html>

ThecodeaccessesonlythefirstmemberoftheStringarray(itishighlylikelythattheuser-agentrequestheaderonlyinvolvesonevalue).Theexpression:

${headerValues[\"user-agent\"]}

returnsthearray,andtheentireexpression,includingthe"[0]"arrayoperator,whichreturnsthenameoftheuseragent,suchas"Mozilla/4.0(compatible;MSIE5.5;WindowsNT4.0)."

SeeAlso

Chapter18onworkingwiththeclientrequest;Recipe23.11onhowtousetheELtoaccessalltheavailablerequestheaders;theJakartaProject'sTaglibssite:http://jakarta.apache.org/taglibs/index.html;theSunMicrosystemsJSTLinformationpage:http://java.sun.com/products/jsp/jstl/;Recipe23.3onusingthecoretags;Recipe23.4andRecipe23.5onusingtheXMLtags;Recipe23.6onusingtheformattingtags;Recipe23.7andRecipe23.8onusingtheSQLJSTLtags;Recipe23.10onusingtheELtoaccessrequestparameters;Recipe23.13andRecipe23.14onusingtheELtoaccesscookiesandJavaBeanproperties.

Page 990: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe23.13AccessingCookieswiththeEL

Problem

YouwanttotakealookatallofthecookienamesandvaluesusingELcode.

Solution

UsethecookieELimplicitobjectintheJSPtodisplayanycookienamesandvalues.

Discussion

ThecookieELimplicitobjectisajava.util.Maptypethatmapscookienames(like"JSESSIONID")tojavax.servlet.Cookieobjects.SincethecookiesarestoredinaMap,youcanusethec:forEachtagtocyclethroughthemapanddisplayeachcookienameandvalueusingc:out(seeExample23-14).

MakesuretoincludethetaglibdirectiveatthetopoftheJSPsothepagecanusethecoreJSTLtags.

Example23-14.usingtheELtodisplayeachcookienameandvalueinaJSP

Page 991: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<%@tagliburi="http://java.sun.com/jstl/core"prefix="c"%>

<html>

<head><title>Cookiedisplay</title></head>

<body>

<h2>HerearealltheAvailableCookies</h2>

<%--${cookies.key}equalsthecookiename;${cookies.value}equalstheCookieobject;

${cookies.value.value}returnsthecookievalue--%>

<c:forEachvar="cookies"items="${cookie}">

<strong>

<c:outvalue="${cookies.key}"/>

</strong>:Object=

<c:outvalue="${cookies.value}"/>,value=

<c:outvalue="${cookies.value.value}"/><br/>

</c:forEach>

</body>

</html>

Thec:forEachtagstorestheentryintheMapforeachcookieinavariablenamedcookies.ThecodeusestheELphrase"${cookies.key}"toaccessthenameofeachcookie.Youwouldthink"${cookies.value}"returnsthevalueforeachcookie;however,thissyntaxreturnstheCookieobjectitself.Theweirdsyntax"${cookies.value.value}"returnsthevalueofthecookie.Figure23-8showshowtheJSPdisplaysthisinformation.

Figure23-8.DisplayingacookieobjectandvaluewiththeJSTL

Page 992: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

SeeAlso

Chapter10onreadingandsettingcookies;theJakartaProject'sTaglibssite:http://jakarta.apache.org/taglibs/index.html;theSunMicrosystemsJSTLinformationpage:http://java.sun.com/products/jsp/jstl/;Recipe23.3onusingthecoretags;Recipe23.4andRecipe23.5onusingtheXMLtags;Recipe23.6onusingtheformattingtags;Recipe23.7andRecipe23.8onusingtheSQLJSTLtags;Recipe23.9-Recipe23.12onusingtheELtoaccessscopedvariables,requestparameters,andrequestheaders;Recipe23.14onusingtheELtoaccessJavaBeanproperties.

Page 993: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe23.14UsingtheELtoAccessJavaBeanProperties

Problem

YouwanttousetheELtoaccessthepropertiesofaJavaBeaninaJSP.

Solution

Usethejsp:useBeanstandardactiontocreateoraccessaninstanceofthebean,thenusetheELtoaccessthebeanproperties.

Discussion

Youcanusethec:outJSTLcoretagandtheELtodisplaythevaluesofJavaBeanpropertiesinaJSP.Example23-15showstheskeletonofaJavaBeanthatisdesignedtohandleemail.IusedthisbeaninChapter20,whichcontainsdetailsaboutallofitsemail-sendingand-accessingmethods.

Example23-15.AJavaBeanthataJSPwillinstantiateandaccess

packagecom.jspservletcookbook;

importjava.io.IOException;

importjava.io.PrintWriter;

importjava.util.Properties;

Page 994: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

importjavax.mail.*;

importjavax.mail.internet.*;

importjavax.servlet.*;

importjavax.servlet.http.*;

publicclassEmailBean{

//defaults

privatefinalstaticStringDEFAULT_SERVER="smtp.comcast.net";

privatefinalstaticStringDEFAULT_TO=

"[email protected]";

privatefinalstaticStringDEFAULT_FROM=

"[email protected]";

privatefinalstaticStringDEFAULT_CONTENT="Unknowncontent";

privatefinalstaticStringDEFAULT_SUBJECT="Unknownsubject";

//JavaBeanproperties

privateStringsmtpHost;

privateStringto;

privateStringfrom;

privateStringcontent;

privateStringsubject;

//no-argsconstructorforthebean

publicEmailBean(){}

//configureanemailmessagewithrequestparamsandsendtheemail

publicvoidsendMessage(HttpServletRequestrequest,

PrintWriterout)throwsIOException{

//SEERECIPE20.3AND20.6FORMOREDETAILSONTHISEMAILBEAN

//METHOD

}//sendMessage

Page 995: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

//getemailmessagesusingaPOPaccount

privatevoidhandleMessages(HttpServletRequestrequest,

PrintWriterout)throwsIOException,ServletException{

//SEERECIPE20.3AND20.6FORMOREDETAILSONTHISEMAILBEAN

//METHOD

}//handleMessages

//displayinfoaboutreceivedemailmessages

privatevoiddisplayMessage(Messagemsg,PrintWriterout)

throwsMessagingException,IOException{

//SEERECIPE20.3AND20.6FORMOREDETAILSONTHISEMAILBEAN

}//displayMessage

//getteroraccessormethods

publicStringgetSmtpHost(){

return(smtpHost==null||smtpHost.equals(""))?

EmailBean.DEFAULT_SERVER:smtpHost;

}//getSmtpHost

publicStringgetTo(){

returnto;

}//getTo

publicStringgetFrom(){

returnfrom;

Page 996: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

}//getFrom

publicStringgetContent(){

returncontent;

}//getContent

publicStringgetSubject(){

returnsubject;

}//getSubject

//setterormutatormethods

publicvoidsetSmtpHost(Stringhost){

if(check(host)){

this.smtpHost=host;

}else{

this.smtpHost=EmailBean.DEFAULT_SERVER;

}

}//setSmtpHost

publicvoidsetTo(Stringto){

if(check(to)){

this.to=to;

}else{

this.to=EmailBean.DEFAULT_TO;

}

}//setTo

publicvoidsetFrom(Stringfrom){

if(check(from)){

this.from=from;

}else{

this.from=EmailBean.DEFAULT_FROM;

Page 997: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

}

}//setFrom

publicvoidsetContent(Stringcontent){

if(check(content)){

this.content=content;

}else{

this.content=EmailBean.DEFAULT_CONTENT;

}

}//setContent

publicvoidsetSubject(Stringsubject){

if(check(subject)){

this.subject=subject;

}else{

this.subject=EmailBean.DEFAULT_SUBJECT;

}

}//setSubject

privatebooleancheck(Stringvalue){

if(value==null||value.equals(""))

returnfalse;

returntrue;

}

}

Example23-16showstheJSPthatcreatesaninstanceofthisbeanusingthejsp:useBeanstandardaction.Theidattributeofjsp:useBeanspecifies"emailer"asthebeanname.Thisisthenamethecodeusestoaccessthebeaninstance'spropertyvaluesusingtheEL.

Example23-16.CreatingaJavaBeanandusingtheJSTLtodisplayitspropertyvalues

Page 998: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<%@tagliburi="http://java.sun.com/jstl/core"prefix="c"%>

<jsp:useBeanid="emailer"class="com.jspservletcookbook.EmailBean"/>

<jsp:setPropertyname="emailer"property="*"/>

<html>

<head><title>Beanpropertydisplay</title></head>

<body>

<h2>HerearetheEmailBeanproperties</h2>

<strong>SMTPhost:</strong><c:outvalue="${emailer.smtpHost}"/>

<strong>Emailrecipient:</strong><c:outvalue="${emailer.to}"/>

<strong>Emailsender:</strong><c:outvalue="${emailer.from}"/>

<strong>Emailsubject:</strong><c:outvalue="${emailer.subject}"/>

<strong>Emailcontent:</strong><c:outvalue="${emailer.content}"/>

</body>

</html>

Whenthecodeusesanexpressionsuchas"${emailer.smtpHost},"itcallsthegetSmtpHost()methodoftheEmailBean(theSMTPserverfromwhichyoureceiveemail,suchas"smtp.comcast.net").ThevariableemailerreferstotheinstanceoftheEmailBean.

Example23-16setalloftheEmailBean'ssettablepropertiesfromrequestparametersofthesamename.Thisisthepurposeofthecode:

<jsp:setPropertyname=

"emailer"property="*"/>

Providingthec:outvalueattributewiththisexpressionoutputsthevalueofthebean'sproperty.Figure23-9showstheJSPofExample23-

Page 999: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

16inawebbrowser.

Figure23-9.DisplayingaJavaBean'spropertiesusingJSTLc:outtags

SeeAlso

Chapter20onusingJavaBeanstohandleemail;theJakartaProject'sTaglibssite:http://jakarta.apache.org/taglibs/index.html;theSunMicrosystemsJSTLinformationpage:http://java.sun.com/products/jsp/jstl/;Recipe23.3onusingthecoretags;Recipe23.4andRecipe23.5onusingtheXMLtags;Recipe23.6onusingtheformattingtags;Recipe23.7andRecipe23.8onusingtheSQLJSTLtags;Recipe23.9-Recipe23.13onusingtheELtoaccessscopedvariables,requestparameters,requestheaders,andcookies.

Page 1000: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe23.15UsingJSTLFunctions

Problem

Youwanttousethebuilt-infunctionsincludedwithJSTL1.1.

Solution

Usethepropertaglibdirective(withtheurivalueof"http://java.sun.com/jsp/jstl/functions")andprefix(e.g.,thefn:infn:contains)inyourJSP.

Discussion

TheJSTL1.1anditsELincludesaniftynewfunctionslibrary.ThesetagsallowJSPdeveloperstocallbuilt-infunctionstohandleandreturnvaluesfromStrings,arrays,Maps,andCollections.Thenatureofthesefunctionswillbefamiliartoanyonewhohasworkedwithjava.lang.Stringanditsnumerousmethods(seeTable23-4).FunctionsrepresentanevolutionofJSTLfrominvolvingacollectionofcustomtagstogivingyoutheabilitytomakefunctioncallsembeddedinsidetemplatetext.

HereisthesetupthatyouneedtouseJSTLfunctionsinyourJSPs:

1. AJSP2.0JSPcontainer

AnimplementationofJSTL1.1(IusetheJavaWebServicesDeveloperPack1.2inthisrecipe)

Page 1001: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Aconversionofyourweb.xmlfiletotheservletAPIVersion2.4(seelateroninthisrecipe)

Example23-17showsthenewtagliburiandprefixvaluestousewiththefunctionslibrary.ThisJSPusestheString"IamatestString"asinputtofouroftheavailablefunctions:fn:length(),fn:contains(),fn:toUpperCase(),andfn:split().

Example23-17.AJSPthatusesJSTL1.1functions

<%@tagliburi="http://java.sun.com/jsp/jstl/functions"prefix="fn"%>

<%@tagliburi="http://java.sun.com/jsp/jstl/core"prefix="c"%>

<html>

<head><title>UsingtheJSTLfunctions</title></head>

<body>

<h2>UsingvariousJSTL1.1functions</h2>

<c:setvar="tempStr"value="IamatestString"/>

ThelengthofthetestString:${fn:length(tempStr)}<br/>

DoesthetestStringcontain"test"?${fn:contains(tempStr,"test")}<br/>

PuttingtheStringintouppercaseusingfn:toUpperCase():${fn:toUpperCase(tempStr)}<br

/>

SplittingtheStringintoaStringarrayusingfn:split(),andreturningthearray

length:${fn:length(fn:split(tempStr,""))}

</body>

</html>

JSTL1.1functioncallscanbeintermingledwithtemplatetext,asin

Page 1002: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Example23-17.SurroundthefunctioncallswiththeELdelimiters("${...}"),andmakesuretousethefn:prefix,asin${fn:toUpperCase(tempStr)}.

Example23-18showshowyoucanchangeweb.xmltotheservletAPI2.4version,sothattheJSP2.0containerinterpretstheELfunctionsinyourcode.

ThemajordifferencebetweenJSTL1.0and1.1isthattheJSP2.0specificationhastakenovertheELresponsibility.Therefore,theJSP2.0container,nottheJSTLlibraries,nowevaluatestheELsyntax.

IfyoustickwiththeservletAPI2.3deploymentdescriptor,thentheJSP2.0containerwillnotevaluatetheELexpressionsandfunctioncalls.Usingtheoldservlet2.3deploymentdescriptor"turnsoff"ELevaluationbytheJSPcontainer;consequently,youcannotusethefunctionslibraryorincludeELsyntaxintemplatetext.ThisautomaticdisablingofELexpressionsbytheJSPcontainerisdesignedasawayofeasingthemigrationofexistingJSPpagestoJSP2.0.Inshort,aJSPthatincludestheJSTL1.0usagesandisassociatedwithaservlet2.3deploymentdescriptorworksthesameunderaJSP2.0container.

However,youmaywanttousethenewfunctions!Therefore,Example23-18showshowtomigratetotheservlet2.4versionofweb.xml.

Example23-18.Changeweb.xmltoservletAPI2.4touseJSTL1.1features

<?xmlversion="1.0"encoding="ISO-8859-1"?>

<web-appxmlns="http://java.sun.com/xml/ns/j2ee"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation=

Page 1003: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

"http://java.sun.com/xml/ns/j2ee

http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"

version="2.4"

>

<!--RESTOFDEPLOYMENTDESCRIPTORELEMENTS-->

</web-app>

Example23-18alterstheweb-appelementtoincludetherequiredattributesoftheservlet2.4deploymentdescriptor(SeeChapter1).Therestofweb.xmlcanremainasitappearedusingtheservlet2.3DTD.

Table23-4describesthepurposeofeachfunctionthattheJSTL1.1includesinitsfunctionlibrary.

Table23-4.JSTL1.1functions

Functionname Arguments Returntype Purpose

fn:contains String,String boolean

FindsoutwhetheraString(firstargument)containsacertainsubstring(secondargument)

fn:containsIgnoreCase String,String boolean

FindsoutwhetheraStringcontainsasubstring(secondargument)inacase-insensitivemanner

fn:endsWith String,String boolean

FindsoutwhetheraString(firstargument)endswithanotherString(secondargument)

fn:escapeXML String String

EscapescharactersthatcouldbeinterpretedasXMLmarkup,suchas">"

fn:indexOf String,String int

ReturnstheindexorpositionofoneString(secondargument)insideanother(firstargument)

JoinsallString[]arrayelements

Page 1004: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

fn:join String[],String String

intoaString,usingthespecifiedseparator(secondargument)asthecharacterbetweeneacharrayelement.

fn:length

Map,array,

Collection,

Iterator,

Enumeration,or

String

intFindsoutthelengthofthearray,collection,orString.

fn:replaceString,String,

StringString

ReplacesallinstancesofaString(secondargument)inaninputString(firstargument)withanotherString(third)

fn:split String,String String[]

SplitsaStringintoanarray,usingthespecifieddelimiter(s)(secondargument)

fn:startsWith String,String booleanFindsoutwhetheraString(firstargument)startswithanotherString.

fn:substring String,int,int String

ReturnsasubstringfromtheinputString(firstargument),fromtheindexsecondargument(inclusive)totheindexthirdargument(exclusive)

fn:substringAfter String,String String

ReturnsthepartoftheStringafterthespecifiedsubstring(secondargument)

fn:substringBefore String,String String

ReturnsthepartoftheStringbeforethespecifiedsubstring(secondargument),beginingwiththefirstcharacterofthefirstStringargument.

fn:toLowerCase String StringReturnsthespecifiedStringinalllowercase.

fn:toUpperCase String StringReturnsthespecifiedStringinalluppercase.

fn:trim String String RemoveswhitespacefromeachendofthespecifiedString.

Page 1005: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Figure23-10showsthewebbrowseroutputofaJSPthatusesvariousmembersoftheJSTL1.1functionslibrary.

Figure23-10.AJSPdisplaystheresultsofusingsomeJSTL1.1functions

SeeAlso

SunMicrosystem'sJSTLinformationpage:http://java.sun.com/products/jsp/jstl/;Recipe23.2onusingthecoretags;Recipe23.3andRecipe23.4onusingXML-relatedtags;Recipe23.5onformattingdatesandnumbers;Recipe23.6andRecipe23.7ontheJSTL'sSQLfeatures;Recipe23.8onaccessingscopedvariables;Recipe23.9onusingtheELwithrequestparameters;Recipe23.10andRecipe23.11onusingtheELwithrequestheaders;Recipe23.12onfindingoutinformationaboutcookies;Recipe23.13onusingtheELtoaccessJavaBeanproperties.

Page 1006: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Chapter24.InternationalizationIntroduction

Recipe24.1.DetectingtheClientLocaleinaServlet

Recipe24.2.DetectingtheClient'sLocalesinaJSP

Recipe24.3.CreatingaResourceBundleasaPropertiesFile

Recipe24.4.CreatingaResourceBundleasaJavaClass

Recipe24.5.UsingtheResourceBundleinaServlet

Recipe24.6.UsingtheResourceBundleinaJSP

Recipe24.7.FormattingDatesinaServlet

Recipe24.8.FormattingDatesinaJSP

Recipe24.9.FormattingCurrenciesinaServlet

Recipe24.10.FormattingCurrenciesinaJSP

Recipe24.11.FormattingPercentagesinaServlet

Recipe24.12.FormattingPercentagesinaJSP

Recipe24.13.SettingtheLocalizationContextintheDeploymentDescriptor

Page 1007: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Introduction

Theaudienceforalmostallwebsitesisglobal.Manysiteshaveatleastasubsetofcontentthatmustbeadaptedtothelanguageandnationalityoftheirvisitors,sothatthevisitor'sbrowserformatsnumbersanddatesproperlyandtranslatestextintotheproperlanguage.Anobviousexampleisaproductdocumentationorhelpwebsite.WhatifmostofyourcustomersorviewersforthisproductspeakalanguageotherthanEnglish?Javaprovidestoolsthatallowwebdeveloperstointernationalizetheirsites.

BeforeIshowthesetools,let'sfirstexplainafewtermsthatalwaysappearindiscussionsofwebsitetranslation.

1. Internationalization,ori18ninitsabbreviatedversion,meansenablingawebsiteorotherJavaprogramtoprovidedifferentversionsofcontenttranslatedintothevisitor'slanguageornationality.Thistermbasicallymeansmakingyoursiteglobal.

Localization,orl10n,meansaddingresourcestoawebsitetoadaptittoaparticulargeographicalorculturalregion.Anexampleofl10nisaddingKoreanlanguagetranslationstoawebsite.Thewebdeveloperswhohavethisresponsibilityareoftenreferredtoaslocalizers.

Alocaleisaparticularculturalorgeographicalregion.Itisusuallyreferredtoasalanguagesymbolfollowedbyacountrysymbol(separatedbyanunderscorecharacter),asin"en_US"fortheEnglishlocale,"de_DE"forGermanspeakersinGermany,or"de_CH"forSwiss-Germanspeakers,or"fr_CH"forpeopleinSwitzerlandwhospeakFrench.Alocalecanalsorepresentjustthelanguage,asin"ja"forJapaneseor"it"forItalian.Finally,localescanhaveathirdsegmentor"variant"thatreflectsacertainbrowser-typeorvendor,suchas"MAC"forMacintosh.AnexampleofalocaleforEnglishwithaWindowsvariantis"en_US_WIN."

Page 1008: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

ThelanguageelementisrepresentedbyanInternationalStandardsOrganization(ISO)languagecode(http://www.ics.uci.edu/pub/ietf/http/related/iso639.txt);thecountryisencodedunderISO-3166(http://www.chemie.fu-berlin.de/diverse/doc/ISO_3166.html).

SohowdoyouinternationalizeorlocalizeaJavawebsite?Thisisabigsubjectandthetopicofseveralbooks.Thefollowingrecipesprovidethebasicsofhowtocreatepropertiesfiles(calledResourceBundles).Thesefiles(theycanalsobeimplementedasJavaclasses)providelanguagetranslationsforphrasesthatyourwebpagesuse.Aservletcanthenaccesstheseresourcesandprovidedifferenttextversionsaccordingtotherequester'slocale.

TherecipesinthischapteralsocoverhowtoadaptJSPpagestovisitorswhospeakdifferentlanguagesbyusingtheJSTLtags.IbeginbydescribinghowtodetectthelocaleofarequestusingaservletorJSP.

Page 1009: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe24.1DetectingtheClientLocaleinaServlet

Problem

Youwanttodetecttheclientlocaleinaservlet.

Solution

UsetheServletRequest.getLocale()method.

Discussion

ThelocaleisrepresentedbyaclassinJava:java.util.Locale.TheServletRequestobjectcanaccesstheclient's"preferred"localewithitsgetLocale()method,whichreturnsaLocaleobject.

Thepreferredlocaleistheuser'stoppreference.Forexample,ausermayconfiguretheirbrowserwithaSpanishlanguagelocale("es_ES")asthepreferredone.

JavacodecanaccessthelistoflocalesthatauserconfiguresabrowserwithbycallingServletRequest'sgetLocales()method,whichreturnsanEnumerationobject.Thisobjectcontainsthepreferredandless-preferredlocales.

Page 1010: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Tosetthelanguagepreference(s)inNetscape7.1,goto"Edit PreferencesNetscape Languages."IntheMacintoshSafaribrowser,openSystem

Preferencesanddragyourlanguagepreference(s)tothetopofthelist(thenrestartSafari).InInternetExplorer5.5,goto"Tools InternetOptionsLanguages."

Example24-1accessestheclient'spreferredlocalebycallingrequest.getLocale().TheservletthendisplaysinformationaboutthelocalebycallingsomeLocalemethods.Example24-1alsodisplaysinfomationabouttheless-preferredlocalesbyusingthemethodrequest.getLocales().

Example24-1.AccessingtheLocaleobjectinaservlet

packagecom.jspservletcookbook;

importjava.util.Enumeration;

importjava.util.Locale;

importjavax.servlet.*;

importjavax.servlet.http.*;

publicclassLocaleDisplayextendsHttpServlet{

publicvoiddoGet(HttpServletRequestrequest,

HttpServletResponseresponse)

throwsServletException,java.io.IOException{

//Gettheclient'sLocales

Enumerationenum=request.getLocales();

//GetthepreferredLocale

Localepreferred=request.getLocale();

StringprefDisplay="";

if(preferred!=null)

Page 1011: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

prefDisplay=preferred.getDisplayName();

//Displaythepreferredandanyotherlocales

response.setContentType("text/html");

java.io.PrintWriterout=response.getWriter();

out.println(

"<html><head><title>LocaleDisplay</title></head><body>");

out.println("<h2>HereisyourLocaleinfo...</h2>");

out.println("<b>PreferredLocale:</b>");

out.println(prefDisplay);

out.println("<br/>");

out.println("Localecountry:");

if(preferred!=null)

out.println(preferred.getDisplayCountry());

out.println("<br/>");

out.println("Localelanguage:");

if(preferred!=null)

out.println(preferred.getDisplayLanguage());

out.println("<br/><br/>");

out.println("<h3>LowerpriorityLocales...</h3>");

Localeloc=null;

while(enum.hasMoreElements()){

loc=(Locale)enum.nextElement();

if(!(loc.getDisplayName().equals(prefDisplay))){

out.println("Locale:");

out.println(loc.getDisplayName());

out.println("<br/>");

out.println("Localecountry:");

out.println(loc.getDisplayCountry());

out.println("<br/>");

out.println("Localelanguage:");

out.println(loc.getDisplayLanguage());

out.println("<br/><br/>");

}//if

}//while

Page 1012: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

out.println("</body></html>");

}//doGet

}

Figure24-1showsthewebbrowseroutputwhenavisitorwithapreferredlocaleof"en_US"requeststheservlet.

Figure24-1.Theservletdisplaysthepreferredandless-preferredlocales

Thisuserhasconfiguredtheirbrowserwithseveralotherlocales.Asyoucansee,themethodlocale.getDisplayName()isdesignedtoreturnamorereadablename(comparedwith"de_CH")forthelocale.

Thecom.oreilly.servletlibraryincludestheLocaleNegotiatorclass,

Page 1013: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

whichusestheclientrequesttofigureoutthebestcharset,locale,andresourcebundletousewiththeresponse.SeeRecipe8.4fortipsonusingthecom.oreilly.servletlibrary.Idon'tcoverLocaleNegotiatorinparticularhere,buttheJavadocexplainsthisclass.Seehttp://www.servlets.com/cos/javadoc/com/oreilly/servlet/LocaleNegotiator.html.

SeeAlso

TheJavadocdescribingtheLocaleclass:http://java.sun.com/j2se/1.4.1/docs/api/java/util/Locale.html;Recipe24.2ondetectingthelocaleusingaJSP.

Page 1014: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe24.2DetectingtheClient'sLocalesinaJSP

Problem

Youwanttofindoutwhattherequest'spreferredlocaleandless-preferredlocalesareanddisplaythisinformationinaJSP.

Solution

Grabthepreferredlocalewiththeexpression"${pageContext.request.locale}."Getaccesstoallofthelocaleswiththeexpression"${pageContext.request.locales}."

Discussion

TheJSTLtagsmakeiteasytoadaptaJSPforvisitorswhospeakdifferentlanguages.Example24-2usestheELtocreateavariablenamedclientLocalethatrepresentstherequest'spreferredlocale.ThentheJSPdisplaysthelocale'sname,language,andcountry.Example24-2alsodisplaysanyinformationabouttheclient'sless-preferredlocales.

Example24-2.Accessingtherequest'slocaleinaJSP

<%@tagliburi="http://java.sun.com/jsp/jstl/core"prefix="c"%>

<html>

<head><title>LocaleDisplay</title></head>

Page 1015: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<body>

<h2>Hereisyourpreferredlocaleinfo...</h2>

<c:setvar="clientLocale"value="${pageContext.request.locale}"/>

<c:setvar="clientLocales"value="${pageContext.request.locales}"/>

Preferredlocale:${clientLocale.displayName}

<br/>

Preferredlocalecountry:${clientLocale.displayCountry}

<br/>

Preferredlocalelanguage:${clientLocale.displayLanguage}

<h3>Lowerprioritylocales...</h3>

<c:forEachvar="loc"items="${clientLocales}"begin="1">

Locale:${loc.displayName}

<br/>

Localecountry:${loc.displayCountry}

<br/>

Localelanguage:${loc.displayLanguage}

<br/><br/>

</c:forEach>

</body>

</html>

Theexpression"${pageContext.request.locale}"getstherequestobjectfromthepageContextimplicitobject,thenaccessestheLocaleobject,representingtheclient'spreferredlocale,fromtherequest.Fairlyefficient,huh?Thenanexpressionsuchas"${clientLocale.displayName}"representstheequivalentofcallingtheLocaleobject'sgetDisplayName()method.

TheELphrase"${pageContext.request.locales}"representstheequivalentofcallingtheServletRequestobject'sgetLocales()method,whichreturnsajava.util.Enumerationtype.TheEnumerationcontainsalloftheclient'sconfiguredlocales,beginingwiththeirpreferredlocale.

Page 1016: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Example24-2usesanimplmentationofJSTL1.1andJSP2.0.MakesuretoincludethepropertaglibdirectiveatthetopoftheJSPfile,sothattheJSPcanusetheELandcoretags.Ifallthisterminologyisnewandstrangetoyou,readChapter23ontheJSTL.

Example24-2iteratesthrougheachofthelocalesusingthec:forEachtag,asin:

<c:forEachvar="loc"items="${clientLocales}"begin="1">

Thebegin="1"attributebeginsthec:forEachiterationwiththesecondlocaleobject,sincethefirstlocaleistheclient'spreferredone,andtheJSPhasalreadydisplayedinformationonthatone.Thebeginattributeuses"0"astheindexforthefirstitemintheEnumeration.

Figure24-2showstheJSP'swebbrowseroutput.Thisoutputresultsfromavisitorwhosebrowserspecifiesthelocale"es_ES"aspreferred.

Figure24-2.Abrowserrequestsalocale-sensitiveJSP

Page 1017: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

SeeAlso

Chapter23ontheJSTL;theJavadocdescribingtheLocaleclass:http://java.sun.com/j2se/1.4.1/docs/api/java/util/Locale.html.

Page 1018: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe24.3CreatingaResourceBundleasaPropertiesFile

Problem

Youwanttostoreyouri18nresourcesinyourwebapplication.

Solution

Createatextfilewithname/valuepairsrepresentingyouri18nresources.NamethefilewithyourglobalresourcenameandstoreitbeneathWEB-INF.

Discussion

Addingi18n-relatedresourcestoyourwebapplicationinvolvescreatingpropertiesfilesorResourceBundleclasses(Recipe24.4).AResourceBundlethattakestheformofapropertiesfileissimplyalistofkeysandvalues,producedinanytexteditor.Thekeysrepresentsthewordsthatyouwanttobetranslated,andthevaluesarethetranslations.Thesefilesaretheresourcesthatthewebapplicationusestodynamicallytranslatetextintotheappropriatelanguage.

Imaginethatyouarecreatingsomeresourceswithaglobalname,orbasename,of"WelcomeBundle."Example24-3showsthesubclassofthisresourceforthevisitorsfromthelocale"es_ES,"orpeoplefromSpainwhospeakSpanish.

Forexample,thekey"Welcome"isassociatedwithitsSpanishequivalent"Holayrecepción."Recipe24.5showshowaservletwoulduseaResourceBundlelikethistodynamicallytranslate"Welcome"to

Page 1019: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

thevisitor'slanguage.

Example24-3.ThecontentsofaResourceBundlefilenamedWelcomeBundle_es_ES.properties

#Spanishlanguageresources

Welcome=Holayrecepción

Thesearejustkeysandvaluesseparatedbynewlinecharacters.Commentsaredelineatedbyahash(#)character.

Thistextfilehastobestoredinaplacewhereotherwebcomponentscanfindit,similartoinstallingaJavaclassinyourwebapplication.Thisisthepathtothepropertiesfile,whichhasafullyqualifiednameofi18n.WelcomeBundle_es_ES.properties.The.propertiesextensionisanessentialdetail!

WEB-INF/i18n/WelcomeBundle_es_ES.properties

Centralizingthei18nresourcesintheirownWEB-INFsubdirectoryinawebapplicationisasensiblewaytoorganizethisinformationandavoidclutter.

SeeAlso

Recipe24.4oncreatingResourceBundleasaJavaclass;thePropertyResourceBundleJavadoc:http://java.sun.com/j2se/1.4.1/docs/api/java/util/PropertyResourceBundle.html

Page 1020: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe24.4CreatingaResourceBundleasaJavaClass

Problem

YouwanttocreateaResourceBundleasaJavaclass.

Solution

Createaclassthatextendsjava.util.ListResourceBundle.

Discussion

Ifyourapplicationrequiresmorefunctionalitythanastaticpropertiesfilecanprovide(Recipe24.3),youcancreateyourResourceBundlesasJavaclasses:java.util.ListResourceBundletypes.Forinstance,aparticularresourcemightneedtoselectitstranslationinformationfromadatabase.

Example24-4includesthesameinformationasthepropertiesfileinthepriorrecipe.However,itskey/valuepairsarestoredintheformofatwo-dimensionalObjectarray.Thisclassisstoredinthesameplaceasthe.propertiesfilesinWEB-INF/i18n.

Example24-4.StoringlanguageinformationinaListResourceBundle

packagecom.jspservletcookbook;

Page 1021: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

importjava.util.ListResourceBundle;

publicclassWelcomeBundle_es_ESextendsListResourceBundle{

staticfinalObject[][]contents={

{"Welcome","Holayrecepción"}

};

publicObject[][]getContents(){

returncontents;

}

}

Thiscodesnippetfromaservletshowshowyoucouldusethisclass.

Example24-5.CallingaListResourceBundlemethodfromaResourceBundlecreatedasaJavaclass

<!--insideservletgoGet()ordoPost()method,forinstance-->

ResourceBundlebundle=ResourceBundle.getBundle(

"i18n.WelcomeBundle_es_ES");

//CallinheritedListResourceBundlegetKeys()method

java.util.Enumerationenum=bundle.getKeys();

while(enum.hasMoreElements()){

//Printsoutkey:"Welcome"

out.println((String)enum.nextElement());

out.println("<br/><br/>");

}//while

Page 1022: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

TheResourceBundle.getBundle()staticmethodtriestofindaJavaclasswiththefullyqualifiedname"i18n.WelcomeBundle_es_ES"(inthisexample).Failingthat,itlooksforapropertiesfileofthesamename(minusthe.propertiesextension):i18n.WelcomeBundle_es_ES.properties.

SeeAlso

TheJavadocforListResourceBundle:http://java.sun.com/j2se/1.4.1/docs/api/java/util/ListResourceBundle.html;Recipe24.3oncreatingaResourceBundleasapropertiesfile.

Page 1023: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe24.5UsingtheResourceBundleinaServlet

Problem

Youwantaservlettodynamicallydisplaya"Welcome"messagetovisitorsdependingontheirlocale.

Solution

UsetheservlettoaccessthetranslatedtextdynamicallyfromaResourceBundle.

Discussion

OnceyouhaveaddedResourceBundlestothewebapplication,thenservletscanusethemtodynamicallydisplaytextbasedontheuser'slocale.

Remember,thewebapplicationstoresResourceBundlesas.propertiesfiles(text)orJavaclasses.

Example24-6usesaResourceBundlewithabasenameof"WelcomeBundle."ItisstoredinWEB-INF/i18n,soitsfullyqualifiednameisi18n.WelcomeBundle.

Page 1024: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Example24-6.Aservletusesatodynamicallydisplaytranslatedtext

packagecom.jspservletcookbook;

importjava.util.Locale;

importjava.util.ResourceBundle;

importjavax.servlet.*;

importjavax.servlet.http.*;

publicclassWelcomeServletextendsHttpServlet{

publicvoiddoGet(HttpServletRequestrequest,

HttpServletResponseresponse)throwsServletException,

java.io.IOException{

//Gettheclient'sLocale

Localelocale=request.getLocale();

ResourceBundlebundle=ResourceBundle.getBundle(

"i18n.WelcomeBundle",locale);

Stringwelcome=bundle.getString("Welcome");

//Displaythelocale

response.setContentType("text/html");

java.io.PrintWriterout=response.getWriter();

out.println("<html><head><title>"+welcome+"</title></head><body>");

out.println("<h2>"+welcome+"</h2>");

out.println("Locale:");

out.println(locale.getLanguage()+"_"+locale.getCountry());

Page 1025: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

out.println("</body></html>");

}//enddoGet

//doPostmethod...

}//WelcomeServlet

HereishowtheapplicationusesthisresourceinresponsetoavisitorfromaSpanishlocale("es_ES"):

1. Theservletaccessesthelocaleasajava.util.Localeobject.

ItpassesthelocaleintotheResourceBundle.getBundle()method,whichusesthelocaletosearchforaResourceBundlenamedi18n.WelcomeBundle_es_ES.Themethodformsthissearchtermbyattachingthecurrentrequest'slocalenametotheendoftheResourceBundlebasename.Inthiscase,thebundleisstoredasaJavaclass(Recipe24.4).

Thebundlethendisplaysthemessagebyaccessingthe"Welcome"key,whichisspecifiedbytheResourceBundle(Example24-4orExample24-5).

Sometimesthebrowsersendsthelocaleinformationasalanguagecodeonly,asin"es"forSpanish(insteadof"es_ES"withlanguagecodeandcountrycode).IftheapplicationhasonlyinstalledaresourcenamedWelcomeBundle_es_ES,butnotWelcomeBundle_es,thenthegetBundle()methoddefaultstoaresourcenamedWelcomeBundle(whichmightnotbetheoptimaloutcome),andthereforemaynotdisplaythetranslatedtext.MakesuretoincludeaWelcomeBundle_esresourcetocoverthesecases.

Figure24-3showstheservlet'soutputinresponsetoarequestfromaSpanishlocale.

Page 1026: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Figure24-3.ASpanishclientrequeststheLocaleServlet

Figure24-4showstheservlet'sresponsewhenitdealswithalocaleforwhichtheapplicationhasnotprovidedaresource.Inthiscase,thebrowserissetfortheJapaneselanguage,buttheapplicationhasnotyetprovidedaresourceforthislocale.

Figure24-4.AbrowsersetforJapanesevisitsreceivesthedefaultmessage

Thetextthatthebrowserdisplaysderivesfromthedefaultpropertiesfile:WelcomeBundle.properties(noticetheabsenceofanylocale-relatedsuffixinthefilename).

SeeAlso

Page 1027: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe24.6onusingtheResourceBundleinaJSP;TheJavadocforResourceBundle:http://java.sun.com/j2se/1.4.1/docs/api/java/util/ResourceBundle.html.

Page 1028: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe24.6UsingtheResourceBundleinaJSP

Problem

YouwanttodynamicallydisplaytextintheJSPaccordingtothelocaleoftherequest.

Solution

UsetheJSTLtagsfromtheformattinglibrary.

Discussion

TheJSTL'sformattingtagsmakeiteasytodynamicallydisplaytextbasedonthebrowser'slanguagesetting.Example24-7makesavailabletheformattingandcoreJSTLtagswiththetaglibdirective.Thenitusesthefmt:setBundletagtospecifythei18nresourcesthatwillbeusedbythepage(thelocalizationcontext).

Example24-7.Usingtheformattingtagstodisplayalocale-sensitivemessageinaJSP

<%@tagliburi="http://java.sun.com/jstl/core"prefix="c"%>

<%@tagliburi="http://java.sun.com/jstl/fmt"prefix="fmt"%>

<fmt:setBundlebasename="i18n.WelcomeBundle"/>

<html>

<head><title><fmt:messagekey="Welcome"/></title></head>

Page 1029: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<body>

<h2><fmt:messagekey="Welcome"/></h2>

Locale:<c:outvalue=

"${pageContext.request.locale.language}"/>_<c:outvalue=

"${pageContext.request.locale.country}"/>

</body>

</html>

Justliketheservletcodeinthepriorrecipe,thetagdynamicallyusestheWelcomeBundleresourcebasedontherequest'slocale.Inotherwords,ifthebrowser'slocaleis"es_ES,"aSpanishlocale,thenthefmt:messagetagsusesthekeysandvaluesfromtheWelcomeBundle_es_ESpropertiesfileorJavaclass(howeveritisimplemented).

Ifyousetthelocalizationcontextasacontext-paramelementinthedeploymentdescriptor,theJSPdoesnothavetousethefmt:setBundletag.SeeRecipe24.13.

IntheJSP,thecode:

<fmt:messagekey="Welcome"/>

isreplacedbythevalueofthe"Welcome"keyinthechosenResourceBundlefile("Holayrecepción").TheresultofrequestingthisJSPlooksjustlikeFigure24-3inRecipe24.5.

SeeAlso

Page 1030: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe24.5onusingtheResourceBundleinaservlet;Chapter23ontheJSTL;theJavadocforResourceBundle:http://java.sun.com/j2se/1.4.1/docs/api/java/util/ResourceBundle.html.

Page 1031: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe24.7FormattingDatesinaServlet

Problem

Youwanttoformatadatefordisplayinaservletbasedontherequest'slocale.

Solution

Usethejava.text.DateFormatclass.

Discussion

Differentcountrieshavetheirownwaysofdisplayingthedateandtime.TheDateFormatclass,likemanyoftheclassesinthejava.textpackage,is"localesensitive."Yourcodedisplaysthedatedependingonthebrowser'slanguagesetting.AllyouhavetodoispasstheLocaleobjecttothestaticDateFormat.getDateTimeInstance()method,asintheservletofExample24-8.

Example24-8.DisplayingadateStringinalocale-sensitivemanner

packagecom.jspservletcookbook;

importjava.text.DateFormat;

importjava.util.Date;

importjava.util.Locale;

Page 1032: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

importjava.util.ResourceBundle;

importjavax.servlet.*;

importjavax.servlet.http.*;

publicclassDateLocaleServletextendsHttpServlet{

publicvoiddoGet(HttpServletRequestrequest,

HttpServletResponseresponse)throwsServletException,

java.io.IOException{

//Gettheclient'sLocale

Localelocale=request.getLocale();

ResourceBundlebundle=ResourceBundle.getBundle(

"i18n.WelcomeBundle",locale);

Stringwelcome=bundle.getString("Welcome");

Stringdate=DateFormat.getDateTimeInstance(DateFormat.FULL,

DateFormat.SHORT,locale).format(newDate());

//Displaythelocale

response.setContentType("text/html");

java.io.PrintWriterout=response.getWriter();

out.println("<html><head><title>"+welcome+"</title></head><body>");

out.println("<h2>"+bundle.getString("Hello")+""+

bundle.getString("and")+""+

welcome+"</h2>");

out.println(date+"<br/><br/>");

out.println("Locale:");

out.println(locale.getLanguage()+"_"+locale.getCountry());

Page 1033: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

out.println("</body></html>");

}//doGet

//implementdoPostandcalldoGet(request,response);

}

TheDateFormat.getDateTimeInstance()methodincludesparametersintheformofconstants(e.g.,DateFormat.FULL)thatallowyourcodetocustomizethedateformat.Example24-8displaysthedateinawaythatincludesthenameofthedayoftheweekandashortformforthetime.Youcanexperimentwiththeseconstantsinordertodeterminehowbrowsersdisplaytheservlet'soutput.Figure24-5showshowthedateisdisplayedinresponsetoaGerman-languagelocaleof"de_DE."

Figure24-5.Displayingthedateinaservletaccordingtotherequest'slocale

SeeAlso

TheJavadocfortheDateFormatclass:

Page 1034: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

http://java.sun.com/j2se/1.4.1/docs/api/java/text/DateFormat.html;Recipe24.8onformattingdatesinaJSP.

Page 1035: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe24.8FormattingDatesinaJSP

Problem

YouwanttodisplayadateinaJSPthatiscustomizedfortheuser'slocale.

Solution

Usethefmt:formatDateJSTLtag.

Discussion

TheJSTLincludesthe"formatting"library,whichallowsJSPcodetodisplaydatesinalocale-sensitivemanner.Example24-9usesthefmt:formatDatetag.Thecodeusesthestandardactionjsp:useBeantocreateajava.util.Dateobjectrepresentingthecurrentdateandtime.Thecodepassesthedateobjecttofmt:formatDate'svalueattribute.WhenauserrequeststheJSP,thefmt:formatDatetagisreplacedbytextdisplayingtheformatteddate.

Example24-9.Formattingadateusingfmt:formatDate

<%@tagliburi="http://java.sun.com/jstl/core"prefix="c"%>

<%@tagliburi="http://java.sun.com/jstl/fmt"prefix="fmt"%>

<jsp:useBeanid="date"class="java.util.Date"/>

Page 1036: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<html>

<head><title><fmt:messagekey="Welcome"/></title></head>

<body>

<h2><fmt:messagekey="Hello"/><fmt:messagekey="and"/>

<fmt:messagekey="Welcome"/></h2>

<fmt:formatDatevalue="${date}"type="both"dateStyle=

"full"timeStyle="short"/><br/>

Locale:<c:outvalue=

"${pageContext.request.locale.language}"/>_<c:outvalue=

"${pageContext.request.locale.country}"/>

</body>

</html>

Thefmt:messagetagsheredependonaconfigurationparameter,orcontext-paramelement,inthedeploymentdescriptor.Thecontext-paramelementspecifiesthei18n-relatedresources.SeeRecipe24.13.

TheelementhasattributesnameddateStyleandtimeStylethatallowthecodetocustomizetheformatofthedateandtimeStrings.

SeetheJavadocfortheDateFormatclassformoredetails:http://java.sun.com/j2se/1.4.1/docs/api/java/text/DateFormat.html.

TheoutputoftheJSPinExample24-9looksjustlikeFigure24-5inthepriorrecipe.

Page 1037: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

SeeAlso

TheJavadocfortheDateFormatclass:http://java.sun.com/j2se/1.4.1/docs/api/java/text/DateFormat.html;Chapter23ontheJSTL;Recipe24.7onformattingdatesinaservlet.

Page 1038: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe24.9FormattingCurrenciesinaServlet

Problem

Youwanttoformatacurrencyvalueaccordingtotherequest'slocale.

Solution

Usethejava.text.NumberFormatclass.

Discussion

TheNumberFormatclasscanformatanumber,suchasalongordoubletype,asapercentage.ThisclasshasastaticgetCurrencyInstance()method.Thismethodcantakeajava.util.Localeobjectasaparameter,todisplaythecurrencyaccordingtotheuser'slanguagesetting.

Example24-10isaservletthatdemonstratesthelocale-sensitivedisplayofacurrency,byshowingboththecurrencyamountandthelocalelanguageandcountrycode.

Example24-10.Formattinganumberasapercentageinaservlet

packagecom.jspservletcookbook;

importjava.text.NumberFormat;

Page 1039: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

importjava.util.Locale;

importjava.util.ResourceBundle;

importjavax.servlet.*;

importjavax.servlet.http.*;

publicclassCurrLocaleServletextendsHttpServlet{

publicvoiddoGet(HttpServletRequestrequest,

HttpServletResponseresponse)

throwsServletException,java.io.IOException{

//Gettheclient'sLocale

Localelocale=request.getLocale();

ResourceBundlebundle=ResourceBundle.getBundle(

"i18n.WelcomeBundle",locale);

Stringwelcome=bundle.getString("Welcome");

NumberFormatnft=NumberFormat.getCurrencyInstance(locale);

StringformattedCurr=nft.format(1000000);

//Displaythelocale

response.setContentType("text/html");

java.io.PrintWriterout=response.getWriter();

out.println("<html><head><title>"+welcome+"</title></head><body>");

out.println("<h2>"+bundle.getString("Hello")+""+

bundle.getString("and")+""+

welcome+"</h2>");

out.println("Locale:");

out.println(locale.getLanguage()+"_"+locale.getCountry());

Page 1040: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

out.println("<br/><br/>");

out.println(formattedCurr);

out.println("</body></html>");

}//doGet

//implementdoPost()tocalldoGet()...

}

TheNumberFormatclass'format()methodreturnsaStringthatrepresentstheformattedcurrency.Figure24-6showstheservlet'soutputwhenrequestedbyabrowserwheretheuserhassetthelanguagesettingtothelocale"en_GB"(Englishlanguage,GreatBritain).

Figure24-6.ABritishvisitorseestheformattedcurrencydisplayofonemillionpounds

SeeAlso

TheJavadocfortheNumberFormatclass:

Page 1041: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

http://java.sun.com/j2se/1.4.1/docs/api/java/text/NumberFormat.html;Recipe24.10onformattingcurrenciesinaJSP.

Page 1042: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe24.10FormattingCurrenciesinaJSP

Problem

YouwanttoformatcurrencyvaluesinaJSP.

Solution

UsetheJSTLtagfmt:formatNumber.

Discussion

Thefmt:formatNumbertagisdesignedtodisplayacurrencyvaluebasedonthevisitor'slocale.Example24-11firstusesthetaglibdirectivetomaketheJSTL1.0formattinglibraryavailabletotheJSP.

Example24-11.formattinganumberusingtheJSTL1.0tags

<%@tagliburi="http://java.sun.com/jstl/core"prefix="c"%>

<%--theformattinglibraryincludesfmt:formatNumber--%>

<%@tagliburi="http://java.sun.com/jstl/fmt"prefix="fmt"%>

<html>

<head><title><fmt:messagekey="Welcome"/></title></head>

<body>

<h2><fmt:messagekey="Hello"/><fmt:messagekey="and"/><fmt:messagekey="Welcome"/></

h2>

Page 1043: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Locale:<c:outvalue="${pageContext.request.locale.language}"/>_<c:out

value="${pageContext.request.locale.country}"/>

<br/><br/>

<fmt:formatNumbervalue="1000000"type="currency"/>

</body>

</html>

Thefmt:formatNumbertagisquitestraightforward.Thevalueattributetakesthenumberyouwanttoformatasacurrency,andthevalueofthetypeattributemustbe"currency."ThetextrepresentingtheformattednumberthenreplacesthetagwhenabrowserdisplaystheJSP'soutput.TheJSPinExample24-11displaysthesamebrowserinformationasshowninFigure24-6ofthepriorrecipe.

SeeAlso

Chapter23ontheJSTL;theJavadocfortheNumberFormatclass:http://java.sun.com/j2se/1.4.1/docs/api/java/text/NumberFormat.html;Recipe24.9onformattingcurrenciesinaservlet.

Page 1044: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe24.11FormattingPercentagesinaServlet

Problem

Youwanttoformatnumbersaspercentagesanddisplaytheminaservlet.

Solution

Usethejava.txt.NumberFormatclassanditsstaticgetPercentInstance()method.

Discussion

Example24-12usestheNumberFormat.getPercentInstance()method,withtheuser'slocaleasanargument,togetaNumberFormattypefordisplayinganumberasapercentage.ThecodeinExample24-12callstheNumberFormat'sformat()method,withanumberasanargument.

Theformat()methoddisplaysthenumber51as"5100%";adoubletypeincludingthedecimalpoint,suchas0.51producestheintendedresult(51%).

Example24-12.UsingNumberFormattodisplayapercentageinaservlet

Page 1045: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

packagecom.jspservletcookbook;

importjava.text.NumberFormat;

importjava.util.Locale;

importjava.util.ResourceBundle;

importjavax.servlet.*;

importjavax.servlet.http.*;

publicclassPerLocaleServletextendsHttpServlet{

publicvoiddoGet(HttpServletRequestrequest,

HttpServletResponseresponse)

throwsServletException,java.io.IOException{

//Gettheclient'sLocale

Localelocale=request.getLocale();

ResourceBundlebundle=ResourceBundle.getBundle(

"i18n.WelcomeBundle",locale);

Stringwelcome=bundle.getString("Welcome");

NumberFormatnft=NumberFormat.getPercentInstance(locale);

Stringformatted=nft.format(0.51);

//Displaythelocale

response.setContentType("text/html");

java.io.PrintWriterout=response.getWriter();

out.println("<html><head><title>"+welcome+"</title></head><body>");

out.println("<h2>"+bundle.getString("Hello")+""+

bundle.getString("and")+""+

welcome+"</h2>");

Page 1046: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

out.println("Locale:");

out.println(locale.getLanguage()+"_"+locale.getCountry());

out.println("<br/><br/>");

out.println("NumberFormat.getPercentInstance():"+formatted);

out.println("</body></html>");

}//doGet

//implementdoPost()tocalldoGet()...

}

Figure24-7showstheservlet'soutputinabrowser.

Figure24-7.Thebrowserdisplaysapercentageforacertainlocale

SeeAlso

TheJavadocfortheNumberFormatclass:http://java.sun.com/j2se/1.4.1/docs/api/java/text/NumberFormat.html;

Page 1047: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe24.12onformattingpercentagesinaJSP.

Page 1048: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe24.12FormattingPercentagesinaJSP

Problem

YouwanttodisplayanumberasapercentageinaJSP.

Solution

Usethefmt:formatNumbertag.

Discussion

TheJSTL'sfmt:formatNumbertagcandisplayanumberthecodeprovidesinthetag'svalueattributeasapercentage.Thevalueofthetypeattributemustbe"percent"(not"percentage").Example24-13passestheString".51"tothevalueattribute.Thiscodedisplaysthetext"51%"inthebrowser.

Example24-13.Usingthefmt:formatNumbertaginaJSPtodisplayapercentage

<%@tagliburi="http://java.sun.com/jstl/core"prefix="c"%>

<%@tagliburi="http://java.sun.com/jstl/fmt"prefix="fmt"%>

<html>

<head><title><fmt:messagekey="Welcome"/></title></head>

<body>

<h2><fmt:messagekey="Hello"/><fmt:messagekey="and"/><fmt:messagekey="Welcome"/></

h2>

Page 1049: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Locale:<c:outvalue="${pageContext.request.locale.language}"/>_<c:out

value="${pageContext.request.locale.country}"/>

<br/><br/>

<fmt:formatNumbervalue=".51"type="percent"/>

</body>

</html>

Figure24-8showstheJSP'soutput.

Figure24-8.AJSPdisplaysanumberformattedasapercentage

SeeAlso

TheJavadocfortheNumberFormatclass:http://java.sun.com/j2se/1.4.1/docs/api/java/text/NumberFormat.html;Chapter23ontheJSTL;Recipe24.12onformattingpercentagesinaservlet.

Page 1050: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe24.13SettingtheLocalizationContextintheDeploymentDescriptor

Problem

YouwanttoconfigurethelocalizationcontextfortheJSTLtagsusedbyawebapplication.

Solution

Useacontext-paramelementintheapplication'sdeploymentdescriptor.

Discussion

AlocalizationcontextisasetofresourcessuchasResourceBundlesthatyourwebapplication'susetoprovidelocaleinformationforaJSP.IftheJSPisdisplayingtranslatedtext,itcanuseJSTLtags(suchasfmt:fmtMessage)thatdetecttheuser'slocale,andthensearcheswithinthelocalizationcontextforthepropertexttodisplay.

Setthelocalizationcontextwithacontext-paramelementinweb.xml.Theparameternamemustbejavax.servlet.jsp.jstl.fmt.localizationContext.ItsvalueisthefullyqualifiedbasenameoftheResourceBundlethatyouhaveinstalledinthewebapplication.Example24-14showsacontext-paramelementthatpointstotheResourceBundlewehaveusedthroughoutthischapter.

Addthistypeofelementtoyourdeploymentdescriptorasanalternative

Page 1051: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

tousingtheJSTLtagfmt:setBundleinsideJSPstospecifyaResourceBundle.

Example24-14.SettingthelocalizationcontextforJSTLtags

<!--Beginningofweb.xml-->

<context-param>

<param-name>

javax.servlet.jsp.jstl.fmt.localizationContext

</param-name>

<param-value>i18n.WelcomeBundle</param-value>

</context-param>

<!--Restofweb.xml-->

SeeAlso

Chapter23ontheJSTL;Recipe24.2ondetectingtheclientlocaleinaJSP;Recipe24.6onusingaResourceBundleinaJSP;Recipe24.8onformattingdates;Recipe24.10onformattingcurrencies;Recipe24.12onformattingpercentages.

Page 1052: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Chapter25.UsingJNDIandEnterpriseJavaBeans

Introduction

Recipe25.1.ConfiguringaJNDIObjectinTomcat

Recipe25.2.AccessingtheTomcatJNDIResourcefromaServlet

Recipe25.3.AccessingtheTomcatJNDIResourcefromaJSP

Recipe25.4.ConfiguringaJNDIResourceinWebLogic

Recipe25.5.ViewingtheJNDITreeinWebLogic

Recipe25.6.AccessingtheWebLogicJNDIResourcefromaServlet

Recipe25.7.AccessingtheWebLogicJNDIResourcefromaJSP

Recipe25.8.AccessinganEJBUsingtheWebLogicJNDITree

Page 1053: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Introduction

TheJavaNamingandDirectoryInterface(JNDI)isanAPIthatJavadevelopersusetoaccessnaminganddirectoryservices.TheseservicesaretechnologiesthatJavaprogramsusetostoreorbindobjectsforlateruse,aswellassearchforor"lookup"objectreferences.ThepurposeofJNDIistoseparatetheresponsibilityofmaintainingarepositoryofcommonlyusedobjectsfromthewidevarietyofJavaclassesthatusethoseobjects,includingservletsandJSPs.

ExamplesofJNDIservicesaretheRemoteMethodInvocationregistryandtheLightweightDirectoryAccessProtocol(LDAP).TheJNDIAPI,representedbythejavax.namingpackage,providesacommonimplementationforaccessingobjectsthatareboundtotheseservices.

Thejavax.namingpackageispartoftheJava21.3and1.4SoftwareDevelopmentKits(SDKs).

Eachofthesetechnologieshasanamingschemewithwhich"JNDIobjects"canbefound.Thestructureoftheseschemesisoftenhierarchical;youstartatthetopoftheJNDItree,thenworkyourwaydowntoeachofthebranchestofindwhatyouarelookingfor.UsingJNDI,Javaprogramsbeginwithan"initialcontext,"similartotheforwardslash(/)fromwhichUnixbeginstodescribethelocationofafile.The/representstherootofastoragemediumorharddisk;youcanfindtheUsersfolderatthetoplevelofthediskbyentering/Users.

InTomcat,theinitialcontextofitsbuilt-inJNDIimplementationistheaddressjava:comp/envalllookupsstartfromthere.Chapter21describeshowtoaccessajavax.sql.DatasourcefromaJNDIimplementationbystartingattheinitialcontextjava:comp/env,andthenlookinguptheDataSourceattheaddressjdbc/MyDataSource.AllDataSourcesare

Page 1054: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

storedunderjdbc,sothisishowJavacodeaccessesaDataSourcenamed"MyDataSource."Usingafilesystemanalogy,the"root"folderinTomcat'sJNDIstructureis"java:comp/env"andspecificDataSourcesarestoredunderthejdbcsubdirectory.

YoucanuseJNDItogetaccesstoanyJavaobject,notjustDataSources.ThischapterdescribeshowtostoreaJavaBeanusingTomcat'sJNDIimplementation,andthenlookupthebeanusingaservletorJSP.Thechapteralsodescribeshowtoconfigureamailsession(withajavax.mail.Sessionobject)usingBEAWebLogic'sJNDIimplementation,andthentogainaccesstothatmailsessionbyenablingaservletorJSPtosendemail.

AservletcanalsoaccessEnterpriseJavaBeans(EJBs)usingJNDI.

AnEJBisaJavaclassthatresidesinthe"businesstier"oftheJava2EnterpriseEditon(J2EE)multi-tierarchitecture.TheJ2EEincludesawebtiercontainingourfamiliarservletsandJSPs,andanEnterpriseInformationSystem(EIS)tierinvolvingdatabasesystems.Seethe"SeeAlso"sectionofRecipe25.8.

TheservletsorJSPsmayrepresentthepresentationlogicofasystemthatusesEJBstoaccessdatabasesandimplementtasksthatarespecifictoabusinessororganization.ThelastrecipeshowshowtoaccessanEJBfromaservletusingBEAWebLogicastheapplicationserver.

Page 1055: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe25.1ConfiguringaJNDIObjectinTomcat

Problem

YouwanttoconfigureaJavaBeanasaJNDIobjectusingTomcat4.

Solution

CreateResourceandResourceParamelementsinserver.xmlorintheXMLfilethatrepresentsyourwebapplication(locatedinTomcat'swebappsfolder).Thenaddaresource-env-refelementtoweb.xml.

Discussion

TheJNDIobjectforTomcatissetupinconf/server.xml.IfyouhaveconfiguredawebapplicationasaseparateXMLfileinTomcat'swebappsfolder,thenconfiguretheJNDIresourceinthisXMLfileinstead.Example25-1showsthesetupforbindingaJavaBeanasaJNDIobject.Thebeanisnamedcom.jspservletcookbook.StockPriceBean.

Example25-1.Theserver.xmlelementforconfiguringaJNDIobject

<Resourcename="bean/pricebean"type=

"com.jspservletcookbook.StockPriceBean"auth="Container"description=

"Awebharvestingbean"/>

<ResourceParamsname="bean/pricebean">

Page 1056: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<parameter>

<name>factory</name>

<value>org.apache.naming.factory.BeanFactory</value>

</parameter>

</ResourceParams>

Example25-1includesaResourceelementandaResourceParamselementthatreferencestheResourcebyname("bean/pricebean").ThisnameistheaddressbywhichJavacodeaccessesabeaninstanceusingtheJNDIAPI.

Example25-2showstheresource-env-refelementthatmustappearinthedeploymentdescriptor(web.xml)inorderforwebapplicationcodetoaccesstheJNDIobject.Storethecom.jspservletcookbook.StockPriceBeanclassinWEB-INF/classesorinaJARfileplacedinWEB-INF/lib.

Example25-2.Placethiselementinthedeploymentdescriptorweb.xml

<!--startofdeploymentdescriptor-->

<resource-env-ref>

<description>

AfactoryforStockPriceBean

</description>

<resource-env-ref-name>

bean/pricebean

</resource-env-ref-name>

<resource-env-ref-type>

com.jspservletcookbook.StockPriceBean

</resource-env-ref-type>

Page 1057: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

</resource-env-ref>

<!--restofdeploymentdescriptor-->

Example25-3showsasnippetofcodethatusestheJNDIAPI,justtostartyouonhowtheconfigurationfitsinwithJNDI-relatedcode.

Example25-3.CodesnippetforaccessingaTomcatJNDIresource

importjavax.naming.Context;

importjavax.naming.InitialContext;

importjavax.naming.NamingException;

//Thiscodemayappearinaservlet'sinit()methodorperhaps

//indoGet()ordoPost()

Contextenv=null;

StockPriceBeanspbean=null;

try{

env=(Context)newInitialContext().lookup("java:comp/env");

spbean=(StockPriceBean)env.lookup("bean/pricebean");

if(spbean==null)

thrownewServletException(

"bean/pricebeanisanunknownJNDIobject");

//closetheInitialContext

env.close();

}catch(NamingExceptionne){

Page 1058: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

//closetheContextifyou'renotusingitagain

try{env.close();}catch(NamingExceptionnex){}

thrownewServletException(ne);

}

Example25-3importsthenecessaryclassesfromthejavax.namingpackage.ThentwolookupstakeplacetogetareferencetoaJavaBeanthathasbeenboundtoaJNDIimplementation.Thefirstlookupprovidestheinitialcontext:

env=(Context)newInitialContext().lookup("java:comp/env");

ThesecondlookupattemptstoreturnaStockPriceBeanobject:

spbean=(StockPriceBean)env.lookup("bean/pricebean");

ThecodeclosestheInitialContexttoreleasetheobject'sresources,ifthecodeisnotgoingtousethecontextagainforanotherlookup.ThenextrecipeusescodelikethisfromservletsandJSPs.

SeeAlso

Recipe25.2onaccessingtheTomcatJNDIobjectfromaservlet;Recipe25.3onaccessingtheTomcatJNDIobjectfromaJSP;Chapter21onaccessingDataSourceswithJNDI.

Page 1059: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe25.2AccessingtheTomcatJNDIResourcefromaServlet

Problem

YouwanttoaccessaJNDIobjectwithaservletusingTomcat'sJNDIimplementation.

Solution

Usethejavax.namingclassesintheservlet'sinit()methodtolookupaJNDIobject.ThenusetheobjectinaservicemethodlikedoGet().

Discussion

AservletcanaccessaJavaBeanasaJNDIregisteredresourceafteryouhave:

1. DevelopedtheJavaBeanclassandstoreditinWEB-INF/classesorinaJARinWEB-INF/lib.

Changedtheserverconfigurationfileandweb.xmlasdescribedinRecipe25.1,inordertobindtheobjecttotheTomcatJNDItree.

Example25-4createsajavax.naming.InitialContextinitsinit()method,thenlooksupaJavaBean:com.jspservletcookbook.StockPriceBean.ThisbeanisboundtotheJNDIimplementationunderthename"bean/pricebean."Theinit()methodiscalledonlywhentheservletcontainercreatesaservlet

Page 1060: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

instance,sotheservlethasaccesstooneinstanceofStockPriceBean.

Example25-4.UsingaTomcatJNDIobjectfromaservlet

packagecom.jspservletcookbook;

importjava.io.IOException;

importjava.io.PrintWriter;

importjavax.naming.Context;

importjavax.naming.InitialContext;

importjavax.naming.NamingException;

importjavax.servlet.*;

importjavax.servlet.http.*;

publicclassBeanServletextendsHttpServlet{

privateStockPriceBeanspbean;

publicvoidinit()throwsServletException{

Contextenv=null;

try{

env=(Context)newInitialContext().lookup("java:comp/env");

spbean=(StockPriceBean)env.lookup("bean/pricebean");

//closetheInitialContext,unlessthecodewilluseitfor

//anotherlookup

env.close();

if(spbean==null)

Page 1061: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

thrownewServletException(

"bean/pricebeanisanunknownJNDIobject");

}catch(NamingExceptionne){

try{env.close();}catch(NamingExceptionnex){}

thrownewServletException(ne);

}//try

}//init

publicvoiddoGet(HttpServletRequestrequest,

HttpServletResponseresponse)

throwsServletException,java.io.IOException{

//settheMIMEtypeoftheresponse,"text/html"

response.setContentType("text/html");

//useaPrintWritertosendtextdatatotheclient

java.io.PrintWriterout=response.getWriter();

//BeginassemblingtheHTMLcontent

out.println("<html><head>");

out.println("<title>StockPriceFetcher</title></head><body>");

out.println("<h2>Pleasesubmitavalidstocksymbol</h2>");

//makesuremethod="POST"sothattheservletservicemethod

//callsdoPostintheresponsetothisformsubmit

out.println(

"<formmethod=\"POST\"action=\""+request.getContextPath()+

"/namingbean\">");

out.println("<tableborder=\"0\"><tr><tdvalign=\"top\">");

Page 1062: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

out.println("Stocksymbol:</td><tdvalign=\"top\">");

out.println("<inputtype=\"text\"name=\"symbol\"size=\"10\">");

out.println("</td></tr><tr><tdvalign=\"top\">");

out.println(

"<inputtype=\"submit\"value=\"SubmitInfo\"></td></tr>");

out.println("</table></form>");

out.println("</body></html>");

}//doGet

publicvoiddoPost(HttpServletRequestrequest,

HttpServletResponseresponse)

throwsjava.io.IOException{

Stringsymbol;//thiswillholdthestocksymbol

floatprice=0f;

symbol=request.getParameter("symbol");

booleanisValid=(symbol==null||symbol.length()<1)?

false:true;

//settheMIMEtypeoftheresponse,"text/html"

response.setContentType("text/html");

//useaPrintWritersendtextdatatotheclient

java.io.PrintWriterout=response.getWriter();

//BeginassemblingtheHTMLcontent

out.println("<html><head>");

out.println("<title>Lateststockvalue</title></head><body>");

if((!isValid)||spbean==null){

out.println(

Page 1063: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

"<h2>Sorry,thestocksymbolparameterwaseither"+

"emptyornull</h2>");

}else{

out.println("<h2>Hereisthelatestvalueof"+symbol+"</h2>");

spbean.setSymbol(symbol);

price=spbean.getLatestPrice();

out.println((price==0?

"Thesymbolisprobablyinvalid.":""+price));

}

out.println("</body></html>");

}//doPost

}//BeanServlet

Example25-4callsclose()ontheInitialContexttofreeupanyresourcesthisobjectisusing,sincethecodedoesnotuseitagaintoinitiatealookup.ThentheservletusesthebeanobjecttoaccessalivestockquoteinitsdoGet()method.Theservletfirstcallsthebean'ssettermethodsetSymbol()tonotifythebeanaboutwhichstocksymbolitislookingup.

Example25-5showsthebeanthatTomcathasstoredasaJNDIobject(it'sthesamebeanusedinExample25-4).Chapter26explainsthisbean,which"scrapes"astockpriceoffofawebpage.Chapter26coversthebean'sdetails;themethodsthischapter'sservletusesaresetSymbol()andgetLatestPrice().Thebeanhandlesallthedetailsofdownloadingthestockprice.

Example25-5.ThebeanthatisstoredasaJNDIobject

packagecom.jspservletcookbook;

importjava.io.BufferedReader;

importjava.io.IOException;

importjava.io.InputStreamReader;

Page 1064: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

importjava.net.URL;

importjava.net.MalformedURLException;

importjavax.swing.text.html.HTMLEditorKit.ParserCallback;

importjavax.swing.text.MutableAttributeSet;

importjavax.swing.text.html.parser.ParserDelegator;

publicclassStockPriceBean{

privatestaticfinalStringurlBase=

"http://finance.yahoo.com/q?d=t&s=";

privateBufferedReaderwebPageStream=null;

privateURLstockSite=null;

privateParserDelegatorhtmlParser=null;

privateMyParserCallbackcallback=null;

privateStringhtmlText="";

privateStringsymbol="";

privatefloatstockVal=0f;

publicStockPriceBean(){}//no-argumentsconstructorforthebean

publicvoidsetSymbol(Stringsymbol){

this.symbol=symbol;

}

publicStringgetSymbol(){

returnsymbol;

}

//Innerclassprovidesthecallback

classMyParserCallbackextendsParserCallback{

privatebooleanlastTradeFlag=false;

privatebooleanboldFlag=false;

publicMyParserCallback(){

if(stockVal!=0)

stockVal=0f;

Page 1065: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

}

publicvoidhandleStartTag(javax.swing.text.html.HTML.Tagt,

MutableAttributeSeta,intpos){

if(lastTradeFlag&&(t==javax.swing.text.html.HTML.Tag.B)){

boldFlag=true;

}

}//handleStartTag

publicvoidhandleText(char[]data,intpos){

htmlText=newString(data);

if(htmlText.indexOf("Nosuchtickersymbol.")!=-1){

thrownewIllegalStateException(

"InvalidtickersymbolinhandleText()method.");

}elseif(htmlText.equals("LastTrade:")){

lastTradeFlag=true;

}elseif(boldFlag){

try{

stockVal=newFloat(htmlText).floatValue();

}catch(NumberFormatExceptionne){

try{

//teaseoutanycommasinthenumberusingNumberFormat

java.text.NumberFormatnf=java.text.NumberFormat.

getInstance();

Doublef=(Double)nf.parse(htmlText);

stockVal=(float)f.doubleValue();

}catch(java.text.ParseExceptionpe){

thrownewIllegalStateException(

"Theextractedtext"+htmlText+

"cannotbeparsedasanumber!");

}//innertry

}//outertry

lastTradeFlag=false;

boldFlag=false;

Page 1066: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

}//if

}//handleText

}//MyParserCallback

publicfloatgetLatestPrice()throwsIOException,MalformedURLException{

stockSite=newURL(urlBase+symbol);

webPageStream=newBufferedReader(newInputStreamReader(stockSite.

openStream()));

htmlParser=newParserDelegator();

callback=newMyParserCallback();//ParserCallback

synchronized(htmlParser){

htmlParser.parse(webPageStream,callback,true);

}//sychronized

//resetsymbol

setSymbol("");

returnstockVal;

}//getLatestPrice

}//StockPriceBean

TheParserDelegator.parse()methodissynchronizedandthereforedesignedtoonlyallowonethreadatatimetoparsethewebpageandpulloutthestockquote.

Figure25-1showsthewebpageformgeneratedbytheservlet'sdoGet()method.Theuserentersastocksymbolintothisform,thensubmitstheformtotheservlet'sdoPost()method.

Figure25-1.Enterastocksymbolforalivestockprice

Page 1067: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Figure25-2showsthestockinformationthattheJNDIobjectfoundfortheservlet.

Figure25-2.Theservlet'sdoPost()methodgeneratesalivestockquoteusingaJNDIobject

SeeAlso

Recipe25.1onconfiguringaJNDIobjectwithTomcat;Recipe25.3onaccessingtheTomcatJNDIobjectfromaJSP;Chapter21onaccessingDataSourceswithJNDI;Chapter26onharvestingwebinformation.

Page 1068: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe25.3AccessingtheTomcatJNDIResourcefromaJSP

Problem

YouwanttoaccessaJNDIresourcefromaJSP.

Solution

Useafiltertoplacetheobjectinrequestorsessionscope.AccesstheobjectintheJSPwiththec:setandc:outJSTLtags.

Discussion

AnicejobforafilterisaccessingaJNDIobject,thenplacingareferencetothatobjectinasessionforaJSPtouse.SeeChapter19formoreinformationonfilters.

HerearethestepsneededtouseafilterwithJNDIandaJSP:

1. Developandcompilethefilter,includingano-argumentsconstructor.

UsetheJNDIAPIandjavax.namingpackageinthefiltertosetasessionattributeusingtheJNDIobject.

PlacethefilterinWEB-INF/classesorinaJARinWEB-INF/lib.

Addfilterandfilter-mappingelementstoweb.xml;mapthefiltertotheJSPthatwillusetheJNDIobject(Example25-7).

Page 1069: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

CreateaJSPthatusesthesessionattribute.

Example25-6showsthefilter.Thefilterinitializesajavax.naming.Contexttypeinitsinit()method(whentheservletcontainercreatesthefilterinstance).ThedoFilter()methodgrabsaJNDIobjectandstorestheobjectasasessionattribute.ThefilterchainendsattheJSPtowhichthefilterismapped;therefore,theJSPhasaccesstothesessionattribute(i.e.,theJNDIobject).

Example25-6.AFilteraccessesaJNDIobjectandsetstheobjectasasessionattribute

packagecom.jspservletcookbook;

importjava.io.IOException;

importjavax.naming.Context;

importjavax.naming.InitialContext;

importjavax.naming.NamingException;

importjavax.servlet.*;

importjavax.servlet.http.*;

publicclassJndiTFilterimplementsFilter{

privateFilterConfigconfig;

privateContextenv;

//No-argumentsconstructorrequiredforafilter;we'vemadeit

//explicithere,eventhoughthecompilerwouldhavecreatedone

//intheabsenceofthisoranyotherconstructor

publicJndiTFilter(){}

publicvoidinit(FilterConfigfilterConfig)throwsServletException{

Page 1070: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

this.config=filterConfig;

try{

env=(Context)newInitialContext().lookup("java:comp/env");

env.close();

}catch(NamingExceptionne){

try{env.close();}catch(NamingExceptionnex){}

thrownewServletException(ne);

}

}

publicvoiddoFilter(ServletRequestrequest,

ServletResponseresponse,FilterChainchain)throwsIOException,

ServletException{

StockPriceBeanspbean=null;

try{

spbean=(StockPriceBean)env.lookup("bean/pricebean");

}catch(NamingExceptionne){}

HttpServletRequesthRequest=null;

if(requestinstanceofHttpServletRequest)

hRequest=(HttpServletRequest)request;

HttpSessionhSession=hRequest.getSession();

if(hSession!=null)

hSession.setAttribute("MyBean",spbean);

chain.doFilter(request,response);

}//doFilter

publicvoiddestroy(){

/*calledbeforetheFilterinstanceisremoved

fromservicebythewebcontainer*/

}

}//Filter

Page 1071: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Thefilter'sdoFilter()methodiscalledeachtimeaclientrequeststheJSP,soeachclientisassociatedwithadifferentbeaninstance.Inotherwords,eachsessionstoresitsownbeaninstance.

TheJSPcouldthenremovethesessionattribute(ifitwasnotgoingtobeusedagain)toconserveserverresources.SeeChapter16forrecipesonsettingandremovingsessionattributes.

Example25-7showsthefilterandfilter-mappingelementsthatyoucanaddtothedeploymentdescriptor.Thiscausestheservletcontainertocreateaninstanceofthefilter(callingthefilter'sinit()method).Thenthecontainercallsthefilter'sdoFilter()methodwheneveritreceivesarequestmatchingtheURL(s)associatedwiththefilter-mappingelement.

Example25-7.ThefilterandelementsforaJNDI-relatedfilter

<!--startofweb.xml-->

<filter>

<filter-name>JndiTFilter</filter-name>

<filter-class>com.jspservletcookbook.JndiTFilter</filter-class>

</filter>

<filter-mapping>

<filter-name>JndiTFilter</filter-name>

<url-pattern>/jndiJsp.jsp</url-pattern>

Page 1072: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

</filter-mapping>

<!--restofweb.xml-->

Example25-7mapstheJndiTFiltertothewebcomponentattheURL/jndiJsp.jsp.Example25-8showstheJSPthatusesthesessionattribute,called"MyBean"todisplayastockquote.

Example25-8.AJSPusesasessionattributeoriginatingasaJNDIobject

<%@tagliburi="http://java.sun.com/jstl/core"prefix="c"%>

<html>

<head><title>JndiBean</title></head>

<body>

<h2>GettingaStockPriceBeanobjectviaJNDI...</h2>

<c:setvar="priceBean"value="${MyBean}"/>

<%--setthe'symbol'propertytothestocksymbol--%>

<c:settarget="${priceBean}"property="symbol"value="${param.symbol}"/>

<%--getthelatestpricebycallinggetLatestPrice()onthebeanobject--%>

Thelatestprice:<c:outvalue="${priceBean.latestPrice}"/>

</body>

</html>

Figure25-3showsthisJSP'soutput.Example25-5inRecipe25.2showsthecodefortheJavaBeanthatthisJSPuses.

Figure25-3.AJSPusesasessionattributeviaJNDItodisplayastockprice

Page 1073: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

SeeAlso

Recipe25.1onconfiguringaJNDIobjectwithTomcat;Recipe25.2onaccessingtheTomcatJNDIobjectfromaservlet;Chapter21onaccessingDataSourceswithJNDI.

Page 1074: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe25.4ConfiguringaJNDIResourceinWebLogic

Problem

YouwanttobindanobjecttoBEAWebLogic'sJNDIimplementation.

Solution

UsetheWebLogicAdministrationconsole.

Discussion

Herearethestepsneededtobindajavax.mail.Sessionobject(whichIuseasanexampleforthisrecipe)toWebLogic'sJNDIimplementation.TheadvantageofthisapproachisthattheavailableSessionisalreadyconfiguredwithelementssuchasitsSMTPhost(seeTable25-1).TheSessionis"readytogo"forthecodethatwilleventuallylookupandusetheobject.

1. LogintotheWebLogicAdministrationconsole,whichinvolvesusingabrowserURLsuchashttp://localhost:7001/console.

GotoYour-domain-name Services Mailinthelefthandcolumnmenu.

Clickon"ConfigureanewMailSession..."ThisproducesthewindowshowninFigure25-4.

Page 1075: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Figure25-4.Configuringajavax.mail.SessiontypeasaJNDIobjectusingtheWebLogicAdministrationconsole

4. Fillinthetextfieldsintheresultingwindow.GivetheSessionobjectaJNDIname(under"JndiName"),whichisthenamethatthecodeusestolookuptheobject.

EnteranypropertiesfortheSessionbytypinginthepropertyname,anequalssign(=),andthepropertyvalue.SeeTable25-1.

Clickthe"Apply"button,thenchoosethe"Targets"tab.TheresultingscreenallowsyoutoassociatetheJNDIobjectwithoneormoreservers.

NowtheJNDIobjectisavailabletoJavaprogramsusingtheJNDIAPIandthenameyouboundtheobjectunder.Recipe25.5showshowtoviewtheJNDItreegraphicallytoverifythattheobjecthasbeenboundproperly.

Table25-1.JavaMailpropertiessetforthisrecipe'sSessionJNDIobject

Propertyname Description Example

mail.host Thedefaultmailserver mail.comcast.net

Page 1076: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

mail.smtp.host Protocol-specificmailhost;defaultstomail.hostvalue mail.comcast.net

mail.user Theusernameforconnectingtothemailserver bruceperry

mail.from Thereturnaddresstousewhensendingmail. [email protected]

SeeAlso

Recipe25.6onaccessingaJNDIobjectwithaservletonWebLogic;Recipe25.7onaccessingaJNDIobjectwithaJSPonWebLogic;Chapter2ononaccessingaJNDIobjectwithaJSPonWebLogic;Chapter2ondeployingwebcomponentswithWebLogic.

Page 1077: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe25.5ViewingtheJNDITreeinWebLogic

Problem

YouwanttoviewtheWebLogicJNDItreeingraphicalform.

Solution

RightclickontheservernameintheWebLogicAdministrationconsoleandchoose"ViewJNDITree."

Discussion

AfteryouhaveboundanobjecttoJNDIusingtheAdministrationconsole,youcanthenviewtheJNDItreetoseeifWebLogichasboundyourobjectasintended.Right-clickon"My-domain-name ServersServer-name"inthelefthandmenuandchoose"ViewJNDITree."ThisgeneratesanewbrowserwindowthatlooksliketheoneinFigure25-5.

Thenewobject("MyEmail")isrepresentedatthetopofthetreeasapurpledot.ThisisanicegraphicalwayofviewingthehierarchicalstructureoftheJNDItree,includingitssubdirectoriesandvariousobjects,thatareavailabletoaWebLogicserver.

Figure25-5showsthe"MyEmail"boundobjectselectedintheJNDItree.Informationabouttheobjectisdisplayedintherighthandframeofthebrowserwindow.

Figure25-5.AgraphicaldisplayoftheWebLogicJNDItree

Page 1078: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

SeeAlso

Recipe25.4onconfiguringaJNDIobjectonWebLogic;Recipe25.6onaccessingaJNDIobjectwithaservletonWebLogic;Recipe25.7onaccessingaJNDIobjectwithaJSPonWebLogic;Chapter2ondeployingwebcomponentswithWebLogic.

Page 1079: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe25.6AccessingtheWebLogicJNDIResourcefromaServlet

Problem

YouwanttoaccesstheJNDIobjectcreatedandboundonWebLogic.

Solution

UsetheJNDIAPIintheservlettoaccessareferencetotheboundobject.

Discussion

Example25-9isanHttpServletthatobtainsajavax.mail.SessionobjectfromWebLogic'sJNDIimplementation.Theservletusesthisobjecttobuildanemailmessage.TheservletinitiatestheJNDIlookupinitsinit()methodforanobjectboundunderthename"MyEmail"(Recipe25.4).Theservletcontainercallstheinit()oncewhenthecontainercreatestheservletinstance.

Example25-9.Servlettoobtainajavax.mail.SessionobjectfromWebLogic'sJNDIimplementationandbuildanemailmessage

packagecom.jspservletcookbook;

importjava.io.IOException;

importjava.io.PrintWriter;

Page 1080: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

importjavax.naming.Context;

importjavax.naming.InitialContext;

importjavax.naming.NamingException;

importjavax.mail.*;

importjavax.mail.internet.*;

importjavax.servlet.*;

importjavax.servlet.http.*;

publicclassEmailJndiServletextendsHttpServlet{

privateSessionmailSession;

publicvoidinit()throwsServletException{

Contextenv=null;

try{

env=(Context)newInitialContext();

mailSession=(Session)env.lookup("MyEmail");

if(mailSession==null)

thrownewServletException(

"MyEmailisanunknownJNDIobject");

//closetheInitialContext

env.close();

}catch(NamingExceptionne){

try{env.close();}catch(NamingExceptionnex){}

thrownewServletException(ne);

}

}//init

publicvoiddoPost(HttpServletRequestrequest,

HttpServletResponseresponse)throwsServletException,

java.io.IOException{

Page 1081: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

response.setContentType("text/html");

java.io.PrintWriterout=response.getWriter();

out.println(

"<html><head><title>Emailmessagesender</title></head><body>");

Stringto=request.getParameter("to");

Stringfrom=request.getParameter("from");

Stringsubject=request.getParameter("subject");

StringemailContent=request.getParameter("emailContent");

try{

sendMessage(to,from,subject,emailContent);

}catch(Exceptionexc){

thrownewServletException(exc.getMessage());

}

out.println(

"<h2>Themessagewassentsuccessfully</h2></body></html>");

out.println("</body></html>");

}//doPost

publicvoiddoGet(HttpServletRequestrequest,

HttpServletResponseresponse)throwsServletException,

java.io.IOException{

//doGet()callsdoPost()

doPost(request,response);

}

privatevoidsendMessage(Stringto,Stringfrom,Stringsubject,

StringbodyContent)throwsException{

Page 1082: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

MessagemailMsg=null;

mailMsg=newMimeMessage(mailSession);//anewemailmessage

InternetAddress[]addresses=null;

try{

if(to!=null){

//throws'AddressException'ifthe'to'emailaddress

//violatesRFC822syntax

addresses=InternetAddress.parse(to,false);

mailMsg.setRecipients(Message.RecipientType.TO,addresses);

}else{

thrownewMessagingException(

"Themailmessagerequiresa'To'address.");

}

if(from!=null)

mailMsg.setFrom(from);

if(subject!=null)

mailMsg.setSubject(subject);

if(bodyContent!=null)

mailMsg.setText(bodyContent);

//Finally,sendthemailmessage;throwsa'SendFailedException'

//ifanyofthemessage'srecipientshaveaninvalidadress

Transport.send(mailMsg);

}catch(Exceptionexc){

throwexc;

}//sendMessage

}//EmailJndiServlet

Page 1083: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

ThedoPost()methodcallstheservlet'ssendMessage()method,passingintheemailmessagepartssuchastherecipientandtheemail'scontent.Theservletderivesthisinformationfromrequestparametersthattheusersubmits.Atypicalrequestfortheservletlookslike:

http://localhost:7001/[email protected]&

[email protected]&subject=hello&

emailContent=Awebmessage

AusercanalsoPOSTinformationtotheservletwithanHTMLform.

Theservlet'ssendMessage()methodusestheJNDIobjectinthejavax.mail.internet.MimeMessageconstructorwhenthemethodcreatesanewemailmessage.

Figure25-6showstheservlet'ssimplereturnmessageinabrowserwindow.

Figure25-6.Theservletsendstheemailsuccessfully

SeeAlso

Recipe25.4onconfiguringaJNDIobjectonWebLogic;Recipe25.5onviewingtheWebLogicJNDItreewiththeAdministrationconsole;Recipe25.7onaccessingaJNDIobjectwithaJSPonWebLogic;Chapter2ondeployingwebcomponentswithWebLogic.

Page 1084: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe25.7AccessingtheWebLogicJNDIResourcefromaJSP

Problem

YouwanttouseaWebLogicJNDIobjectinaJSP.

Solution

CreateafilterthataccessestheJNDIobjectandsetstheobjectasasessionattribute.

Discussion

Anysenseofdejávucomesfromafewrecipesago,whenyouusedafiltertopassaJNDIobjecttoaJSPonTomcat.TheonlydifferenceinthisrecipeisthattheapplicationserverusedisWebLogicandtheJNDIobjectisaJavaMailSession,notaJavaBean.

ThefilteraccessestheobjectusingtheJNDIAPIonWebLogic.Thenthefiltersetstheobjectasasessionattribute,sothattheJSPcanaccessthejavax.mail.Session.Example25-10showsthecodeforthefilterthatrecipeusesontheWebLogicserver.

Example25-10.AfilterstoresaWebLogicJNDIobjectinasessionattribute

packagecom.jspservletcookbook;

Page 1085: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

importjava.io.IOException;

importjavax.naming.Context;

importjavax.naming.InitialContext;

importjavax.naming.NamingException;

importjavax.servlet.*;

importjavax.servlet.http.*;

publicclassJndiFilterimplementsFilter{

privateFilterConfigconfig;

privateContextenv;

publicJndiFilter(){}

publicvoidinit(FilterConfigfilterConfig)throwsServletException{

this.config=filterConfig;

try{

env=(Context)newInitialContext();

}catch(NamingExceptionne){

thrownewServletException(ne);

}

}//init

publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,

FilterChainchain)throwsIOException,ServletException{

javax.mail.SessionmailSession=null;

try{

mailSession=(javax.mail.Session)env.lookup("MyEmail");

}catch(NamingExceptionne){}

HttpServletRequesthRequest=null;

if(requestinstanceofHttpServletRequest){

hRequest=(HttpServletRequest)request;

HttpSessionhSession=hRequest.getSession();

Page 1086: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

if(hSession!=null)

hSession.setAttribute("MyEmail",mailSession);

}//if

chain.doFilter(request,response);

}//doFilter

publicvoiddestroy(){

/*calledbeforetheFilterinstanceisremoved

fromservicebythewebcontainer*/

}

}

Example25-11showsthefilterconfigurationinsidethedeploymentdescriptor.ThisdeploymentdescriptormustaccompanyawebapplicationthatyouoranotherdeployerhasinstalledonWebLogicserver.

Example25-11.AfilterthataccessesaJNDIobjectonWeblogic

<!--startofweb.xml-->

<filter>

<filter-name>JndiFilter</filter-name>

<filter-class>com.jspservletcookbook.JndiFilter</filter-class>

</filter>

<filter-mapping>

<filter-name>JndiFilter</filter-name>

<url-pattern>/jndiJsp.jsp</url-pattern>

Page 1087: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

</filter-mapping>

<!--restofweb.xml-->

Example25-12showsaJSPthataccessestheJNDIobject.Thiscodedisplaystheclassnameoftheobject,ajavax.mail.SessiontypethatRecipe25.4boundasaJNDIobjectonWebLogic.ThefilterinExample25-11thensettheobjectasasessionattribute(nottobeconfusedwiththeSessiontypeoftheobject).Thisattributeisavailabletoallwebcomponentsthatparticipateinthesamesession.Therefore,thec:settaginthisJSPusesthefollowingELcodetogetaccesstotheattribute.

${MyEmail}

Thenthec:outtagdisplaystheclassnameofthesessionattribute,inordertoverifythattheobjectisajavax.mail.Session.Recipe25.6givesthecompleteJavaMailcodeforsendinganemail.

Example25-12.TheJSPaccessestheJavaMailobjectasasessionattribute

<%@tagliburi="http://java.sun.com/jstl/core"prefix="c"%>

<html>

<head><title>JndiEmail</title></head>

<body>

<h2>Gettingajavax.mail.SessionobjectviaJNDI...</h2>

<c:setvar="mSession"value="${MyEmail}"/>

<c:outvalue="${mSession.class.name}"/>

</body>

</html>

Page 1088: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Figure25-7showsawebbrowserwindowafterauserhasrequestedtheJSP.

Figure25-7.AJSPaccessesaJNDIobjectviaaservletfilter

SeeAlso

Chapter19onfilters;Chapter23ontheJSTL;Recipe25.4onconfiguringaJNDIobjectwithWebLogic;Recipe25.6onaccessingaJNDIobjectwithaservletonWebLogic;Chapter2ondeployingwebcomponentswithWebLogic.

Page 1089: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe25.8AccessinganEJBUsingtheWebLogicJNDITree

Problem

YouwanttoaccessanEnterpriseJavaBean(EJB)fromaservletonWebLogic.

Solution

FindouttheEJB'sJNDInameandusethejavax.namingpackagetogetareferencetotheEJBObjectorremoteinterfacesothatyoucancalltheEJB'smethods.

Discussion

AservletaccessesanEJBbyusingaspecifiedJNDIname.Theprocessisthereforetransparenttotheservletdeveloper.AnyEJBsanapplicationusescomprisethebusinesstierofanapplication.TheservletsandJSPsrepresentthewebtierwithinthemulti-tiereddistributedarchitectureofatypicalJava2EnterpriseEdition(J2EE)application.AllyouneedtoknowistheJNDInameassociatedwiththeEJBinordertousetheEJBinyourprograms.

EnterpriseJavaBeansisacomprehensivetopic;however,thisrecipeisdevotedtoshowinghowaservletcanconnecttoanEJB.The"SeeAlso"segmentofthisrecipeincludesseverallinkstoEJBandJ2EEinformationandbooks.

Page 1090: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

YoushouldbeawareoftheEJB'sbusinessmethods,butdonothavetobeanexpertonthejavax.ejbpackagetousetheEJB.Example25-13showsthesourcecodeforastatelesssessionEJBthatismanagedbyBEAWebLogic7.0applicationserver.

AcertaintypeofEJB,astatelesssessionbeanencapsulatesbusinesslogicthatdoesnotrequirepersistenceorthesavingoftheobject'sstatebetweenmethodcalls.Ontheotherhand,astatefulsessionbean(suchasashoppingcartobject),mustremembertheobject'sstate(suchasthevalueofvariousinstancevariables)betweenmethodcalls,aspartofaconversationwiththeEJBclient.

Example25-13providesajava.util.MapthatlinksU.S.statenameswiththeirpostalabbreviations.Thesessionbeanincludesonebusinessmethod,getAbbreviation(),whichreceivesastatenameasaparameterandreturnsitspostalabbreviation.

Example25-13.ThestatelesssessionEJB

packagecom.jspservletcookbook;

importjavax.ejb.*;

importjava.util.Map;

importjava.util.HashMap;

publicclassAbbrevBeanimplementsSessionBean{

privateSessionContextcontext;

privateMapabbrevMap;

publicAbbrevBean(){//thebean'sno-argumentsconstructor

Page 1091: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

//AMapcontainingthenamesofstatesandabbreviations

abbrevMap=newHashMap();

abbrevMap.put("ALABAMA","AL");

abbrevMap.put("ALASKA","AK");

abbrevMap.put("AMERICANSAMOA","AS");

abbrevMap.put("ARIZONA","AZ");

abbrevMap.put("ARKANSAS","AR");

abbrevMap.put("CALIFORNIA","CA");

abbrevMap.put("COLORADO","CO");

abbrevMap.put("CONNECTICUTT","CT");

abbrevMap.put("DELAWARE","DE");

abbrevMap.put("DISTRICTOFCOLUMBIA","DC");

abbrevMap.put("FEDERATEDSTATESOFMICRONESIA","FM");

abbrevMap.put("FLORIDA","FL");

abbrevMap.put("GEORGIA","GA");

abbrevMap.put("GUAM","GU");

abbrevMap.put("HAWAII","HI");

abbrevMap.put("IDAHO","ID");

abbrevMap.put("ILLINOIS","IL");

abbrevMap.put("INDIANA","IN");

abbrevMap.put("IOWA","IA");

abbrevMap.put("KANSAS","KS");

abbrevMap.put("KENTUCKY","KY");

abbrevMap.put("LOUISIANA","LA");

abbrevMap.put("MAINE","ME");

abbrevMap.put("MARSHALLISLANDS","MH");

abbrevMap.put("MARYLAND","MD");

abbrevMap.put("MASSACHUSETTS","MA");

abbrevMap.put("MICHIGAN","MI");

abbrevMap.put("MINNESOTA","MN");

abbrevMap.put("MISSISSIPPI","MS");

abbrevMap.put("MISSOURI","MO");

Page 1092: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

abbrevMap.put("MONTANA","MT");

abbrevMap.put("NEBRASKA","NE");

abbrevMap.put("NEVADA","NV");

abbrevMap.put("NEWHAMPSHIRE","NH");

abbrevMap.put("NEWJERSEY","NJ");

abbrevMap.put("NEWMEXICO","NM");

abbrevMap.put("NEWYORK","NY");

abbrevMap.put("NORTHCAROLINA","NC");

abbrevMap.put("NORTHDAKOTA","ND");

abbrevMap.put("NORTHERNMARIANAISLANDS","MP");

abbrevMap.put("OKLAHOMA","OK");

abbrevMap.put("OREGON","OR");

abbrevMap.put("PALAU","PW");

abbrevMap.put("PENNSYLVANIA","PA");

abbrevMap.put("PUERTORICO","PR");

abbrevMap.put("RHODEISLAND","RI");

abbrevMap.put("SOUTHCAROLINA","SC");

abbrevMap.put("SOUTHDAKOTA","SD");

abbrevMap.put("TENNESSEE","TN");

abbrevMap.put("TEXAS","TX");

abbrevMap.put("UTAH","UT");

abbrevMap.put("VERMONT","VT");

abbrevMap.put("VIRGINISLANDS","VI");

abbrevMap.put("VIRGINIA","VA");

abbrevMap.put("WASHINGTON","WA");

abbrevMap.put("WESTVIRGINIA","WV");

abbrevMap.put("WISCONSIN","WI");

abbrevMap.put("WYOMING","WY");

}//constructor

publicvoidsetSessionContext(SessionContextctx)throws

EJBException{

context=ctx;

Page 1093: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

}//setSessionContext

publicMapgetAbbrevMap(){

returnabbrevMap;

}

//Thebean'sbusinessmethod

publicStringgetAbbreviation(Stringstate){

return(String)abbrevMap.get(state);

}

//javax.ejb.SessionBeanmethod;ithastobeimplementedinasession

//bean,butisnotrelevanttoStatelesssessionbeans.

publicvoidejbActivate(){}

//javax.ejb.SessionBeanmethod;ithastobeimplementedinaSession

//bean,butisnotrelevanttostatelesssessionbeans.

publicvoidejbPassivate(){}

//javax.ejb.SessionBeanmethod;

publicvoidejbRemove(){}

}

Example25-13couldeasilybeimplementedasanordinaryJavahelperorutilityclass.However,IshowasimpleexampleofanEJBsothattherecipecanfocusonhowaservletconnectstotheseobjects.

EJBshaveadeploymentdescriptor,similartotheweb.xmlfilethatwebapplicationsuse.TheEJBdeploymentdescriptormustbenamedejb-jar.xml.WhenyoupackagetheEJB(s)beforetheyaredeployedonanapplicationserver,includethisdeploymentdescriptoraspartofthearchive.Theejb-jar.xmlfiledescribestherelatedEJBcomponent(s);theapplicationserverusesthisdescriptiveinformationinordertoproperlydeploytheEJB.

Forexample,theejb-jar.xmlfileinExample25-14specifiesthetypeof

Page 1094: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

EJB(e.g.,statelesssessionbean)andthefullyqualifiedclassnamesofitsrelatedJavaclasses,suchasitsremoteinterface.

Example25-14.Theejb-jar.xmlfile

<?xmlversion="1.0"?>

<!DOCTYPEejb-jarPUBLIC"-//SunMicrosystems,Inc.

//DTDEnterpriseJavaBeans2.0//EN"

"http://java.sun.com/dtd/ejb-jar_2_0.dtd"

>

<ejb-jar>

<enterprise-beans>

<session>

<ejb-name>AbbreviationEjb</ejb-name>

<home>com.jspservletcookbook.AbbrevHome</home>

<remote>com.jspservletcookbook.Abbrev</remote>

<local-home>com.jspservletcookbook.AbbrevLocalHome</local-home>

<local>com.jspservletcookbook.AbbrevLocal</local>

<ejb-class>com.jspservletcookbook.AbbrevBean</ejb-class>

<session-type>Stateless</session-type>

<transaction-type>Container</transaction-type>

</session>

</enterprise-beans>

</ejb-jar>

ThepackagethatcontainsthisEJB,andwithwhichtheEJBisdeployedontheapplicationserver,isaJARfilenamedmyejb.jar(justanameIconcocted;youdonothavetousethesamename).

SincethisstatelesssessionbeanisdeployedonBEAWebLogicServer,theJARfilemustincludeavendor-specificdeploymentdescriptornamedweblogic-ejb-jar.xml.ThisdeploymentdescriptorgivesthedeployertheopportunitytoconfigureseveralaspectsofhowtheEJBisdeployedonWebLogic,suchastheJNDInamesofitshomeandlocalhome

Page 1095: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

interfaces.

The"home"objectisanimplementationofthe"home"interface,andthe"localhome"objectisanimplmentationofthelocalhomeinterface.Theseobjectsare"factories"forEJBobjects,whichdelegatethebusiness-methodcallstotheEJBdeployedintheserver.AfactoryisaJavaclassthatgeneratesobjectsofadifferentkindofJavaclass.Inthisrecipe'scase,theclientusesJNDItogetareferencetothehomeobject,whichcreatesanEJBobject.Theservlet(client)thencallstheEJBobject'sgetAbbreviation()method;theEJBobjectisaremoteobjector"stub"thatdelegatesthismethodcalltotheoriginalEJBstoredontheserver.

Youwillencounterthehomeobject'sJNDInameintheservletdepictedlateroninthisrecipe.

WhenyoudeployanEJBonWebLogicusingtheAdministrationConsole,WebLogicautomaticallybindsthehomeandlocalhomeobjectswithintheWebLogicJNDItree,usingthenamesspecifiedbytheweblogic-ejb-jar.xmldeploymentdescriptor.

Example25-15showstheweblogic-ejb-jar.xmldeploymentdescriptorforourstatelesssessionbean.

Example25-15.Theweblogic-ejb-jar.xmlfile

<!DOCTYPEweblogic-ejb-jarPUBLIC

'-//BEASystems,Inc.//DTDWebLogic7.0.0EJB//EN'

'http://www.bea.com/servers/wls700/dtd/weblogic-ejb-jar.dtd'>

<weblogic-ejb-jar>

<weblogic-enterprise-bean>

<ejb-name>AbbreviationEjb</ejb-name>

Page 1096: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<stateless-session-descriptor>

<pool>

<initial-beans-in-free-pool>1</initial-beans-in-free-pool>

</pool>

</stateless-session-descriptor>

<jndi-name>AbbrevHome</jndi-name>

<local-jndi-name>AbbrevLocalHome</local-jndi-name>

</weblogic-enterprise-bean>

</weblogic-ejb-jar>

AnEJBmoduleisacomplicatedpackagethatincludesbeanclasses,remoteinterfaces,andtwodifferentdeploymentdescriptors.Example25-16showsthecontentsofthemyejb.jarfile.Iusethejartvfmyejb.jar.commandinacommand-linewindowtodisplaythecontentsofthespecifiedJARfile(itworksinbothUnixandWindows).

Example25-16.Thecontentsoftheejb-jar.xmlfile

H:\book\cookbook\code\chap27\src\ejbs\ejbjar>jartvfmyejb.jar

META-INF/

META-INF/MANIFEST.MF

com/

com/jspservletcookbook/

com/jspservletcookbook/Abbrev.class

com/jspservletcookbook/AbbrevBean.class

com/jspservletcookbook/AbbrevHome.class

com/jspservletcookbook/AbbrevLocal.class

com/jspservletcookbook/AbbrevLocalHome.class

META-INF/ejb-jar.xml

META-INF/weblogic-ejb-jar.xml

InExample25-16,thesessionbeanisAbbrevBean.class,theremoteinterfaceisAbbrev.class,andthehomeobject(thefactoryforEJBobjectsthatimplementtheAbbrevinterface)isAbbrevHome.class.

Page 1097: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Finally,Example25-17showstheservletthatusesthesessionbeanfromExample25-13.Thecodeisself-explanatory.TheimportantthingtorememberisthattheservletreceiveseareferencetotheAbbrevHomeobjectfromtheWebLogicJNDItree.Thentheservlet,initsdoGet()method,callstheAbbrevHomeobject'screate()methodtogetaninstanceofthesessionbean'sremoteinterface(inthisexample,it'sanAbbrevtype).

Example25-17.AservletthataccessestheEJBonWebLogicusingJNDI

packagecom.jspservletcookbook;

importjava.io.IOException;

importjava.io.PrintWriter;

importjavax.naming.Context;

importjavax.naming.InitialContext;

importjavax.naming.NamingException;

importjavax.rmi.PortableRemoteObject;

importjavax.servlet.*;

importjavax.servlet.http.*;

publicclassWebJndiServletextendsHttpServlet{

publicvoiddoGet(HttpServletRequestrequest,

HttpServletResponseresponse)

throwsServletException,java.io.IOException{

//Therequestparameterlookslike'state=Massachusetts'

Stringstate=request.getParameter("state");

Contextenv=null;

Abbrevabbrev=null;

Page 1098: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

AbbrevHomehome=null;

try{

env=(Context)newInitialContext();

//LookupthehomeorfactoryobjectontheWebLogicJNDItree

ObjectlocalH=env.lookup("AbbrevHome");

//ThismethodcallisnecessaryforEJBcodethatusesa

//technologycalledRMI-IIOP

home=(AbbrevHome)PortableRemoteObject.narrow(localH,

AbbrevHome.class);

//closetheInitialContext

env.close();

if(home==null)

thrownewServletException(

"AbbrevHomeisanunknownJNDIobject");

//Gettheremoteinterfacebycallingthehomeobject'screate()

//method

abbrev=(Abbrev)PortableRemoteObject.narrow(home.create(),

Abbrev.class);

}catch(NamingExceptionne){

try{env.close();}catch(NamingExceptionnex){}

thrownewServletException(ne);

}catch(javax.ejb.CreateExceptionce){

thrownewServletException(ce);

}

//settheMIMEtypeoftheresponse,"text/html"

response.setContentType("text/html");

Page 1099: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

java.io.PrintWriterout=response.getWriter();

out.println("<html><head>");

out.println("<title>Stateabbreviations</title></head><body>");

out.println("<h2>Hereisthestate'sabbreviation</h2>");

//CalltheEJBObject'sgetAbbreviation()method;theEJBObject

//delegatesthismethodcalltothesessionbean.Puttherequest

//parameterinallupper-case,becausethisishowthesessionbean's

//java.util.Mapstoresthestatenames,whicharetheMap'skeys

if(state!=null)

out.println(abbrev.getAbbreviation(state.toUpperCase()));

try{

//TheservletisthroughwiththeEJBObject;callitsremove()

//method

abbrev.remove();

}catch(javax.ejb.RemoveExceptionre){}

out.println("</body></html>");

}//doGet

publicvoiddoPost(HttpServletRequestrequest,

HttpServletResponseresponse)

throwsServletException,java.io.IOException{

doGet(request,response);

}//doPost

}//WebJndiServlet

Thevalueoftheabbreviationforastatesuchas"Oregon"isultimatelyretrievedontheserversidebycallingthesessionbean's

Page 1100: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

getAbbreviation()method.Figure25-8showsawebbrowserwindowafterauserhasrequestedtheservlet.TheURLlookssomethinglikehttp://localhost:7001/webjndi?state=Oregon.TheURLpattern/webjndiismappedinweb.xmltotheservletofExample25-17.

Figure25-8.AnEJB-accessingservlet'swebbrowserdisplay

SeeAlso

Recipe25.4onconfiguringaJNDIobjectwithWebLogic;Recipe25.6onaccessingaJNDIobjectwithaservletonWebLogic;Chapter2ondeployingwebcomponentswithWebLogic;aweblinkforthejavax.ejbAPI:http://java.sun.com/j2ee/1.4/docs/api/javax/ejb/package-summary.html;thedocumentationpageforWebLogicServer7.0:http://edocs.bea.com/wls/docs70/index.html;alinktoJ2EEtutorials,includinganEnterpriseJavaBeantutorial:http://java.sun.com/j2ee/tutorial/index.html;EnterpriseJavaBeans,ThirdEdition(O'Reilly);J2EEDesignPatterns(O'Reilly).

Page 1101: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Chapter26.HarvestingWebInformationIntroduction

Recipe26.1.ParsinganHTMLPageUsingthejavax.swing.textSubpackages

Recipe26.2.UsingaServlettoHarvestWebData

Recipe26.3.CreatingaJavaBeanasaWebPageParser

Recipe26.4.UsingtheWebPageParsingJavaBeaninaServlet

Recipe26.5.UsingtheWebPageParsingJavaBeaninaJSP

Page 1102: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Introduction

TheWebcontainsinformationgalore.Muchofthisinformationisfreelyavailablebysimplysurfingovertoanorganization'swebsiteandreadingtheirpagesorsearchresults.However,itcanbedifficultseparatingthedrossfromthegems.Thevastmajorityofawebpage'svisualcomponentsaretypicallydedicatedtomenus,logos,advertisingbanners,andfancyappletsorFlashmovies.WhatifallyouareinterestedinisatinynuggetofdataawashinanoceanofHTML?

TheanswerliesinusingJavatoparseawebpagetoextractonlycertainpiecesofinformationfromit.Thewebtermsforthistaskareharvestingorscrapinginformationfromawebpage.Perhapswebservices(Chapter27)willeventuallyreplacetheneedtoharvestwebdata.ButuntilmostmajorsiteshavetheirwebservicesAPIsupandrunning,youcanuseJavaandcertainjavax.swing.textsubpackagestopullspecifiedtextfromwebpages.

Howdoesitwork?Basically,yourJavaprogramusesHTTPtoconnectwithawebpageandpullinitsHTMLtext.

ParsingtheHTMLfromwebsitesstillinvolvestransferringtheentirewebpageoverthenetwork,evenifyouareonlyinterestedinafractionofitsinformation.Thisiswhyusingwebservicesisamuchmoreefficientmannerofsharingspecificdatafromawebsite.

ThenuseJavacodetoparsetheHTMLpageinordertopullfromitonlythepieceofdatayouareinterestedin,suchasweatherdataorastockquote.ThefollowingrecipesshowtheJavaclassesthatyoucanusetoharvestwebinformation.ThentherecipesshowaservletandaJSPusingaJavaBeantograbanddisplay,asanexample,alivestockquote.

Page 1103: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe26.1ParsinganHTMLPageUsingthejavax.swing.textSubpackages

Problem

YouwanttousetheclassestheJava2StandardEdition(J2SE)makesavailableforparsingHTML.

Solution

Usethevarioussubpackagesofthejavax.swing.textpackagetocreateaparserforHTML.

Discussion

TheJ2SE1.3and1.4versionsincludethenecessaryclassesforsiftingthroughwebpagesinsearchofinformation.TheJavaprogramstheserecipesuseimportthefollowingclasses:

javax.swing.text.html.

HTMLEditorKit.ParserCallback;

javax.swing.text.MutableAttributeSet;

javax.swing.text.html.parser.ParserDelegator;

Thedesignpatternthattheseclassesusetoreadwebpagesinvolvesthreemainelements:

1. Ajava.net.URLobjectthatopensupasocketorInputStreamtothewebpageusingHTTP.Thecodethenusesthisobjecttoreadthewebpage.

Page 1104: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

AParserDelegatorobjectwithwhichthecodesiftsthroughthewebpagebycallingthisobject'sparse()method.

AParserCallbackobjectthattheParserDelegatorusestotakecertainactionswhileitisparsingthewebpage'sHTMLtext.AcallbackingeneralisanobjectthatJavacodetypicallypassesintoanotherobject'sconstructor.Theenclosingobjectthendrivesthecallbackbyinvokingthecallback'smethods,whichtheJavaprogrammerimplementsaccordingtowhattheywanttoaccomplishbyparsingtheHTML.Theroleofthecallbackwillbecomeclearerasyoureadthroughtheserecipes.

TheservletandJavaBeandefinedinthischapteruseaninnerclasstoimplementthecallback.Example26-1showsthecallbackthatextendsjavax.swing.text.html.HTMLEditorKit.ParserCallback.

Example26-1.Acallbackclassforsiftingthroughwebpages

classMyParserCallbackextendsParserCallback{

//breadcrumbsthatleadustothestockprice

privatebooleanlastTradeFlag=false;

privatebooleanboldFlag=false;

publicMyParserCallback(){

//Resettheenclosingclass'stock-priceinstancevariable

if(stockVal!=0)

stockVal=0f;

}

//Amethodthattheparsercallseachtimeitconfrontsastarttag

publicvoidhandleStartTag(javax.swing.text.html.HTML.Tagt,

MutableAttributeSeta,intpos){

if(lastTradeFlag&&(t==javax.swing.text.html.HTML.Tag.B)){

boldFlag=true;

Page 1105: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

}

}//handleStartTag

//Amethodthattheparsercallseachtimeitreachesnestedtextcontent

publicvoidhandleText(char[]data,intpos){

htmlText=newString(data);

if(htmlText.indexOf("Nosuchtickersymbol.")!=-1){

thrownewIllegalStateException(

"InvalidtickersymbolinhandleText()method.");

}elseif(htmlText.equals("LastTrade:")){

lastTradeFlag=true;

}elseif(boldFlag){

try{

stockVal=newFloat(htmlText).floatValue();

}catch(NumberFormatExceptionne){

try{

//teaseoutanycommasinthenumberusingNumberFormat

java.text.NumberFormatnf=java.text.NumberFormat.

getInstance();

Doublef=(Double)nf.parse(htmlText);

stockVal=(float)f.doubleValue();

}catch(java.text.ParseExceptionpe){

thrownewIllegalStateException(

"Theextractedtext"+htmlText+

"cannotbeparsedasanumber!");

}//try

}//try

//Resettheinnerclass'sinstancevariables

lastTradeFlag=false;

boldFlag=false;

}//if

Page 1106: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

}//handleText

}//MyParserCallback

Acallbackincludesmethodsthatrepresenttheattainmentofacertainelementofawebpageduringtheparsingprocess.Forexample,theparser(theobjectthatenclosesthecallbackobject)callshandleStartTag()wheneveritrunsintoanopeningtagasittraversesthewebpage.Examplesofopeningtagsare<html>,<title>,or<body>.Therefore,whenyouimplementthehandleStartTag()methodinthecode,youcancontrolwhatyourprogramdoeswhenitfindsanopeningtag,suchas"preparetograbthetextthatappearswithintheopeningandclosingtitletag."

Example26-1usesaparticularalgorithmtosearchawebpageforanupdatedstockquote,andthisiswhatthetwomethods(handleStartTag()andhandleText())accomplishintheMyParserCallbackclass:

1. Itlooksforthetext"LastTrade"inthehandleText()callbackmethod;ifit'sfound,thelastTradeFlagbooleanvariableissettotrue.Thisislike"droppingabreadcrumb"astheprogramtravelsthroughthevastHTMLofthewebpage.

IfhandleStartTag()findsabtagrightafter"LastTrade"isfound(thelastTradeFlagflagistrue),itgrabsthenestedcontentofthatbtag,becausethiscontentrepresentsthestockquote.

Thebignegativeofwebharvesting,whichwebservicesispartlydesignedtosolve,isthatwhenthewebpageyouareparsingischanged,yourprogramthrowsexceptionsandnolongerpullsouttheinformation,becauseitsalgorithmsarebasedontheoldpagestructure.

Example26-2showsasnippetofcodethatusestheParserDelegator

Page 1107: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

andMyParserCallbackobjects,justtogiveyouanideaofhowtheyfittogetherbeforewemoveontotheservletandJSP.

Example26-2.Acodesnippetshowstheparserandcallbackclassesatwork

//Instancevariables

privateParserDelegatorhtmlParser=null;

privateMyParserCallbackcallback=null;

//InitializeaBufferedReaderandaURLinsideofamethodforconnecting

//toandreadingawebpage

BufferedReaderwebPageStream=null;

URLstockSite=newURL(BASE_URL+symbol);

//Connectinsideofamethod

webPageStream=newBufferedReader(

newInputStreamReader(stockSite.openStream()));

//Createtheparserandcallback

htmlParser=newParserDelegator();

callback=newMyParserCallback();//ParserCallback

//Callparse(),passingintheBufferedReaderandcallbackobjects

htmlParser.parse(webPageStream,callback,true);

Theparse()methodofParserDelegatoriswhattriggersthecallingofthecallback'smethods,withthecallbackpassedinasanargumenttoparse().

Nowlet'sseehowtheseclassesworkinaservlet,JavaBean,andJSP.

SeeAlso

Page 1108: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

AJavadoclinkforParserDelegator:http://java.sun.com/j2se/1.4.1/docs/api/javax/swing/text/html/parser/ParserDelegator.htmlChapter27onusingwebservicesAPIstograbinformationfromwebservers.

Page 1109: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe26.2UsingaServlettoHarvestWebData

Problem

Youwanttouseaservlettoharvestwebinformation.

Solution

UsetheHTMLparsingAPIclassesoftheJava2SoftwareDevelopmentKit(SDK).

Discussion

Thelastrecipeintroducedtherelevantsubpackagesofthejavax.swing.textpackage;thisiswhereIshowhowtousetheminaservlet.Example26-3importsthenecessaryclassestoparseanHTMLpage.Theservlet'sdoGet()methoddisplaysaforminwhichtheuserentersastocksymbol(suchas"INTC,"caseinsensitive).

ThenthedoPost()methodattemptstogetalivestockquoteforthatsymbolbyparsingawebpagefromfinance.yahoo.com.

Example26-3.Harvestingwebdatafromaservlet

packagecom.jspservletcookbook;

importjava.io.IOException;

importjava.io.PrintWriter;

importjava.io.BufferedReader;

importjava.io.InputStreamReader;

Page 1110: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

importjava.net.URL;

importjava.net.MalformedURLException;

importjavax.servlet.*;

importjavax.servlet.http.*;

importjavax.swing.text.html.HTMLEditorKit.ParserCallback;

importjavax.swing.text.MutableAttributeSet;

importjavax.swing.text.html.parser.ParserDelegator;

publicclassHtmlParseServletextendsHttpServlet{

privatestaticfinalStringBASE_URL="http://finance.yahoo.com"+

"/q?d=t&s=";

privateParserDelegatorhtmlParser=null;

privateMyParserCallbackcallback=null;

privateStringhtmlText="";

privatebooleanlastTradeFlag=false;

privatebooleanboldFlag=false;

privatefloatstockVal=0f;

publicvoiddoGet(HttpServletRequestrequest,

HttpServletResponseresponse)throwsServletException,

java.io.IOException{

//settheMIMEtypeoftheresponse,"text/html"

response.setContentType("text/html");

//useaPrintWritertosendtext

java.io.PrintWriterout=response.getWriter();

//BeginassemblingtheHTMLcontent

out.println("<html><head>");

out.println("<title>StockPriceFetcher</title></head><body>");

out.println("<h2>Pleasesubmitavalidstocksymbol</h2>");

//makesuremethod="post"sothattheservletservicemethod

//callsdoPostintheresponsetothisformsubmit

Page 1111: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

out.println(

"<formmethod=\"post\"action=\""+request.getContextPath()+

"/stockservlet\">");

out.println("<tableborder=\"0\"><tr><tdvalign=\"top\">");

out.println("Stocksymbol:</td><tdvalign=\"top\">");

out.println("<inputtype=\"text\"name=\"symbol\"size=\"10\">");

out.println("</td></tr><tr><tdvalign=\"top\">");

out.println(

"<inputtype=\"submit\"value=\"SubmitInfo\"></td></tr>");

out.println("</table></form>");

out.println("</body></html>");

}//doGet

publicvoiddoPost(HttpServletRequestrequest,

HttpServletResponseresponse)

throwsjava.io.IOException{

Stringsymbol;//thiswillholdthestocksymbol

floatprice;//Thestock'slatestprice

symbol=request.getParameter("symbol");

booleanisValid=(symbol==null||symbol.length()<1)?

false:true;

//settheMIMEtypeoftheresponse,"text/html"

response.setContentType("text/html");

java.io.PrintWriterout=response.getWriter();

//BeginassemblingtheHTMLcontent

out.println("<html><head>");

out.println("<title>Lateststockvalue</title></head><body>");

if(!isValid){

out.println(

"<h2>Sorry,thestocksymbolparameterwaseitherempty"+

Page 1112: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

"ornull</h2>");

}else{

out.println("<h2>Hereisthelatestvalueof"+symbol+"</h2>");

price=getLatestPrice(symbol);

out.println((price==0?"Thesymbolisprobablyinvalid.":

""+price));

}

out.println("</body></html>");

}//doPost

privatefloatgetLatestPrice(Stringsymbol)throwsIOException,

MalformedURLException{

BufferedReaderwebPageStream=null;

URLstockSite=newURL(BASE_URL+symbol);

webPageStream=newBufferedReader(newInputStreamReader(stockSite.

openStream()));

htmlParser=newParserDelegator();

callback=newMyParserCallback();

//thecodeisdesignedtomakecallingparse()thread-safe

synchronized(htmlParser){

htmlParser.parse(webPageStream,callback,true);

}//synchronized

returnstockVal;

}//getLatestPrice

classMyParserCallbackextendsParserCallback{

//breadcrumbsthatleadustothestockprice

privatebooleanlastTradeFlag=false;

privatebooleanboldFlag=false;

publicMyParserCallback(){

//Resettheenclosingclass'instancevariable

if(stockVal!=0)

Page 1113: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

stockVal=0f;

}

publicvoidhandleStartTag(javax.swing.text.html.HTML.Tagt,

MutableAttributeSeta,intpos){

if(lastTradeFlag&&(t==javax.swing.text.html.HTML.Tag.B)){

boldFlag=true;

}

}//handleStartTag

publicvoidhandleText(char[]data,intpos){

htmlText=newString(data);

if(htmlText.indexOf("Nosuchtickersymbol.")!=-1){

thrownewIllegalStateException(

"InvalidtickersymbolinhandleText()method.");

}elseif(htmlText.equals("LastTrade:")){

lastTradeFlag=true;

}elseif(boldFlag){

try{

stockVal=newFloat(htmlText).floatValue();

}catch(NumberFormatExceptionne){

try{

//teaseoutanycommasinthenumberusing

//NumberFormat

java.text.NumberFormatnf=java.text.NumberFormat.

getInstance();

Doublef=(Double)nf.parse(htmlText);

stockVal=(float)f.doubleValue();

}catch(java.text.ParseExceptionpe){

thrownewIllegalStateException(

"Theextractedtext"+htmlText+

"cannotbeparsedasanumber!");

}//try

}//try

Page 1114: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

lastTradeFlag=false;

boldFlag=false;

}//if

}//handleText

}//MyParserCallback

}//HttpServlet

TheMyParserCallbackinnerclassdefinestheparsingalgorithmfortheservlet,whichisexplainedinRecipe26.1.ThegetLatestPrice()methodusesthiscallbackclassandanHTMLparsertoreturnastockquoteasafloattype.

TheParserDelegatorobjectissynchronizedasitcallsparse(),sothatonlyonethreadisparsingthewebpageandsettingthevalueofstockVal(aninstancevariablerepresentingthestockvalue)atonetime.

Thisservletisalittletoocomplicatedforoneclass,asitusesservletAPIandHTMLparsingAPIclasses.AbetterdesignwouldseparatetheseresponsibilitiesintodifferentJavaclasses.TheupcomingrecipescreateaJavaBeanwhoseresponsibilityistoparseHTMLforalivestockquote.

Figure26-1showstheoutputoftheservlet'sdoGet()method.

Figure26-1.Theuserentersastocksymbolandsubmitstheform

Page 1115: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Figure26-2showstheservlet'sdoPost()methodoutputinaNetscapebrowser.

Figure26-2.Theservletreturnsthelateststockpriceforthesymbol

SeeAlso

Recipe26.3oncreatingaJavaBeanasaweb-pageparser;Recipe26.4andRecipe26.5onusingthebeanwithaservletandaJSP,respectively.

Page 1116: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe26.3CreatingaJavaBeanasaWebPageParser

Problem

YouwanttocreateaJavaBeanthatwebcomponentscanusetoparseanHTMLpage.

Solution

UsetheJavaAPIclassesforparsingHTMLfromthejavax.swing.textsubpackages.StoretheJavaBeaninWEB-INF/classesorinaJARplacedinsideWEB-INF/lib.

Discussion

Example26-4isaJavaBeanwhosesolepurposeistoparseawebpageforlivestockquotes.AservletorJSPcanusethisJavaBeanforitsspecialpurpose,andthusavoidtheclutteroftakingontheparsingresponsibilityitself.Allofthecode,includingtheinnerclassrepresentingaParserCallback,isreproducedfromthischapter'searlierrecipes.What'snewisthesetterormutatormethodforthebean'sstocksymbol:setSymbol(Stringsymbol).

Example26-4.AJavaBeanforusewithservletsandJSPs

packagecom.jspservletcookbook;

importjava.io.BufferedReader;

Page 1117: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

importjava.io.IOException;

importjava.io.InputStreamReader;

importjava.net.URL;

importjava.net.MalformedURLException;

importjavax.swing.text.html.HTMLEditorKit.ParserCallback;

importjavax.swing.text.MutableAttributeSet;

importjavax.swing.text.html.parser.ParserDelegator;

publicclassStockPriceBean{

privatestaticfinalStringurlBase="http://finance.yahoo.com/"+

"q?d=t&s=";

privateBufferedReaderwebPageStream=null;

privateURLstockSite=null;

privateParserDelegatorhtmlParser=null;

privateMyParserCallbackcallback=null;

privateStringhtmlText="";

privateStringsymbol="";

privatefloatstockVal=0f;

publicStockPriceBean(){}

//Setterormutatormethodforthestocksymbol

publicvoidsetSymbol(Stringsymbol){

this.symbol=symbol;

}

classMyParserCallbackextendsParserCallback{

//breadcrumbsthatleadustothestockprice

privatebooleanlastTradeFlag=false;

Page 1118: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

privatebooleanboldFlag=false;

publicMyParserCallback(){

//Resettheenclosingclass'instancevariable

if(stockVal!=0)

stockVal=0f;

}

publicvoidhandleStartTag(javax.swing.text.html.HTML.Tagt,

MutableAttributeSeta,intpos){

if(lastTradeFlag&&(t==javax.swing.text.html.HTML.Tag.B)){

boldFlag=true;

}

}//handleStartTag

publicvoidhandleText(char[]data,intpos){

htmlText=newString(data);

if(htmlText.indexOf("Nosuchtickersymbol.")!=-1){

thrownewIllegalStateException(

"InvalidtickersymbolinhandleText()method.");

}elseif(htmlText.equals("LastTrade:")){

lastTradeFlag=true;

}elseif(boldFlag){

try{

stockVal=newFloat(htmlText).floatValue();

}catch(NumberFormatExceptionne){

try{

//teaseoutanycommasinthenumberusing

//NumberFormat

java.text.NumberFormatnf=java.text.NumberFormat.

getInstance();

Doublef=(Double)nf.parse(htmlText);

stockVal=(float)f.doubleValue();

}catch(java.text.ParseExceptionpe){

thrownewIllegalStateException(

Page 1119: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

"Theextractedtext"+htmlText+

"cannotbeparsedasanumber!");

}//try

}//try

lastTradeFlag=false;

boldFlag=false;

}//if

}//handleText

}//MyParserCallback

publicfloatgetLatestPrice()throwsIOException,MalformedURLException{

stockSite=newURL(urlBase+symbol);

webPageStream=newBufferedReader(newInputStreamReader(stockSite.

openStream()));

htmlParser=newParserDelegator();

callback=newMyParserCallback();//ParserCallback

synchronized(htmlParser){

htmlParser.parse(webPageStream,callback,true);

}//synchronized

//resetsymbol

symbol="";

returnstockVal;

}//getLatestPrice

}//StockPriceBean

ThisbeanresetsthesymbolinstancevariabletotheemptyStringwhenit'sfinishedfetchingthestockquote.TheMyParserCallbackclassresetsthestockValinstancevariableto0,sothatthepreviouslyattainedstockpricedoesnotlingerbetweendifferentthread'scallstogetLatestPrice().

Nowlet'sseehowaservletandJSPusethebean.

Page 1120: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

SeeAlso

Recipe26.4onusingthisJavaBeaninaservlet;Recipe26.5onusingthebeaninaJSP.

Page 1121: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe26.4UsingtheWebPageParsingJavaBeaninaServlet

Problem

YouwanttousetheJavaBeanforparsingHTMLinaservlet.

Solution

Createaninstanceofthebeanintheappropriateservicemethod(e.g.,doGet()ordoPost())andcallitsmethods.

Discussion

TheJavaBeanhastobeavailabletotheservlet,andthereforestoredinWEB-INF/classes,includingsubdirectoriesthatmatchthebean'spackagename.TheJavaBeancanalsobestoredinaJARinsideofWEB-INF/lib.

SincetheJavaBeaninExample26-5sharestheservlet'spackage(com.jspservletcookbook),theservletclassdoesnothavetoimportthebeanclass.

IftheJavaBeanresidesinadifferentpackageinthewebapplication,thentheservlethastoincludeanimportstatementsuchasthefollowingexample:

importcom.parkerriver.beans.BeanParserServlet;

ThedoGet()methodprovidesanHTMLformforenteringastocksymbol(suchas"intc").ThedoPost()methodthencreatesan

Page 1122: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

instanceoftheStockPriceBean,callsthebean'ssetSymbol()method,andfinallydisplaysthestockpricebycallingthebean'sgetLatestPrice()method.

Example26-5.AservletusesaspeciallydesignedJavaBeantogetalivestockquote

packagecom.jspservletcookbook;

importjava.io.IOException;

importjava.io.PrintWriter;

importjavax.servlet.*;

importjavax.servlet.http.*;

publicclassBeanParserServletextendsHttpServlet{

publicvoiddoGet(HttpServletRequestrequest,

HttpServletResponseresponse)

throwsServletException,java.io.IOException{

//settheMIMEtypeoftheresponse,"text/html"

response.setContentType("text/html");

//useaPrintWritersendtextdatatotheclient

java.io.PrintWriterout=response.getWriter();

//BeginassemblingtheHTMLcontent

out.println("<html><head>");

out.println("<title>StockPriceFetcher</title></head><body>");

out.println("<h2>Pleasesubmitavalidstocksymbol</h2>");

//makesuremethod="POST"sothattheservletservicemethod

//callsdoPostintheresponsetothisformsubmit

out.println(

Page 1123: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

"<formmethod=\"POST\"action=\""+request.getContextPath()+

"/stockbean\">");

out.println("<tableborder=\"0\"><tr><tdvalign=\"top\">");

out.println("Stocksymbol:</td><tdvalign=\"top\">");

out.println("<inputtype=\"text\"name=\"symbol\"size=\"10\">");

out.println("</td></tr><tr><tdvalign=\"top\">");

out.println("<inputtype=\"submit\"value=\"SubmitInfo\"></td></tr>");

out.println("</table></form>");

out.println("</body></html>");

}//doGet

publicvoiddoPost(HttpServletRequestrequest,

HttpServletResponseresponse)

throwsServletException,java.io.IOException{

Stringsymbol;//thiswillholdthestocksymbol

floatprice=0f;

symbol=request.getParameter("symbol");

booleanisValid=(symbol==null||symbol.length()<1)?

false:true;

//settheMIMEtypeoftheresponse,"text/html"

response.setContentType("text/html");

//useaPrintWritersendtextdatatotheclient

java.io.PrintWriterout=response.getWriter();

//BeginassemblingtheHTMLcontent

out.println("<html><head>");

out.println("<title>Lateststockvalue</title></head><body>");

Page 1124: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

if(!isValid){

out.println(

"<h2>Sorry,thestocksymbolparameterwaseitherempty"+

"ornull</h2>");

}else{

out.println("<h2>Hereisthelatestvalueof"+symbol+"</h2>");

StockPriceBeanspbean=newStockPriceBean();

spbean.setSymbol(symbol);

price=spbean.getLatestPrice();

out.println((price==0?"Thesymbolisprobablyinvalid.":

""+price));

}//if

out.println("</body></html>");

}//doPost

}//HttpServlet

Theservlet'sHTMLform(generatedbythedoGet()method)andthestockpricedisplay(generatedbydoPost())hasthesamewebbrowserdisplayastheoneshowninFiguresFigure26-1andFigure26-2.

SeeAlso

Recipe26.3oncreatingaJavaBeanasawebpageparser;Recipe26.5onusingawebpageparsingJavaBeaninaJSP.

Page 1125: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe26.5UsingtheWebPageParsingJavaBeaninaJSP

Problem

YouwanttouseaJavaBeanandJSPtoharvestinformationfromawebpage.

Solution

Usethejsp:useBeanstandardactiontocreateaninstanceofthebean.

Discussion

ThesameJavaBeanthatpriorrecipescreatedandstoredinthewebapplicationinWEB-INF/classescanbeusedbyaJSP.TheJSPinExample26-6usesjsp:useBeantocreateaninstanceofthebeannamedpriceFetcher.Iftherequestdoesnotcontainasymbolparameter,theJSPdisplaystheHTMLformshowninFigure26-1.

TheJSPusestheJSTLcoretagstogeneratethisconditionalbehavior.Thesetagsincludec:choose,c:when,andc:otherwise.

IftherequesttotheJSPcontainsasymbolparameter,theJSPsetsthepriceFetcher'ssymbolpropertytothevalueofthisrequestparameter.Thiscodeistheequivalentofcallingthebean'ssetSymbol()method;itpassesthenameofthestocksymboltothebeansothatitcangrabalivestockquotefromthewebpage.

Page 1126: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Example26-6.AJSPusesjsp:useBeantoemployaweb-harvestingJavaBean

<%@tagliburi="http://java.sun.com/jstl/core"prefix="c"%>

<jsp:useBeanid="priceFetcher"class=

"com.jspservletcookbook.StockPriceBean"/>

<html>

<head><title>PriceFetch</title></head>

<body>

<c:choose>

<c:whentest="${emptyparam.symbol}">

<h2>Pleasesubmitavalidstocksymbol</h2>

<formmethod="POST"action=

'<c:outvalue="${pageContext.request.contextPath}"/>/priceFetch.jsp'>

<tableborder="0"><tr><tdvalign="top">Stocksymbol:</td>

<tdvalign="top">

<inputtype="text"name="symbol"size="10"></td></tr>

<tr><tdvalign="top">

<inputtype="submit"value="SubmitInfo"></td></tr>

</table></form>

</c:when>

<c:otherwise>

<h2>Hereisthelatestvalueof<c:outvalue="${param.symbol}"/></h2>

<jsp:setPropertyname="priceFetcher"property="symbol"value=

"<%=request.getParameter(\"symbol\")%>"/>

Page 1127: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<jsp:getPropertyname="priceFetcher"property="latestPrice"/>

</c:otherwise>

</c:choose>

</body>

</html>

NowthattheJSPhasseededthebeanwiththestocksymbol,thiscodewillcallthebean'sgetLatestPrice()method:

<jsp:getPropertyname="priceFetcher"property="latestPrice"/>

TheJSP'soutputreplacesthejsp:getPropertystandardactionwiththestockprice,aslongasthestocksymbolsenttothebeanwithjsp:setPropertywasvalid.

TheoutputoftheJSPinExample26-6looksjustliketheoutputshowninFiguresFigure26-1andFigure26-2.

SeeAlso

Chapter23ontheJSTL;Recipe26.4onusingawebpageparsingJavaBeaninaservlet.

Page 1128: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Chapter27.UsingtheGoogleandAmazonWebAPIs

Introduction

Recipe27.1.GettingSetUpwithGoogle'sWebAPI

Recipe27.2.CreatingaJavaBeantoConnectwithGoogle

Recipe27.3.UsingaServlettoConnectwithGoogle

Recipe27.4.UsingaJSPtoConnectwithGoogle

Recipe27.5.GettingSetUpwithAmazon'sWebServicesAPI

Recipe27.6.CreatingaJavaBeantoConnectwithAmazon

Recipe27.7.UsingaServlettoConnectwithAmazon

Recipe27.8.UsingaJSPtoConnectwithAmazon

Page 1129: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Introduction

GoogleandAmazon.comarebothearlyadoptersintheemergingfieldofwebservices.

Googleisagiantwebsearchengineanddirectory.Amazon.comisae-commercewebsitethatbeganasanonlinebookstoreandhassincebranchedoutintonumerousproductssuchassoftwareandelectronics.BothsitesseparatelyoffersoftwaredeveloperswebservicesApplicationProgrammingInterfaces(APIs)thatgiveyoutheabilitytomanageGooglesearchesusingJavaobjectsandaccessAmazon'scomprehensiveproductcatalogswithyourJavacode.

ForusJavadevelopers,webservicesmeansmakingrequestsandreceivingresponsesusingaspecialXMLformat.Inotherwords,youmakearequestusingXMLelementsandattributesintextform,andreceivearesponseinthesameformat.WebservicestypicallyuseanXML-basedprotocolnamedSimpleObjectAccessProtocol(SOAP)totransferinformation.

Inanutshell,SOAPrepresentstheabstractionofanenvelope,thatinturncontainsoptionalheadersandthemessagebody.Themessage,composedofitsouterenvelope,aswellastheheadersandbody,ismadeupofXMLelementsthatareassociatedwithspecifiednamespaces.ThetechnologiesthischapterdescribesuseHTTPtocarrytheseXML-basedSOAPmessages.

IneverreallyunderstoodSOAPmessagesuntilIlookedatsomesamples.Example27-1ispartofaSOAPresponsetoanAmazonWebServiceskeyword-searchrequestusingthequery"LanceArmstrong."

TheresponseisanXMLfilecomposedofaProductInforootelement,whichcontainsoneormoreDetailselements.EachoneoftheseDetailsrepresentsabookfromAmazon'scatalog(IomittedallbutoneoftheDetailselements,justtomakethesampleeasiertoview).Onlyoneofthereturnedbooksisshown.

Page 1130: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Example27-1.ASOAPresponsefromAmazonWebServicesbasedonasearchfortheterms"LanceArmstrong"

<?xmlversion="1.0"encoding="UTF-8"?>

<!DOCTYPEProductInfoPUBLIC"-//Amazon.com//DTDAmazonProductInfo//EN"

"http://xml.amazon.com/schemas/dev-lite.dtd">

<ProductInfoxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:noNamespaceSchemaLocation=

"http://xml.amazon.com/schemas/dev-lite.xsd">

<Detailsurl=

"http://www.amazon.com/exec/obidos/ASIN/0399146113/webservices-20?

dev-t=DCJEAVXSDVPUD%26camp=2025%26link_code=xm2">

<Asin>0399146113</Asin>

<ProductName>It'sNotAbouttheBike:MyJourneyBacktoLife

</ProductName>

<Catalog>Book</Catalog>

<Authors>

<Author>LanceArmstrong</Author>

<Author>SallyJenkins</Author>

</Authors>

<ReleaseDate>June,2000</ReleaseDate>

<Manufacturer>PutnamPubGroup</Manufacturer>

<ImageUrlSmall>

http://images.amazon.com/images/P/0399146113.01.THUMBZZZ.jpg

</ImageUrlSmall>

<ImageUrlMedium>

http://images.amazon.com/images/P/0399146113.01.MZZZZZZZ.jpg

</ImageUrlMedium>

Page 1131: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<ImageUrlLarge>

http://images.amazon.com/images/P/0399146113.01.LZZZZZZZ.jpg

</ImageUrlLarge>

<ListPrice>$24.95</ListPrice>

<OurPrice>$17.47</OurPrice>

<UsedPrice>$9.99</UsedPrice>

</Details>

</ProductInfo>

ThreeprincipalreasonsforadoptingSOAP-basedwebservicesare:

1. SOAPisstandards-based,soyoucanuseanytechnologythathasdevelopedaSOAPAPIortoolkit,includingJava,.NET,Perl,andPython.Object-orientedtechnologies(likeJava)allowyoutobuildandreadSOAPmessagesusingobjects,insteadofhavingtodealwithrawXML,whichcanmakewebservicesgratifyingtoworkwith.

Webservicesrepresentinteroperabilitybetweentechnologies.AserverthatisusingJ2EEtechnologiessuchasservletsandJSPscaneasilyexchangemessageswithaserverrunning.NET,becausetheyspeakthesamelanguage:SOAPandXML.

SOAPmessagescaneasilybeexchangedbetweenwebserverswithoutrunningafoulofthelimitationsoffirewalls,becausethemessagesaremadeofupXMLtextandcarriedbyHTTP(inaverygeneralway,justlikeanHTMLpage).DevelopersareembracingSOAPasaneasierformofdistributedcomputing:itallowsanobjectresidinginthememoryofoneservertocallmethodsononeormoreobjectsresidingondistantcomputersbyexchangingSOAPmessages.

ArecipeintroductioncannotdojusticetoacomplicatedtopicsuchasSOAP,butthereareplentyofbooksandfreetutorialsonthistopic(seethischapter's"SeeAlso"sectionsforsomesuggestions).

Page 1132: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Mostlyinabetastageofdevelopment,theAmazonandGooglewebservicesAPIsallowaJavaprogramtocreateveryusefulandcomplexsystemsthatinteractwithAmazonandGoogle.TheAmazonandGooglewebservicesprogramsaredesignedtofamiliarizedeveloperswiththesenewwaysofhandlingrequestsandresponsestothetwopopularwebdestinations.

Theprogramsgenerallyinvolvecreatingadeveloper'saccountandrecievingakey,ortoken,thatwillaccompanyeachoneofyourrequeststothesesites.ThischapterdescribeshowtogetsetupwithusingAmazonandGooglewebservices,thenshowsyouhowtointegratetheseAPIswithaservletandJSP.

Page 1133: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe27.1GettingSetUpwithGoogle'sWebAPI

Problem

YouwanttouseGoogle'sWebAPItomakeJava-enabledsearchesofGoogle'svastwebindex.

Solution

DownloadtheGoogleWebAPIsSDK.CreateaGoogleaccountandgetalicensekeythatallowstheuseofGoogle'sWebAPI.

Discussion

TheGoogleWebAPIsSDKincludesanarchivenamedgoogle.jar.ThisfilecontainstheclassesthatyourprogramwillusetoconnectwithGoogleduringsearches.HerearethespecificstepsyoutaketopreparethewebapplicationforconnectingwithGoogle:

1. DownloadthezippedSDKfromhttp://www.google.com/apis/download.html.Unpackthisfileintoadirectory(namedgoogleapiinBetaVersion3.0oftheGoogleWebAPIs).Thisdirectorycontainsgoogle.jar,alongwithalotofcodesamplesanddocumentation.

CreateaGoogleaccountandgetalicensekey,whichisencodedtextthatlookslike"5W1ABCyzPSyI3rIa5Pt3DtXMatsdzaSGB."YourJavacodeusesthiskeywhenitqueriesGoogle'sindex.Thequerywillfailifitisnotaccompaniedbyavalidkey.

Page 1134: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Placethegoogle.jarfileintheWEB-INF/libdirectoryofthewebapplication.

DevelopyourJavaclassesforconnectingwithGoogle,usingthecom.google.soap.searchpackagefromthegoogle.jarfile.

SeeAlso

ThehomefortheGoogleWebAPIs:http://www.google.com/apis/;theGooglewebAPIsSDK:http://www.google.com/apis/download.html.

Page 1135: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe27.2CreatingaJavaBeantoConnectwithGoogle

Problem

YouwanttouseGoogle'sWebAPIstomakeJava-enabledsearchestoGoogle'ssite.

Solution

CreateaJavaBeansothatyoucanusethebeaninbothaservletandJSP.

Discussion

ThefirstthingtodoisgetsetupwithaGoogleWebServicesaccount,asdescribedinRecipe27.1.NowcreateaJavaBeanthatwillmakekeywordsearchesofGoogleandreturntheresults.

Example27-2firstimportsthepackagecontainedingoogleapi.jar:com.google.soap.search.Remember,youstoredthatJARfileinWEB-INF/lib.ThismeansthatthewebapplicationcanfindtheJavaclassesinthatpackageandtheGoogleBeaninExample27-2canuseit.

Example27-2.AJavaBeanthatsearchesGoogle'swebdatabase

packagecom.jspservletcookbook;

Page 1136: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

importcom.google.soap.search.*;

publicclassGoogleBean{

privateGoogleSearchsearch;

privateGoogleSearchResultgoogleRes;

privatefinalstaticStringGOOGLE_KEY=

"5W1BWPyzPSyI3rIa5Pt3DtXMatsniSGB";

privateStringlineSep="\n";

//Settablebeanproperties

privateStringquery;

privatebooleanfilter;

privateintmaxResults;

privateintstartRes;

privatebooleansafeSearch;

privateStringrestrict;

privateStringlangRestrict;

publicGoogleBean(){//No-argumentsconstructorforthebean

query="";

restrict="";

langRestrict="";

}

publicStringstructureResult(GoogleSearchResultres){

//EachGoogleSearchResultElement

GoogleSearchResultElement[]elements=res.getResultElements();

Stringurl="";

Stringresults="Estimatedtotalresultscount:"+

res.getEstimatedTotalResultsCount()+lineSep+lineSep;

for(inti=0;i<elements.length;i++){

url=elements[i].getURL();

results+=("Title:"+elements[i].getTitle()+lineSep+

Page 1137: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

"URL:<ahref=\""+url+"\">"+url+"</a>"+lineSep+

"Summary:"+elements[i].getSummary()+lineSep+

"Snippet:"+elements[i].getSnippet()+lineSep+lineSep);

}

returnresults;

}

publicStringgetSearchResults()throwsGoogleSearchFault{

search=newGoogleSearch();

search.setKey(GOOGLE_KEY);

search.setFilter(filter);

if(restrict.length()>0)

search.setRestrict(restrict);

search.setQueryString(query);

googleRes=search.doSearch();

returnstructureResult(googleRes);

}

publicvoidsetLineSep(StringlineSep){

this.lineSep=lineSep;

}

publicStringgetLineSep(){

returnlineSep;

}

publicvoidsetQuery(Stringquery){

this.query=query;

}

publicStringgetQuery(){

returnquery;

}

publicvoidsetRestrict(Stringquery){

this.restrict=restrict;

}

Page 1138: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

publicStringgetRestrict(){

returnrestrict;

}

publicvoidsetLangRestrict(StringlangRestrict){

this.langRestrict=langRestrict;

}

publicStringgetLangRestrict(){

returnlangRestrict;

}

publicvoidsetFilter(booleanfilter){

this.filter=filter;

}

publicbooleangetFilter(){

returnfilter;

}

publicvoidsetSafeSearch(booleansafeSearch){

this.safeSearch=safeSearch;

}

publicbooleangetSafeSearch(){

returnsafeSearch;

}

publicvoidsetMaxResults(intmaxResults){

this.maxResults=maxResults;

}

publicintgetMaxResults(){

returnmaxResults;

}

Page 1139: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

publicvoidsetStartRes(intstartRes){

this.startRes=startRes;

}

publicintgetStartRes(){

returnstartRes;

}

}//GoogleBean

TheinterestingactioninExample27-2occursinthemethodsgetSearchResults()andstructureResults().

IngetSearchResults(),thecodecreatesaGoogleSearchobject,whichisthencustomizedwithGooglesearchoptionsbeforetheGoogleSearchdoSearch()methodiscalled.TheGoogleSearchobjectusessettermethodstodesignaspecificgoogle.comsearch.Forexample,thesetQueryString()methodprovidestheuser'ssearchterms.TheJavaobjectsthatareusingthebeanprovidesthesearchtermsbycallingthebean'ssetQuery()method.

YoucansetthevariousoptionsforGooglesearchesbycallingtheGoogleSearchsettermethods.Forexample,callingsetFilter(true)filtersoutalltheresultsthatderivefromthesamewebhost.AndyoucanrestrictthesearchtospecificGooglesubsitesbycallingsetRestrict("mac").Seehttp://www.google.com/apis/reference.html.

EverySOAP-relatedsearchofGooglemustcalltheGoogleSearchsetKey()methodwiththeproperlicensekey,orthesearchisrejected.

ThestructureResults()methodformatsthesearchresults.GooglesearchresultsareencapsulatedbyaGoogleSearchResultobject.ThisobjectcontainsanarrayofGoogleSearchResultElementobjects,whichrepresenteachURLthattheGooglesearchhasreturned.

Page 1140: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

TheGoogleSearchResultgetResultElements()methodreturnstheGoogleSearchResultElementarray.

Thecodetheniteratesthroughthearray.Eachreturnedelement(theGoogleSearchResultElementobject)hasgetteroraccessormethodsthatprovidesinformationabouttheweb-pagesearchresult:

getURL()returnstheURLofthefounditem

getTitle()returnsthetitleofthefoundHTMLpage

getSnippet()returnsasnippet(asmall,possiblyambiguous,pieceoftextfromthewebpage)

getSummary()returnsatextsummaryofthefoundwebpage

ThebeanusesthesemethodstodisplaytheURL,title,snippet,andsummaryofeachwebpagethesearchreturns.Figure27-2showshowtheseresultsaredisplayed.

SeeAlso

ThehomeforGoogleWebService:http://www.google.com/apis/;theGoogleWebAPIsSDK:http://www.google.com/apis/download.html;Recipe27.1onsettingupyourprogrammingenvironmentforusewiththeGoogleWebAPIs.

Page 1141: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe27.3UsingaServlettoConnectwithGoogle

Problem

YouwanttoconnecttoGooglewithaservletandinitiateasearch.

Solution

UsetheJavaBeandescribedinRecipe27.2asaGooglesearchutilityclass.

Discussion

TheservletinExample27-3usestheGoogleBeanfromRecipe27.2toinitiategoogle.comsearchesanddisplaytheresults.

TheservletdisplaysanHTMLforminitsdoGet()method.TheclientusesthisformtoinputGooglesearchparameters,andthenPOSTtheformparametersbacktothesameservlet.Finally,theservlet'sdoPost()methodcreatesaninstanceoftheGoogleBeantoinitiatethesearch.Inthiscase,usethedeploymentdescriptortomapanyrequestsoftheform"/googleservlet"toExample27-3.

Example27-3.AservletusesaspecialJavaBeantosearchGoogleanddisplayanyresults

packagecom.jspservletcookbook;

Page 1142: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

importjava.io.IOException;

importjava.io.PrintWriter;

importjavax.servlet.*;

importjavax.servlet.http.*;

publicclassGoogleServletextendsHttpServlet{

publicvoiddoGet(HttpServletRequestrequest,

HttpServletResponseresponse)

throwsServletException,java.io.IOException{

response.setContentType("text/html");

java.io.PrintWriterout=response.getWriter();

out.println("<html><head>");

out.println("<title>InitiateaGoogleSearch</title></head><body>");

out.println("<h2>Pleaseenteryoursearchterms</h2>");

//Makesuremethod="POST"sothattheservletservicemethod

//callsdoPostintheresponsetothisformsubmit

out.println(

"<formmethod=\"POST\"action=\""+request.getContextPath()+

"/googleservlet\">");

out.println("<tableborder=\"0\"><tr><tdvalign=\"top\">");

out.println("Searchterms:</td><tdvalign=\"top\">");

out.println("<inputtype=\"text\"name=\"query\"size=\"15\">");

out.println("</td></tr><tr><tdvalign=\"top\">");

out.println(

"RestricttoGooglesub-site...</td><tdvalign=\"top\">");

out.println(

"<selectname=\"restrict\"><option>unclesam</option>"+

"<option>linux</option>option>mac</option><option>bsd</option>"+

"</select>");

out.println("</td></tr><tr><tdvalign=\"top\">");

Page 1143: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

out.println(

"<inputtype=\"submit\"value=\"SubmitInfo\"></td></tr>");

out.println("</table></form>");

out.println("</body></html>");

}//doGet

publicvoiddoPost(HttpServletRequestrequest,

HttpServletResponseresponse)

throwsServletException,java.io.IOException{

Stringquery=request.getParameter("query");

Stringrestrict=request.getParameter("restrict");

booleanisValid=(query==null||query.length()<1)?

false:true;

//settheMIMEtypeoftheresponse,"text/html"

response.setContentType("text/html");

java.io.PrintWriterout=response.getWriter();

out.println("<html><head>");

out.println("<title>Googleresults</title></head><body>");

if(!isValid){

out.println(

"<h2>Sorry,thequeryparameterwaseitheremptyornull</h2>");

}else{

out.println("<h2>Hereareyoursearchresults</h2>");

GoogleBeangb=newGoogleBean();

gb.setFilter(true);

//Configureforwebdisplay

gb.setLineSep("<br/>");

if(restrict!=null&&restrict.length()>0)

gb.setRestrict(restrict);

gb.setQuery(query);

try{

out.println(gb.getSearchResults());

Page 1144: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

}catch(Exceptione){

thrownewServletException(e.getMessage());

}

}//if

out.println("</body></html>");

}//doPost

}//GoogleServlet

UsingtheGoogleBeanclassindoPost()isstraightforward.Thecodesetsafewsearchoptions(suchassetFilter(true)),thencallsthebean'sgetSearchResults()method.ThismethodreturnsaStringofformattedsearchresults,whichtheservlet'sPrintWritersendstothebrowserfordisplay.

Figure27-1showsthesimpleHTMLformdisplayedintheservlet'sdoGet()method.

Figure27-1.EnterkeywordstosearchGooglewithaservlet

The"RestricttoGooglesub-site..."partallowstheusertochooseoneofnone,unclesam,linux,mac,orbsd.Theuserentersthesearchterm

Page 1145: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

"LanceArmstrong"intheHTMLform'stextfield,thenpressesthe"SubmitInfo"button.Figure27-2showsthesearchresultsdispalyedbytheservlet'sdoPost()method.

TheGoogleWebAPIsdisplayamaximumof10resultspersearch.

Figure27-2.AservletusingtheGoogleWebAPIsdisplayssomesearchresults

Page 1146: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

SeeAlso

ThehomeforGoogleWebService:http://www.google.com/apis/;theGoogleWebAPIsSDK:http://www.google.com/apis/download.html;Recipe3.1onmappingaservlettoanameinweb.xml;Recipe27.1onsettingupyourprogrammingenvironmentforusewiththeGoogleWebAPIs;Recipe27.4onusingaJSPtoconnectwithGooglewebservices.

Page 1147: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe27.4UsingaJSPtoConnectwithGoogle

Problem

YouwanttosearchGoogleusingtheGoogleWebAPIsandaJSP.

Solution

Usethejsp:useBeanstandardactiontogetaccesstotheGoogleBeanfromExample27-2,thenusethisbeaninstancetoconnectwithGoogle'swebtools.

Discussion

TheJSPinExample27-4usestheJSTLcoretagstodetermineiftheuserhassentasearchqueryalongwiththeirrequest.Ifthequeryrequestparameterisempty,thentheJSPdisplaysaform(seeFigure27-1).SeeChapter23fordetailsontheJSTLcoretags.

Iftherequestparameterisfilledbyasearchquery,theJSPusestheGoogleBeantosearchgoogle.comanddisplaytheresults.TheJSPusesthejsp:useBeanstandardactiontocreateaninstanceofthebean,whichisstoredintheWEB-INF/libdirectory.

Example27-4.AJSPusesaJavaBeantosearchgoogle.com

<%@tagliburi="http://java.sun.com/jstl/core"prefix="c"%>

Page 1148: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

<html>

<head><title>SearchGooglefromaJSP</title></head>

<body>

<c:choose>

<c:whentest="${emptyparam.query}">

<h2>Pleaseenteryoursearchterms...</h2>

<%--DisplaytheHTMLform...--%>

<formmethod="POST"action='<c:outvalue=

"${pageContext.request.contextPath}"/>/google.jsp'>

<tableborder="0">

<tr><tdvalign="top">

Searchterms:</td><tdvalign="top">

<inputtype="text"name="query"size="15">

</td></tr>

<tr><tdvalign="top">

RestricttoGooglesub-site...</td><tdvalign="top">

<selectname="restrict">

<optionselected>none</option><option>unclesam</option>

<option>linux</option>

<option>mac</option><option>bsd</option></select>

</td></tr>

<tr><tdvalign="top">

<inputtype="submit"value="SubmitInfo"></td></tr>

</table></form>

<%--EndoftheHTMLform...--%>

Page 1149: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

</c:when>

<c:otherwise>

<%--CreateaninstanceoftheGoogleBean--%>

<jsp:useBeanid="gBean"class="com.jspservletcookbook.GoogleBean"/>

<h2>Hereareyoursearchresults</h2>

<%--Setthequery,restrict,andlineSeppropertiesoftheGoogleBean--%>

<jsp:setPropertyname="gBean"property="query"param="query"/>

<jsp:setPropertyname="gBean"property="restrict"param="restrict"/>

<jsp:setPropertyname="gBean"property="lineSep"value="<br/><br/>"/>

<%--Nowdisplayanyresultsofthesearch--%>

<jsp:getPropertyname="gBean"property="searchResults"/>

</c:otherwise>

</c:choose>

</body>

</html>

TheJSPusesthejsp:setPropertystandardactiontothebeaninstance'squery,restrict,andlineSepproperties.Thequeryrepresentsthesearchterms;restrictcanhavevaluesofmac,linux,bsd,orunclesam,representingvariousGooglesub-sites,andthelineSeppropertydeterminestheline-separationcharacterstousewhenformattingtheresults(<br/>inthisexample).

Finally,thecodeusesjsp:getPropertytoeffectivelycalltheGoogleBean'sgetSearchResults()method,whichsendsaSOAPmessagetoGoogleandformatstheresponse.

Page 1150: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

SeeAlso

ThehomeforGoogleWebService:http://www.google.com/apis/;theGooglewebAPIsSDK:http://www.google.com/apis/download.html;Recipe27.1onsettingupyourprogrammingenvironmentforusewiththeGoogleWebAPIs;Recipe27.3onusingaservlettoconnectwithGooglewebservices.

Page 1151: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe27.5GettingSetUpwithAmazon'sWebServicesAPI

Problem

YouwanttoconnecttoAmazonWebServices(AWS)withaservletorJSP.

Solution

DownloadtheAmazonWebServicesSDK,acquireanAmazondeveloper'stoken,andcreateaJava-SOAPpackageforinteractingwithAWS.

Discussion

TheprocessforsettingupAWSgoeslikethis:

1. DownloadtheAWSSDKathttp://www.amazon.com/gp/aws/download_sdk.html/002-2688331-0628046.Thiskit.zipfileincludesseveralcodesamplesandwebservicesAPIdocumentationinHTMLformat.

Acquireadeveloper'stokenfrom:http://associates.amazon.com/exec/panama/associates/join/developer/application.html/002-2688331-0628046.SimilartothelicensekeyyouusewithGoogle'sWebAPIs,thefree-of-chargetokencomprisesaseriesofencodedcharactersthatmustaccompanyeachinteractionbetweenyourJavacodeandAWS.

Page 1152: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

DeveloptheJavaAPIformakingSOAPrequeststoAWS.TheendresultisaJARfilecontainingtheclassesthatyourservletsorJSPsusetomakeSOAPrequests.TherestofthisrecipedescribeshowtogeneratethisJARfile,becauseitisamultistepprocess.

InteractingwithAWSusingSOAPmessagesisoneoptionthatAmazonmakesavailabletodevelopers.AnotheroneinvolvesencodingthewebservicesrequestsinURLs,andtherebymakingAWSrequestsviaHTTP(called"XMLoverHTTP").Recipe27-7showsanexampleofthisURLsearch(theyareusefulfordebuggingyourSOAPapplications).IfyoustoreanXSLTfileontheWeb,AWSusesthisfiletoformattheresponsetoXML-over-HTTPrequests.SeetheSDKdocumentationformoredetails.

SOAPwithApacheAxis

ThecreationofaJava-SOAPAPIforusingAWSbeginswithdownloadinganopensourceSOAPtoolkitnamedApacheAxis(http://ws.apache.org/axis/).HerearethestepsinvolvedincreatingtheAPI:

1. DownloadAxisandextracttheAxisZIPfiletothedirectoryofyourchoice(thiscreatesadirectorynamedaxis-1_1).

Insidetheaxis-1_1/libdirectoryareseveralJARfiles.PlacetheseJARfilesonyourclasspathandthenrunaprogramnamedorg.apache.axis.wsdl.WSDL2JavatogenerateJavasourcefiles.TheseJavasourcefilescomprisetheJavaAPIyouwillusewithAWSwhenyoucompilethefiles.

DownloadtheWebServicesDescriptionLanguage(WSDL)fileassociatedwiththeAmazonWebServices.Atthiswriting,thefilecanbefoundat:http://soap.amazon.com/schemas3/AmazonWebServices.wsdl.

Page 1153: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Thefollowingcommandlinegeneratesthecom.amazon.soap.axispackageforyourJavaAPI.ThecommandlinesinthisrecipeworkonbothWindows-andUnix-basedmachines.ThecommandlineisdesignedtorefertotheAmazonWebServices.wsdlfileinthecurrentdirectory.TheWSDL2JavaprogramgeneratesJavaclassesbasedontheXMLelementsdescribedbytheWSDLXMLfile(XML-to-Javaconversion).ThisallowsyoutoworkwithAWSusingonlyJavaobjects,whichisveryniceit'swhyyouareenduringtheinitialpainofcreatingtheseJavaclasses!Breakupthiscommandlineintoseparatelinestomakeitmorereadable,butwhenyouactuallyrunit,thecommandsmustallbecombinedononeline:

java-cp.;lib/axis.jar;lib/commons-discovery.jar;lib/commons-

logging.jar;lib/jaxrpc.jar;lib/saaj.jar;lib/wsdl4j.jar

org.apache.axis.wsdl.WSDL2JavaAmazonWebServices.wsdl--verbose

--packagecom.amazon.soap.axis

ThiscommandlinegeneratesJavasourcefilesinadirectorytreethatmatchesthespecifiedpackagename(com.amazon.soap.axis).Nowyouhavetocompiletheseclasseswiththejavactool,asinthefollowingcommandline(thecurrentdirectorycontainsthecomdirectory).Onceagain,webreakupthissingle-linecommandintoseparatelinesjustforthesakeofreadability(youhavetorunthecommandlineunbrokenbyanynewlinecharacters):

javac-classpath.;lib/axis.jar;lib/commons-discovery.jar;lib/commons-

logging.jar;lib/jaxrpc.jar;lib/saaj.jar;lib/wsdl4j.jar

com/amazon/soap/axis/*.java

NowJARupallthesefiles.Inthesamedirectorycontainingthetop-levelcomdirectory,thiscommandcreatesaJARfilenamedamazonapi.jar,whichisjustanameIcreatedforit:

jarcvfamazonapi.jar./com

Taketheamazonapi.jar(orwhateveryou'venamedtheJARfile)and

Page 1154: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

placeitinWEB-INF/lib.There'sonemorestepleft.

MakesurethattheJARfilesorlibrariesthatthecom.amazon.soap.axispackagedependsonarealsoavailabletothewebapplication.Theamazonapi.jarfiledependsonthesameAxislibrariesthatyouaddedtotheclasspathinthepriorjavaandjavaccommand-linesequences.YouhavetoaddtheseJARstoWEB-INF/libaswell(unlessyourapplicationservermakesalloftheselibrariesgenerallyavailabletowebapplications).

Okay,nowforthefunpart,whereyourJavacodegetstoexplorebooksandotherstuffatAmazonusingservlets.Yourservletsshouldusethecom.amazon.soap.axispackageforthispurpose.

SeeAlso

TheAWSSDKhttp://www.amazon.com/gp/aws/download_sdk.html/002-2688331-0628046;ApacheAxis:http://ws.apache.org/axis/;theAmazonWebServicesWSDLfile:http://soap.amazon.com/schemas3/AmazonWebServices.wsdl.

Page 1155: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe27.6CreatingaJavaBeantoConnectwithAmazon

Problem

YouwanttocreateaJavaBeanasatypeofAmazonsearchutilityclass.

Solution

SetupyourAmazonAPIasdescribedinRecipe27.5,thencodeaJavaBeanthatusesthecom.amazon.soap.axispackagefromthisAPI.

Discussion

TheJavaBeaninExample27-5,namedAmazonBean,importsthecom.amazon.soap.axispackage.Thispackageisstoredinamazonapi.jar,which(generatedbyRecipe27.5).StoretheJARinthewebapplication'sWEB-INF/libdirectoryandtheAmazonBeaninWEB-INF/classes(oralsoinaJARinWEB-INF/lib).

Example27-5connectswithAmazoninitsgetSearchResults()method.TheAmazonBeanformatsanddisplaysthesearchresultsinstructureResults().Thecodecommentsdescribewhat'sgoingonindetail.

Example27-5.AJavaBeanclassthatsearchesAmazon

packagecom.jspservletcookbook;

Page 1156: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

importjava.net.URL;

importcom.amazon.soap.axis.*;

publicclassAmazonBean{

//Thedeveloper'stoken

privatefinalstaticStringAMAZON_KEY="DCJEAVDSXVPUD";

//NOTE:AWSVersion3uses"http://xml.amazon.com/xml3"

privatefinalstaticStringEND_POINT=

"http://soap.amazon.com/onca/soap";

privatefinalstaticStringAMAZON_TAG="webservices-20";

privateURLendpointUrl;

privateStringlineSep="\n";

privateStringtotalResults;

privateStringkeyword;

privateStringpage;

privateStringtype;

privateStringmode;

publicAmazonBean(){}//no-argumentsconstructorrequiredforabean

//aneasywaytotestthebeanoutsideofaservlet

publicstaticvoidmain(String[]args)throwsException{

AmazonBeanbean=newAmazonBean();

bean.setKeyword("Lance%20Armstrong");

bean.setType("heavy");

bean.setMode("books");

bean.setPage("1");

Page 1157: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

System.out.println(bean.getSearchResults());

}

//StructurethesearchresultasaString

publicStringstructureResult(ProductInfoinfo){

//AmazonsearchesreturnProductInfoobjects,which

//containsarrayofDetailsobject.ADetailsobject

//representsanindividualsearchresult

Details[]details=info.getDetails();

Stringresults="";

//eachfoundbookincludesanarrayofauthorsinitsDetails

String[]authors=null;

StringusedP=null;//UsedPriceobject

Stringrank=null;//SalesRankobject

//foreachreturnedsearchitem...

for(inti=0;i<details.length;i++){

if(mode!=null&&mode.equals("books")){

authors=details[i].getAuthors();}

//Includetheproductname

results+=

"<strong>"+(i+1)+".Productname:</strong>"+

details[i].getProductName()+lineSep;

//Iftheyarebooksincludeeachauthor'sname

if(mode!=null&&mode.equals("books")){

for(intj=0;j<authors.length;j++){

results+="Authorname"+(j+1)+":"+authors[j]+

lineSep;

Page 1158: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

}//for

}//if

usedP=details[i].getUsedPrice();//gettheusedprice

rank=details[i].getSalesRank();//getthesalesrank

results+="Salesrank:"+(rank==null?"N/A":rank)+

lineSep+"Listprice:"+details[i].getListPrice()+lineSep+

"Ourprice:"+details[i].getOurPrice()+lineSep+

"Usedprice:"+(usedP==null?"N/A":usedP)+lineSep+

lineSep;

}

returnresults;

}//structureResult

//ConnectwithAmazonWebServicesthencallstructureResult()

publicStringgetSearchResults()throwsException{

endpointUrl=newURL(END_POINT);

AmazonSearchServicewebService=newAmazonSearchServiceLocator();

//ConnecttotheAWSendpoint

AmazonSearchPortport=webService.getAmazonSearchPort(endpointUrl);

KeywordRequestrequest=getKeywordRequest();

//Returnresultsofthesearch

ProductInfoprodInfo=port.keywordSearchRequest(request);

//SettotalResultswithanyprovidedresultstotal

setTotalResults(prodInfo.getTotalResults());

//Makesurethebook-searchresultsarestructuredanddisplayed

returnstructureResult(prodInfo);

}//getSearchResults

Page 1159: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

//Setterandgettermethods...

publicvoidsetLineSep(StringlineSep){

this.lineSep=lineSep;

}

publicStringgetLineSep(){

returnlineSep;

}

//AKeywordRequestobjectinitializedwithsearchterms,themode,the

//numberofpagestobereturned,thetype('lite'or'heavy'),andthe

//developer'stoken.

publicKeywordRequestgetKeywordRequest(){

KeywordRequestrequest=newKeywordRequest();

request.setKeyword(keyword);//thesearchterms

request.setMode(mode);//themode,asin'books'

request.setPage(page);//thenumberofpagestoreturn

request.setType(type);//thetype,'lite'or'heavy'

request.setDevtag(AMAZON_KEY);//developer'stoken

request.setTag(AMAZON_TAG);//thetag,'webservices-20'

returnrequest;

}

publicvoidsetKeyword(Stringkeyword){

this.keyword=keyword;

}

publicStringgetKeyword(){

returnkeyword;

}

publicvoidsetMode(Stringmode){

this.mode=mode;

}

Page 1160: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

publicStringgetMode(){

returnmode;

}

publicvoidsetPage(Stringpage){

this.page=page;

}

publicStringgetPage(){

returnpage;

}

publicvoidsetType(Stringtype){

this.type=type;

}

publicStringgetType(){

returntype;

}

publicvoidsetTotalResults(Stringresults){

totalResults=results;

}

publicStringgetTotalResults(){

returntotalResults;

}

}//AmazonBean

Thebeanhasamain()methodthatallowsyoutotestthebeanfromthecommandline.Hereiscodefromthatmethodthatcreatesabeaninstance,searchesforabookusingthesearchterms"LanceArmstrong,"anddisplayssomeresults:

AmazonBeanbean=newAmazonBean();

bean.setKeyword("Lance%20Armstrong");

bean.setType("heavy");

Page 1161: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

bean.setMode("books");

bean.setPage("1");

System.out.println(bean.getSearchResults());

Torunthebeanfromacommandline,makesureincludeallofthenecessaryAxis-relatedlibrariesonyourclasspath(seeRecipe27.5).Thefollowingcommandlinerunsthebeantotestit.Notethatthiscommandlineincludestheamazonapi.jarfilegeneratedbyRecipe27.5:

java-cp.;jaxrpc.jar;axis.jar;amazonapi.jar;commons-logging.jar;commons-discovery.

jar;saaj.jarcom.jspservletcookbook.AmazonBean

Ifyousetthetypeoptiontoheavy(asopposedtolite),thenthesearchreturnsthebook'ssalesrankatAmazon.TheliteSOAPresponsesdonotincludeavalueforsalesrank.

SeeAlso

TheAWSSDKhttp://www.amazon.com/gp/aws/download_sdk.html/002-2688331-0628046;Recipe27.7onusingaservletandaJavaBeantoconnectwithAWS.

Page 1162: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe27.7UsingaServlettoConnectwithAmazon

Problem

YouwanttoconnectwithAWSusingaservlet.

Solution

UseaspeciallydesignedJavaBeantopeformtheAWS-relatedtasks.

Discussion

Example27-6usesthesamedesignthattheGooglerecipesused,soyoushouldfindthisservletcodeveryfamiliarifyouhaveworkedthroughthoseexamplesbefore.TheservletgeneratesanHTMLforminresponsetoaGETHTTPrequest,whichsendstheAmazonsearchtermsbacktothesameservlet.TheinterestingactiontakesplaceinthedoPost()method,wheretheservletusesanAmazonBeanclass(fromRecipe27.6)toconnectwithAWSanddisplayanysearchresults.

Example27-6.AservletusesaJavaBeantoconnectwithAWS

packagecom.jspservletcookbook;

importjava.io.IOException;

importjava.io.PrintWriter;

Page 1163: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

importjavax.servlet.*;

importjavax.servlet.http.*;

publicclassAmazonServletextendsHttpServlet{

publicvoiddoGet(HttpServletRequestrequest,

HttpServletResponseresponse)

throwsServletException,java.io.IOException{

//settheMIMEtypeoftheresponse,"text/html"

response.setContentType("text/html");

java.io.PrintWriterout=response.getWriter();

//BeginassemblingtheHTMLcontent

out.println("<html><head>");

out.println(

"<title>InitiateanAmazonBookSearch</title></head><body>");

out.println("<h2>PleaseenteryourAmazonsearchterms</h2>");

//DisplayanHTMLformthatsendstherequestbacktothis

//'/amazonservlet'whichwillcausethecallingofdoPost()

//makesuremethod="POST"sothattheservletservicemethod

//callsdoPostintheresponsetothisformsubmit

out.println(

"<formmethod=\"POST\"action=\""+request.getContextPath()+

"/amazonservlet\">");

out.println("<tableborder=\"0\"><tr><tdvalign=\"top\">");

out.println("Searchterms:</td><tdvalign=\"top\">");

out.println("<inputtype=\"text\"name=\"query\"size=\"15\">");

out.println("</td></tr>");

out.println("<tr><tdvalign=\"top\">");

out.println(

Page 1164: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

"<inputtype=\"submit\"value=\"SubmitInfo\"></td></tr>");

out.println("</table></form>");

out.println("</body></html>");

}//doGet

publicvoiddoPost(HttpServletRequestrequest,

HttpServletResponseresponse)

throwsServletException,java.io.IOException{

Stringquery=request.getParameter("query");

booleanisValid=(query==null||query.length()<1)?

false:true;

response.setContentType("text/html");

java.io.PrintWriterout=response.getWriter();

out.println("<html><head>");

out.println("<title>Amazonbookresults</title></head><body>");

if(!isValid){

out.println(

"<h2>Sorry,thequeryparameterwaseitheremptyornull</h2>");

}else{

AmazonBeanamBean=newAmazonBean();

amBean.setKeyword(query);

amBean.setType("lite");

amBean.setMode("books");

amBean.setPage("1");

amBean.setLineSep("<br/>");

out.println("<h2>Hereareyoursearchresults</h2>");

try{

out.println(amBean.getSearchResults());

}catch(Exceptione){

out.println(

Page 1165: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

"Thesearchtermseitherreturnedzeroresults"+

"orwereinvalid.");

}

}

out.println("</body></html>");

}//doPost

}//AmazonServlet

Tokeepthecodesimple,limitthekeywordsearchtobooks.AWSoffersacomprehensivemethodofsearchingitsseveralcatalogs,however,withtheAPInotlimitedtokeywordsearchesofbooks.Forexample,theproductmodesincludeDVD,electronics,music,hardware,software,andtoys.Youcanalsoinitiateseveraldifferentsearchtypes(inadditiontokeywords),suchasAmazonStandardItemNumber(ASIN)searches.

Figure27-3showsthereturnvalueoftheservlet'sdoGet()method.

Figure27-3.Aservlet'sHTMLformacceptsAmazonsearchterms

Figure27-4showspartsoftheservlet'sdisplayedresultsthatarehandledbytheservlet'sdoPost()method.

Page 1166: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Figure27-4.TheresultsofanAmazonbooksearch

OnceyouhavedownloadedandunpackedtheAWSSDK,thesoftwaredocumentationislocatedat:AmazonWebServices/APIGuide/index.html.

TohelpdebugyourAWSsearchesandservlets,youcaninitiateanAWSsearchusingaUniformResourceLocator(URL)inyourbrowser.ThefollowingURLinitiatesakeywordseachforabookusingtheterms"BritishEmpire."

http://xml.amazon.com/onca/xml?v=1.0&t=webservices-20&

dev-t=DCJEAVXSDVPUD&KeywordSearch=British%20Empire&mode=books&

Page 1167: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

type=lite&page=1&f=xml

AnrequestforthisURLreturnsanXMLfilethatlookssimilartoExample27-1.Thesalesrankreads"N/A"becausethesearchoptiontype=litereturnsanullvalueforthisranking.Usetype=heavytogetavaluefortheAmazonsalesrank.

SeeAlso

TheAWSSDKhttp://www.amazon.com/gp/aws/download_sdk.html/002-2688331-0628046;WebServicesEssentials(O'Reilly);Recipe3.1onmappingaservlettoanameinweb.xml;Recipe27.8onusingaJSPandaJavaBeantoconnectwithAWS.

Page 1168: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Recipe27.8UsingaJSPtoConnectwithAmazon

Problem

YouwanttoconnectwithAWSusingaJSP.

Solution

Usethejsp:useBeanstandardactiontocreateaninstanceoftheAmazonBeanfromRecipe27.6.UsethisinstancetomanagetheAWSsearchandresults.

Discussion

ThisrecipeusesthesamestrategyastheJSPinRecipe27.4:createaJavaBeaninstancethathandlestheAWSsearchanddisplaysthesearchresults.Thejsp:useBeanstandardactioncreatesaninstanceofcom.jspservletcookbook.AmazonBean,whichislocatedinWEB-INF/classes.

Thenthecodeusesjsp:setPropertytosetsomesearchoptions,beforetheJSPusesjsp:getPropertytolaunchtheseach.Example27-7usestheJSTLtagc:catchtocatchanyexceptionsthrownbytheAmazonBean'sgetSearchResults()method.ThevariableexceptisofthetypeThrowable,anditserrormessageisdisplayedbythec:outtagifthesearchqueryisinvalid.TheJSPinExample27-7displaystheHTMLformandsearchresultsshowninFiguresFigure27-3andFigure27-4.

Page 1169: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Thisjsp:getPropertycodeistheequivalentofcallingtheAmazonBean'sgetSearchResults()method,whichreturnsaStringofformattedsearchresults.

Example27-7.AJSPlaunchesanAWSbooksearch

<%@tagliburi="http://java.sun.com/jstl/core"prefix="c"%>

<html>

<head><title>SearchAmazon.comforaBook</title></head>

<body>

<c:choose>

<c:whentest="${emptyparam.keyword}">

<h2>PleaseenteryourAmazonsearchterms...</h2>

<%--DisplaytheHTMLform...--%>

<formmethod="POST"action=

'<c:outvalue="${pageContext.request.contextPath}"/>/amazon.jsp'>

<%--formandtabletags...--%>

<tableborder="0"><tr><tdvalign="top">

Searchterms:</td><tdvalign="top">

<inputtype="text"name="keyword"size="15">

</td></tr><tr><tdvalign="top">

<tr><tdvalign="top">

<inputtype="submit"value="SubmitInfo"></td></tr>

</table></form>

</body></html>

Page 1170: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

</c:when>

<c:otherwise>

<jsp:useBeanid="aBean"class="com.jspservletcookbook.AmazonBean"/>

<jsp:setPropertyname="aBean"property="keyword"param="keyword"/>

<jsp:setPropertyname="aBean"property="mode"value="books"/>

<jsp:setPropertyname="aBean"property="page"value="1"/>

<jsp:setPropertyname="aBean"property="type"value="lite"/>

<jsp:setPropertyname="aBean"property="lineSep"value="<br/>"/>

<h2>Hereareyoursearchresults</h2>

<c:catchvar="excep">

<%--Nowdisplayanyresultsofthesearch--%>

<jsp:getPropertyname="aBean"property="searchResults"/>

</c:catch>

<%--Printanyerrormessages,suchas'BadRequest'ifthesearch

termsaremeaningless--%>

<c:outvalue="${excep.message}"/>

</c:choose>

</body>

</html>

SeeAlso

TheAWSSDK:http://www.amazon.com/gp/aws/download_sdk.html/002-2688331-0628046;WebServicesEssentials(O'Reilly);Recipe27.7onusingaservletandaJavaBeantoconnectwithAWS;Chapter23on

Page 1171: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

usingtheJSTL.

Page 1172: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Colophon

Ourlookistheresultofreadercomments,ourownexperimentation,andfeedbackfromdistributionchannels.Distinctivecoverscomplementourdistinctiveapproachtotechnicaltopics,breathingpersonalityandlifeintopotentiallydrysubjects.

TheanimalonthecoverofJavaServletandJSPCookbookisafennecfox(Fennecuszerda),alsoknownasthedesertfox.FennesfoxesliveinaridsandyregionsofnorthernAfrica,theSahara,theSinaiPeninsulaandArabiaandareoneofthetiniestmembersofthecaninefamily(eightinchesatthetallestandusuallylessthanafootlong).Theirrelativelyhugeearsandbeadyblackeyesgivethemadistinctiveappearance.Thefennecfox'sbushytailischaracteristicofmostfoxes,andathickcreamycoatcamouflagesthemintheirsandyhabitat.

Fennecfoxesliveinburrowsandarenocturnalhunters,eatingplants,smallrodents,birdsandtheireggs,lizards,andinsects.Theirhearingissoacutethattheycanheareventhesmallestofpreywalkingacrossdesertsand.Thesefoxesoftenstalktheirpreyandpounceuponit;theirverticalleapistwofeethighandtheycanjumpfourfeethorizontallyfromastandingposition,astoundingfeatsforananimalofsuchsmallstature.Theyarerapidandprolificdiggers,knownfor"disappearing"intosandwhileappearingtostandstill.Somereportsnotethatthisspeciescandiga20-foot-longtunnelinonenight!

Thefennecfoxisnotlistedasendangered,butisnowconsideredrareinsomeareaswhereitwasoncecommon.Theyhavebeenhuntedextensivelyandaresometimestakenfromthewildforthepettrade.

PhilipDanglerwastheproductioneditorandcopyeditorforJavaServletandJSPCookbook.SarahShermanandMattHutchinsonweretheproofreaders.RegAubryandMaryAnneWeeksMayoprovidedqualitycontrol.EllenTroutmanZaigwrotetheindex.

EmmaColbydesignedthecoverofthisbook,basedonaseriesdesignbyEdieFreedman.Thecoverimageisa19th-centuryengravingfromAnimateCreations,VolumeOne.EmmaColbyproducedthecoverlayout

Page 1173: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

withQuarkXPress4.1usingAdobe'sITCGaramondfont.

MelanieWangdesignedtheinteriorlayout,basedonaseriesdesignbyDavidFutato.ThisbookwasconvertedJulieHawkstoFrameMaker5.5.6withaformatconversiontoolcreatedbyErikRay,JasonMcIntosh,NeilWalls,andMikeSierrathatusesPerlandXMLtechnologies.ThetextfontisLinotypeBirka,theheadingfontisAdobeMyriadCondensed,andthecodefontisLucasFont'sTheSansMonoCondensed.TheillustrationsthatappearinthebookwereproducedbyRobertRomanoandJessamynReadusingMacromediaFreeHand9andAdobePhotoshop6.ThetipandwarningiconsweredrawnbyChristopherBing.ThiscolophonwaswrittenbyPhilipDangler.

TheonlineeditionofthisbookwascreatedbytheSafariproductiongroup(JohnChodacki,BeckiMaisch,andMadeleineNewell)usingasetofFrame-to-XMLconversionandcleanuptoolswrittenandmaintainedbyErikRay,BennSalter,JohnChodacki,andJeffLiggett.

Page 1174: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

[TeamLiB][SYMBOL][A][B][C][D][E][F][G][H][I][J][K][L][M][N][O][P][Q][R][S][T][U][V][W][X]

[TeamLiB]

Page 1175: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

[TeamLiB][SYMBOL][A][B][C][D][E][F][G][H][I][J][K][L][M][N][O][P][Q][R][S][T][U][V][W][X]

${}ELexpressiondelimitersdereferencingvariableandpropertyvaluesencapsulatingfunctioncallwithin%inconversionpatterns<!---->,inTomcatserver.xmlfilecomments<%%>,inJSPscriptlets<%----%>inJSPcomments<%@syntax,JSPdirectives2nd*(asterisk)**patterninAntelements,forzeroormoredirectories2ndwildcardcharacterinURLpatterns.(dot)inattributenamesspecifyingcurrentdirectory.(dot)operator.jspfiles.jspxfiles2nd3rd.swffileextension2nd/(forwardslash)/*inURLpatternsforcontrollerservlet2ndforinvokerservletoverridenbycontrollerservletinURLpatterns2ndexcludingfromextensionmapping401UnauthorizedHTTPstatuscode403ForbiddenHTTPstatuscode404NotFoundHTTPstatuscode500InternalServerErrorHTTPstatuscode

[TeamLiB]

Page 1176: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

[TeamLiB][SYMBOL][A][B][C][D][E][F][G][H][I][J][K][L][M][N][O][P][Q][R][S][T][U][V][W][X]

abort()(LoginModule)actionsinJSPscreatedasXMLfilesactivation.jararchiveActiveXcontrol,FlashfileembeddedinJSPbyInternetExploreraddCookie()(HttpServletResponse)addresses,email2ndAdministrationconsole(WebLogic)configuringJNDIresourceviewingJNDItreeAdobeSystem'sSVGViewerapplicationaliasestoservlets,creatinginweb.xmlfilealready.deployedproperty(Ant,build.xmlfile)AmazonWebServicesconnectingtowithaJSPconnectingtowithaservletcreatingJavaBeantoconnectwithsettingupSOAPresponsetokeywordsearchrequestAnttoolbuild.xmlfilecompilingandcreatingWARfileswithcompilingservletclassescompilingservletwithbuildfilecreatingJARfilesdeployingservletonWebLogicServer7.0deployingsingleservletonTomcatdeployingwebapplicationonTomcatbuild.propertiesfile(example)build.xmlfile(example)stepsinprocessdeployingwebapplicationonWebLogicServer7.0global.propertiesfileobtainingandsettingupdownloadingbinaryorsourcedistributionJAXP-compliantXMLparseronlinemanualforstartingTomcatapplicationwithstoppingTomcatapplicationwithtargets,usingbuild.xmlfile,executingexecutingseveraltargetsinspecifiedsequenceTomcatJARfiles,includinginAntclasspathWARfiles,creatingANT_HOMEenvironmentvariableantcallelementantcalltaskApacheAnt[SeeAnttool]Xerces2XMLparserApacheJakartaProjectlog4jdistribution,downloadingfromreferenceimplementation(RI)fortheJSTL

Page 1177: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Standard1.0taglibApacheSoftwareFoundation,Log4jlibraryApacheSoftwareLicenseappBasedirectory(Tomcat,server.xmlfile)appendersaddingtorootloggerConsoleAppenderinheritanceoflayoutspecificationrollingfileappenderusingapatternwithAppleComputer'sQuickTimemoviesapplettags(HTML)appletsembeddinginJSPswithHTMLConvertertoolembeddinginJSPswithjsp:pluginexample(SunMicrosystems)applicationeventlistenersapplicationimplicitobject2ndapplicationname(webapplications)applicationscope2ndbindinganobjecttoapplicationserversBEAWebLogic,recipesinthisbookforapplicationScopeJSTLimplicitobjectArithmeticExceptionclassarrayofcookies2ndarraysGoogleSearchResultElementarrayiteratingoverwithc:forEachtagofSortedMaps,iteratingoverattachments,emailaddingtoanemailinaservlethandlingforemailreceivedinaservletattributedirective2ndattributeAdded()(HttpSessionAttributeListener)attributeRemoved()(HttpSessionAttributeListener)attributeReplaced()(HttpSessionAttributeListener)attributescookiescustomloggingtagdefinitionofJSPscopedattribute,settingtovalueofformpapameterobject,namingconventionforServletContext,settinginJSPsServletContext,settinginservletsobjectthatservletbindstoServletContextservletthatbindsobjecttoServletContextattributionforuseofcodeexamplesaudiofilesembeddinginJSPssendingasMP3filesauth-constraintelement(web.xml)rolesinauth-methodelement(web.xml)form-basedauthentication

Page 1178: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

valuesforauthentication2ndauthorizationvs.BASICauthentication,usewithwebapplicationsonTomcatcreatingusernamesandpasswordswithTomcatform-basedloggingoutuserJAASconfigurationfile,creatingJAAS,usinginaJSPJAAS,usinginaservletLoginModule,creatingwithJAASSSL,settinguponTomcatauthorization[SeealsoJAAS]authenticationvs.availabletask(Ant,build.xmlfile)

[TeamLiB]

Page 1179: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

[TeamLiB][SYMBOL][A][B][C][D][E][F][G][H][I][J][K][L][M][N][O][P][Q][R][S][T][U][V][W][X]

backgroundsoundtrack,embeddinginaJSPBase64content-encodingmechanismbasedirattributeAntjartaskAntprojectelementBASICauthenticationform-basedauthentication,usingwithusingwithwebapplicationsonTomcatweb.xmlelementsforinitiationofBasicConfiguratorclassbatchfile,forprecompilingJSPswithTomcatBEAWebLogic[SeeWebLogic]binarydataPDFfile,sendingaswordprocessingfile,sendingasXMLfile,sendingasbindingobjectslisteningforbindingorunbindingofsessionobjectsSessionobject,toWebLogicJNDIimplementationtotheServletContextwithaJSPwithaservletblockingfiltersIPaddresses,blockingrequestsfromrequests,optionallyblockingbodytags(HTML)BodyPartclass2nd3rdBodyTagSupportclass2ndboundarypatternseparatingfilesinHTTPuploadrequestsbrowserwindows,creatingwithJavaScriptinaJSPinaservletbrowserscookiessupportedbydetectingMIMEtypeforembeddedMP3fileandactivatinghelperapplicationtoplaymusicdisplayingXMLfilesinreadableformatembeddingFlashfileinaJSPJavaScriptinviewerapplicationsforSVGfilesBufferedInputStreamclassbuilddirectoryinclusionofnesteddirectoriesinWARfilewithAntwartaskbuildfiles(Ant)command-linesequenceforexecutingcompilingservletwithdeployingwebapplication(example)editedtodeployonWebLogic7.0executingseveraltargetsinspecifiedsequencefunctionsofimportingbuild.propertiesfileintoJSPparsing,usingJSTLXMLtagsnamesotherthanbuild.xml

Page 1180: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

TomcatManagerapplication,usingfromtransformingintoHTML,usingXSLstylesheetwl.propertiesforWebLogicAntfilebuild.propertiesfile(Ant)deployingwebapplicationonWebLogicServer7.0build.xmlfile[Seebuildfiles]Builder(WebLogic)

[TeamLiB]

Page 1181: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

[TeamLiB][SYMBOL][A][B][C][D][E][F][G][H][I][J][K][L][M][N][O][P][Q][R][S][T][U][V][W][X]

Clanguage,printffunctionc:choosetagc:forEachtag2ndinterationsperformedbyiteratingovermapvaluesiteratingthroughaMap'sstoredrequestheadersc:iftagtestingexpressionsforconditionalcodeexecutionuseinaJSP(example)c:importtagimportingAntbuildfileintoJSPincludingJavaScriptmoduleinaJSPJavaScriptmodule,importingintoaJSPusebyJSPtoaccessforbiddenresourcec:otherwisetagc:outtag2nd3rddisplayingaJavaBean'spropertiesdisplayingforminputviaaJavaBeandisplayingindividualparametervaluesescapedcharactersexceptioninformation,displayingforJSPpassingvalueofrequest_uriattributetosummaryoffunctionsuseinaJSP(example)c:paramtags,includingparametervaluesinJSPc:settagbindinganobjecttoapplicationscopesettingvariabletosessionscopesummaryoffunctionsc:whentagCallableStatementclassexecuteUpdate()servletusingtocallstoredprocedureCallbackHandlerclass2nd3rdcallbacksclassforsiftingthroughwebpagesdefinitionofParserDelegator,usingwithcasesensitivityurlpatterninservlet-mappingelementsusernamesandpasswordsintomcat-users.xmlfilecastingrequestparametersServletRequesttypetoHttpServletRequestCauchoResin(servletengine)cbck:log(customJSPtag)2ndCDATAsectionsinXMLfiles,usingtopasswell-formedtestCGI(CommonGatewayInterface)characterentitycodes2ndescapedcharactersinc:outtaglistingofCheckEmailfunction,JavaScript

Page 1182: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

classesJavaServerPageimplementationclassservlet2ndservlet-classelementinweb.xmlclassesdirectory2ndlog4j.propertiesfilespecifyingclasseswithAntwartaskTLDsandWebLogic7.0server,pastingservletclassintoclasseselement(Ant)classictaghandlerscreatingforacustomactioncreatingJSP1.2TLDforcreatingJSP2.0TLDforclasspathelement(Ant)nestedinsidethejavactaskCLASSPATHenvironmentvariable,precompilingJSPsandclasspathsAntclasspaththatincludesTomcatJARfilesemail-relatedclasses,placingoninbuild.xmlfile,forJARfilesinTomcatdirectoriesuser,representedbyCLASSPATHenvironmentvariableWLCLASSPATHenvironmentvariableclientauthentication[Seeauthentication]clientrequestscountingforwebapplicationexaminingHTTPrequestheadersinaJSPexaminingHTTPrequestheadersinaservletfilter,usingtoalterrequestheadersrefreshingaJSPautomaticallyrefreshingaservletautomaticallyclientstateClockclass(exampleapplet)referenceto,embeddedbyJSPclose()InitialContextclassPrintWriterclassclosingdatabaseconnections2ndcodeexamplesinthisbook,useofCollectionsclass,synchronizedMap()com.oreilly.servletlibraryclassesforfileuploadsLocaleNegotiatorclassMultipartFilterclasscom.oreilly.servlet.multipartpackagecommentattribute(cookies)commentsJSPuncommentingConnectorelementinTomcatserver.xmlcommercialservletenginescommit()Connectionclass2ndLoginModuleclassCommonGatewayInterface(CGI)compilingservlets2nd[SeealsoprecompilingJSPs]Anttool,using

Page 1183: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

PATHenvironmentvariableforjavacwithAntbuildfileconfigure()(BasicConfigurator)configure()(PropertyConfigurator)specifyingnameoflog4j.propertiesfileConnectionclasscommit()2ndgetMetaData()getTransactionIsolation()listingofisolationlevelsrollback()2ndsetAutoCommit()connections,databasecreatingconnectionpoolwithWebLogicConsoleDataSourceasfactoryforopeningandclosingservletusingWebLogicconnectionpoolConnectorelement(server.xml)ConsoleAppenderclasscontainer-managedsecuritycontent[Seealsodynamicallyincludingcontent;staticcontent]non-HTML,sendingaudiofilesPDFfilesviewinginternalresourcesinaservletwordprocessingfilesXMLfilescontenttypesemail2ndMultipartmultipart/form-dataContent-Dispositionheader2ndContent-LengthheaderContent-Typeheaderapplication/mswordMIMEtypescontentTypeattribute(jspdirective.pageelement)contextdefault,forservletsincludingJSPfile,importingcontentfromoutsideContextelement(Tomcatserver.xmlfile)2ndcontextpathforwebapplicationpathattributeofContextelement(Tomcat)context-paramelement(web.xml)cookieage,valuesfordataSourceparameterthatconnectswithadatabaseinternationalizationresourcesJSPthatopenspop-upwindowlocalizationcontext,setting2ndprovidingpathforanincludedfileinaJSPcontext-relativepathcontextDestroyed()(ServletContextListener)contextInitialized(ServletContextListener)ContextObjectclass(example)controllerservlet

Page 1184: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

exclusiveaccesstocertainservlets,settingupmappingallrequeststowhilepreservingallservletmappingsconversionofaJSPintoaservletconversionpatterns,layoutofloggedmessagesconversionspecifiersinpatternlanguageCookieclassgetName()andgetValue()2ndgetPath()getterandsettermethodsforattributessetMaxAge()2ndargumentvalueofzerosetValue()cookieimplicitobject(JSTL)2ndCookierequestheadercookies2ndaccessingwithELdefinitionofdeletionbyusersdisabledbyusersname/valuepairoptionalattribute/valuepairsoverwritingorremovingexistingcookiesreadingvalueswithaJSPreadingvalueswithaservletsessiontracking,useindisabledcookiessettingwithaJSPsettingwithaservletstoringrequestcookiesinanarraycopytask(Ant)Copyrightservlet(example)CoreJ2EEBlueprintswebpageCorel'sSVGViewercos.jarfilecountrycodes(ISO)2ndcreate-jartarget(Ant)create-wartarget(Ant,build.xmlfile)CreateWindowfunction,JavaScriptcreatingnewbrowserwindowinaservletcreationtimeforsessionstrackingwithJSPstrackingwithservletscurrencies,formattingforlocalesinaJSPinaservletcustomactions2nd[Seealsocustomtags]JSPusingtoaccesslog4jcustomtags2nd3rdassociatedwithatagfile,usingcbck:logtaglogginglevelconfigurationfile,includingyourowncreatingclassictaghandlerforcreatingJSP1.2TLDforclassictaghandlercreatingJSP2.0TLDforclassictaghandlercreatingTLDforasimpletaghandler

Page 1185: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

functioncallsembeddedintemplatetexthandlingexceptionsincustomtagclassJSPtagfile,creatinglistenerclass,addingtotaglibrarypackagingataglibraryinawebapplicationpackagingJSPtagfileinaJARpackagingtaglibraryinaJARfilesimpletaghandler,creatingsimpletaghandler,usinginaJSPtagfile,packaginginwebapplicationtagthatuseslog4jTLDforcustomloggertagusinginaJSP

[TeamLiB]

Page 1186: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

[TeamLiB][SYMBOL][A][B][C][D][E][F][G][H][I][J][K][L][M][N][O][P][Q][R][S][T][U][V][W][X]

DatabaseMetaDatainterfacedatabasesaccessingfromservletwithoutDataSourceconfigurationcallingstoredprocedurefromaJSPconfiguringDataSourceinTomcatconvertingResultSettoResultobjectcreatingDataSourceonWebLogicDataSource,usinginservletwithTomcatexecutingseveralSQLstatementsinonetransactioninteractingwithbyconfiguringDataSourceinweb.xmlJNDIlookup,usingtoaccessaWebLogicDataSourceJSTLtagsthatinteractwithResultSetinformation,findingoutstoredprocedure,callingfromaservlettransactions,usingwithJSPsWebLogicDataSource,usinginaJSPDataHandlerclassDataSourceconfigurationinweb.xmlconfiguringforservletinTomcatconfiguringinweb.xmlforSQLJSTLtagscreatingDataSourceobjectonWebLogicconfiguration,stepsinexplicitlysettingforJSTLSQLtagsinaJSPgetConnection()2ndJNDI,accessingwithusinginservletwithTomcatWebLogicDataSource,usinginaJSPDataSourceLoginModule2ndDateclass,getTime()DateFormatclass2ndformat()getDateTimeInstance()datesandtimescreationandlast-accessedtimeforsessionstrackingwithJSPstrackingwithservletsexpirationforcookiesformattingdatesaccordingtorequestlocaleinaJSPinaservletformattingwithJSTLtagscurrentdateinSwissandU.S.stylefmt:formatDatetag,attributesofJSPthatdisplayscurrentlog4jdateformatterofloggingactivitydateStyleandtimeStyleattributes(fmt:formatDate)Davidson,JamesDuncanDEBUGlevellogging2ndinrootloggerdeclarativesecurity

Page 1187: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

defaultattribute(Antprojectelement)DefaultFileRenamePolicyclassfile-uploadingJavaBean,useindeletingacookiedependsattribute(Anttargetelements)deploy-applicationtarget(Ant,build.xmlfile)editedtodeployonWebLogic7.0deploy-servlettarget(Ant,build.xmlfile)2ndDeployerutility(WebLogic)deployingservletsandJSPsdeployingaspartofTomcat'sContextelementinserver.xmlfileindividualJSP,deployingonTomcatindividualJSP,deployingonWebLogicindividualservlet,deployingonTomcatAnttool,usingstepsinprocessindividualservlet,deployingonWebLogicServer7.0Antfile,usingeditingweb.xmlfiletoregisterservletredeployingwebapplicationwebapplication,deployingonTomcatAntbuildfile,usingwebapplication,deployingonWebLogicusingAnttoolusingWebLogicAdministrationConsoleusingWebLogicBuilderusingweblogic.Deployercommand-lineutilitydeploymentdescriptors[Seealsoweb.xmlfile]creatingforservletAPI2.3servletAPI2.4web.xmlfilecontentsEJBvendor-specific(weblogic-ejb-jar.xml)J2EE,namespaceofopeningandeditinginWebLogicBuildersecurity-relatedelementsinversionsotherthanservletv2.4storageinWEB-INFdirectorytaglibelementweb.xmlfileinWEB-INFdirectorydescriptionattribute(Anttargetelements)destfileattributeAntjartaskAntwartaskdigitalcertificate,creatingforTomcatserverdirattributesAntclasseselementAntfilesetelementsdirectives,JSPinwell-formedXMLfileXMLequivalentsfordirectories**patterninAntelements(zeroormoredirectories)2ndlocal,savingfileuploadstoURLsthatspecifyadirectoryonlydirectorystructureofwebapplications

Page 1188: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

forapplicationdeployedbyAnttoolexampleofexplodeddirectoryformatJSPfilesindirtyreaddispatcherelements(web.xml)2nddisplayMessage()AttachBeanclass(example)EmailBeanclass(example)HeaderAccessorclass(example)MailAccessorclass(example)distributedcomputing,SOAPaseasierformofdoCatch()(TryCatchFinally)docBaseattribute(Contextelement,Tomcat)DocumentTypeDefinition(DTD)inJSP1.2TLDfileJSP1.2orderforelementsinweb.xml(servlet2.3API)XMLSchemavs.doEndTag()2nddoFilter()blockingrequestscastingrequestparameterchangingservletresponsefilterusingHttpServletResponseWrapperclassFilterChainclassdoFinally()(TryCatchFinally)doGet()encodeRedirectURL,usinginFirstServletclass(example)outputdisplayedinbrowserHttpServletclassincludingcontentinJavaBean,usingtosendemailPrivacyServletclass(example),includingresourcespecifiedbyinitparameterservletaccessingdatabaseusingJDBCservletmethodtowhichfilterismappedservletusingaJavaBeantohandleemalattachmentsservletusingJavaBeantosendemaildomainattribute(cookies)doPost()FirstServletclass(example)outputdisplayedinbrowserHttpServletclassincludingcontentinPOSTHTTPrequests,respondingtotrackingauser'srefreshcountdoStartTag()2nddoTag()simpletaghandlersdownloadprogress,showingtouserDriverManagerclassDTD[SeeDocumentTypeDefinition]dynamiccontent,combiningmultimediawithinJSPsdynamicallyincludingcontentconfiguringincludedresourceinexternalfile

Page 1189: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

externalconfigurationfile,usingtoincluderesourceinaJSPimportingaresourceeachtimeservlethandlesarequestincludingcontentfromoutsideacontextinJSPincludingcontentinaJSPforeachrequestincludingXMLfragmentinJSPdocumentresourcesnestedatmultiplelevelsinservletexceptioninformation,displayingfirstinnerincludedservletouterincludingservletrequestattributes,accessbyincludedresourcessecondincludedservletresourcesthatseldomchange,includinginJSPserverperformanceand

[TeamLiB]

Page 1190: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

[TeamLiB][SYMBOL][A][B][C][D][E][F][G][H][I][J][K][L][M][N][O][P][Q][R][S][T][U][V][W][X]

EAR(EnterpriseApplicationArchive)fileechotask(Ant)EIS(EnterpriseInformationSystems)ejb-jar.xmlfilecontentsof,displayingEJBs(EnterpriseJavaBeans)accessinganEJBonWebLogicfromaservlet,usingJNDIdeploymentdescriptor(ejb-jar.xml)deploymentdescriptor,vendor-specificservlet(example)statelesssessionbean(example)EL[SeeExpressionLanguage]elements,XMLAnttasksbuild.xmlfile(Ant)Contextelement(Tomcatserver.xmlfile)inweb.xmlfileforservletAPI2.3inweb.xmlfileforservletAPI2.4orderinvalidXMLfileemailaccessingfromaservletaccessingfromaservletusingaJavaBeanaddingattachmentstoanemailinaservletJavaBeansActivationFramework(JAF)JavaMailAPIplacingclassesrelatedtoonclasspathreadingreceivedemailheadersfromaservletreceivedinaservlet,handlingattachmentsfromsendingfromaservletservletinteractionwithmailserversendingfromaservletusingaJavaBeanEmailBean(example)servletusingJavaBeantosendemailsettingemailpartswithbeanmethodsemailaddresses,validatinginforminputwithJavaScriptembedtags(HTML)2ndautomaticHTMLfilegenerationbyFlashproducedbyHTMLConverterencodeRedirectURL(HttpServletResponse)encodeURL()(HttpServletResponse)EnterpriseApplicationArchive(EAR)fileEnterpriseInformationSystems(EIS)EnterpriseJavaBeans[SeeEJBs]entitycodesforspecialcharacters2ndc:outtag,escapedcharacterslistingofentrySet()(Map)2ndEnumerationtypeERRORlevelloggingerror-pageconfigurationauthenticationfailurepage(/loginError.html)elementinweb.xmlforIOExceptions

Page 1191: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

inweb.xml,exampleofoverriddenbypagedirectivedeclarationerror-pageelement(web.xml)2ndconfiguringerrorpagesErrorDataclasserrorPageattribute(pagedirective)escapedcharacters,c:outtagescapeXmlattribute(c:outtag)EventObjectclassexamplecodefromthisbook,useofexceptionimplicitobjectexception-typeelement(web.xml)exceptionsincustomtagclasshandlinginwebapplicationscreatingerror-handlingJSPdeclaringexceptionhandlersinweb.xmldeclaringexception-handlingJSPforotherJSPsexception-handlingservletsendingerrorfromaJSPsendingerrorfromaservletthrownduringincludeoperationsexcludeelement(Ant)executeUpdate()(CallableStatement)expirationforcookiessettingsettingwithjsp:setPropertyexpiresattribute(cookies)explodeddirectoryformatExpressionLanguage(EL)callingLoginBean'sgetLoginSuccess()clientlocales,preferredandless-preferredcookieimplicitobjectcookies,accessingwithcreatinghperlinksinURLrewritingcreationtimeforsessions,fetchingdereferencingofvariableandpropertyvaluesfunctionthatcallsastoredprocedureJavaclassthatimplementsfunctionJSP,useinTLDfileforconfiguringfunctionfunctionsinJSPerrorpageinJSPusedaserrorpageintemplatetext(JSP2.0specification)JavaBeanproperties,accessingwithJSPexamplepage,useinJSTLandmapentrykey/valuepairsrequestheaders,accessingwithvalueofaparticularheaderrequestparameters,accessing2ndscopedattributes,accessingscopedvariables,accessingwithtemplatetext,usingELexpressionsdirectlyinURLforJavaScriptwindowinaJSP,gettingfromacontextparameter

Page 1192: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

ExtensibleStylesheetLanguage(XSL)ExtensibleStylesheetLanguageTransformations(XSLT)extensionmappingURLpatternsassociatingfilterwithany.jspfilemappingallreferencestoJSPpagestoasingleservletmappingstaticcontenttoaservletexternal-includeproperty

[TeamLiB]

Page 1193: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

[TeamLiB][SYMBOL][A][B][C][D][E][F][G][H][I][J][K][L][M][N][O][P][Q][R][S][T][U][V][W][X]

FATALlevelloggingfileextensionsassociatingMIMEtypeswithfileuploads[Seeuploadingfiles]FileDataSourceclassFilerConfigclassgetInitParameter()FileRenamePolicyinterfacefilesetelements(Ant)2ndnestedwithinjartasknestingmultipleinpathelementfilterelements(web.xml)2ndinit-paramchildelementFilterinterfaceactionsthatfilterscanundertakefilter-mappingelements(web.xml)2ndapplyingfiltertoaservletusingaRequestDispatcherchangingorderofmappingmultiplefilterstoaservleturl-patternnestedelementFilterChainclassdoFilter()2nd3rdFilterConfigclassgetInitParameterNames()filteringblockingIPaddresseswithchangingorderinwhichfiltersareappliedtoservletsconfiguringinitializationparametersforafilterfilterconfigurationinweb.xmlfile(servletAPI2.3)HTTPresponsesinterceptingandreadingforminputJNDIobject,accessingfromaJSPsettingobjectassessionattributemappingafiltertoaJSPmappingafiltertoaservletfilterthatlogssomeinformationmappingmultiplefilterstoaservletmonitoringsessionattributesMultipartFilterclassoptionallyblockingarequestwithafilterpassingJNDIobjecttoJSPonWebLogicrequestheaders,alteringusingfilterswithRequestDispatcherobjectsvalidatingforminputwithafilterFlashfilesembeddinginaservletHTMLtemplateforembeddinginaJSPautomaticallygeneratingwritingfmt:formatDatetagcurrentlocale,usingtoformatdatesandnumbersfmt:formatNumbertag

Page 1194: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

currentlocale,usingtoformatnumbersdisplayingcurrencyvalueforalocaledisplayingnumbersaspercentagesfmt:messagetagsfmt:setBundletagfmt:setLocaletagfn:contains()fn:length()fn:split()fn:toUpperCase()Folderclass2ndfootersegmentincludedinJSPwithjsp:includeactionformtags(HTML)actionattributeaction,methodandenctypeattributesforfileuploadsform-basedauthenticationformforusewithloggingoutuseronsystemthatusesform-login-configelementformat()DateFormatclassNumberFormatclass2ndformattingtags(JSTL)displayingdateinJSPforuserlocaledisplayingtextinJSPforrequestlocaleFORWARDvalue(dispatcherelements)forward()(RequestDispatcher)forwardingrequestscontrollerservletforwardingwithRequestDispatcher.forward()withforward()(RequestDispatcher)withgetNamedDispatcher()(ServletContext)initiatingafilterforbyobjectsimplementingRequestDispatcherinterface,withouttriggeringsecurityconstraintsfragments,JSPincludedinaservletbyusingRequestDispatchernowreferredtoasJSPsegmentsFrontControllerdesignpattern(SunMicrosystems)fullyqualifiedclassnamesinvokingregisteredservletthroughlistenerclassinlistenerclasselementobjectattributenamesandfunctioncallsembeddedinJSPcodewithJSTL2ndfunctiontagfunctionsExpressionLanguage,callingstoredprocedureJavaclassthatimplementsfunctionJSP,useinTLDfileforconfiguringfunctionJavaScriptJSTLlistingof,withpurposeofeachusinginJSPs

[TeamLiB]

Page 1195: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

[TeamLiB][SYMBOL][A][B][C][D][E][F][G][H][I][J][K][L][M][N][O][P][Q][R][S][T][U][V][W][X]

GETrequestssecurityconstraintsonservletresponsetogetAllHeaders()MessageclassPartinterfacegetAttribute()(ServletContext)getBundle()(ResourceBundle)2ndgetConnection()(DataSource)2ndgetContent()(Message)getContextPath()(HttpServletRequest)getCookies()(HttpServletRequest)2ndgetCurrencyInstance()(NumberFormat)getDateTimeInstance()(DateFormat)getDisplayName()(Locale)getFilesystemName(MultipartRequest)getFrom()(Message)getHeader()HttpServletRequestclassPartinterfacegetHeaderNames()(HttpServletRequest)getID()(HttpSession)getInitParameter()(FilterConfig)getInitParameterNames()(FilterConfig)getInputStream()PageDataclassPartinterfacegetInputStream()(PageData)getJspBody()(SimpleTagSupport)getJspContext()(SimpleTagSupport)getLastAccessedTime()(HttpSession)getLocale()(ServletRequest)getLocales()getLoginSuccess()LoginBeanclass(example)getMaxInactiveInterval()(HttpSession)getMetaData()ConnectionclassResultSetclassgetName()Cookieclass2ndHeaderclassgetNamedDispatcher()(ServletContext)getParameter()(ServletRequest)2ndhandlingposteddatagetParameterMap()HttpServletRequestclassServletRequestclass2ndhandlingposteddatagetParameterNames()(ServletRequest)getParameterValues()(ServletRequest)getPath()(Cookie)

Page 1196: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

getPercentInstance()(NumberFormat)getQueryStringHttpServletRequestclassgetQueryString()requestwrappersthatoverridegetRealPath()(ServletContext)getRemoteAddr()(HttpServletRequest)getRemoteUser()(HttpServletRequest)getRequestDispatcher()(ServletRequest)getRequestURI()(HttpServletRequest)getRequestURL()(HttpServletRequest)getResultElements()(GoogleSearchResult)getRows()(Result)getSearchResults()2ndgetServletContext()getServletRequest()(ServletRequestEvent)getSession()HttpServletRequestclass2nd3rd4thHttpSessionBindingEventclassHttpSessionEventclassgetSnippet()(GoogleSearchResultElement)getSource()(EventObject)getSummary()(GoogleSearchResultElement)getTitle()(GoogleSearchResultElement)getTransactionIsolation()(Connection)2nd3rdgetURL()(GoogleSearchResultElement)getValue()Cookieclass2ndHeaderclassHttpSessionBindingEventclassglobal.propertiesfile(Ant)exampleof2ndGoogleWebServicesconnectingtowithaJSPconnectingtowithaservletcreatingaJavaBeantoconnectwithoptionsforsearches,settingsettingupwithGoogleSearchclass(example)GoogleSearchResultclassGoogleSearchResultElementclass

[TeamLiB]

Page 1197: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

[TeamLiB][SYMBOL][A][B][C][D][E][F][G][H][I][J][K][L][M][N][O][P][Q][R][S][T][U][V][W][X]

handleMessages()EmailBeanclass(example)MailAccessorclass(example)handleStartTag()harvestingWebinformationcreatingJavaBeanasHTMLparserJavaBeanforHTMLparsingusinginaJSPusinginaservletparsingHTMLpagewithjavax.swing.textsubpackagescallbackclass(example)usingaservletHashtableclassHeaderclassheaderimplicitobject2ndheadersegmentincludedinJSPwithjsp:includeactionheadersemail,readingfromaservletHTTP[Seerequestheadersresponseheaders]headerValuesimplicitobjectheadingattribute(customtag)2ndhomeandlocalhomeinterfaces(EJBonWebLogic)Hostelement(Tomcatserver.xmlfile)2ndhrefattributeHTMLcodeforJSPthathandlesHTTPrequestsconvertingXMLfileintowithXSLstylesheeterrorpagesenttoclientfileuploadpage,preparingcomponenttoreceivefileandstoreinlocaldirectoryformtag2ndonSubmiteventhandlerheadtaginputtagJavaBeanforparsingcreatingusinginaJSPusinginaservletparsingAPIclasses,useinservletsrcattributeofscripttag,usingtoimportJavaScriptmoduletemplateforembeddingFlashfilesgeneratingautomaticallytemplateforincludingFlashfileswritingHTMLConverter(JavaPlug-in)HTMLformsaddingparameterstoquerystringusingaJSPusingaservletinterceptingandreadingforminputwithafilterpostingsubmitteddatafromaJSPservlethandlingof

Page 1198: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

FirstServletclass(example)servlet,acceptingAmazonsearchtermsettingpropertesofJavaBeantovaluesenteredinsettingscopedattributeinaJSPtovalueofaformparametersubmissiontoserver-sideprogramviaPOSTmethodvalidatinginputwithafilterfilterthatchecksvalues(example)JSPthatcontainsaform(example)HTMLtagsapplettagembedtag2ndgeneratedwithJavaPlug-inHTMLConverterforloadingappletsobjecttag2ndHTMLEditorKitclassHTTPdevelopingJSPforhandlingofrequestsGETmethod[SeeGETrequests]POSTmethod[SeePOSTrequests]requestheaders[Seerequestheaders]requestsforfileuploadingresponseheaders[Seeresponseheaders]secureconnections[SeeSecureSocketsLayer]securityconstraintsonmethodsXML-basedSOAPmessagesonHTTPresponsecodes403or404,handlingbywebcontainer500,returnedbywebcontainerintparameterofsendError()http-methodelementssecurityconstraintsforHttpClient(JakartaCommons)automatingdatapostingfromservlettootherprogramsdownloadingservletusingtopostdatatoaJSPuseinJavaBeanthatpostsdatafromJSPpagehttps://,URLsthatstartwithHttpServletclassinit(),includingcontentinservice()HttpServletRequestclasscheckingsessionexistencegetContextPath()getCookies()2ndgetHeader()getHeaderNames()getParameterMap()getQueryString()getRemoteAddr()getRemoteUser()getRequestURI()getRequestURL()getSession()2nd3rdisUserInRole()HttpServletRequestobjectsHttpServletRequestWrapperclassHttpServletResponseclass

Page 1199: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

addCookie()encodeRedirectURL()encodeURL()Refreshresponseheader,addingsendError()2ndsendRedirect()2ndHttpServletResponseobjectsHttpServletResponseWrapperclass,forusewithafilter(example)HttpSessionclassgetId()getLastAccessedTime()getMaxInactiveInterval()invalidate()removeAttribute()setAttribute()setMaxInactiveInterval()2ndHttpSessionActivationListenerinterfaceHttpSessionAttributeListenerinterfaceHttpSessionBindingEventclassgetSession()getValue()HttpSessionBindingListenerinterfaceHttpSessionEventclass,getSession()HttpSessionListenerinterfacenotificationofsessioncreationanddestructionsessionCreated()andsessionDestroyed()

[TeamLiB]

Page 1200: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

[TeamLiB][SYMBOL][A][B][C][D][E][F][G][H][I][J][K][L][M][N][O][P][Q][R][S][T][U][V][W][X]

i18n[Seeinternationalization]if/then/elsestatementsIllegalStateException,handlinginwebapplicationsimgtag(HTML)implicitobjects2nd3rdimplicitobjects,JSPsapplicationexceptionpageContext2ndresponsesessionimplicitobjects,JSTLapplicationScopecookie2nd3rdheader2ndheaderValuesinitParam2ndparam2nd3rd4threquestScope2ndsessionScope2nd3rdimportcustomactionincludedirectivechangesmadetoincludedpage,reflectioninincludingpageinJSPdocument,expansionbyXMLviewincludingseldomchangingresourceinaJSPincludingXMLfragmentinJSPdocumentjsp:includeactionvs.2ndruleofthumbforusingincludeelement(Ant)includemechanismsfordynamiccontentconfiguringincludedresourceinexternalfileexternalconfigurationfile,usingtoincluderesourceinaJSPimportingaresourceeachtimeservlethandlesarequestincludingcontentfromoutsideacontextinJSPincludingcontentinaJSPforeachrequestincludingXMLfragmentinJSPdocumentresourcesnestedatmultiplelevelsinservletexceptioninformation,displayingfirstinnerincludedservletouterincludingservletrequestattributes,accessbyincludedresourcessecondincludedservletresourcesthatseldomchange,includinginJSPINCLUDEvalue(dispatcherelements)include()(RequestDispatcher)2ndembeddingFlashinaservletincludingJavaScriptCreateWindowfunctioninaservletincludingtop-levelservletfileservletimportingJavaScriptfilevalidatingJavaScript,includinginservletincludesattribute(Antjartask)IncludeServletclass(example)

Page 1201: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

INFOlevellogginginheritancestructureinlog4j2nd3rdinittarget(Ant,build.xmlfile)2ndinit-paramelement(web.xml)specifyingincludingresourcewithtimeoutvalueforservlet,configuringURLforloadingnewwindowcreatedbyJavaScriptfunctioninaservletinitialcontextInitialContextclass2ndclose()lookup()2ndinitializationparametersconfiguringforafilterservlet,registerednameandinitialize()(LoginModule)initParamimplicitJSTLobject2ndinputtags(HTML)multiplefileuploadstype,name,andacceptattributes,forfileuploadsInputStream,XMLviewofJSPpagereturnedas2ndINSERTstatement(SQL),executinginJSPinatransactioninternalresourcesfromwebapplication,viewinginternationalization2ndclientlocale,detectinginaJSPclientlocale,detectinginaservletcreatingResourceBundleasaJavaclassdefinitionofformattingcurrenciesinaJSPformattingcurrenciesinaservletformattingdatesinaJSPformattingdatesinaservletformattingpercentagesinaJSPinaservletlocalizationcontext,settinginweb.xmlResourceBundleaspropertiesfile,creatingResourceBundle,usinginaJSPResourceBundle,usinginaservletInternetExplorerembeddingFlashfilesinwebcomponentsHTMLobjecttag,loadingappletwithlanguagepreference,setting(v.5.5)InternetAddressclass2ndinvalidate()(HttpSession)invoke()(JspFragment)invokerservletsinvokingservletsregisteredinweb.xmloverridingtodirectallrequeststocontrollerservletIOExceptionclass2ndJSPthatthrows(example)webapplications,handlinginIPaddresses,blockingrequestsfromwithafilteris-xmlelementisErrorPageattribute(pagedirective)ISO(InternationalStandardsOrganization)countrycodes2nd

Page 1202: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

languagecodesisolationlevelsfortransactionsinsql:transactiontagisUserInRole()(HttpServletRequest)iteratingovercollectionsofdatac:forEachtag,iteratingoverarrayiteratingposteddatawithJSTLIteratorclassnext()iterator()(Set)

[TeamLiB]

Page 1203: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

[TeamLiB][SYMBOL][A][B][C][D][E][F][G][H][I][J][K][L][M][N][O][P][Q][R][S][T][U][V][W][X]

J2EE(Java2EnterpriseEdition)CoreBlueprintswebpageEJBinbusinesstierJavaMailandJavaBeansActivationFramework(JAF)J2SE(Java2StandardEdition)JAAS(JavaAuthenticationandAuthorizationService)authenticatingservletclientsconfigurationfile,creatingflagvalues,listingoflocationoffileLoginModuleclassCallbackHandlerforexamplecodeonlinedocumentationusinginaJSPJAF(JavaBeansActivationFramework)2ndJakartaCommonsHttpClient[SeeHttpClient]JakartaTomcat[SeeTomcat]JAR(JavaARchive)filescreatingwithAntforJakartaCommonsHttpClientincludingTomcatJARfilesinAntclasspathlog4j.jarmail.jarandactivation.jarpackagingJSPtagfileinpackagingtaglibraryinSunMicrosystemsspecificationforWEB-INF/libdirectory,storageinjartask(Ant)2ndbasedirattributedestfileattributefileset(nested)elementincludesattributemanifestfile,creatingjartoolplacingtaglibraryinaJARfilejartool,creatingWARfileswithJasper(TomcatJSPcontainer)jasper-runtime.jarJASPER_HOMEenvironmentvariableJava2EnterpriseEdition[SeeJ2EE]JavaAPIforXMLProcessing(JAXP)2nd3rdJavaAuthenticationandAuthorizationService[SeeJAAS]javacommand-linetool,settinguserclasspathJavaDatabaseConnectivity[SeeJDBC]JavaDevelopmentKit(JDK)JavaNamingandDirectoryInterface[SeeJNDI]JavaPlug-indifferentinstalledversions,causingproblemsloadingappletsHTMLConverter,embeddingappletinaJSPJavaRuntimeEnvironment(JRE)applets,runningin

Page 1204: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

executingappletwithJavaPlug-inJavaVirtualMachine(JVM),servletsandJavaWebServicesDeveloperPack(WSDP)JavaWebServicesDeveloperPack,downloadingJAXPJava-basedwebapplicationsJAVA_HOMEenvironmentvariablesettinginAntinstallationJavaBeansaccessingemailfromaservletconfiguringasaJNDIobjectwithTomcatcookies,creatingCookieBean(example)creatingaswebpageparsercreatingtosearchAmazoncreatingtosearchGooglewebdatabasecustomizingresponsessenttoclientsemailattachments,handling(example)file-uploading(example)GooglesearchutilityclassJAASAPI,usingforauthenticationJSPdata,postingdynamicallytoanotherserver-sideprocessJSPusingtosearchgoogle.compropertiesaccessingwithELsettinginaJSPsendingemailfromaservletEmailBean(example)servletusingJavaBeantosendemailsettingofemailpartswithbeanmethodsservletusingtoconnecttoAmazonWebServicesasTomcatJNDIresourceaccessingfromaservletwebpageparserusinginaJSPusinginaservletJavaBeansActivationFramework(JAF)2nd3rdjavaccompilerbuilt-in,withSunMicrosystemsJDKjavactask(Ant)classpathelementnestedinsideofcompilingapplicationservletsintobuilddirectoryJavaMailfetchingemailmessageslistingemailheaderspropertiessetforSessionJNDIobjectSession,Store,Folder,andMessageclassesJavaScriptcreatingnewbrowserwindowinaJSPcreatingnewbrowserwindowinaservletincludingJavaScriptmodulesinaJSPincludingJavaScriptmodulesinaservletvalidatingforminputinaservletvalidatingformvaluesinaJSPJavaServerPages[SeeJSPs]JavaServerPagesStandardTagLibrary(seeJSTL)javaxsub-packagesforBEAWebLogic

Page 1205: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

javax.mailpackagejavax.mail.internetpackagejavax.namingpackage2ndjavax.servlet.jsp.tagextpackagejavax.sqlpackageJDBC(JavaDatabaseConnectivity)accessingdatabasefromservletusingJDBCcallingstoredprocedurefromaservletwithCallableStatementConnectionobjectsdatabasedriverandstoragelocation2ndDriverManagerclassjavax.sql.DataSourceobjectcreatingonWebLogiconWebLogic,usinginaJSPSQLJSTLtag,usingwithOracleclasses12.zipdriverResultSet,convertingtoResultobjectResultSetMetaDatainterfacespecification,addressfordownloadingtransactionAPIJDK(JavaDevelopmentKit)version1.1,AntsupportofJNDI(JavaNamingandDirectoryInterface)2ndconfiguringJNDIobjectinTomcatconfiguringJNDIresourceinWebLogiclookup,usingtoaccessWebLogicDataSourceTomcatJNDIresourceaccessingfromaJSPaccessingfromaservletusingAPIclassestoobtainDataSourceWebLogicJNDIresourceaccessingfromaaJSPaccessingfromaservletWebLogicJNDItreeaccessinganEJBwithforaDataSourceviewingJRE(JavaRuntimeEnvironment)applets,runninginexecutingappletwithJavaPlug-injsp-property-groupelement2ndjsp:directive.includeelementjsp:directive.pageelementaddedtoJSPdocumentbyXMLviewjsp:doBodyaction2ndjsp:forwardactionjsp:getPropertyactionjsp:idattributeforXMLelementsinJSPdocumentjsp:includeactionexternalconfigurationfile,usingtoincluderesourceinaJSPimmediatereflectionofchangestoincludedfilesincludedirectivevs.2ndruleofthumbforusingincludingresourceinJSPeachtimeitreceivesrequestincludingXMLfragmentinJSPdocumentjsp:paramaction

Page 1206: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

jsp:paramelements,providingembeddedappletswithparameterandvaluepairsjsp:pluginactionembeddingappletinaJSPHTMLtagsgeneratedforloadingJavaappletjsp:rootelement2ndaddedbyXMLviewtoJSPdocumentjsp:setPropertyactioncookieproperties,settingcookievalue,settingsettingdirectorynameforsavinguploadedfilesettingJavaBeanpropertytosubmittedformvaluejsp:textelementjsp:useBeanaction2nd3rd4th5thcookie-creatingbean,usinginJSPidattributeinstantiatingfile-uploadingbeaninaJSPuseinsettingbeanpropertytosubmittedformvaluejsp_precompileparameterjspc(weblogic.jspcprecompilationtool)JspCcommand-linetool(Tomcat)JspContextclassJspFragmentinterface.jspffilesvs.JSPs(JavaServerPages)applicationserversassoftwarehostsforasXMLdocumentscreatingfromscratchasJSPdocumentcreatingJSP-typeURLforaservletcustomXMLtags[Seecustomtagstags]deploying[SeedeployingservletsandJSPs]2nd[SeedeployingservletsandJSPs]fragmentsgeneratingXMLviewfromimplementationclasspackaginginWARfilesprecompiled,mappingtopageimplementationclassprecompilinginTomcatinWebLogicprecompilationprotocol,usingrequestattributes,accessbyincludedresourceswritingasXMLfilesbasicstepsinviewingoutputinbrowserJspWriterclassJSTL(JavaServerPagesStandardTagLibrary)2ndarraysorMaps,usingtoiteratethroughvaluesc:choose,c:when,andc:otherwisetagsc:forEachtag2nd3rd4th5thiteratingposteddatawithc:iftag2ndc:importtag2nd3rd4th5thc:outtag2nd3rd4th5th6thescapedcharactersexceptioninformation,displayingforaJSPsummaryoffunctions

Page 1207: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

useinaJSP(example)c:paramtagc:settag2nd3rdsummaryoffunctionscookieimplicitobjectcookies,accessingwithELcoretags,usinginaJSPcurrentsessionID,displayingcustomtagsinJSPscreatedasXMLfilesdownloadingandusing1.0referenceimplementation,libdirectorycontentsJSTL1.1taglibdirectivesfordifferentJSTL1.0librariesdownloadingJavaWebServicesDeveloperPackExpressionLanguage(EL)[SeeExpressionLanguage]fmt:formatDatetagfmt:formatNumbertagdisplayingnumbersaspercentagesformattingcurrencyvalueforalocalefmt:messagetagfmt:setBundletagfmt:setLocaletagformattingnumbersaspercentagesformattingsessioncreationandlast-accessedtimesformattingtagsdisplayingtextinJSPforclientlocalefunctionalityoffunctions,usinginJSPsheaderimplicitobjectinJSPerrorpage2ndJavaBeanproperties,accessingwithELJSPusingResultobjectstoredassessionattributelocalizationcontextfortags,settinginweb.xmlrequestheaders,accessingwithELvalueofaparticularheaderrequestparameters,accessingwithELscopedvariables,accessingwithELsessiondate/timesformattedwithSQLtagswithDataSourceconfigurationwithoutDataSourceconfigurationsql:querytag2ndsql:setDataSourcetagsql:transactiontagsql:updatetagurlcustomactionx:outtagx:parsetagx:transformtag2nd3rdXMLandXSLTtags,usingXMLcoretags,usinginaJSPJVM(JavaVirtualMachine),servletsand

[TeamLiB]

Page 1208: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

[TeamLiB][SYMBOL][A][B][C][D][E][F][G][H][I][J][K][L][M][N][O][P][Q][R][S][T][U][V][W][X]

key/valuepairs(cookies)keystorefilekeytoolutility

[TeamLiB]

Page 1209: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

[TeamLiB][SYMBOL][A][B][C][D][E][F][G][H][I][J][K][L][M][N][O][P][Q][R][S][T][U][V][W][X]

l10n[Seelocalization]languagecodes(ISO)languageelementlanguagepreference,settinginNetscape7.1last-accessedtimeforsessionstrackingwithJSPstrackingwithservletslayoutsforloggedmessagesininheritedappenderspatternusedforBasicConfiguratorPatternLayoutSimpleLayoutclass,inrootloggermessageslibdirectory2ndinclusionofnesteddirectoriesinWARfilewithAntwartaskJARfiles,storinginlog4j.jarfileTLDsandlibelement(Ant)listenerelement(web.xml)listenersaddinglistenerclasstoataglibraryapplicationeventconfigurationinweb.xmlfile(servletAPI2.3)examiningHTTPrequestswithmonitoringsessionattributesrequests,trackingforawebapplicationservletcontexteventlistener,usinginloggingsessioneventusinginloggingtrackingsessionlifecyclevalidatingforminputwithListResourceBundleclassload-on-startupelement(web.xml)localhomeinterface(EJBonWebLogic)localedefinitionof2nddetectingforclientinaJSPdetectingforclientinaserverdisplayingmessageappropriateforusingJSTLformattingtagsformattingcurrencyvaluesforinaJSPinaservletformattingdatefordisplayinaJSPinaservletpreferredlocalizationdefinitionoflocalizationcontextsettinginweb.xmllocalizerslocationelement(web.xml)

Page 1210: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

Locationheaderlog()(ServletContext)2nd3rd4th5thlog4jApacheLog4jlibraryconfigurationfileusedbyservletcontextlistenersessioneventlistenerthatusessettinguplog4j.propertiesfileappenderconfigurationspecifyingdifferentnameforLoggerTagclass2ndloggingappendersaddingtoroootloggerfilterthatlogssomeinformation(example)layoutslog4jandservletcontexteventlistener,usinglog4j,usinginaJSPLogFilter(example),mappedtoaservletloggerscreatingyourownandgivingitanappenderusingwithoutconfigurationfilerequestssessioneventlistener,usingsettinguplog4j2ndwithservletthatusesServletContext.log()loggingoutusers,applicationwithform-basedauthenticationlogin()DataSourceLoginModuleclass2ndLoginContextclass2ndLoginModulelogin-configelements(web.xml)auth-methodnestedelementvaluesforusingwithsecurity-constraintelementlogin.htmlpage(example)LoginBeanclass(example)getLoginSuccess()LoginContextclassloginError.htmlpageloginError.jsppageLoginModuleclassexamplecodemethodsvalidatingusernameandpasswordagainstdatabaseinformationlogout()(LoginModule)longdatatypesreturnedbydate-relatedHttpSessionmethods2ndlookup()(InitialContext)2nd

[TeamLiB]

Page 1211: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

[TeamLiB][SYMBOL][A][B][C][D][E][F][G][H][I][J][K][L][M][N][O][P][Q][R][S][T][U][V][W][X]

MacromediaFlash[SeeFlashfiles]mail[Seeemail]mailserver,interactionwithemail-sendingservletmailsessions2ndservletgettingfromWebLogicJNDImail.jararchivemailDefaults.propertiesfileManagerapplication(Tomcat)onlinedocumentationforStopTaskclassmanifestfileforJARfilesMapobjectsContextObjectclass(example)2ndmethodsaddingkeysandvaluestomapcookieELimplicitobjectEntrysubclass,getKey()andgetValue()entrySet()headerimplicitobject2ndheaderValuesimplicitobjectJSPparameterspassedforpostingtoJavaBeanMessageclassgetAllHeaders()getContent()getFrom()messagestores2ndMessagingExceptionclassMETA-INFdirectory,TLDsinmethodattribute(HTMLformtag)Methodobjectsmethods(JavaBean),namingconventionsforMicrosoftWordfileasemailattachmentsendingasbinarydataMIMEtypesapplication/mswordapplication/pdfassociatingfileextensionswithcommon,listingofMicrosoftWorddocumentMP3filesmultipart/mixedMimeMessageclass2nd3rdMimetypesFileTypeMapclassmodules,JavaScriptexampleoforganizationandstorageofvalidatingforminput(validate.js)MPEGaudiolayer3(MP3)embeddedfileinaJSPsendingaudiofileasmultimedia,embeddinginJSPsembeddingappletwithHTMLConvertertool

Page 1212: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

embeddingappletwithjsp:pluginembeddingbackgroundsoundtrackinaJSPembeddingFlashinaservletembeddingQuickTimemovieinaJSPembeddingSVGfileinaJSPHTMLtemplateforembeddingFlashfilesgeneratingautomaticallywritingMultipartclassMultipartcontenttypemultipart/form-datacontenttypeMultipartFilterclassMultipartParserclassMultipartRequestclassfile-uploadingJavaBean,useinservletthatuses,creatingMultipurposeInternetMailExtensions[SeeMIMEtypes]MutableAttributeSetclass

[TeamLiB]

Page 1213: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

[TeamLiB][SYMBOL][A][B][C][D][E][F][G][H][I][J][K][L][M][N][O][P][Q][R][S][T][U][V][W][X]

nameattribute(Antprojectelement)namespacedefinitionofidentifiedbyprefixattributeoftaglibdirectiveforXMLelementsrelatedtoXMLSchemainstancesxmlnsattributeoftaglibelementnamingconventions,log4jnamingservletscreatingmultiplemappingstoaservletcreatingwelcomefilesforwebapplicationinvokingservletwithoutaweb.xmlmappingJSP-typeURLforservletsmappingallrequestsfromawebapplicationtoaservletmappingallrequeststocontrollerwhilepreservingallservletmappingsmappingservlettonameinweb.xmlmappingstaticcontenttoaservletrestrictingrequestsforcertainservletsNetscapedisablingcookiesJavaScript,developers'websitesettinglanguagepreference(v.7.1)next()(Iterator)non-repeatablereadnullrolesecurityroleNumberFormatclassformat()2ndgetCurrencyInstance()getPercentInstance()numbers,formattingwithJSTLtagsfmt:setLocaletag

[TeamLiB]

Page 1214: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

[TeamLiB][SYMBOL][A][B][C][D][E][F][G][H][I][J][K][L][M][N][O][P][Q][R][S][T][U][V][W][X]

objectattributesforwebapplicationssettingscopewithc:settagobjecttags(HTML)2ndautomaticHTMLfilegenerationbyFlashproducedbyHTMLConverter(example)objectsEJB,factoriesforscopesofonSubmiteventhandler(HTMLformtag)2ndopensourceapplicationsopenConnection()(URL)Oracle8idatabaseservletthatqueriesforaResultSetstoredprocedureaddingrowtotableOraclesequencesorg.apache.jasper.runtimepackageoverwritingacookie

[TeamLiB]

Page 1215: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

[TeamLiB][SYMBOL][A][B][C][D][E][F][G][H][I][J][K][L][M][N][O][P][Q][R][S][T][U][V][W][X]

packagesfully-qualifiedclassnamesandforservletandutilityclassespageattribute(jsp:include)2ndpagedirectiveerrorPageattributeimportattributeisErrorPageattributeoverridingerror-pageconfigurationpageimplementationobjectpagerelativepathpagescope2ndpageContextimplicitobject2ndPageDataclass,getInputStream()2ndpageEncodingattribute(jspdirective.pageelement)PAM(PluggableAuthenticationModule)paramimplicitobject2nd3rd4thparam-valueelement,alteringtoimportincludedresourceparse()(ParserDelegator)2ndsynchronizationofParserCallbackParserDelegatorclasscallbacks,usingwithparse()2ndsynchronizationofparsingHTMLwithjavax.swing.textsubpackagesJSPsbeforeconversiontopageimpelementationXMLJAXP-compliantparsersx:parsetagPartinterfacegetAllHeaders()getHeader()getInputStream()passwords[Seealsoauthentication]creatingintomcat-users.xmlfileforkeystorefileanddigitalcertificatepathattribute(Contextelement,Tomcat)pathattribute(cookies)accessingvaluesforsettingtonameofcontextpathpathelement(Ant)2nd3rdnestingthreefilesetsinPATHenvironmentvariableAnt/bindirectory,addingtoincludingpathtothebindirectoryofyourJavaSDKinstallationforSunJDKjavaccompilerpathparameterpathscontext-relative

Page 1216: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

cookie,settingwithjsp:setPropertypage-relativetosavedirectory,forfileuploadservlet2ndservletcreatingforwebapplicationusersdifferencesamongservletenginespatternlanguageforconvertingloggedmessagelayoutsPatternLayoutclass2ndPDF(PortableDocumentFormat)filespercentagesformattinginaJSPformattinginaservletpermissionsforusingcodeexamplesphantomreadPluggableAuthenticationModule(PAM)pop-upwindow,creatingwithJavaScriptfunctioninaservletportnumbers,usedbysecurevs.insecureHTTPconnectionsPortableDocumentFormat(PDF)filesPortableDocumentFormatfiles[SeePDFfiles]POSTrequestsdeliveryofHTMLformdatatoserver-sideprogramviafileuploadsandhandlinginaJSPhandlinginaservletwithServletRequest.getParameter()andgetParameterMap()postingdatafromaJSPpostingdatafromaservlettootherserver-sideprogramsHttpClient,usingtopostdatatoaJSPsecurityconstraintsonPRECLASSPATHenvironmentalvariableprecompilingJSPs2ndinTomcatinWebLogicwithprecompilationprotocolservletmappingspreferredlocaleprefixattribute(taglibdirective)preparetarget(Ant,build.xmlfile)2ndprintffunctioninCPrintWriterclassHTMLpagereturnedbyblockingfilterPrivacyServletclass(example)doGet(),includingresourcespecifiedbyinitparameterJSPfragmentincludedbyprogrammaticsecurityprojectelement(Ant)arrangingtargetelementsinsidepropertiesAntglobal.propertiesfileloadingintobuild.xmlmakingavialabletobuildfileAntpropertytask,importingglobal.propertiesfilebuild.propertiesfile(Ant),forwebapplicationdeploymentcookie,settingexternalfile(include.properties),specifyingresourcetoincludeinJSPjar-nameproperty

Page 1217: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

JavaBeanaccessingwithELemailpartsstoredassettinginaJSPlog4j.propertiesfilemailDefaults.propertiesfilepassingtoanAntfilecommandline,usingpropertytask,usingpropertiesfileforautomaticallygeneratedXMLviewtagattributesaswl.propertiesfileforWebLogicAntbuildpropertiesfile,ResourceBundleaspropertytask(Ant)2ndPropertyConfiguratorclass

[TeamLiB]

Page 1218: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

[TeamLiB][SYMBOL][A][B][C][D][E][F][G][H][I][J][K][L][M][N][O][P][Q][R][S][T][U][V][W][X]

querystringsaddingparametertowithaservletaddingparameterstowithaJSPrequest,addingparametertoQuickTimemovie,embeddinginaJSP

[TeamLiB]

Page 1219: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

[TeamLiB][SYMBOL][A][B][C][D][E][F][G][H][I][J][K][L][M][N][O][P][Q][R][S][T][U][V][W][X]

redirectingrequests(aftercheckingsessionvalidity)referenceimplementationforJSTLrefidattribute(Antclasspathelement)2ndreflection,usinginloggingRefreshheaderJSPthataddstotheresponserefreshingaJSPautomaticallyrefreshingaservletautomaticallyregisterednamesforservletsfilters,mappingtoinvokingregisteredservletswithinvokerservletreloadableattribute(Contextelement,Tomcat)2ndRemoteMethodInvocationregistryremoveAttribute()(HttpSession)renaminguploadedfileswithyourownJavaclassrequestandresponseobjectserrorpageaccesstorequestattributesaccessbyerror-handlingservletaccessbyincludedresourcesinJSPsexceptioninformationfromrequestheadersaccessingwithELimplicitobjectvalueofoneparticularheaderexamininginaJSPexamininginaservletfilter,usingtoalterrequestimplicitobjectrequestparametersaccessingwithELimplicitobject2ndgettingforCallbackHandlerrequestphase(JSPs)requestscope2ndrequest,ServletRequestListenersRequestDispatcherinterface2ndforward()2ndforwardingofHTTPrequestswithouttriggeringsecurityconstraintsforwardingrequeststoservletsundersecurityconstraintsinclude()2ndembeddingFlashinaservletincludingJavaScriptCreateWindowfunctioninaservletincludingtop-levelservletfileincludingvalidatingJavaScriptmoduleinaservletservletimportingJavaScriptfileJSPfragmentincludedinaservletwithRequestDispatcherobjects,usingfilterswithrequestInitialized()requestsblockingfromanIPaddresswithafilteroptionallyblockingwithafilter

Page 1220: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

requestScopeimplicitJSTLobject2ndResourceelements(server.xml)2nd3rdresource-env-refelement(web.xml)2ndresource-refelement(web.xml)ResourceBundleobjects2ndcreatingasaJavaclasscreatingasapropertyfilegetBundle()2ndlocalizationcontextsetinweb.xmlusinginaJSPusinginaservletResourceParamselements(server.xml)2nd3rdresponsecodes,HTTP[SeeHTTPresponsecodes]responseheadersdefinitionofRefreshJSPs,addingtoresponseimplicitobject(JSP)responsescustomizingwithaJavaBeanfilteringHTTPresponsesrestrictingrequestsforcertainservletsResultinterface2ndResultobjectsconvertingResultSettoResultSetobjectsfindingoutinformationaboutResultSetMetaDatainterfaceservletthatusesResultSupportclasstoResult()rolescheckingforuserswhorequestservletspecifiedinauth-constraintelementrollback()(Connection)2ndrollingfileappenderRollingFileAppenderclassrootelement[Seejsp:rootelement]rootloggeraddinganappenderto

[TeamLiB]

Page 1221: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

[TeamLiB][SYMBOL][A][B][C][D][E][F][G][H][I][J][K][L][M][N][O][P][Q][R][S][T][U][V][W][X]

save-direlement(web.xml)SAX(SimpleAPIforXML)ScalableVectorGraphics(SVG)file,embeddinginaJSPscopedattributesusingELandc:outtagtogetvalueofscopesboundobjectsforstoredobjectsscrapinginformationfromawebpage[SeeharvestingWebinformation]scriptblocks(JavaScript)scriptletsSDK(SoftwareDevelopmentKit)GoogleWebAPIsSDKPATHenvironmentvariablesecureattribute(cookies)SecureSocketsLayer(SSL)built-insessiontrackingmechanismsettinguponTomcatsecurityconfiguringweb.xmlwithwebapplicationsecurityelementsrelatedto,indeploymentdescriptorsnotusingservletv2.4includingsecurity-relatedcodeinservletsrestrictingrequestsforcertainservletsservletaccess,restrictingtocontrolleronlysecurityrolesnullrole,preventingusermappingtointomcat-users.xmlsecurity-constraintelements(web.xml)auth-constraintnestedelementblockingallrequestsexceptfromRequestDispatcher.forwardexampleofinitiatingauthenticationwithaJSPlogin-configelement,usingwithrestrictingrequestsforcertainservletsservletaccess,restrictingtocontrollerservletonlyspecifyingwebresourcesrequiringauthenticationweb-resource-collectionnestedelementsecurity-roleelements(web.xml)2nd3rdsegments,JSPselectattribute(x:forEach)SELECTstatement(SQL)executinginJSPinatransactionsendingtodatabasewithsql:querytagself-signeddigitalcertificate,creatingforTomcatsend()(Transport)2ndsendError()(HttpServletResponse)2ndsendingnon-HTMLdataaudiofilesPDFfilesviewinginternalresourcesinaservletwordprocessingfilesXMLfilessendRedirect()(HttpServletResponse)2nd

Page 1222: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

sequences,Oracleserverresponsecodes[SeeHTTPresponsecodes]serverstatuscode403Forbiddenserver.xmlfile(Tomcat)ConnectorelementContextelementResourceandResourceParamselementsservers,applicationservice()(HttpServlet)servletAPI2.3deploymentdescriptorthatconfigureserrorpagessessions,configurationinweb.xmlweb.xmlfile2nd[Seealsoweb.xmlfile]servletAPI2.4filters,usingwithRequestDispatchersweb.xmlfile2nd[Seealsoweb.xmlfile]3rdweb.xml,usewithTomcat5andJSTL1.1servletAPIdocumentationservletcontainersservletelements(web.xml)associatingwithmultipleservlet-mappingelementsgeneratedbyJspC,mappingservletstoload-on-startupnestedelementservletengines,commercialServletinterfaceservlet-classelement(web.xml)servlet-mappingelements(web.xml)associatingmultiplewithoneservletelementcreatingaliastoaservletgeneratedbyJspC,mappingservletstoJSP-styleURLpatterninmappingallrequestsfromwebapplicationtoaservletremovingoralteringanyelementsallowingrequeststobypasscontrollerservletmappingstaticcontenttoaservletremovingoralteringanythatallowrequeststobypasscontrollerservletservletswithout,invokingurl-patternelementWebLogicServer7.0servlet-nameelement(web.xml)*wildcardsymbol,notusedinservlet.jar,inclusioninPRECLASSPATHenvironmentvariableServletConfiginterfaceServletContextattributessettinginJSPssettinginservletsobjectthatservletbindstoServletContextservletthatbindsobjecttoServletContextServletContextclass2ndgetAttribute()getRealPath()log()2nd3rd4th5threturninganulldispatchersetAttribute()2ndServletContextListenerinterfacecontextInitialized()andcontextDestroyed()

Page 1223: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

ServletExceptionclass2ndServletOutputStreamclassServletRequestinterfacegetLocale()getParameter()getParameter()andgetParameterMap()getParameterMap()getRequestDispatcher()methods,usinginservlet'sdoPostmethodServletRequestEventclass,getServletRequest()ServletRequestListenerclassServletResponseclasschangingresponsewithafiltersetBufferSize()servlets2ndapplicationserversassoftwarehostsforcompiling[Seecompilingservlets]conversionofJSPsintodeploying[SeedeployingservletsandJSPs]deploymentdescriptorforservletAPI2.3deploymentdescriptor,creatingforservletAPI2.4JavaServerPages[SeeJSPs]naming[Seenamingservlets]packaginginWARfileswritingFirstServletclass(example)lifecycle,managementofpackages,creatingforSessionclass2nd3rd4thbindingobjecttoWebLogicJNDIservletgettingSessionobjectfromWebLogicJNDIsessioneventlistenerssessionIDdisplayingwithJSTLtagURLsthatautomaticallyinclude,creatingsessionimplicitobject2ndsessionscope2ndJNDIobjectplacedin,usingafiltersession-configelement(web.xml)2ndsessiontimeoutforallTomcatapplicationssession-timeoutelement(web.xml)sessionCreated()(HttpSessionListener)2nd3rdsessionDestroyed()(HttpSessionListener)2nd3rdsessionDidActivate()(HttpSessionActivationListener)SessionFilterclass(example)sessionscheckingexistenceofinHttpServletRequestconfigurationinweb.xmlfileforservletAPI2.3definitionofinvalidatingtologoutusermonitoringsessionattributeswithafiltermonitoringsessionattributeswithalistenertimeout,settinginallTomcatwebapplicationsinservletcode

Page 1224: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

inweb.xmltrackinglifecyclewithalistenertrackingsessionactivityinJSPstrackingsessionactivityinservletstrackingwithURLrewritinginaJSPtrackingwithURLrewritinginaservletsessionScopeimplicitJSTLobject2nd3rdsessionWillActivate()(HttpSessionActicationListener)Setclass,iterator()Set-Cookieresponseheader2ndsetAttribute()HttpSessionclassServletContextclasssetAutoCommit()(Connection)setBufferSize()(ServletResponse)setContent()setFrom()setKey()(GoogleSearchsetKey)setMaxAge()(Cookie)callingwithargumentvalueofzerosetMaxInactiveInterval()(HttpSession)2ndsetQuery()setQueryString()(GoogleSearch)setValue()(Cookie)shellscriptsforprecompilingJSPfiles(onUnix)forprecompilingallJSPpagesinapplication(onUnix)Tomcat,shuttingdownshow-propstarget(Ant)SimpleAPIforXML(SAX)SimpleObjectAccessProtocol[SeeSOAP]simpletaghandlercreating(JSP2.0)creatingaTLDforusinginaJSPSimpleLayoutclassmessagesloggedbyrootloggerSimpleTaginterface2ndSimpleTagSupportclass2ndgetJspBody()getJspContext()SOAP(SimpleObjectAccessProtocol)responsefromAmazonbasedonkeywordsearch(example)webservicesbasedon,reasonstousesocketconnectionwithadatabaseserverSoftwareDevelopmentKit(SDK)GoogleWebAPIsPATHenvironmentvariablesoundtrack,embeddinginaJSPSQL(StructuredQueryLanguage)executingseveralstatementsinonetransactionservletusingtransactionJSTLSQLtags2ndwithDataSourceconfigurationSQLJSTLtagwithoutDataSourceconfigurationstoredprocedures

Page 1225: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

transactions,usingwithJSPsSQLPLUSdatabase,addEventstoredprocedure(example)sql:querytagsendingSQLSELECTstatementtodatabasesql:setDataSourcetagsql:transactiontagsql:updatetagsrcattribute(HTMLscripttag),importingJavaScriptmoduleintoservletsrcdirectorySSL[SeeSecureSocketsLayer]startandstoptasks(Ant,build.xmlfile)startingTomcatfromAntStartTasktaskstatelessSessionbean(EJB)definitionofstaticcontentmappingtoaservletrequestsfor,interceptedbycontrollerservletserverperformanceandstaticmethods,JavamethodimplementingELfunctionforJSPstaticpageformultimediacontentstatuscodes,HTTP[SeeHTTPresponsecodes]status_codeattributestopandstarttasks(Ant,build.xmlfile)stoppingaTomcatapplicationwithAntStopTaskclassStoreclass2nd3rdstoredprocedurescallingfromaJSPcallingfromaservletstructureResults()2ndstylesheets(XSL),integratingintoJSPsSunMicrosystemsFrontControllerdesignpatternJAASdocumentationJARfilespecificationJavaDevelopmentKit(JDK)JavaWSDPdownloadsiteonlinetutorialssampleappletswebservicestutorialthatincludesXPathSVGfile,embeddinginaJSPsynchronizedMap()(Collections)

[TeamLiB]

Page 1226: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

[TeamLiB][SYMBOL][A][B][C][D][E][F][G][H][I][J][K][L][M][N][O][P][Q][R][S][T][U][V][W][X]

t:toxmlelementtagdirectivetagfilescreatingcustomtagassociatedwith,usingpackaginginaJARpackaginginawebapplicationtaghandlersclassiccreatingcreatingJSP1.2TLDforpackagenameforclassessimplecreatingcreatingTLDforusinginaJSPtaglibrarylistenerclass,addingtopackaginginaJARfilepackaginginawebapplicationTagLibraryDescriptor(TLD)files2ndaddinglistenerelementtoconfiguringanELfunctioncreatingforsimpletaghandlercreatingJSP1.2TLDforclassictaghandlercreatingJSP2.0TLDforclassictaghandlercustomloggertagcustomtaginformation,providingdefinitionofforXMLviewcustomtagplacingintaglibraryJAR'sMETA-INFdirectoryspecifyingvalidatorforurifortaglibraryXMLDTD,useinJSP1.2taglibdirectives2ndforcustomtag,identifyingurifortaglibraryfordifferentJSTL1.0librariesinincludedJSPsegment,foruseofc:outJSTL1.0tagsJSPsegmentcontaining(example)requiredforuseofJSTL1.0coreandSQLlibrariesspecifyingcoretaglibraryfromJSTLuriandprefixvaluestousewithfunctionslibraryuriattributevaluesinJSTL1.1taglibelementversionattributexmlnsattributexmlns:xsiattributexsi:schemaLocationattributeTagLibraryValidatorclassusingXMLviewtovalidatecustomtagsinJSPpagetagscustom[Seealsocustomtags]

Page 1227: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

customtagsinJSPsdefinitionofincludingtaglibrariesasnamespaceattributesinJSPdocumentspre-builtforJSPs(JSTL)TagSupportclass2ndtargetelements(Ant),groupingoftasksintargets(Ant)inbuild.xml,displayingnamesoftaskdefelement(Ant,buildfile)starttask,definingstoptask,definingtasks(Ant)filesetsgroupof,representedbytargetelementpropertytasktextfiles,JSPswrittenasthreadnameinloggingmessagesThrowableclassThrowableobjectsaccessinginJSPerrorpageassociatedwithexceptions,accessingthrownexceptions,informationaboutinJSPerrorpage2ndtimeoutforsessionssettinginallTomcatwebapplicationssettinginservletcodesettinginweb.xmltimeStyleattribute(fmt:formatDate)TimeZoneIDs,helperclasstodisplayTLD[SeeTagLibraryDescriptorfiles]tldfileextensionTomcatcompilingservletonconfiguringDataSourcetouseinservletcontextelement(conf/server.xml),forJSPcontentimportedfromoutsidecontextcreatingusernamesandpasswordsDataSource,usinginaservletdeployingindividualJSPondeployingindividualservletonAnttool,usingstepsinprocessdeployingservletaspartofContextelementinserver.xmldeployingwebapplicationonAntbuildfile,usingpointingtoexternaldirectorycontainingwebapplicationerrorpagedisplayedbyerrorhandlingservletimplicitmappingtoitsJSPcompilerandexecutionservletfor.jsprequestsincludingJARfilesinAntbuildfileclasspathinitialcontextofbuilt-inJNDIimplementationinvokerservletcommentingoutJasper(JSPcontainer)JNDIobject,configuringJNDIresourceaccessingfromaJSPaccessingfromaservletJSPpageimplementationclass,viewing

Page 1228: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

JSTL1.1features,usingwithversion5logfilesprecompilingJSPsinsecurity-constraintelementinweb.xml,usingsessiontimeout,settingforallwebapplicationsSSL,setlingupstartingwebapplicationwithAntstoppingwebapplicationwithAnttomcat-users.xmlfileexampleofatypicalfilemanagerrole,usermappingtonullrollsecurityrole,preventingusermappingtousermappingtosecurityrolesusernamesandpasswords,case-sensitivityofusernames,passwords,androlesforauthenticationtoResult()(ResultSupport)2ndToXmlValidatorclasstransactionscreatingwithConnectionmethodsexecutingseveralSQLstatementsinsingletransactionservletthatusestransactionisolationlevelsusingwithJSPstransformingXML,usingJSTLXMLandXSLT-relatedtagstranslationphase(forJSPs)2ndincludingJSPsegmentintoJSPpageTransportclass,send()2ndtry/catchblock,forexceptionsthrownduringincludeoperationsTryCatchFinallyinterfacetutorials,online(SunMicrosystems)

[TeamLiB]

Page 1229: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

[TeamLiB][SYMBOL][A][B][C][D][E][F][G][H][I][J][K][L][M][N][O][P][Q][R][S][T][U][V][W][X]

unbindingsessionobjects,listeningforundeploytarget(Ant,build.xmlfile)Unixkeytoolutility,creatingdigitalcertificatewithshellscriptforprecompilingallJSPpagesinapplicationshellscriptforprecompilingJSPfilesUnix-basedMacOSX10.2system,PATHvariableforjavacUPDATEstatement(SQL)uploadingfilescom.oreilly.servletclassesforfileuploadsJSP,handlingwithfileuploadingJavaBean,creatingJSPthatuploadsanddisplaysinformationaboutmultiplefileuploads2ndpreparingHTMLpageforcomponenttoreceivefileuploadandstoreinlocaldirectoryrenaminguploadedfileswithyourownJavaclassuriattribute(taglibdirective)JSTL1.1,differentvaluesinURIsmappingurielementsinTLDasspecifiedbytaglibdirectiveinJSPfilesrequest,usebyJSPerrorpageurlcustomactionaddingparameterswithencodeURL()vs.rewritingURLswithURLpatterns*.jspisanextensionmapping/sqlJsp.jsp,initiationofBASICauthenticationforaimingallrequestsatacontrollerservletexactmatchingrequirementforJSP-type,creatingforaservletrestrictinganyrequestsfromreachingspecifiedbysecurity-constraintelementsURLrewriting2ndusinginaJSPusinginaservleturl-patternelement(web.xml)*wildcardcharacterincasesensitivityofmappingallrequestsfromwebapplicationtoaservletmappingfiltertoaJSPURLConnectionclassURLsconnectionto,openingexternalimportingintoJSPwithc:importtaginitiatingAmazonsearchwithinvoker-style,forservletsspecifyingadirectoryonlyforstaticcontent,mappingtoaservletuserclasspath

Page 1230: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

userroles[Seeroles]User-Agentheaderusersmanagerrole(Tomcat)tomcat-users.xmlfilemappingtosecurityrolesusernames,passwords,androlesin

[TeamLiB]

Page 1231: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

[TeamLiB][SYMBOL][A][B][C][D][E][F][G][H][I][J][K][L][M][N][O][P][Q][R][S][T][U][V][W][X]

validpartialrequestsValidateHandlerclassvalidatingcustomtagsinJSPpagesforminputfilter,usingforJavaBean,usingJavaScript,usinginaJSP2ndJavaScript,usinginaservlet2ndXMLdocuments,specifyingvalidatorforTLDfilevarattribute(c:forEachtag)variabledirectivevariables(scoped),accessingwithEL2ndvariant(inlocales)versionattributecookiestaglibelementviewerapplicationsforSVGviewinginternalresourcesinaservlet

[TeamLiB]

Page 1232: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

[TeamLiB][SYMBOL][A][B][C][D][E][F][G][H][I][J][K][L][M][N][O][P][Q][R][S][T][U][V][W][X]

WAR(WebARchive)filescreatingwithAntdeployingwebapplicationas,usingWebLogicAdministrationConsolefindingoutifalreadydeployedonTomcatforservletsandJSPsgeneratingwithAntwartaskopeininginWebLogicBuildertoeditweb.xmlfileviewingcontentsofwartask(Ant)2ndclasses,lib,andfileset(nested)elementsdestfileandwebxmlattributesWARNlevelloggingwebapplicationsconfiguringlog4jmechanismcountingnumberofrequestsforcreatingwelcomefilesfordefinitionofdeployingonTomcatAntbuildfile,usingconfiguringTomcattopointtoapplicationinexternaldirectorydeployingonWebLogicusingAnttoolusingWebLogicAdministrationConsoleusingWebLogicBuilderusingweblogic.Deployercommand-lineutilitydeploymentdescriptor,creatingfordirectorystructure[Seedirectorystructureofwebapplications]Java-basedmappingallrequeststocontrollerservletpackagingJSPtagfileinpackagingtaglibraryinservletcontextinstanceservlet,writingforstartingonTomcatusingAntfilestoppingonTomcatusingAntfileWARfiles[SeeWARfiles]webbrowsers[Seebrowsers]webcomponentswebcontainers2nd[SeealsoTomcat]exceptionhandlinginwebdevelopertasks,recipesinthisbookimplementationwithBEAWebLogicwebdirectory,inclusionofnesteddirectoriesinWARfilewithAntwartaskwebpageforthisbookwebservices[SeealsoAmazonWebServices;GoogleWebServices]2ndAmazonandGoogleAmazon,settingupGoogleWebAPI,settingupSOAP,usingforinformationtransferSOAP-based,reasonstoadoptweb-appelement(web.xml)requiredattributesofservlet2.4deploymentdescriptor

Page 1233: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

WEB-INFdirectory2ndcontentsofWEB-INF/jspf(optionaldirectory)WEB-INF/tlds(optionaldirectory)web-resource-collectionelements(web.xml)protectedresourcesinsecurity-constraintelementspecifyingsecurityrestraintsweb.xmlfile2nd[Seealsoservlet-mappingelements]BASICauthentication,initiatingwithJSPfilecontentsofcontextparametersave-direlementcontext-paramelement,addingforincludedfileinaJSPcreatingmultiplemappingstoaservletcreatingwithJspCutilityDataSource,configuringindeclaringexceptionhandlersineditingforWebLogictoregisteraservleterror-pageattribute,mappingexceptiontypestoaJSPerror-pageconfigurationfiltersconfiguringinmappedtotheservletpath(example)mappingofmappingtoaJSPform-basedauthentication,settingupform-checkingfilterregisteredandmappedinIOExceptions,elementformanagingIPblockingfilter,mappingofjsp-property-groupelement2ndJSP-typeURLforaservletlistenerelementlisteners[Seealsolisteners]configurationinservletAPI2.3forservletrequests,registeringmappingallreferencestoJSPpagestoasingleservletmappingservlettoanamepreventingrequeststonon-controllerservletsresource-refelementrestrictingrequestsforcertainservletsservletAPI2.3convertingto2.4forJSTL1.1featuresservletAPI2.4usewithTomcat5andJSTL1.1servletelementwithload-on-startupnestedelementservletthatcreatespop-upwindowservletswithoutamappinginsessiontimeoutforallTomcatwebapplicationssessiontimeout,settingviewingwithaservletwebappsfolder(Tomcat)WebLogiccreatingDataSourceonconfiguration,stepsinJNDIlookup,usingtoaccessDataSourceJNDIresourceaccessingfromaJSP

Page 1234: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

accessingfromaservletconfiguringinJNDItreeaccessinganEJBwithviewingprecompilingJSPsinrecipesforcommontasksservletclassesandjavaxsub-packagesWebLogicServer7.0deployingindividualJSPondeployingindividualservletonAntfile,usingeditingweb.xmltoregisterservletredeployingwebapplicationdeployingwebapplicationonusingAnttoolusingWebLogicAdministrationConsoleusingWebLogicBuilderusingweblogic.Deployercommand-lineutilitysecurityconfigurationinweblogic.xmlweblogic-ejb-jar.xmlfileweblogic.Deployercommand-lineutilityweblogic.jspcutilityweblogic.xmlfile,securityconfigurationinwebxmlattribute(Antwartask)welcomefilesforawebapplicationwelcome-file-listelement(web.xml)wildcardsinURLpatternsoverridingwithspecificmappingswindoidWindowssystemslaunchingWebLogicBuilderlocalvariantforPATHenvironmentvariableforjavaccompiler(onNT)precompilingallJSPpagesinapplicationwithweblogic.jspcshellscriptforrunningJspCwindows,browser[Seebrowserwindows,creatingwithJavaScript]wl.applicationsproperty(Ant,build.propertiesfile)wl.propertiesfile(forWebLogicAntbuildfile)WLCLASSPATHenvironmentvariablewordprocessingfiles,sendingWSDP(WebServicesDeveloperPack)

[TeamLiB]

Page 1235: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

[TeamLiB][SYMBOL][A][B][C][D][E][F][G][H][I][J][K][L][M][N][O][P][Q][R][S][T][U][V][W][X]

x:forEachtag2ndx:iftagx:outtagx:parsetagx:transformtagassociatingastylesheetwithanXMLfilexmlattributexsltattributeXerces2XMLparserXMLAntbuildfilecreatingJSPdocumentasXMLfileincludingXMLfragmentinaJSPdocumentJSPdocumentvs.XMLviewJSPsasXMLfiles2ndXMLequivalentsofJSPdirectivesJSTLXMLandXSLTtags,usinginaJSPJSTLXMLcoretags,usinginaJSPsendingXMLfileasbinarydataSOAPmessagesonHTTPTLD(TagLibraryDescriptor)filestransforming(x:transform)webservicesXMLelementsAnttaskscase-sensitivityinelementandattributenamescustomtagsusedinJSPnamespaceforelementsrelatedtoXMLSchemainstancesnamespace,definitionofpathelement,definingAntclasspathXMLparsers,JAXP-compliantXMLSchemainstancesXMLSchemasforJSP2.0TLDinservletAPI2.4web.xmlfileXMLviewautomaticallygeneratingforJSPpagegeneratingfromaJSPpageJSPXMLdocumentvs.xmlnsattribute(taglibelement)xmlns:xsiattribute(taglibelement)XPathxsi:schemaLocationattribute(taglibelement)XSL(ExtensibleStylesheetLanguage)XSLT,convertingXMLtoreadableformat

[TeamLiB]

Page 1236: O'Reilly : Java Servlet and JSP Cookbookdl.booktolearn.com/ebooks2/computer/programming/... · 2019-06-23 · Java Servlet & JSP Cookbook By Bruce W. Perry Publisher: O'Reilly Pub

BroughttoYouby

Likethebook?Buyit!