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.