Действительно, наличие этих двух статических включений приведет к ошибке того, что одна и та же переменная будет объявлена дважды. Этот импорт во время компиляции добавит код включенной страницы во включающую, а затем будет скомпилирован полностью.
Я не знаю ни одного include_once
подхода, встроенного в JSP, но вы могли бы сделать нечто подобное, если бы глобальный Set
(то есть HashSet
), объявленный как переменная на странице верхнего уровня или в качестве атрибута запроса (который вы должны очистить после завершения обработки), в который вы можете добавлять имена уже включенных страниц.
one.jsp
<% HashSet<String> pagesSet = new HashSet<String>(); %>
...
<%@include file='two.jsp'/>
two.jsp
<% if (!pagesSet.contains("two.jsp"){ %>
//... Remember to actually ADD two.jsp to pageSet,
// because it IS being included NOW.
pageSet.add("two.jsp");
// Entire contents of two.jsp
// ....
<% } %>
Обратите внимание, что это очень похоже на шаблон #ifndef #define #endif
в C.
Примите во внимание, что при использовании динамических включений вы избежите проблемы с дублирующимися переменными. Включенная страница будет выполняться в своей области видимости, и для доступа к серверным переменным вам придется передавать их с помощью <jsp:param>
или в одной из Request
, Session
или Application
областей. См. Ответ на этот вопрос о различиях между статическим и динамическим: директива include и проблема с именем атрибута
Кроме того, если у вас имеется большое количество этих «условных» статических включений, вы можете в конечном итоге достичь ограничения по методу 64K