Implementując servlet, tj. jego metodę doGet(…) czy doPost(…), mamy do dyspozycji obiekty reprezentujące żądanie i odpowiedź HTTP przekazywane nam przez serwer aplikacji jako parametry wywołania tych metod. Implementując JSP także mamy dostęp do obiektów żądania i odpowiedzi, a także kilku innych pomocnych obiektów, które to obiekty są nam udostępniane poprzez predefiniowane zmienne JSP.
Wróćmy do przykładu z artykułu „JSP”. Przypomnijmy sobie, jak wyglądał skryptlet który tam zaimplementowaliśmy:
<% out.println(new Date()); %>
Skryptlet ten to nic innego jak wywołanie metody println(…) na obiekcie wskazywanym przez zmienną out. No właśnie – skąd ta zmienna, skoro nigdzie wcześniej jej nie deklarowaliśmy? Skąd wiemy, że nazywa się ona właśnie tak i skąd wiemy że reprezentuje ona strumień związany z odpowiedzią HTTP? Oczywiście wiemy to wszystko ze specyfikacji JSP. Zmienna out to właśnie jedna z predefiniowanych zmiennych.
Oprócz zmiennej out mamy do dyspozycji jeszcze kilka innych zmiennych, z czego dla nas na obecnym etapie nauki istotne będą trzy: zmienna request i response, które są odpowiednikiem parametrów metod doGet(…) i doPost(…), tzn. reprezentują żądanie i odpowiedź HTTP, oraz zmienna session, która reprezentuje obiekt sesji.
Wróćmy teraz do artykułu „Sesje” i przyjrzyjmy się jeszcze raz zamieszczonemu tam przykładowi servletu. Widzimy w nim między innymi instrukcję:
session.getAttribute("cart");
Jest to instrukcja pobrania atrybutu z sesji. Jeśli implementujemy servlet, to mamy do dyspozycji tylko zmienne reprezentujące żądanie i odpowiedź HTTP, tak więc obiekt sesji musimy sobie pobrać z obiektu żądania za pomocą metody getSession(). W przypadku JSP nic takiego robić nie trzeba. Zmienna session jest w JSP predefiniowana, gotowa do użycia.
Predefiniowane zmienne JSP nie są oczywiście efektem magicznym. Zmienne te są zdefiniowane w zwykły sposób w servlecie powstałym w efekcie translacji JSP, tyle że definicje te umieszcza za nas w kodzie mechanizm wykonujący tę translację.