Я создаю сайт, на котором есть много компонентов страницы, которые ссылаются на объекты, которые используются в других местах на странице. Некоторые из этих компонентов используются и на других страницах, поэтому мое желание использовать включает в себя, а не вырезать и вставить.
Проблема в том, что, если у меня есть идентичные операторы "jsp: useBean" в нескольких компонентах страницы, компилятор выдаст ошибку "дублировать локальную переменную".
Как я могу использовать одни и те же объекты в нескольких компонентах страницы JSP, не имея всего в файле?
Пример: на главной (родительской) странице:
<jsp:useBean id="fred" class="..." scope="request" />
<jsp:directive.include file="myWidget.jsp" />
включенная страница myWidget.jsp также должна использовать объект "fred":
<jsp:useBean id="fred" class="..." scope="request" />
Однако это приводит к сбою компиляции с «дубликатом локальной переменной« fred »».
Это в основном отвергает идею разбить страницу на компоненты; Я не хочу иметь JSP-файлы длиной в сотни строк, которые немного отличаются друг от друга!
Для одного компонента, где абсолютно необходимо, чтобы он был согласованным на каждой странице сайта, я решил проблему со скриплетом:
<%
{ // for scope
Object _o1 = request.getAttribute("fred");
if (_o1 !=null && _o1 instanceof MyClass)
{
// use a deliberately obscure variable name to avoid conflict
MyClass _myLocalFred1 = (MyClass) _o1;
}
} // for scope
%>
Это работает, но уродливо; в нескольких книгах написано: «Никогда не используйте скриптлеты», но скриптлеты, похоже, являются единственным методом, в котором можно управлять областью действия переменной, и я могу использовать имена, не беспокоясь о том, что они используются в других местах страницы.
Как использовать jsp: useBean во включаемом файле?