Нет генерации сессии в JSF - PullRequest
9 голосов
/ 04 ноября 2010

В JSP есть атрибут сеанс , используемый для отключения сеанса автогенерации в запросе.

<%@page contentType="text/html" pageEncoding="UTF-8" session="false" %>

Есть ли способ сделать то же самое в JSF2?

Спасибо

Почему? Потому что у нас есть открытая страница формы регистрации в качестве страницы по умолчанию в приложении. Это очень простая форма, и сессия создается каждый раз, когда люди (или роботы и т. Д.) Запрашивают главную страницу. ManagedBean - это RequestScope, но JSF создает один сеанс в первом запросе навигации.

Ответы [ 2 ]

7 голосов
/ 04 ноября 2010

Только не используйте 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);
    }

    // ...
}
2 голосов
/ 10 марта 2016

На самом деле ответ от BalusC неверный, так как Мохарра 2.1.19 / 2.2.0. Вы можете прочитать об этом в его блоге здесь . Теперь достаточно полно только установить:

<f:view transient="true">
   Your regular content
</f:view>

Как было сказано в упомянутом посте:

Состояние просмотра не было создано, и, следовательно, сеанс также не будет создан, если он еще не создан. [...] Не забудьте поместить связанный управляемый компонент в область запроса вместо области просмотра / сеанса, в противном случае вы просто отрицаете значение слова «без сохранения состояния».

Следующий фрагмент кода присутствует в com.sun.faces.application.view.FaceletViewHandlingStrategy классе:

        /*
         * Make sure we have a session here if we are using server state
         * saving. The WriteBehindStateWriter needs an active session when
         * it writes out state to a server session.
         * 
         * Note if you flag a view as transient then we won't acquire the
         * session as you are stating it does not need one.
         */
        if (isServerStateSaving() && !viewToRender.isTransient()) {
            getSession(ctx);
        }      

Также следует учитывать, что некоторые сторонние библиотеки компонентов, например, ICEfaces или другие структуры, например Апач Широ мог сам создавать сессию для каких-то собственных целей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...