Если вы поместите код в скриптлет (старые теги <%%>), они будут преобразованы компилятором JSP в метод _jspService (). Этот метод вызывается всякий раз, когда к странице JSP обращаются, либо непосредственно клиентом, либо внутри контейнера с использованием пересылки на стороне сервера или включением.
Метод _jspService () не может быть переопределен. Компилятор JSP создает тело метода службы в том же порядке, в котором код отображается на странице JSP. Поэтому переменные создаются как локальные переменные и инициализируются каждый раз, когда вызывается метод службы.
В тех случаях, когда вы используете более старый <%! %> теги или более новые теги jsp: объявление для определения методов, переменные создаются и инициализируются при выполнении объявленного метода.
Кстати, все неявные переменные будут инициализированы контейнером.
Дополнительные сведения об этом поведении можно найти в спецификации JSP и в JspPage javadoc .
Если вы хотите знать, как JspPage и класс HttpJspPage инициализируются и используются контейнером, вам нужно будет просмотреть исходный код контейнера. Однако спецификация JSP (глава 11, касающаяся контракта контейнера JSP) определяет, как контейнер JSP инициализирует и создает страницу JSP. Обычно инициализация самого класса страницы выполняется один раз; в этот момент вызывается jspInit (). Когда страница уничтожается, обычно при закрытии приложения или контейнера, метод jspDestroy () вызывается до того, как страница будет уничтожена.
Обновление
Выражения EL в конечном итоге находят bean-компонент, пытаясь разрешить переменную в области страницы, запроса, сеанса и приложения . Используемая переменная должна быть объявлена и инициализирована в соответствующей области видимости. Компоненты JavaBean можно инициализировать с помощью тега jsp: useBean . Другие объекты должны были быть объявлены и инициализированы в сервлете или в скриптлете.