Обработка обновлений браузера в JSF - PullRequest
4 голосов
/ 24 апреля 2011

Есть ли способ обработки события обновления браузера внутри моего приложения JSF 2.0, чтобы пользователь мог перейти на страницу приветствия при обновлении страницы браузером?и это приводит меня к другому вопросу о том, как сделать навигацию по страницам внутри управляемого компонента?

Cheers,

Ответы [ 3 ]

2 голосов
/ 09 мая 2011

Используйте один вид, в который вы включаете условное отображение.

<h:panelGroup id="body">
    <ui:include src="#{bean.page}.xhtml" />
</h:panelGroup>

Создайте область видимости компонента и используйте командные ссылки с <f:ajax>, чтобы изменить включенную страницу.

<h:form>
    <h:commandLink value="Page 1" action="#{bean.setPage('page1')}">
        <f:ajax execute="@this" render=":body" />
    </h:commandLink>
    <h:commandLink value="Page 2" action="#{bean.setPage('page2')}">
        <f:ajax execute="@this" render=":body" />
    </h:commandLink>
</h:form>

Если вы установили страницу приветствия как страницу включения по умолчанию во время построения (публикации) компонента, то новый запрос GET всегда будет отображать страницу приветствия.Единственным недостатком является то, что эти страницы больше не могут быть добавлены в закладки, но это, похоже, не является серьезной проблемой, учитывая это конкретное функциональное требование.

0 голосов
/ 13 января 2016

Я решил перезагрузить страницу, используя следующий подход.

Phase listener для фазы RENDER_RESPONSE создано NavigateHomePage. На каждой странице, требующей перезагрузки браузера, необходимо перейти на «Домашнюю страницу» и добавить f:phaseListener с type = "my.NavigateHomePage".

NavigateHomePage в методе afterPhase определяет имя текущей страницы (из request path) и сохраняет его в session.

NavigateHomePage в методе beforePhase определяет имя текущей страницы (из request path), берет имя предыдущей страницы из session и принимает request method. Если текущее имя страницы совпадает с именем предыдущей страницы и request method равно GET, а текущая страница не является «Домашней страницей», то выполняется перенаправление на «Домашнюю страницу».

Ограничение заключается в том, что для таких страниц (при перезагрузке браузера из которых происходит переход на «Домашнюю страницу») не должно быть ссылок (через GET) на себя.

Чтобы включить слушателя фазы на страницу, добавьте на страницу следующее:

<f:phaseListener type="my.NavigateHomePage"/>

Phase listener код следующий:

public class NavigateHomePage implements PhaseListener {

    private static final String CURR_PAGE = "currPage";
    private static final String HOME_PAGE = "home";
    private static final String HOME_PATH = "/my/faces/home.xhtml";

    @Override
    public void afterPhase(PhaseEvent event) {
        FacesContext facesContext = event.getFacesContext();
        String currPage = getPageName(facesContext);
        facesContext.getExternalContext().getSessionMap().put(CURR_PAGE, currPage);
    }

    @Override
    public void beforePhase(PhaseEvent event) {       
        //check browser reload and redirect to Main page
        FacesContext facesContext = event.getFacesContext();        
        String requestMethod = ((HttpServletRequest)facesContext.getExternalContext().getRequest()).getMethod();
        String currPage = (String) facesContext.getExternalContext().getSessionMap().get(CURR_PAGE);
        String newPage = getPageName(facesContext);
        if ("GET".equals(requestMethod) && newPage.equals(currPage) && !HOME_PAGE.equals(newPage)) {
            try {
                facesContext.getExternalContext().redirect(HOME_PATH);
            } catch (IOException ex) {
                Logger.getLogger(this.getClass()).warn("Can't redirect to Home page", ex);
            }                
        }                
    }

    @Override
    public PhaseId getPhaseId() {
        return PhaseId.RENDER_RESPONSE;
    }

    private String getPageName(FacesContext facesContext) {
        String pagePath = facesContext.getExternalContext().getRequestServletPath();
        String pageName = pagePath.substring(pagePath.lastIndexOf("/") + 1, pagePath.lastIndexOf(".xhtml"));

        return pageName;
    }

}
0 голосов
/ 09 мая 2011

Не совсем.

В протоколе http или в jsf ничего такого нетв лучшем случае.

Если бы клиент спросил меня что-то подобное, я бы позволил ему заплатить много за эту функцию, без особых гарантий.Это выглядит нереальным требованием ко мне; -)

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