Templat JSP

Walaupun alat pengembangan Web berkembang pesat, mereka masih ketinggalan kebanyakan alat alat antara muka pengguna grafik (GUI) seperti Swing atau VisualWorks Smalltalk. Sebagai contoh, kit alat GUI tradisional menyediakan pengurus susun atur, dalam satu bentuk atau yang lain, yang membolehkan algoritma susun atur dikemas dan digunakan semula. Artikel ini meneroka mekanisme templat untuk JavaServer Pages (JSP) yang, seperti pengurus tata letak, merangkum susun atur sehingga dapat digunakan kembali dan bukan ditiru.

Kerana susun atur mengalami banyak perubahan sepanjang pengembangan, penting untuk merangkumi fungsi tersebut sehingga dapat diubahsuai dengan sedikit kesan pada aplikasi yang lain. Sebenarnya, pengurus susun atur menunjukkan contoh salah satu prinsip reka bentuk berorientasikan objek: merangkumi konsep yang berbeza-beza, yang juga merupakan tema asas bagi banyak corak reka bentuk.

JSP tidak memberikan sokongan langsung untuk merangkumi susun atur, jadi Halaman Web dengan format yang serupa biasanya meniru kod susun atur; sebagai contoh, Gambar 1 menunjukkan Halaman Web yang mengandungi bahagian tajuk, footer, bar sisi, dan kandungan utama.

Susun atur halaman yang ditunjukkan dalam Gambar 1 dilaksanakan dengan tag jadual HTML:

Contoh 1. Termasuk kandungan

Templat JSP  
   
<% @ include file = "sidebar.html"%>
<% @ include file = "header.html"%>
<% @ include file = "Introduction.html"%>
<% @ include file = "footer.html"%>

Dalam contoh yang disenaraikan di atas, kandungan disertakan dengan includearahan JSP , yang membolehkan kandungan halaman berubah - dengan mengubah fail yang disertakan - tanpa mengubah halaman itu sendiri. Namun, kerana susun atur dikodekan dengan keras, perubahan tata letak memerlukan pengubahsuaian pada halaman. Sekiranya Laman Web mempunyai banyak halaman dengan format yang sama, yang biasa, perubahan susun atur yang sederhana memerlukan pengubahsuaian pada semua halaman.

Untuk mengurangkan kesan perubahan susun atur, kami memerlukan mekanisme untuk memasukkan tata letak selain kandungan; dengan cara itu, kedua-dua susun atur dan kandungan dapat berbeza tanpa mengubah fail yang menggunakannya. Mekanisme itu adalah templat JSP.

Menggunakan templat

Templat adalah fail JSP yang merangkumi kandungan parameter. Template dibincangkan dalam artikel ini dilaksanakan dengan satu set tag adat: template:get, template:put, dan template:insert. The template:gettag mengakses kandungan parameterized, seperti yang ditunjukkan dalam Contoh 2.A, yang menghasilkan Halaman web dengan format yang ditunjukkan dalam Rajah 1.

Contoh 2.a. Templat

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

Contoh 2.a hampir sama dengan Contoh 1, kecuali kita menggunakan template:getbukannya includearahan. Mari kita kaji bagaimana ia template:getberfungsi.

template:getmengambil kacang Java dengan nama yang ditentukan dari ruang lingkup permintaan. Kacang berisi URI (Uniform Resource Identifier) ‚Äč‚Äčkomponen Web yang disertakan oleh template:get. Sebagai contoh, dalam templat yang disenaraikan dalam Contoh 2.a, template:getmemperoleh URI - header.html- dari kacang yang dinamakan headerdalam ruang lingkup permintaan. Selepas itu, template:getmerangkumi header.html.

template:putmeletakkan kacang dalam ruang lingkup permintaan yang kemudian diambil oleh template:get. Templat disertakan dengan template:insert. Contoh 2.b menggambarkan penggunaan putdan inserttag:

Contoh 2.b. Menggunakan templat dari Contoh 2.a

   
    masukkan templat = "/ artikelTemplate.jsp">
    
     let name = "title" content = "Templates" direct = "true" />
     
      let name = "header" content = "/ header.html" />
      
       letakkan nama = "sidebar" content = "/ sidebar.jsp" />
       
        let name = "content" content = "/ pengenalan.html" />
        
         let name = "footer" content = "/ footer.html" />
        
       
      
     
    
   

Yang insertdinyatakan oleh permulaan tag template yang hendak dimasukkan, dalam kes ini template yang disenaraikan dalam Contoh 2.a. Setiap puttag menyimpan kacang dalam ruang lingkup permintaan dan inserttag akhir termasuk templat. Templat kemudian memasuki biji seperti yang dijelaskan di atas.

A directatribut boleh dinyatakan untuk template:put; jika directdiset ke true, kandungan yang berkaitan dengan tag tidak termasuk template:get, tetapi dicetak terus ke outpemboleh ubah tersirat . Dalam Contoh 2.b, misalnya, kandungan tajuk - Templat JSP - digunakan untuk tajuk tetingkap.

Laman web yang mengandungi beberapa halaman dengan format yang sama mempunyai satu templat, seperti yang disenaraikan dalam Contoh 2.a, dan banyak halaman JSP, seperti Contoh 2.b, yang menggunakan templat. Sekiranya formatnya diubah, perubahan dibatasi pada templat.

Manfaat lain templat dan termasuk kandungan secara umum adalah reka bentuk modular. Sebagai contoh, fail JSP yang disenaraikan dalam Contoh 2.b akhirnya merangkumi header.html, disenaraikan dalam Contoh 2.c.

Contoh 2.c. header.html

   

Kerana header.htmldisertakan isi, tidak perlu ditiru di antara halaman yang menampilkan header. Selain itu, walaupun header.htmlmerupakan file HTML, file tersebut tidak berisi mukadimah tag HTML seperti atau kerana tag tersebut ditentukan oleh templat. Itu kerana templatnya termasuk header.html, tag tersebut tidak boleh diulang header.html.

Catatan: JSP menyediakan dua cara untuk memasukkan kandungan: secara statistik, dengan includearahan, dan secara dinamis, dengan includetindakan. The includearahan termasuk sumber bagi laman sasaran pada masa kompil dan bersamaan dengan itu C #includeatau Jawa import. The includetindakan termasuk sambutan sasaran dihasilkan pada masa jalanan.

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.

Setiap puttag permulaan membuat PageParameterkacang, disimpan di hashtable yang dibuat oleh inserttag lampiran .

Tanda sisipan endmerangkumi templat. Templat menggunakan gettag untuk mengakses kacang yang dibuat oleh puttag. Setelah templat diproses, hashtable yang dibuat oleh inserttag mula muncul dari timbunan.

Rajah 6 menunjukkan rajah turutan untuk template:get.

Senarai tag templat

Pelaksanaan pengendali tag untuk tag templat terbukti mudah. Contoh 3.a menyenaraikan InsertTagkelas - pengendali tag untuk template:insert.

Contoh 3.a. InsertTag.java