Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Navigate using p:selectOneMenu

I'm using a select one menu to do navigation to different parts of my site:

<p:selectOneMenu value="#{navigator.outcome}">                      
    <f:selectItem itemLabel="Select page..." />
    <f:selectItem itemValue="page1" itemLabel="Page 1" />
    <f:selectItem itemValue="page2" itemLabel="Page 2" />
    <f:selectItem itemValue="page3" itemLabel="Page 3" />
    <p:ajax event="change" listener="#{navigator.navigate}" />
</p:selectOneMenu>

Is there a more SEO friendly way of doing this? I'm worried that the JavaScript links won't get followed.

like image 555
DD. Avatar asked Feb 21 '13 17:02

DD.


2 Answers

Use custom content with <p:column> with therein a <h:link>.

Bean:

private List<Page> pages;

@PostConstruct
public void init() {
    pages = new ArrayList<Page>();
    pages.add(new Page("Page 1", "/page1.xhtml"));
    pages.add(new Page("Page 2", "/page2.xhtml"));
    pages.add(new Page("Page 3", "/page3.xhtml"));
}

View:

<p:selectOneMenu var="page">
    <f:selectItems value="#{bean.pages}" var="page" itemLabel="#{page.title}" />
    <p:column>
        <h:link value="#{page.title}" outcome="#{page.viewId}" />
    </p:column>
</p:selectOneMenu>

Note that this doesn't work with List<SelectItem> nor individual <f:selectItem> entries. You really need to provide a List<Entity> (wherein Entity is Page in the above example).

This generates a <table> with fullworthy and crawlable (and clickable!) <a> elements.

See also:

  • What is the difference between redirect and navigation/forward and when to use what?
  • How to navigate in JSF? How to make URL reflect current page (and not previous one)
like image 113
BalusC Avatar answered Oct 21 '22 21:10

BalusC


just create function navigate as :

<p:selectOneMenu value="#{navigator.outcome}">                      
    <f:selectItem itemLabel="Select page..." />
    <f:selectItem itemValue="page1" itemLabel="Page 1" />
    <f:selectItem itemValue="page2" itemLabel="Page 2" />
    <f:selectItem itemValue="page3" itemLabel="Page 3" />
    <p:ajax event="change" listener="#{navigator.navigate}" />
</p:selectOneMenu>

public void navigate() {
    FacesContext context = FacesContext.getCurrentInstance();
    NavigationHandler navigationHandler = context.getApplication()
            .getNavigationHandler();
    navigationHandler.handleNavigation(context, null, outcome
            + "?faces-redirect=true");
}
like image 24
Karim Oukara Avatar answered Oct 21 '22 20:10

Karim Oukara