Łączą ze sobą elementy statyczne z akcjami. Dzielą się na:
deklaracje - ujmowane w znaczniki <%! ... %>, służą do deklarowania zmiennych i metod w języku, który zadeklarowano do obsługi skryptów (patrz dyrektywy). Zadeklarowane zmienne i metody są dostępne dla innych deklaracji, skryptów i wyrażeń występujących na danej stronie. Deklaracje nie mogą zapisywać nic do strumienia wyjściowego.
Przykłady:
<%! int i; %> <%! public String s = "napis"; %>
skrypty - ujmowane w znaczniki <% ... %>, mogą zawierać dowolne fragmenty kodu poprawne w języku zadeklarowanym do obsługi skryptów (patrz dyrektywy). Skrypty są wykonywane w czasie obsługi żądania. Mogą pisać do strumienia wyjściowego, a także zmieniać wszystkie obiekty, które są dla nich widoczne. Mogą także deklarować zmienne lokalne. Aby używać znacznika %> w skrypcie (a nie jako znacznika kończącego skrypt) należy pisać %\>.
Przykłady:
<% if (x < 5) %> x jest mniejsze od 5. <% else %> x jest większe lub równe 5.
wyrażenia - ujmowane w znaczniki <%= ... %>, są poprawnymi wyrażeniami w języku, który został zadeklarowany do obsługi skryptów (patrz dyrektywy). Wartość tych wyrażeń jest konwertowana do typu String. Jeśli to się nie uda, kontener JSP informuje o błędzie (jeśli wykryto go w fazie tłumaczenia) lub zgłasza wyjątek (jeśli błąd wykryto w czasie obsługi żądania). Wyrażenia mogą mieć efekty uboczne. Są one wyliczane od lewej do prawej podczas obsługi żądania.
Przykłady:
<%= 2+2 %> <%= (new java.util.Date()).toLocaleString() %>