Для начала немного уточним о чем идет речь. Wicket хранит последнюю просмотренную страницу в сессии, но в случае если страница очень большая, иногда это может стать проблемой. Для того что бы избежать этих проблем, можно попытаться сделать страницу Stateless(т.е. не имеющую состояния).
Итак, Stateless page — это страница не имеющая состояния, Statefull page — это страница с состоянием.
Stateless страницы не хранят никакого состояния из-за чего нет необходимости сохранять их от запроса к запросу.
Такие страницы не сохраняются ни в сессии ни в истории посещённых страниц хранящейся на диске, таким страницам не присваивается версия, как это происходит со statefull страницами. При каждом запросе к такой странице, её экземпляр создаётся заново.
Для того что бы страница стала stateless необходимо выполнить два условия:
- В первую очередь страница должна быть bookmarkable.
- Страница должна использовать только stateless компоненты.
При выполнении этих условий, такая страница автоматически становится stateless. Но если на странице используется хотя бы один компонент, который не является stateless, то вся страница становится statefull, и полностью сереализуется и сохраняется в сессии, и далее в истории на диске.
Рассмотрим подробнее эти два условия:
Bookmarkable страница означает, что этой странице можно самостоятельно назначить URL, и этот URL не содержит ни какой информации связанной с сессией(к примеру версии страницы), и
её можно открыть непосредственно набрав адрес в браузере, даже если сессия ещё не начата.
Для того, что бы страница была Bookmarkable, она должна иметь конструктор не принимающий параметров или конструктор принимающий единственный параметр класса PageParameter
.
В случае если страница создаётся с помощью конструктора не удовлетворяющего этим условиям, страница не будет Bookmarkable.
Если страница не является Bookmarkable, то к ней можно получить доступ только создав её из другой страницы.
Является компонент stateless или statefull определяется с помощью метода getStatelessHint(), который возвращает true если компонент stateless и false если нет.
К stateless относятся следующие компоненты:
- Label, MultiLineLabel, EnumLabel
- Panel, Border, BoxBorder, Include, TabbedPanel, FeedbackPanel
- BookmarkablePageLink, ExternalLink, ImageMap, StatelessLink
- StatelessForm
- Button, SubmitLink
- TextField, PasswordTextField, TextArea, HiddenField, RequiredTextField, DateTextField
- CheckBoxMultipleChoice, CheckGroupSelector
- ListMultipleChoice
- Select, SelectOption, SelectOptions
- Palette
- DataGridView, DataTable, Tree, TreeTable,
- ListItem, ListView, Loop, PageableListView, PropertyListView
- PagingNavigation, PagingNavigator
- BaseTree, LabelTree, LinkTree
К statefull относятся следующие компоненты:
- Link, ResourceLink
- Form
- CheckBox, CheckGroup, Check
- DropDownChoice, ListChoice
- Radio, RadioChoice, RadioGroup
- ImageButton
- PagingNavigationIncrementLink, PagingNavigationLink
- AJAX компоненты (существует библиотека, с некоторыми stateless AJAX компонентами github.com/jolira/wicket-stateless)
Важно: Link и Form являются statefull. Для использования этих компонентов в stateless страницах предназначены StatelessLink и StatelessForm.
Источники:
cwiki.apache.org/WICKET/stateless-pages.html
cwiki.apache.org/WICKET/pages.html
cwiki.apache.org/WICKET/bookmarkable-pages-and-links.html
wicket.apache.org/apidocs/1.4/
www.wicket-library.com/wicket-examples/compref/
Автор: faradei