воскресенье, 2 сентября 2012 г.

В чем разница между Scriptlet и El? И возможны ли между ними коммуникации?

Scriptlet - ява код прям в странице. Заключается в <% %>. Когда внутри скриплета создаются переменные они стают локальными(и по всей видимости приватными) переменными страницы. Да мы можем на этой страницы к ним обращаться в рамках сприптлета.

Exression Language - это переменные определенного скоупа, которые доступны через выражение ${...}, среди скоупов есть и скоуп page, но даже в этом скоупе переменная не является локальной для класса страницы. Поэтому мы просто так не можем в скриптлете обратиться к переменной из этих скоупов, в том числе и скоупа страницы. Скоупы бывают: page, request, session, application.


Так могут ли Scriptlet и El обмениваться переменными? Ответ: могут. Нужно пользоваться посредником, который доступен в обьекте страницы, а значит и в Scriptlet, это pageContext.

Вот пример:
<c:set value="test1" var="test" />
<% 
    String resp = "abc";
    String test = pageContext.getAttribute("test");
    resp = resp + test;
    pageContext.setAttribute("resp", resp);
%>
<c:out value="${resp}" />
Как видно тег "с:set" занес новую переменную test(или обновили существующую) в скоуп пейдж(это скоуп по-умолчанию для этого тега; мы можем явно указать скоуп через атрибут с соответствующим именем). Мы его оттуда достали через обьект pageContext, а потом занесли в этот скоуп новую переменную/или обновили существующую.

Вообще конечно интересно посмотреть какие переменные доступны в обьекте страницы - а значит и из Scriptle.
Вот они
Имя переменнойЕе классЗаметки
pageContextPageContext

pageObjectБестолковая, я не знаю для чего она
applicationServletContextНу типа межстранничный обмен). Изменения состояния сервлета(приложения) глобально, не в рамках ни поточного запроса и даже ни сессии.
sessionHttpSessionСюда походу идут переменные с временем жизни сессии. Поскольку сешинКонтекста переменной нет, то смею предложить, что сюда попадают переменные из c:set из скоупом сессия.
Получается чтобы передать переменную скоупам session или application, мы не должны пользоваться этими переменными (application, session), мы все равно использует pageContext, только вот метод setAttribute с тремя параметрами, где третий параметр интовой значение скоупа. Для application = 4(javax.servlet.jsp.PageContext.APPLICATION_SCOPE), для session=3(javax.servlet.jsp.PageContext.SESSION_SCOPE) и т.д.
Тогда получается эти две переменные для редких случаев когда нам надоумит что-то делать с самими обьектами сессии и приложения.
requestHttpServletRequest
responseHttpServletResponse
outJspWriterЭто походу для случая, когда у нас есть содержимое в байтах, которые нужно выгрузить потоком на страницу(страница в итоге тоже ничто иное как поток байтов), по-идее этими байтами должен оказаться какой-нибудь хтмл.
configServletConfigПо названию понятно. Кстати нужно будет когда-нибудь задаться вопросом что за настройки есть у сервлета.
jspContextJspContextИнтересно что это за контекст?



Комментариев нет:

Отправить комментарий