JSP Velocity Freemarker comparison

沙丁鱼 2012-02-16

JSP has been the De facto standard for Java and web development for years. JSP is one of the first popular dynamic web application frameworks. Since then as architecture models have evolved. PHP has taken a foothold in the simple dynamic web applications and large enterprise application with complex business logic has moved to MVC design using Java or .Net. Where does that leave JSP and how does it compare with Velocity and Freemarker? 

JSPOverview

Originally,JavaServerPagesweredesignedtobeutilizedwithinaJ2EEwebcontainerthatwouldallowforfullapplicationdevelopment.OlderapplicationsweredesignedtobewrittentodirectlyaccesstheJSPfiles.ThisistheMVCmodel1architectureapproach.TheclientdirectlyreferencestheJSPpage,theJSPpagereferencesabeanwhichinturncanaccessdatabaseinformation.Withtoday'sstandards,however,itistypicallynotacceptabletoutilizeJSPasanindependentarchitecturesolution.Assoftwarearchitecturehasevolvedanddesignpatternshavechanged,itseemsthatthepurposesofJSPpageshavechangedaswell.

TheabilityofJSPtopermitscripting,tags,andhtmlcodemakesitaspowerfulasJavaitselfwiththecapabilitytobedirectlyrunasawebpage.Torebuttalthestrengthofthispoint,thisunrestrictedabilityofallowingsomanydifferentdevelopmenttechniquesissimplydangerous.ItbecomesdangeroustoboththeapplicationarchitectureandtotheaveragedeveloperasitisveryeasytointroduceinconsistencyindesignpatternsintotheJSP.ThecomplexityofJSPcangrowquicklyandfurtherdevelopmentorongoingmaintenancecouldsufferinbothtimeandcost.

AnexampleofabusiveJSPdevelopmentcanoccurwhenmixingdifferentJSPsyntax.UsinganparticulartaglibrarywithwithanexpressionorusingETLinsideandoutsideoftags.JSPScripletsareinviolationoftheMVCapproachwhenusingJSPasaviewcomponentwhichistheprimaryfunctionJSPpagesareusedtoday.

VeloctiyandFreemarkerOverview

VelocityandFreemarkeraretemplateenginesthatdefineatemplatelanguageinwhichtoparse.TheytakeJavaobjectsandmergethedatawiththetemplate.VelocityandFreemarkeraresosimilarIwillnotcompareonetotheother.Bothareactiveprojects.Velocityrecentlycameoutofitsshellafterafewslowyearsandhadsomereleasesin2007.Freemarkermayhaveafewbitmorefunctionalitythanvelocitybutisalsoabitmorecomplex.

JSPvsTemplateEngines

*CompileTime-JSPneedtobeprocessedandcompiledtobeforeitisexecuted.JSPfileisconvertedtoaJavafile.Itisthencompiledintoaclassfile.Bothvelocityandfreemarkerdonotneedcompiliation.Thisisespeciallybeneficialtoadeveloper.EverytimeadevelopermodifiesaJSPitisveryslowtorunitduetocompilation.TheVelocityengineisnamedVelocityforareason.

*LearningCurve-JSPisverylargewithmanytagdifferentlibraries.VelocityandFreemarkeraresimple.Theengineandcorefunctionalitycanbeunderstoodwithinamatterofhours.

*Readibility-JSPallowsfortaglibraries,scriplets,expressionlanguage,andothervarioustechniquesthatisrecognizedascode.Velocityusesashortlistofbuiltincommands.

*CommunityBase-ManydevelopersknowJSP.Itisaverycommonlanguagefordeveloperstolistasaskill.BothfreemarkerandvelocityhavealargeuserbasebutneitherisaslargeasJSP.ThisisbecauseJSPwasoriginallyusedasafullapplicationframeworkwhendeployedtoacompliantwebcontainer.

*Templatestructure-JSPallowsformanydifferenttypesofsyntax.Scriptingtechniquessuchasdeclarations,scriptlets,andexpressionsaswellasactionsandtags.Velocityusesa#commandforcommandsand$varforvariables.Freemarkeruses<#command>forcommandsand${var}forvariables.JSP2.0triestoappearastemplateenginewith${}tryingtoresembletemplatestyle

*CustomTools-JSPallowsforthecreationofJSPtaglibs.BothFreemarkerandVelocityallowtheutilizationofJSPtaglibsaswell.Freemarkerhasalotofextrabuiltinfunctionalityaswell.Velocityallowsthedevelopertocreatetheirowncustomtools.ThesetoolsarecreatedinJavaandutilizedasJavaobjectswithinthetemplate.

*Integration-MostofthemajorlibrariesanddevelopmenttoolsintegratewithJSP,VelocityandFreemarker.FrameworkssuchasSitemesh,Tiles,Struts,andSpringhavefunctionalityavailabletoutilizeall3technologies.

therearecoupleofthingswhereFreeMarkermightsuityoubetter:

1.Thisissubjective,buttheoverallsyntaxislessawkward.I’mawarethere’slotofsyntacicsugarinJSP2.0that’saimedathidingtheuglinessofdirectlyusingJSTLtagsforcontrolflowetc.butrememberthatFreeMarkerhashadaratherergonomicsyntaxfor“foreach”and“if”foryears.

2.Macros.Ifyouwanttohavereusabletemplatesnippets,youcanwritethemasmacrosandimportthem.AFAIK,inJSP2.0youfinallyhaveasortofmacros,butyouneedtodefineeachsnippetinitsownfile.Thisisnowhereaselegantasthefullnamespace/macrosolutioninFreeMarker.

3.Transforms.TransformsaretheequivalentofbodytagsinJSP,withasignificantdistinctionthatwhileJSPbodytagsfirstcachealloftheirbodyandonlyafterthatactonthem,FreeMarkertransformsarefullyoutput-driven,infacttheyareimplementedinternallyaschainsofjava.io.Writerobjects.Therefore,regardlessofhowmanytransformsyouhavenested,youcanstillhaveprogressivepagerendering(“can”becauseatransformcanchoosetocacheallofitsbodylikeaJSPbodytag,butisnotmandatedtodosoandcanprovideacleverimplementationthatallowsprogressiveprocessing).

4.Also,theusualargumentaboutusabilityoutsidetheHTTPprotocolstack.IfyoursystemdoesanytextoutputbesideHTTPresponses–i.e.sendsSMTPmail,youcanuseFreeMarkerforgeneratingmailmessagesfromtemplates,too,orforgeneratingarbitraryXML.ItevenhasdeclarativeXMLprocessingcapabilitieswhichmakeitpossibletouseitsimilartoXSLT,butsignificantlylesscomplex.Youcansimplifyyourprojectbyhavingonelanguageforallyourtextoutputgeneratingneeds.

5.Datamodelflexibility–ifyoulike,youcanimplementthedatamodelinterfacestonaturallyrepresentanyunderlyingdatamodel.I.e.wehaveawrapperforJythonobjectsthatprettyfaithfullyreflectsthelookandfeelofJythonobjectsinthetemplatesyntax.PeoplehavereportedprovidingasimilarbindingforJavaScriptetc.

There’salsolotsofgoodieslikeautomaticHTMLorXMLescapingofexpressions,convenientliteralsyntaxforlistsandmaps,etc.

Thismuchoffthetopofmyhead–it’sabitlatehere,soIcan’tthinkofanythingelseatthisverymoment.

Velocity'sSimplisticdesign

Ofthethreetechnologies,velocityisthesimplest.Ithasasmallamountofverypowerfulcommands.Syntaxisasfollows.

Displayvariablename

$var

Displayvariablename.Ifnullitdisplaysblank

$!var

Directives

#foreach($itemin$collection)itemis$item#end

#if($order.total==0)Nocharge#end

#parse("header.vm")

#macro

#include("disclaimer.txt")

#set($customer=${order.customer})

CodeComparisons

HereissomecodethatiswritteninJSP.Thisisthelogicthatwouldbeusedwhenprocessinganumbernamed"number"ispassedinasaparameter.

<%@pagelanguage="java"%>

<%@tagliburi="/WEB-INF/struts-logic.tld"prefix="logic"%>

<!--Isthenumberguessright?-->

<logic:equalparameter="number"value="7">

Youguessedright!Youwinahighspeedblender!

</logic:equal>

<!--Ifthenumberguessedwaswrong-->

<logic:notEqualparameter="number"value="7">

<!--LessThan-->

<logic:lessThanparameter="number"value="7">

Alittlehigher...

</logic:lessThan>

<!--GreaterThan-->

<logic:greaterThanparameter="number"value="7">

Alittlelower...

</logic:greaterThan>

</logic:notEqual>

Andhereisthesamelogicwithinavelocitytemplate

<!--Isthenumberguessright?-->

#if($number==7)

Youguessedright!Youwinahighspeedblender!

#end

<!--Ifthenumberguessedwaswrong-->

#if($number!=7)

<!--LessThan-->

#if($number<7)

Alittlehigher...

<!--GreaterThan-->

#elseif($number>7)

Alittlelower...

#end

#end

Nowaanotherexamplewiththesametask.Createalistanddisplayit.FirstJSP.

<%@pagelanguage="java"%>

<%@tagliburi="/WEB-INF/struts-bean.tld"prefix="bean"%>

<%@tagliburi="/WEB-INF/struts-logic.tld"prefix="logic"%>

<%

java.util.ArrayListlist=newjava.util.ArrayList();

list.add("First");

list.add("Second");

list.add("Third");

list.add("Fourth");

list.add("Fifth");

pageContext.setAttribute("list",list,PageContext.PAGE_SCOPE);

%>

<logic:iterateid="myCollectionElement"name="list">

ElementValue:<bean:writename="myCollectionElement"/><br/>

</logic:iterate>

Andhereisthevelocityversion.

#set($list=["First","Second","Third","Fourth","Fifth"])

#foreach($itemin$list)

ElementValue:$item<br/>

#end

Conclusion

JSPhasprovideddeveloperswithaveryusefullibraryandtoolset.Ithasbeenaroundforalongtimeandtherearenosignsthatitsusersaredeclining.DuetoMVCstylearchitecture,serversideprocessingincludingbusinesslogicshouldnottakeplacewithintheviewcomponent.IdidnotgetintoVelocityvsFreemarkerdebatesincetheyareidenticalfromanarchitecturalstandpoint.Youcanmakethatdecisionbycomparingthetemplatelanguageitselfandchoosewhichisbettersuitedforyourneeds.WhendeterminingwhichtechnologytoutilizeIhopethatyoutaketimetoresearcheachtechnologyandusethisarticleasareference.

相关推荐