2013-10-24 3 views
0

У меня есть приложение JSF 2.0, у которого есть бит, называемый соглашением. Это приложение содержит всего 4 страницы: main.xhtml, details.xhtml, generation.xhtml и generationFailed.xhtml. Правильный порядок навигации должен быть main.xhtml -> details.xhtml и заданы определенные условия: gener.xhtml или generationFailed.xhtml.Принудительная страница

Порядок должен быть таким, потому что для правильного отображения details.xhtml и страниц генерации, bean должен быть построен на основе ввода пользователя в main.xhtml.

Проблема заключается в том, что клиент может перейти непосредственно на любую из страниц, указав URL-адрес в браузере. Таким образом, при загрузке, например, details.xhtml, он выдает ошибку, потому что компонент соглашения имеет несколько нулевых атрибутов. Мне нужно как-то узнать, является ли атрибут bean-компонента равным null (атрибут называется id), а если он равен нулю, принудительно перенаправляйте main.xhtml.

Любые идеи?

+0

Вы можете делать то, что вы хотите с помощью проверки сеанса, как [это] (http://stackoverflow.com/questions/ 8144195/регистрация если-сеанс существует-JSF) – danRod

ответ

1

Просто когда пользователю перемещаться из main.xhtml на любой странице поместить основной. атрибут Xhtml бина в флэш-прицел,

 public String gotoDetails() { 
     getFlash().put("id", Id); 
     return "/pages/details?faces-redirect=true"; 
    } 

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

 public void loadPage(ComponentSystemEvent cse) { 
     if (null == getID()) { 
      FacesContext 
         .getCurrentInstance() 
         .getApplication() 
         .getNavigationHandler() 
         .handleNavigation(FacesContext.getCurrentInstance(), null, 
           "/pages/main?faces-redirect=true"); 
     } 
    } 

, то вы можете вызвать предыдущий метод в preRenderView event в details.xhtml с помощью

<f:event listener="#{yourdetailsbean.loadPage}" type="preRenderView" /> 
1

Вы должны использовать фильтры для страниц и создавать виртуальные конечные машины для каждого из ваших клиентов. В государственном компьютере содержится правило навигации, которое вы описали: main.xhtml -> details.xhtml -> либо gener.xhtml, либо generationFailed.xhtml. Сохраняя состояние в файлах cookie или как угодно (в сеансе или на стороне сервера каким-то образом), вы можете управлять, проверяя фактическое состояние, если фактический запрос является законным или нет.

0

Ну, если пользователь вводит URL-адрес браузер отправит запрос GET, но если они отправят форму, он отправит запрос POST. Вы можете просто написать сервлет Filter, который перенаправляет все запросы GET для FacesServlet на страницу приветствия.

0

Создать SessionScoped фасоль и добавить 3 булевы:

firstPageVisited, secondPageVisited, thirdPageVisited.

На странице Проверка 4, если thirdPageVisited ложно, перенаправлять на 3, на 3, если secondPageVisited ложно редирект 2 ...

Смежные вопросы