Как управлять меню боковой панели при навигации между страницами в JSF?

#jsf #navigation #submenu

#jsf #навигация #подменю

Вопрос:

Я использую пользовательский шаблон с боковой панелью: у меня есть 3 сгруппированных меню, которые можно открывать или закрывать. Я бы открывал меню только тогда, когда я нахожусь на определенных страницах.

Я попытался использовать NavigationController со свойством, которое позволяет мне понять, «где» мы сейчас находимся, чтобы я мог открыть нужное меню.

 @ManagedBean(eager = true)
@RequestScoped
public class NavigationController implements Serializable {
   @ManagedProperty(value = "#{param.pageId}")
   private String pageId;

   public String showPage() {
       switch(pageId) {
          case "1": return "home";
          case "21": return "cerca_a";
          case "22": return "anagrafica?id_p=newamp;faces-redirect=true";
          ...
         default: return "home";
       }
  }
  //getter and setter
}
 

Используется в sideBar.xhtml следующим образом

 <ul class="collapse list-unstyled #{navigationController.pageId lt 30? 'show':''}">
  <li><h:commandLink action="#{navigationController.showPage}" value="Cerca">
    <f:param name="pageId" value="31"/></h:commandLink></li>
  ...
</ul>
 

Это не работает, когда я использую ссылки с параметрами (случай 22): меню не открывается, оно теряет #{NavigationController.pageId}.
Уверен, что это происходит потому, что это @RequestScoped и когда я вызываю anagrafica?id_p=new выполняется AnagConverter.

Должен ли я использовать @ViewScoped? Как? Есть ли лучший способ сохранить пользовательскую «хлебную крошку»?

Большое спасибо!

Комментарии:

1. Итак, вы не понимаете, что amp;faces-redirect=true на самом деле делает? Удалите эту часть, и она будет работать. Если вы хотите сохранить его, вам также придется добавить amp;pageId=22 его туда.

2. Привет @BalusC: может быть, недостаточно ..! Если я не использую ‘amp;faces-redirect= true’, то меню работает, но параметр ‘id_p= new’ не отображается anagrafica.xhtml (который, в этом случае, создает страницу для нового элемента). Если я добавлю ‘amp;pageId= 22’, это работает, но отображается в URL-адресе браузера. Я полагаю, что нет более чистого решения. Спасибо!

3. Конечно, есть более чистое решение. Просто не используйте идентификаторы страниц, а используйте имена страниц / URL-адреса / пути.

4. Понял: я учусь 🙂 Большое спасибо!