Подтвердить что ты не робот

Переменная Java в нескольких блоках include - переменная не может быть разрешена

У меня есть страница jsp, которая выглядит примерно так:

MyPage.jsp

<%@ include file = "/Title.jsp" %>
<%@ include file = "/Header.jsp" %>
<html>...</html>

В Title.jsp есть экземпляр "user", скажем:

User user = new User();

в пользователе Header.jsp указывается как

user.setName("John");

Eclipse показывает ошибку, что "пользователь не может быть разрешен к переменной" в файле header.jsp. Я прекрасно понимаю, почему. Есть ли способ сказать Eclipse игнорировать эту конкретную ошибку для этой конкретной переменной? Есть ли что-нибудь, что можно сделать здесь?

На работе я поддерживаю некоторое старое (и большое и уродливое) приложение Java, которое на самом деле является веб-приложением. Я пытаюсь преобразовать этот Java-проект в Java Dynamic Web Project. Прежде чем я его преобразовал, каким-то образом Eclipse не заботился об этих висячих переменных, которые повсюду. Теперь в динамическом веб-проекте Eclipse жалуется.

Переписывание кода не может быть и речи. Каждый файл jsp состоит из нескольких включений с множеством глобальных переменных. Я не буду трогать его больше, чем мне нужно.

4b9b3361

Ответ 1

Лучшие практики

В идеале, в JSP больше не должно быть блоков <% // scriptlet %>.

JSP настолько развились, что просто скрывали Java-код за Стандартными действиями и пользовательскими тегами с использованием языка выражений, JSTL и теперь выражений OGNL для получения результатов (только для обработанного запроса) из предварительно заполненных JavaBeans, доступных в любой из области приложения (например, сеанс, запрос, страница и т.д.) или сложные хранилища данных (например, ValueStack в Struts 2).

Итак, правильное решение будет выглядеть примерно так (не может использовать EL, потому что нам нужна ссылка "user" )

 <jsp:useBean id="user" class="foo.User" /> <!-- scope="page" by default -->

Эта строка кода при добавлении в Title.jsp создаст новый User bean и добавит его в область page, и эта же строка кода в Header.jsp будет извлекать User bean из области page и присвойте ему ссылку с именем User, которая затем может использоваться во всей остальной части файла.

Но, поскольку остальная часть кода Java не написана с помощью тегов, это не будет иметь большого смысла. Таким образом, вы также можете просто передать bean между двумя JSP как атрибут запроса, используя один из ваших блоков <%//scriptlet% > .

<% // in Title.jsp
  request.setAttribute ("user", new User());
%>

<% // in Header.jsp
  User user = request.getAttribute ("user");
  user.setName ("John Doe");
%>

Ответ

Если база кода слишком велика для спасения, и использование любой из лучших практик просто непрактично; вы можете настроить среду Eclipse для игнорирования ошибок проверки синтаксиса JSP или лучше отключить их только для фрагментов JSP или определенных файлов и папок.

С веб-проектом, выбранным в рабочей области, перейдите к Project > Properties > Validation > JSP Syntax. Затем Enable project specific settings и выключите Validate JSP fragments, как показано ниже.

JSP validation off for fragments

Фрагмент JSP представляет собой файл .jspf, который содержит сегмент JSP/HTML без открытия и закрытия тегов заголовков (если, конечно, это не заголовок или фрагмент нижнего колонтитула). Поэтому, хотя вам придется переименовывать ваши файлы в .jspf для Eclipse, чтобы распознавать их как фрагменты (и не проверять); основные преимущества:

  • файлы могут находиться в любой папке структуры
  • расширение явно указывает на включение
  • новые фрагменты автоматически идентифицируются

Если количество включенных файлов огромно или их нельзя переименовать по какой-то причине, ваш следующий лучший вариант - переместить их в отдельную папку (например, includes), а затем исключить саму папку из проверки синтаксиса JSP.

Снова перейдите в меню "Проект" > "Свойства" > "Валидация" и включите специальные настройки проекта, нажмите кнопку "Тип поиска" [...] для доступа к настройкам JSP Syntax Validator.

Validation settings

В этом случае сначала создайте Exclude Group, а затем Add Rule до исключите папку (например, WebContent/includes на изображении) из проверки синтаксиса JSP.

Exclude folder

Теперь Eclipse перестанет сообщать об ошибках для любого JSP файла, включенного в эту папку. Вы могли бы использовать один и тот же подход для отдельных файлов, но насколько он практичен, он будет снова зависеть от количества таких фрагментов, которые у вас есть.

Ссылки:
Как избежать кода Java в JSP файлах?

Ответ 2

На ваш вопрос: есть ли способ сказать Eclipse игнорировать эту конкретную ошибку для этой конкретной переменной? Как отмечено выше, ошибка исходит из рамки проверки в Eclipse. Лучшее, что вы можете сделать, это сказать eclipse игнорировать этот файл - не эту ошибку или эту переменную. Для этого щелкните правой кнопкой мыши по проекту и потяните его диалог свойств. После этого выберите "Проверка" и установите флажок "Включить конкретные настройки проекта". Оттуда вы можете включить или отключить специальные проверки. Лично я не нахожу Eclipse валидаторы все, что полезно, и они занимают довольно много времени на обработку, поэтому я почти всех их отключил! Тем не менее, вы можете контролировать мелкие зерна через столбец "Настройки". Вы попадаете на elipsis рядом с JSP Content Validator (например), и вы можете исключить из него только Header.jsp.

Надеюсь, что это поможет, но только детализирует более ранние комментарии.