Spring til indhold

JSP

Fra Wikipedia, den frie encyklopædi
For alternative betydninger, se JSP (flertydig). (Se også artikler, som begynder med 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

[redigér | rediger kildetekst]

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

  1. Dynamisk generering af hjemmesider: Hjemmesider udseende kan varieres efter input, givet fx i forespørgselsstrengen (URL'en + dens parametre).
  2. 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.
  3. 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.
  4. 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.
  5. 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-specifikationen præsenterer 6 syntakselementer.

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 er på formen

<%! Erklæring %>

For eksempel:

<%! int i = 0; %>

Gyldig Java-kode

[redigér | rediger kildetekst]

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");
     }
%>

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" %>

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 er på formen

 <!-- Kommentar -->

Kommentarer kan ikke indlejres i hinanden.

Model-View-Controller-paradigmet

[redigér | rediger kildetekst]

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

[redigér | rediger kildetekst]

En simpel JSP

[redigér | rediger kildetekst]

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(); %>
<html>
<head><title>JSP-demo</title></head>
<body>
<h1>JSP-demo</h1>
<p>
Tid på serveren: <%=dato%> />
</p>
</body>
</html>

Servlet genereret ud fra JSP

[redigér | rediger kildetekst]

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

 <%@ 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>
 ...

Resulterende servlet

 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" %>
         }
    }
 }
[redigér | rediger kildetekst]