Только не используйте bean-объекты области видимости / сеанса (поэтому используйте только bean-объекты области запроса или приложения) и установите для сохранения состояния значение client
вместо (по умолчанию) server
, задав следующий параметр контекста в web.xml
.
<context-param>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>client</param-value>
</context-param>
Тогда JSF не будет создавать сеанс и будет сохранять состояние просмотра в скрытом поле ввода с именем javax.faces.ViewState
в форме при необходимости.
Стоимость создания и управления сессиями, однако, довольно незначительна. Кроме того, вам все равно придется компенсировать стоимость (де) сериализации состояния просмотра и пропускной способности сети при использовании сохранения состояния просмотра на стороне клиента.
Обновление согласно вашему комментарию:
@ BalusC Да, это может быть глобальным решением. Но мне нужен этот метод только на этой общедоступной странице. На других страницах я хочу метод сохранения состояния на стороне сервера.
Ах, верно. Извините, я не вижу каких-либо приятных способов в JSF / Facelets отключить сеанс или изменить сохранение состояния представления для каждого запроса. Я хотел бы использовать простой HTML <form>
вместо JSF <h:form>
, позволить ему отправляться на другую страницу JSF и использовать @ManagedProperty
в bean-компоненте, связанном со страницей JSF. Э.Г.
<form action="register.jsf" method="post">
<input type="text" name="username" />
<input type="password" name="password" />
<input type="submit" />
</form>
с
@ManagedBean
@RequestScoped
public class Register {
@ManagedProperty(value="#{param.username}")
private String username;
@ManagedProperty(value="#{param.password}")
private String password;
@PostConstruct
public void init() {
// Do your thing here.
System.out.println("Submitted username/password: " + username + "/" + password);
}
// ...
}