Scriptlet - ява код прям в странице. Заключается в <% %>. Когда внутри скриплета создаются переменные они стают локальными(и по всей видимости приватными) переменными страницы. Да мы можем на этой страницы к ним обращаться в рамках сприптлета.
Exression Language - это переменные определенного скоупа, которые доступны через выражение ${...}, среди скоупов есть и скоуп page, но даже в этом скоупе переменная не является локальной для класса страницы. Поэтому мы просто так не можем в скриптлете обратиться к переменной из этих скоупов, в том числе и скоупа страницы. Скоупы бывают: page, request, session, application.
Так могут ли Scriptlet и El обмениваться переменными? Ответ: могут. Нужно пользоваться посредником, который доступен в обьекте страницы, а значит и в Scriptlet, это pageContext.
Вот пример:
Вообще конечно интересно посмотреть какие переменные доступны в обьекте страницы - а значит и из Scriptle.
Вот они
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.
Вот они
| Имя переменной | Ее класс | Заметки |
|---|---|---|
| pageContext | PageContext | |
| page | Object | Бестолковая, я не знаю для чего она |
| application | ServletContext | |
| session | HttpSession | Сюда походу идут переменные с временем жизни сессии. Получается чтобы передать переменную скоупам session или application, мы не должны пользоваться этими переменными (application, session), мы все равно использует pageContext, только вот метод setAttribute с тремя параметрами, где третий параметр интовой значение скоупа. Для application = 4(javax.servlet.jsp.PageContext.APPLICATION_SCOPE), для session=3(javax.servlet.jsp.PageContext.SESSION_SCOPE) и т.д. Тогда получается эти две переменные для редких случаев когда нам надоумит что-то делать с самими обьектами сессии и приложения. |
| request | HttpServletRequest | |
| response | HttpServletResponse | |
| out | JspWriter | Это походу для случая, когда у нас есть содержимое в байтах, которые нужно выгрузить потоком на страницу(страница в итоге тоже ничто иное как поток байтов), по-идее этими байтами должен оказаться какой-нибудь хтмл. |
| config | ServletConfig | По названию понятно. Кстати нужно будет когда-нибудь задаться вопросом что за настройки есть у сервлета. |
| jspContext | JspContext | Интересно что это за контекст? |
Комментариев нет:
Отправить комментарий