Programmering

JSP-skabeloner

Selvom webudviklingsværktøjer hurtigt udvikler sig, ligger de stadig bagud med de fleste grafiske brugergrænseflade (GUI) -værktøjssæt som Swing eller VisualWorks Smalltalk. For eksempel leverer traditionelle GUI-værktøjssæt layoutadministratorer i en eller anden form, der gør det muligt at indkapsle og genbruge layoutalgoritmer. Denne artikel udforsker en skabelonmekanisme til JavaServer Pages (JSP), der ligesom layoutadministratorer indkapsler layout, så det kan genbruges i stedet for replikeret.

Fordi layout gennemgår mange ændringer i løbet af udviklingen, er det vigtigt at indkapsle denne funktionalitet, så den kan ændres med minimal indvirkning på resten af ​​applikationen. Faktisk demonstrerer layoutledere et eksempel på en af ​​principperne for objektorienteret design: indkapsle konceptet, der varierer, hvilket også er et grundlæggende tema for mange designmønstre.

JSP yder ikke direkte support til indkapsling af layout, så websider med identiske formater replikerer normalt layoutkode; for eksempel viser figur 1 en webside, der indeholder sektioner for sidehoved, sidefod, sidebjælke og hovedindhold.

Layoutet på siden vist i figur 1 er implementeret med HTML-tabel tags:

Eksempel 1. Inkluderet indhold

JSP-skabeloner 
<%@include file="sidebar.html"%>
<%@include file="header.html"%>
<%@include file="introduction.html"%>
<%@include file="footer.html"%>

I eksemplet ovenfor er indhold inkluderet i JSP omfatte direktiv, som gør det muligt for siden at variere - ved at ændre de inkluderede filer - uden at ændre selve siden. Men fordi layout er hårdt kodet, kræver layoutændringer ændringer på siden. Hvis et websted har flere sider med identiske formater, hvilket er almindeligt, kræver selv enkle layoutændringer ændringer på alle siderne.

For at minimere virkningen af ​​layoutændringer har vi brug for en mekanisme til at inkludere layout ud over indhold; på den måde kan både layout og indhold variere uden at ændre filer, der bruger dem. Denne mekanisme er JSP-skabeloner.

Brug af skabeloner

Skabeloner er JSP-filer, der inkluderer parametreret indhold. De skabeloner, der diskuteres i denne artikel, er implementeret med et sæt brugerdefinerede tags: skabelon: få, skabelon: putog skabelon: indsæt. Det skabelon: få tag får adgang til parametreret indhold, som illustreret i eksempel 2.a, der producerer websider med det format, der er vist i figur 1.

Eksempel 2.a. En skabelon

<skabelon: get name = "title"/>
<skabelon: få name = "header" />

Eksempel 2.a er næsten identisk med eksempel 1, medmindre vi bruger skabelon: få i stedet for omfatte direktiv. Lad os undersøge hvordan skabelon: få arbejder.

skabelon: få henter en Java-bønne med det angivne navn fra anmodningsomfanget. Bønnen indeholder URI (Uniform Resource Identifier) ​​af en webkomponent, der er inkluderet i skabelon: få. For eksempel i skabelonen, der er anført i eksempel 2.a, skabelon: få får en URI - header.html - fra en bønne ved navn header i anmodningens omfang. Efterfølgende skabelon: få inkluderer header.html.

skabelon: put sætter bønnerne i anmodningsomfang, der efterfølgende hentes af skabelon: få. Skabelonen er inkluderet i skabelon: indsæt. Eksempel 2.b illustrerer brugen af sætte og indsæt tags:

Eksempel 2.b. Brug af skabelonen fra eksempel 2.a

<>indsæt skabelon = "/ articleTemplate.jsp"><>sætte name = "title" content = "Skabeloner" direct = "true" /><>sætte name = "header" content = "/ header.html" /><>sætte name = "sidebar" content = "/ sidebar.jsp" /><>sætte navn = "indhold" indhold = "/ introduktion.html" /><>sætte name = "footer" content = "/ footer.html" />

Det indsæt start tag specificerer den skabelon, der skal medtages, i dette tilfælde skabelonen, der er anført i eksempel 2.a. Hver sætte tag gemmer en bønne i anmodningsomfang og indsæt slutkode inkluderer skabelonen. Skabelonen får derefter adgang til bønnerne som beskrevet ovenfor.

EN direkte attribut kan specificeres for skabelon: put; hvis direkte er indstillet til rigtigt, indholdet tilknyttet tagget er ikke inkluderet i skabelon: få, men er trykt direkte på det implicitte ud variabel. I eksempel 2.b bruges f.eks. Titelindholdet - JSP-skabeloner - til vinduetitlen.

Websteder, der indeholder flere sider med identiske formater, har en skabelon, såsom den, der er angivet i eksempel 2.a, og mange JSP-sider, såsom eksempel 2.b, der bruger skabelonen. Hvis formatet ændres, er ændringer begrænset til skabelonen.

En anden fordel ved skabeloner og med indhold generelt er modulært design. For eksempel inkluderer JSP-filen, der er anført i eksempel 2.b, i sidste ende header.html, anført i eksempel 2.c.

Eksempel 2.c. header.html


Fordi header.html er inkluderet indhold, behøver det ikke at blive replikeret blandt sider, der viser en overskrift. Også selvom header.html er en HTML-fil, den indeholder ikke den sædvanlige indledning til HTML-tags, såsom eller fordi disse tags er defineret af skabelonen. Det vil sige, fordi skabelonen inkluderer header.htmlbør disse tags ikke gentages i header.html.

Bemærk: JSP giver to måder at inkludere indhold på: statisk med omfatte direktiv og dynamisk med omfatte handling. Det omfatte Direktivet inkluderer kilden til målsiden ved kompileringstidspunktet og svarer til C'er #omfatte eller Java'er importere. Det omfatte handling inkluderer målets respons genereret ved kørsel.

Ligesom JSP omfatte handling, skabeloner inkluderer indhold dynamisk. Så selvom JSP-siderne i eksempel 1 og eksempel 2.b er funktionelt identiske, inkluderer førstnævnte statisk indhold, mens sidstnævnte dynamisk inkluderer det.

Valgfrit indhold

Alt skabelonindhold er valgfrit, hvilket gør en enkelt skabelon nyttig til flere websider. For eksempel viser figur 2.a og figur 2.b to sider - login og beholdning - der bruger den samme skabelon. Begge sider har en sidehoved, sidefod og hovedindhold. Inventarsiden har et redigeringspanel (som login-siden mangler) til at foretage beholdningsændringer.

Nedenfor finder du skabelonen, der deles af login- og beholdningssiderne:

 ... 
navn = 'editPanel'/>
...

Inventarsiden bruger skabelonen, der er anført ovenfor, og specificerer indholdet til redigeringspanelet:

   ...  ...  

Derimod specificerer loginsiden ikke indhold til redigeringspanelet:

Da login-siden ikke specificerer indhold til redigeringspanelet, er det ikke inkluderet.

Rollebaseret indhold

Webapplikationer diskriminerer ofte indhold baseret på en brugers rolle. For eksempel producerer den samme JSP-skabelon, som kun inkluderer redigeringspanelet, når brugerens rolle er kurator, de to sider, der er vist i figur 3.a og 3.b.

Skabelonen anvendt i figur 3.a og 3.b bruger skabelon: få's rolle attribut:

 ...  ...  ... 
role = 'kurator'/>
...

Det tag indeholder kun indhold, hvis brugerens rolle matcher rolle attribut. Lad os se på, hvordan taghåndtereren til skabelon: få bruger rolle attribut:

offentlig klasse GetTag udvider TagSupport {private String name = null, role = null; ... public void setRole (String role) {this.role = role; } ... public int doStartTag () kaster JspException {... if (param! = null) {if (roleIsValid ()) { // inkluderer eller udskriver indhold ... }} ...} privat boolsk roleIsValid ()  } 

Implementering af skabeloner

De skabeloner, der er diskuteret i denne artikel, er implementeret med tre brugerdefinerede tags:

  • skabelon: indsæt
  • skabelon: put
  • skabelon: få

Det indsæt tag indeholder en skabelon, men inden det gør det, sætte tags gemmer information - et navn, URI og en boolsk værdi, der angiver, om indholdet skal inkluderes eller udskrives direkte - om det indhold, skabelonen indeholder. skabelon: få, som inkluderer (eller udskriver) det specificerede indhold, får derefter adgang til oplysningerne.

skabelon: put gemmer bønner i anmodningsomfang, men ikke direkte fordi hvis to skabeloner bruger de samme indholdsnavne, kan en indlejret skabelon overskrive den vedlagte skabelons indhold.

For at sikre, at hver skabelon kun har adgang til sine egne oplysninger, skabelon: indsæt opretholder en stak hashtables. Hver indsæt start-tag opretter en hashtable og skubber den på stakken. Den vedlagte sætte tags opretter bønner og gemmer dem i den nyoprettede hashtable. Efterfølgende tags i den medfølgende skabelon får adgang til bønnerne i hashtabellen. Figur 4 viser, hvordan stakken vedligeholdes for indlejrede skabeloner.

Hver skabelon i figur 4 får adgang til den rigtige sidefod; footer.html til skabelon_1.jsp og footer_2.html til skabelon_2.jsp. Hvis bønnerne blev opbevaret direkte i anmodningsomfanget, ville trin 5 i figur 4 overskrive bundfoden, der er specificeret i trin 2.

Skabelon tag implementeringer

Resten af ​​denne artikel undersøger implementeringen af ​​de tre skabelontags: indsæt, sætteog . Vi begynder med sekvensdiagrammer, der starter med figur 5. Det illustrerer rækkefølgen af ​​begivenheder for indsæt og sætte tags, når en skabelon bruges.

Hvis en skabelonstak ikke allerede findes, vises indsæt start-tag opretter en og placerer den i anmodningsomfanget. En hashtable oprettes efterfølgende og skubbes på stakken.

Hver sætte start tag opretter en PageParameter bønne, gemt i hashtable oprettet af vedlagte indsæt tag.

Indsatsen ende tag indeholder skabelonen. Skabelonen bruger tags for at få adgang til de bønner, der er oprettet af sætte tags. Når skabelonen er behandlet, oprettes hashtable af indsæt start-tag vises fra stakken.

Figur 6 viser sekvensdiagrammet for skabelon: få.

Skabelonlister

Taghåndteringsimplementeringer for skabelontags viser sig ligetil. Eksempel 3.a viser listen Indsæt tag klasse - taghåndteringen til skabelon: indsæt.

Eksempel 3.a. InsertTag.java