JavaServer Pages

Tehnologia JavaServer Pages (JSP) are la bază tehnologia servlet-urilor şi replică într-o mare măsură tehnologia Active Server Pages (ASP) de la Microsoft.

În esenţă este vorba de posibilitatea de inserare de cod java în cadrul paginilor HTML. Codul java este inclus între tagurile speciale <% şi %> .

O pagină HTML cu secvenţe de cod JSP arată astfel:

<HTML>
<HEAD><TITLE>Hello</TITLE></HEAD>
<BODY>
<H1>
<%
if (request.getParameter("name") == null) {
   out.println("Hello World");
}
else {
  out.println("Hello, " + request.getParameter("name"));
}
%>
</H1>
</BODY></HTML>

În momentul în care paginile JSP sunt încărcate, serverul (care găzduieşte paginile JSP) va genera automat, compila, încărca şi rula servleturi speciale pentru a genera conţinutul dinamic al paginii.

FIGURA

Servletul generat în fundal ca urmare a realizării cererii de încărcare a paginii prezentate în listingul anterior arată astfel:

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
 
public class _hello1_xjsp extends HttpServlet {
 
  public void service(HttpServletRequest request, HttpServletResponse response)
                                 throws ServletException, IOException {
    response.setContentType("text/html");
    PrintWriter out = response.getWriter();
    BufferedReader in = request.getReader();
 
    out.println("<HTML>");
    out.println("<HEAD><TITLE>Hello</TITLE></HEAD>");
    out.println("<BODY>");
    out.println("<H1>");
    if (request.getParameter("name") == null) {
      out.println("Hello World");
    }
    else {
      out.println("Hello, " + request.getParameter("name"));
    }
    out.println("</H1>");
    out.println("</BODY></HTML>");
  }
}

Prima încărcare a paginii JSP va dura mai mult deoarece serverul va trebui să genereze, compileze şi să încarce servletul corespunzător.

Elementele unei pagini JSP

Codul JSP poate fi inserat în cadrul paginilor în trei moduri:

<%= expression %> în acest caz expresia este evaluată şi rezultatul este trimis către ieşire (afişare).

<% code %> acest cod este inserat în cadrul metodei service() corespunzătoare servletului ce va fi generat pe baza paginii JSP.

<%! code %> astfel de declaraţii sunt folosite pentru a insera cod în cadrul servletului dar în afara oricărei metode.

Expresii JSP

După cum s-a precizat expresiile sunt evaluate, convertite în şir de caractere şi trimise către ieşire. De exemplu următoarea secvenţă va trimite către ecran timpul curent al sistemului.

Current time: <%= new java.util.Date() %>

Pentru lucrul cu expresii sunt câteva expresii care sunt predefinite şi pot fi folosite în cadrul acestora. Cele mai importante sunt următoarele:

  • request, reprezintă obiectul de tip HttpServletRequest;
  • response, reprezintă obiectul de tip HttpServletResponse;
  • session, reprezintă obiectul de tip HttpSession asociat cu obiectul request;
  • out, reprezintă un obiect de tip PrintWriter ce poate fi folosit pentru trimiterea datelor către ieşire.

Un alt exemplu:

 
Your hostname: <%= request.getRemoteHost() %>

Scripturi JSP

Paginile JSP permit inserarea de cod complex java prin intermediul tagurilor <% %>. Câteva exemple:

<%
String queryData = request.getQueryString();
out.println("Attached GET data: " + queryData);
%>
 
<% if (Math.random() < 0.5) { %>
Have a <B>nice</B> day!
<% } else { %>
Have a <B>lousy</B> day!
<% } %>
 
if (Math.random() < 0.5) {
  out.println("Have a <B>nice</B> day!");
} else {
  out.println("Have a <B>lousy</B> day!");
}

Folosind tagurile <% %> se poate scrie cod mixt HTML şi java.

Declaraţii JSP

Declaraţiile permit definirea de metode sau atribute ce vor fi inserate în codul servletului ce va fi generat pe baza paginii JSP ( în afara metodei service()).

Inserarea declaraţiilor se face cu tagurile <%! %>. Declaraţiile nu pot fi utilizate pentru a genera direct text către ieşire standard. Exemplu:

<%! private int accessCount = 0; %>
Accesses to page since server reboot:
<%= ++accessCount %>

Directive JSP

Există două tipuri importante de directive ce pot fi utilizate în cadrul unei aplicaţii. Directiva page permite definirea de importuri de pachete şi setarea a diferiţi parametri ai clasei servlet ce va fi generate pe baza paginii JSP. Directiva include permite includerea de fişiere în momentul în care este generat servletul asociat paginii JSP.

Ca şi exemplu directiva include poate fi folosite pentru a include o bară de navigaţie în cadrul paginilor unui site:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>Servlet Tutorial: JavaServer Pages (JSP) 1.0</TITLE>
<META NAME="author" CONTENT="webmaster@somesite.com">
<META NAME="keywords" CONTENT="...">
<META NAME="description" CONTENT="...">
<LINK REL=STYLESHEET
      HREF="Site-Styles.css"
      TYPE="text/css">
</HEAD>
 
<BODY>
<%@ include file="/navbar.html" %>
 
<!-- Part specific to this page ... -->
 
</BODY>
</HTML>

Exemplu pagina JSP

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>Using JavaServer Pages</TITLE>
 
<META NAME="author" CONTENT="content xxx yyy zzz">
<META NAME="keywords"
      CONTENT="JSP,JavaServer Pages,servlets">
<META NAME="description"
      CONTENT="A quick example of the four main JSP tags.">
<LINK REL=STYLESHEET
      HREF="My-Style-Sheet.css"
      TYPE="text/css">
</HEAD>
 
<BODY BGCOLOR="#FDF5E6" TEXT="#000000" LINK="#0000EE"
      VLINK="#551A8B" ALINK="#FF0000">
 
<CENTER>
<TABLE BORDER=5 BGCOLOR="#EF8429">
  <TR><TH CLASS="TITLE">
      Using JavaServer Pages</TABLE>
</CENTER>
<P>
 
Some dynamic content created using various JSP mechanisms:
<UL>
  <LI><B>Expression.</B><BR>
      Your hostname: <%= request.getRemoteHost() %>.
  <LI><B>Scriptlet.</B><BR>
      <% out.println("Attached GET data: " +
                     request.getQueryString()); %>
  <LI><B>Declaration (plus expression).</B><BR>
      <%! private int accessCount = 0; %>
      Accesses to page since server reboot: <%= ++accessCount %>
  <LI><B>Directive (plus expression).</B><BR>
      <%@ page import = "java.util.*" %>
      Current date: <%= new Date() %>
</UL>
 
 
</BODY>
</HTML>