Правильно, проблема в том, что PageContext - это буквально контекст страницы. Когда вы запускаете include, этот ресурс (при условии, что это JSP) получает собственный PageContext, который теряется при возврате.
JSP имеет 4 области действия: приложение, сеанс, запрос и страница. Каждый из них имеет свой жизненный цикл, который должен быть понятен.
Использование области запроса здесь - правильная идея.
Если вы посмотрите на код шаблона, на который вы ссылались, это именно то, что делает тег Вставка. В этом случае он помещает Hashtables в стек, который поддерживается в Запросе.
Затем он использует теги «положить» и «получить», чтобы помещать / получать элементы в текущем «стеке» и выключать его.
Простая вещь, которую вы можете сделать, - перед тем, как PageContext.include, вызвать соответствующий метод «execute». Пусть этот метод просто вернет карту пар имя / значение. Затем вы можете взять эту карту и заполнить существующую (или скоро уже существующую) Hashtable в стеке.
По сути, ваш класс Init - это логика, которая похожа на вызов множества тегов "put".
Кроме того, теги вашего шаблона работают одинаково.
Или вы можете объединить результаты прямо в Запрос для использования JSTL. Или вы можете сохранить природу «стека», вставив свой собственный «контекст» в Запрос.