Я работаю с Wicket уже месяц или два, создавая простые веб-приложения и привыкая к моделям и так далее. Теперь я хотел бы продвинуться вперед и посмотреть, смогу ли я использовать то, чему я научился до сих пор, для создания среднего / большого веб-приложения. Тем не менее, я не тратил много времени на размышления о том, как сделать страницы без сохранения состояния.
Если я правильно понимаю, создание страницы без сохранения состояния выполняется путем создания закладки для этой страницы и обеспечения того, чтобы на страницу не добавлялись компоненты с состоянием.
Для веб-сайта, который я создаю, я хочу избегать сообщений «Страница истекла» Позвольте пользователям войти в систему с помощью файлов cookie, сделать доступным весь контент без необходимости входа в систему / создания сеанса, и я хочу, чтобы такие функции, как разбиение на страницы, были без сохранения состояния и добавлялись в закладки.
Это не проблема, например, с PHP, но мне кажется, что множество полезных компонентов Wicket находятся в состоянии. Я занимаюсь большой работой, такой как создание собственного набора компонентов, которые не имеют состояния, или это не имеет большого значения?
Я надеюсь, что кто-то может помочь мне, указав мне правильное направление.
РЕДАКТИРОВАТЬ: Допустим, я хотел бы сделать блог. Просмотр сообщений, категории и т. д. должны быть возможны, не беспокоясь о том, что срок действия страницы истечет, если пользователь решит прочитать статью в течение 2 часов, а затем попытается перейти далее, например, через нумерацию страниц. Я хочу разрешить пользователям оставаться в системе в течение месяца, но я также не хочу сохранять их сеанс в течение месяца.
Я был бы очень признателен за любую помощь в том, как я могу выполнить то, что я только что описал , с калиткой.
При построении страниц без сохранения состояния с помощью Wicket вы действительно теряете большинство «умных» встроенных компонентов, например, таблицы и деревья с разбивкой на страницы.
Я думаю, что это не проблема для сайтов, блогов и т. П., Которые обычно имеют довольно простую модель навигации и не используют такого рода «богатые» компоненты, а также используют дружественный к серверу без сохранения состояния, основанный на Javascript. компоненты / эффекты, например jQuery-UI или YUI.
Некоторые вещи вы будете делать по-другому, например, разбиение на страницы. Например, вместо использования встроенных компонентов разбиения на страницы вам придется создать свой собственный механизм, используя параметры страницы и ссылки без состояния:
HomePage.html
<html xmlns:wicket="http://wicket.apache.org">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<div class="container">
<div wicket:id="posts">
<h2 wicket:id="title"></h2>
<p wicket:id="content"></p>
Posted on <span wicket:id="date"></span>
</div>
<div>
<a wicket:id="recentPosts"><< Recent posts</a>
<a wicket:id="previousPosts">Previous posts >></a>
</div>
</div>
</body>
</html>
HomePage.java
package wishminimal.ui.home;
import java.util.Iterator;
import org.apache.wicket.PageParameters;
import org.apache.wicket.devutils.stateless.StatelessComponent;
import org.apache.wicket.extensions.markup.html.repeater.data.table.ISortableDataProvider;
import org.apache.wicket.extensions.markup.html.repeater.util.SortableDataProvider;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.markup.repeater.data.DataView;
import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.spring.injection.annot.SpringBean;
import wishminimal.dao.PostDAO;
import wishminimal.entity.Post;
@StatelessComponent
public class HomePage extends WebPage {
@SpringBean
PostDAO postDAO;
ISortableDataProvider<Post> dataProvider = new SortableDataProvider<Post>() {
public Iterator<? extends Post> iterator(int first, int count) {
return postDAO.findAll(first, count).iterator();
}
public int size() {
return postDAO.countAll();
}
public IModel<Post> model(Post object) {
return new CompoundPropertyModel<Post>(object);
}
};
public HomePage(PageParameters params) {
final int currentPage = params.getAsInteger("p", 0);
final DataView<Post> dataView = new DataView<Post>("posts", dataProvider, 10) {
@Override
protected void populateItem(Item<Post> item) {
item.add(new Label("title"));
item.add(new Label("content"));
item.add(new Label("date"));
}
};
dataView.setCurrentPage(currentPage);
add(dataView);
add(new BookmarkablePageLink<Void>("recentPosts", getClass(), new PageParameters("p=" + (currentPage - 1))) {
@Override
public boolean isVisible() {
return currentPage > 0;
}
});
add(new BookmarkablePageLink<Void>("previousPosts", getClass(), new PageParameters("p=" + (currentPage + 1))) {
@Override
public boolean isVisible() {
return currentPage < dataView.getPageCount();
}
});
}
}
Хотя это гораздо менее удобно чем Wicket с отслеживанием состояния, я все еще считаю намного лучше, чем, скажем, JSF без сохранения состояния или Struts :)
Чтобы сделать страницы без состояния, я делаю следующее: