jsp: область применения useBean

Код JSP:

<jsp:useBean id="person" class="org.example.model.PersonModel" scope="session">
</jsp:useBean>
<br> Name : <jsp:getProperty property="name" name="person"/>
<br> Surname : <jsp:getProperty property="surname" name="person"/>

Хотя я установил Java-объект в request сфера, а не в session область действия в сервлете контроллера, откуда я пересылаю запрос в этот сервлет. Как работает <jsp:useBean> получает атрибут запроса, хотя область, упомянутая в теге, является сеансом? Если он использует pageContext.findAttribute() чтобы получить атрибут, то какая польза от наличия атрибута области в этом <jsp:useBean> тег?

1 ответ

Решение

PageContext#findAttribute() сканирует соответственно области страницы, запроса, сеанса и приложения до первого null Значение атрибута найдено для данного ключа атрибута. Смотрите также Javadoc:

Выполняет поиск именованного атрибута в странице, запросе, сеансе (если он действителен) и области (-ах) приложения по порядку и возвращает значение, связанное со значением или ноль.

Это объясняет, почему он находит набор с областью запроса в передающем сервлете, а не с областью, объявленной в JSP. Это также объясняется на нашей вики-странице EL.

В любом случае, если вы используете сервлет, вы не должны использовать <jsp:useBean> на модельных объектах, которые должны управляться сервлетом. <jsp:useBean> а именно, другой уровень MVC, который может привести к путанице и проблемам с обслуживанием, когда фактически используется сервлет в качестве контроллера. Это также явно упоминается в разделе "Стиль кодирования и рекомендации" нашей вики-страницы Servlets.

Итак, вместо всех тех <jsp:xxx> вещи, которые вы можете просто сделать:

<br>Name: ${person.name}
<br>Surname: ${person.surname}

Вам нужно только добавить JSTL <c:out> предотвратить потенциальные дыры XSS-атак при повторном отображении данных, контролируемых пользователем (обратите внимание, что <jsp:getProperty> не делает этого!)

<br>Name: <c:out value="${person.name}" />
<br>Surname: <c:out value="${person.surname}" />

Чтобы узнать больше о JSTL, посетите нашу вики-страницу JSTL.

Другие вопросы по тегам