JSP

Fra Wikipedia, den frie encyklopædi
Jump to navigation Jump to search
Disambig bordered fade.svg 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 | redigér wikikode]

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-syntaks[redigér | redigér wikikode]

JSP-specifikationen præsenterer 6 syntakselementer.

Direktiver[redigér | redigér wikikode]

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[redigér | redigér wikikode]

Erklæringer er på formen

<%! Erklæring %>

For eksempel:

<%! int i = 0; %>

Gyldig Java-kode[redigér | redigér wikikode]

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[redigér | redigér wikikode]

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[redigér | redigér wikikode]

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[redigér | redigér wikikode]

Kommentarer er på formen

 <!-- Kommentar -->

Kommentarer kan ikke indlejres i hinanden.

Model-View-Controller-paradigmet[redigér | redigér wikikode]

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 | redigér wikikode]

En simpel JSP[redigér | redigér wikikode]

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 | redigér wikikode]

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

Udgivelser[redigér | redigér wikikode]

Se også[redigér | redigér wikikode]

Eksterne links[redigér | redigér wikikode]