[ Pobierz całość w formacie PDF ]

Przy stosowaniu języka wyrażeń do operowania na zmiennych dostępnych w określonych
zakresach, nazwy tworzonych atrybutów muszą być zgodne ze wszystkimi zasadami okre-
ślającymi dopuszczalną postać nazw zmiennych w języku Java. A zatem nie należy
umieszczać w nich kropek, odstępów, ukośników oraz wszelkich innych znaków, które
można stosować w zwyczajnych łańcuchach znaków, lecz nie w nazwach zmiennych.
Oprócz tego, należy pamiętać, by nazwy nadawane atrybutom nie kolidowały z nazwami
zmiennych predefiniowanych, przedstawionymi w podrozdziale 16.8.
Przykład
W ramach przedstawienia sposobu korzystania ze zmiennych dostępnych w określonym
zakresie, serwlet ScopedVars (przedstawiony na listingu 16.1) zapisuje pewien łańcuch znaków
w obiekcie HttpServletRequest, inny łańcuch w obiekcie HttpSession oraz datę w obiekcie
ServletContext. Następnie obsługa żądania jest przekazywana na stronę JSP (przedstawioną
na listingu 16.2 oraz rysunku 16.2), na której atrybuty te są wyświetlane przy użyciu wyrażenia
${nazwaAtrybutu}.
Listing 16.1. ScopedVars.java
package coreservlets;
/** Serwlet tworzy zmienne dostępne w określonym zakresie
* (czyli obiekty zapisywane jako atrybuty w pewnych
* standardowych miejscach). Następnie przekazuje obsługę
* żądania do strony JSP, która wyświetla wartości zapisane
* przez serwlet przy użyciu języka wyrażeń.
*/
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class ScopedVars extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {

Rozdział 16. Upraszczanie dostępu do kodu Javy: język wyrażeń JSP 2.0 435
request.setAttribute("attribute1", "Pierwsza wartość");
HttpSession session = request.getSession();
session.setAttribute("attribute2", "Druga wartość");
ServletContext application = getServletContext();
application.setAttribute("attribute3",
new java.util.Date());
request.setAttribute("repeated", "%7łądanie");
session.setAttribute("repeated", "Sesja");
application.setAttribute("repeated", "Obiekt ServletContext");
RequestDispatcher dispatcher =
request.getRequestDispatcher("/el/scoped-vars.jsp");
dispatcher.forward(request, response);
}
}
Listing 16.2. scoped-vars.jsp
Zmienne dostępne w określonym zakresie
HREF="/el/JSP-Styles.css"
TYPE="text/css">
Dostęp do zmiennych dostępnych w różnych zakresach:
attribute1: ${attribute1}
attribute2: ${attribute2}
attribute3: ${attribute3}
Wartość atrybutu "repeated": ${repeated}
Rysunek 16.2.
Język wyrażeń
JSP 2.0 upraszcza
dostęp
do zmiennych
dostępnych
w określonych
zakresach
 czyli obiektów
zapisywanych
jako atrybuty obiektu
strony, żądania,
sesji lub kontekstu
serwletu

436 Część II JavaServer Pages
Warto zwrócić uwagę, iż strona JSP odwołuje się do wszystkich atrybutów przy użyciu te-
go samego zapisu, niezależnie od tego, w jakim zakresie zostały one zapisane. Zazwyczaj
takie rozwiązanie jest wygodne, gdyż serwlety obsługujące rozwiązania typu MVC nadają
zapamiętywanym obiektom unikalne nazwy atrybutów. Niemniej jednak, z technicznego
punktu widzenia, istnieje możliwość kilkukrotnego zastosowania tej samej nazwy. Dlatego
należy pamiętać, że język wyrażeń poszukuje atrybutu w następującej kolejności: obiekt
PageContext, obiekt HttpServletRequest, obiekt HttpSession i na końcu obiekt ServletContext.
Aby przedstawić ten aspekt działania języka wyrażeń, serwlet zapisuje obiekt w trzech róż-
nych zakresach, za każdym razem nadając mu tę samą wartość klucza  repeated. War-
tość zwrócona przez wyrażenie ${repeated} (widoczna na rysunku 16.2) odpowiada pierw-
szemu atrybutowi odnalezionemu podczas przeszukiwania zakresów (w tym przypadku
zostanie ona odczytana z obiektu HttpServletRequest). Informacje na temat ograniczania
poszukiwania atrybutów do konkretnego zakresu zostały podane w podrozdziale 16.8 ( Od-
wołania do obiektów niejawnych ).
16.6. Dostęp do właściwości komponentów
W razie zastosowania przedstawionego wcześniej zapisu o postaci ${nazwa}, system odnaj-
duje obiekt name, zmienia go na łańcuch znaków i zwraca. Choć takie działanie jest wygod-
ne, to jednak bardzo rzadko trzeba będzie wyświetlić wartość samego obiektu zapisanego
przez serwlet. Zazwyczaj będzie chodziło o wyświetlenie konkretnych właściwości tego
obiektu.
Język wyrażeń JSP udostępnia prostą, a jednocześnie dającą bardzo duże możliwości nota-
cję kropkową, służącą właśnie do pobierania wartości właściwości obiektów. Aby pobrać
wartość właściwości firstName zmiennej o nazwie klient dostępnej w pewnym zakresie,
wystarczy użyć wyrażenia o postaci ${klient.firstName}. Choć to wyrażenie wydaje się
być bardzo proste, to jednak, aby możliwe było wyznaczenie jego wartości, system musi
wykorzystać technologię odzwierciedlania (badania wewnętrznej struktury obiektu). A za-
tem, zakładając, że obiekt jest typu NameBean, który należy do pakietu coreservlets, to aby
wykonać tą samą czynność przy użyciu zwykłego kodu Javy, należałoby zastąpić wyrażenie:
${klient.firstName}
następującym blokiem kodu:
NameBean klient =
(NameBean) pageContext.findAttribute("klient");
%>
Co więcej, w przypadku zastosowania języka wyrażeń, jeśli nie uda się odnalezć atrybutu, to
zostanie zwrócony pusty łańcuch znaków. Z kolei stosując standardowe elementy skryptowe,
należałyby dodać kolejny fragment kodu Javy, zabezpieczający przez zgłoszeniem wyjątku
NullPointerException.

Rozdział 16. Upraszczanie dostępu do kodu Javy: język wyrażeń JSP 2.0 437
Czytelnik zapewne pamięta, że elementy skryptowe JSP nie są jedyną alternatywą dla języka
wyrażeń. O ile tylko znany jest zakres, w jakim został zapisany obiekt, oraz pełna nazwa jego
klasy, to wyrażenie:
${klient.firstName}
można zastąpić znacznikami akcji:
scope="request, session lub application" />
Jednak język wyrażeń pozwala na dowolne zagnieżdżanie właściwości. A zatem, gdyby klasa
NameBean dysponowała właściwością address (czyli metodą getAddress) zwracającą obiekt typu
Address, który zawierałby właściwość zipCode (czyli metodę getZipCode), to do właściwości [ Pobierz całość w formacie PDF ]

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • sp28dg.keep.pl