JSP predlošci

Iako alati za web razvoj brzo napreduju, oni i dalje zaostaju za većinom alata za grafičko korisničko sučelje (GUI), poput Swinga ili VisualWorks Smalltalka. Na primjer, tradicionalni GUI alati nude upravitelje izgleda, u jednom ili drugom obliku, koji omogućuju enkapsuliranje i ponovnu upotrebu algoritama izgleda. Ovaj članak istražuje mehanizam predloška za JavaServer Pages (JSP) koji poput upravitelja izgleda enkapsulira izgled tako da se može ponovno upotrijebiti umjesto replicirati.

Budući da izgled tijekom razvoja prolazi kroz mnoge promjene, važno je tu funkciju inkapsulirati kako bi se mogla izmijeniti s minimalnim utjecajem na ostatak aplikacije. Zapravo, voditelji izgleda pokazuju primjer jednog od načela objektno orijentiranog dizajna: inkapsuliraju koncept koji varira, što je također temeljna tema za mnoge uzorke dizajna.

JSP ne pruža izravnu podršku za enkapsulaciju izgleda, tako da web stranice s identičnim formatima obično repliciraju kod izgleda; na primjer, slika 1 prikazuje web stranicu koja sadrži zaglavlje, podnožje, bočnu traku i odjeljke glavnog sadržaja.

Izgled stranice prikazan na slici 1. implementiran je s oznakama HTML tablice:

Primjer 1. Uključujući sadržaj

JSP predlošci  
   
<% @ include file = "sidebar.html"%>
<% @ include file = "header.html"%>
<% @ include file = "uvod.html"%>
<% @ include file = "footer.html"%>

U gore navedenom primjeru sadržaj je uključen u JSP includedirektivu koja omogućava da se sadržaj stranice mijenja - mijenjajući uključene datoteke - bez izmjene same stranice. Međutim, budući da je izgled teško kodiran, promjene izgleda zahtijevaju izmjene na stranici. Ako web stranica ima više stranica s identičnim formatima, što je uobičajeno, čak i jednostavne promjene izgleda zahtijevaju izmjene na svim stranicama.

Da bismo umanjili utjecaj promjena izgleda, potreban nam je mehanizam za uključivanje izgleda uz sadržaj; na taj se način i izgled i sadržaj mogu razlikovati bez mijenjanja datoteka koje ih koriste. Taj mehanizam čine JSP predlošci.

Korištenje predložaka

Predlošci su JSP datoteke koje uključuju parametarski sadržaj. Predlošci spominju u ovom članku se provode sa skupa prilagođenih oznaka: template:get, template:put, i template:insert. template:getOznaka pristupa parametrizirani sadržaja, kao što je prikazano u primjeru, koja proizvodi 2.a web stranice u obliku koji je prikazan na slici 1.

Primjer 2.a. Predložak

< template: get name = "title" />
   
< template: get name = "header" />

Primjer 2.a gotovo je identičan Primjeru 1, osim što koristimo template:getumjesto includedirektive. Ispitajmo kako to template:getfunkcionira.

template:getdohvaća Java grah s navedenim imenom iz opsega zahtjeva. Bean sadrži URI (jedinstveni identifikator resursa) web komponente koju uključuje template:get. Na primjer, u predlošku navedenom u Primjeru 2.a, template:getdobiva URI - header.html- iz graha imenovanog headeru opsegu zahtjeva. Naknadno, template:getuključuje header.html.

template:putstavlja grah u opseg zahtjeva koji se naknadno preuzima template:get. Predložak je priložen uz template:insert. Primjer 2.b ilustrira upotrebu puti insertoznake:

Primjer 2.b. Upotreba predloška iz primjera 2.a

   
    umetnite predložak = "/ articleTemplate.jsp">
    
     put name = "title" content = "Predlošci" direct = "true" />
     
      stavite name = "header" content = "/ header.html" />
      
       put name = "sidebar" content = "/ sidebar.jsp" />
       
        put name = "content" content = "/ uvod.html" />
        
         put name = "footer" content = "/ footer.html" />
        
       
      
     
    
   

Na insertpočetak Oznaka određuje predložak koji će biti uključeni u ovom slučaju predložak navedeni u primjeru 2.a. Svaka putoznaka sprema grah u opseg zahtjeva, a insertkrajnja oznaka uključuje predložak. Predložak zatim pristupa grahu kako je gore opisano.

directAtribut može biti specificiran za template:put; ako directje postavljeno na true, sadržaj povezan s oznakom nije uključen template:get, već se ispisuje izravno na implicitnu outvarijablu. U primjeru 2.b, na primjer, sadržaj naslova - JSP Predlošci - koristi se za naslov prozora.

Web stranice koje sadrže više stranica s jednakim formatima imaju jedan predložak, poput onog navedenog u Primjeru 2.a, i mnoge JSP stranice, poput Primjera 2.b, koje koriste predložak. Ako je format izmijenjen, promjene su ograničene na predložak.

Još jedna prednost predložaka i općenito uključivanja sadržaja je modularni dizajn. Na primjer, JSP datoteka navedena u Primjeru 2.b na kraju uključuje header.html, navedenu u Primjeru 2.c.

Primjer 2.c. header.html

   

Budući da header.htmlje uključeni sadržaj, ne mora se replicirati na stranice koje prikazuju zaglavlje. Također, iako header.htmlje HTML datoteka, ona ne sadrži uobičajenu preambulu HTML oznaka kao što su ili zato što su te oznake definirane predloškom. Odnosno, jer predložak uključuje header.html, te se oznake ne smiju ponavljati u header.html.

Napomena: JSP nudi dva načina za uključivanje sadržaja: statički, s includedirektivom i dinamički, s includeakcijom. includeDirektiva uključuje izvor ciljane stranice u vrijeme prevođenja i odgovara C-a #includeili Java-a import. includeDjelovanje uključuje odgovor je meta je generirana za vrijeme izvođenja.

Like the JSP include action, templates include content dynamically. So, although the JSP pages in Example 1 and Example 2.b are functionally identical, the former statically includes content, whereas the latter dynamically includes it.

Optional content

All template content is optional, which makes a single template useful to more Webpages. For example, Figure 2.a and Figure 2.b show two pages -- login and inventory -- that use the same template. Both pages have a header, footer, and main content. The inventory page has an edit panel (which the login page lacks) for making inventory changes.

Below, you'll find the template shared by the login and inventory pages:

 ... 
   
name='editPanel'/>
...

The inventory page uses the template listed above and specifies content for the edit panel:

   ... 
    ...  

In contrast, the login page does not specify content for the edit panel:


  

Because the login page does not specify content for the edit panel, it's not included.

Role-based content

Web applications often discriminate content based on a user's role. For example, the same JSP template, which includes the edit panel only when the user's role is curator, produces the two pages shown in Figures 3.a and 3.b.

The template used in Figures 3.a and 3.b uses template:get's role attribute:

 ... 
   
     ... 
     ... 
    
role='curator'/>
...

The get tag includes content only if the user's role matches the role attribute. Let's look at how the tag handler for template:get uses the role attribute:

public class GetTag extends TagSupport { private String name = null, role = null; ... public void setRole(String role) { this.role = role; } ... public int doStartTag() throws JspException { ... if(param != null) { if(roleIsValid()) { // include or print content ... } } ... } private boolean roleIsValid()  } 

Implementing templates

The templates discussed in this article are implemented with three custom tags:

  • template:insert
  • template:put
  • template:get

The insert tag includes a template, but before it does, put tags store information -- a name, URI, and Boolean value specifying whether content should be included or printed directly -- about the content the template includes. template:get, which includes (or prints) the specified content, subsequently accesses the information.

template:put stores beans in request scope but not directly because if two templates use the same content names, a nested template could overwrite the enclosing template's content.

To ensure that each template has access only to its own information, template:insert maintains a stack of hashtables. Each insert start tag creates a hashtable and pushes it on the stack. The enclosed put tags create beans and store them in the newly created hashtable. Subsequently, get tags in the included template access the beans in the hashtable. Figure 4 shows how the stack is maintained for nested templates.

Each template in Figure 4 accesses the correct footer; footer.html for template_1.jsp and footer_2.html for template_2.jsp. If the beans were stored directly in request scope, step 5 in Figure 4 would overwrite the footer bean specified in step 2.

Template tag implementations

The remainder of this article examines the implementation of the three template tags: insert, put, and get. We begin with sequence diagrams, starting with Figure 5. It illustrates the sequence of events for the insert and put tags when a template is used.

If a template stack does not already exist, the insert start tag creates one and places it in request scope. A hashtable is subsequently created and pushed on the stack.

Svaka putpočetna oznaka stvara PageParametergrah koji se pohranjuje u tablicu raspršivanja stvorenu priloženom insertoznakom.

Oznaka za umetanje enduključuje predložak. Predložak koristi getoznake za pristup grahu stvorenom putoznakama. Nakon obrade predloška, ​​hashtable stvoren insertpočetnom oznakom iskače iz snopa.

Slika 6 prikazuje dijagram redoslijeda za template:get.

Popisi oznaka predloška

Implementacije rukovatelja oznakama za oznake predloška pokazuju se jednostavnim. Primjer 3.a navodi InsertTagklasu - obrađivač oznaka za template:insert.

Primjer 3.a. InsertTag.java