JSP

En Java Server Page eller JSP er et HTML- eller XML-dokument med indlejret javakode.
En JSP-side skal køres på en passende applikationsserver (fx en J2EE-server). Når siden forespørges, sørger applikationsserveren for at kompilere siden til en en servlet. JSP-sider bruges tit sammen med servlets, således at præsentationen klares af JSP'er mens selve processeringen af forespørgsler klares af servletter.

Fordele ved JSP 

JSP har en række fordele i forhold til fx statiske HTML-sider:

 Dynamisk generering af hjemmesider: Hjemmesider udseende kan varieres efter input, givet fx i forespørgselsstrengen (URL'en + dens parametre).
 Adgang til standardobjekter: Når man skriver en JSP, er der adgang til en række nyttige standardobjekter. Objektet request indeholder oplysninger om klientprogrammet og eventuelle inputdata. Hvis der skal manipuleres med data i svaret, klares det med objektet response. Objekterne session og application kan holde klientdata fra en JSP eller servlet til den næste under en hel session hhv. en hel kørsel af web-applikation.
 Adgang til standard-præsentationslogik: Mange applikationsservere tilbyder taglibs med prædefineret præsentationslogik, som JSP-siderne kan benytte sig af. Dermed lettes programmørens opgave.
 Adskillelse af præsentation og logik: Man kan sætte en HTML-programmør uden dybere erfaring med programmering til at udvikle JSP-sider, mens mere tekniske udviklere kan implementere javakode i servletter og andre bagvedliggende komponenter.
 God håndtering af undtagelser: I tilfælde af undtagelser, der skal propageres til klienten, tilbyder JSP en række fornuftige navigations- og fremvisningselementer.

JSP-syntaks 

JSP-specifikationen præsenterer 6 syntakselementer.

Direktiver 

I direktiver kan andre JSP-sider inkluderes (statisk, som råtekst eller på compile-time), og taglibs, klasser og servlets kan importeres. Det kan endvidere specificeres, om siden er en fejlside eller ej, mv.
Direktiver er på formen

 <%@ Direktiv %>

For eksempel:

 <%@ taglib prefix = ”myPrefix” uri = ”myUri” %>

Erklæringer 

Erklæringer er på formen

 <%! Erklæring %>

For eksempel:

 <%! int i = 0; %>

Gyldig Java-kode 

Java-kode (også variabel- og metodeerklæringer) kan indsættes direkte i JSP-siderne (selvom det kan være praktisk, er det dog i strid men Model-View-Controller-designmønstret).

Java-kode der indsættes i JSP-sider kaldes scriptlets.

Scriptlets er på formen

 <% scriptlet %>

Et eksempel på en scriptlet kunne være:

 <% 
      String name = null; 
      if (request.getParameter("name") == null) { 
 %> 
 <%@ include file="error.html" %> 
 <% 
      } else { 
         name = request.getParameter("name");
      }
 %>

Udtryk 

Java-udtryk kan indsættes. Udtrykket evalueres på forespørgselstidspunktet, og den resulterende simple type eller objektreferences toString-metode kaldes; resultatet heraf indsættes i siden. Udtryk er på formen

 <%= Udtryk %>

For eksempel:

 <%= "Dette er et udtryk" %>

Actions 

JSP-sider kan udføre såkaldte actions, der inkluderer andre JSP-sider dynamisk, tilgår egenskaber på såkaldte backing beans (Java-objekter, der bl.a. kan indeholde data i forbindelse med en klientsession) og videresender til nye JSP-sider.

Bemærk, at actions er den eneste JSP-konstruktion, der benytter XML-syntaks istf. standard JSP-syntaks.

Actions er på formen

 <jsp:actionNavn> Evt. krop </jsp:actionNavn>

For eksempel:

 <jsp:include page="scripts/login.jsp" />
 <jsp:include page="copyright.html" />
 <jsp:include page="/index.html" />
 <jsp:include page="scripts/login.jsp">	
    <jsp:param name="username" value="jsmith" />	
 </jsp:include>

Kommentarer 

Kommentarer er på formen

<nowiki>
 <!-- Kommentar -->
</nowiki>
Kommentarer kan ikke indlejres i hinanden.

Model-View-Controller-paradigmet 

Sun anbefaler at Model-View-Controller-mønsteret anvendes med JSP-filer for at afkoble præsentation, processering af HTTP-forespørgsler og datalagring. Enten kan servlets eller separate JSP-filer håndtere processeringen af forespørgsler, hvorefter kontrollen delegeres til en JSP-side, hvis ansvar det kun er at generere output (HTML-kode).

Flere platforme baseret på Model-View-Controller-mønsteret findes, fx JavaServer Faces, Apache Struts og Spring.

Eksempler på JSP-sider

En simpel JSP 

Her er et eksempel på en meget simpel JSP, der fortæller, hvad klokken er på applikationsserveren, hvor JSP-en er installeret:

 <% java.util.Date dato = new java.util.Date(); %>
  JSP-demo
  <h1>JSP-demo</h1>
 <p>
 Tid på serveren: <%=dato%> />
 </p>

Servlet genereret ud fra JSP 
Uanset hvordan om JSP-compileren genererer Java-kildekode for en servlet eller generer Java-byte-code direkte,
er det instruktivt at se, hvordan compileren omformer en JSP-side til en servlet (dette sker ved første forespørgsel efter siden).

Input-JSP
<nowiki>
 <%@ page errorPage="myerror.jsp" %>
 <%@ page import="com.foo.bar" %>

 <html>
 <head>
 <%! int serverInstanceVariable = 1;%>
 ...
 <% int localStackBasedVariable = 1; %>
 <table>
 <tr><td><%= "expanded inline data " + 1 %></td></tr>
 ...
</nowiki>

Resulterende servlet
<nowiki>
 package jsp_servlet;
 import java.util.*;
 import java.io.*;
 import javax.servlet.*;
 import javax.servlet.http.*;
 import javax.servlet.jsp.*;
 import javax.servlet.jsp.tagext.*;

 import com.foo.bar; //imported as a result of <%@ page import="com.foo.bar" %>
 import ...

 class _myservlet implements javax.servlet.Servlet, javax.servlet.jsp.HttpJspPage {
     //inserted as a
     //result of <%! int serverInstanceVariable = 1;%>
     int serverInstanceVariable = 1; 
     ...

     public void _jspService( javax.servlet.http.HttpServletRequest request,
                              javax.servlet.http.HttpServletResponse response )
       throws javax.servlet.ServletException,
              java.io.IOException
     {
         javax.servlet.ServletConfig config = ...;//get the servlet config
         Object page = this;
         PageContext pageContext = ...;//get the page context for this request 
         javax.servlet.jsp.JspWriter out = pageContext.getOut();
         HttpSession session = request.getSession( true );
         try {
             out.print( "<html>\r\n" );
             out.print( "<head>\r\n" );
             ...
             //from <% int localStackBasedVariable = 1; %>
             int localStackBasedVariable = 1; 
             ...
             out.print( "<table>\r\n" );
             out.print( "   <tr><td>" );
             //note, toStringOrBlank() converts the expression into a string or if
             // the expression is null, it uses the empty string.
             //from <%= "expanded inline data " + 1 %>
             out.print( toStringOrBlank( "expanded inline data " + 1 ) );
             out.print( "   </td></tr>\r\n" );
             ...
         } catch ( Exception _exception ) {
             //clean up and redirect to error page in <%@ page errorPage="myerror.jsp" %>
         }
    }
 }
</nowiki>

Udgivelser 

 JavaServer Pages, Third Edition, Hans Bergsten, O'Reilly & Associates, Inc., Sebastopol, California, 2003.

Se også 

 J2EE
 JavaServer Faces
 Servlet
 WAR (filformat)
 EAR (filformat)
 JAR (filformat)

Eksterne links 
 Suns JSP-produktbeskrivelse
 JSP-Tutorial – trin for trin 
 JSR 245 (JSP 2.1)
 JSR 152 (JSP 2.0)
 JSR 53 (JSP 1.2)
 Gratis JSP-undervisningsmateriale (på engelsk) 

Javaprogrammering
Webudviklingssoftware