Newsletter sign-up
View all newsletters

Enterprise Java Newsletter
Stay up to date on the latest tutorials and Java community news posted on JavaWorld

Sponsored Links

Optimize with a SATA RAID Storage Solution
Range of capacities as low as $1250 per TB. Ideal if you currently rely on servers/disks/JBODs

JSP templates

Use JSP templates to encapsulate Webpage layout and encourage modular design

  • Print
  • Feedback

Page 2 of 3



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.

Figure 2.a. A login form



Figure 2.b. An inventory page



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

<%@ taglib uri='template.tld' prefix='template' %>
...
<table width='670'>
   <tr><td width='60'></td>
      <td><template:get name='header'/></td></tr>
   <tr><td width='60'></td>
      <td><template:get name='main-content'/></td></tr>
   <tr><td width='60'></td>
       <td><template:get name='editPanel'/></td></tr>
   <tr><td width='60'></td>
   <td><template:get name='footer'/></td></tr>
</table>
...


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

<%@ taglib uri='template.tld' prefix='template' %>
<%@ taglib uri='security.tld' prefix='security' %>
<template:insert template='/template.jsp'>
   ...
   <template:put name='editPanel'
                    content='/editPanelContent.jsp'/>
   ...
</template:insert>


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

<%@ taglib uri='template.tld' prefix='template' %>
<template:insert template='/template.jsp'>
   <template:put name='title' content='Login' direct='true'/>
   <template:put name='header' content='/header.jsp'/>
   <template:put name='main-content'
                 content='/login.jsp'/>
   <template:put name='footer' content='/footer.jsp'/>
</template:insert>


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.

Figure 3.a. Inventory page for curators



Figure 3.b. Inventory page for other users



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

<%@ taglib uri='template.tld' prefix='template' %>
...
<table>
   ...
   <td><template:get name='editPanel' role='curator'/></td></tr>
   ...
</table>
...


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() {
      return role == null || // valid if role isn't set
         ((javax.servlet.http.HttpServletRequest)
          pageContext.getRequest()).isUserInRole(role);
   }
}


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.

  • Print
  • Feedback

Resources