The difference between h:link and h:commandLink is that h:link does an immediate jump to the target, disregarding any updates made to the form. commandLink, on the other hand, validates the inputs, and if the data is valid, updates the backing bean, then invokes the action method. Which, by the way, should be declared as "action="#{menuBean.logout}"". Another case where you need to lose the parentheses.
The action method must be a public method with no parameters, and returning a
String. The String is the navigation token, which originally was the label of a navigation rule, but in JSF2 can also be a direct reference to another JSF View. When it's empty or null, the invoking page is simply redisplayed.
The link tag was added for JSF2 as part of the support for bookmarkable JSF URLs. It should be used sparingly. The commandLink and commandButtons are more appropriate when doing data updates.
You can add the "redirect" element to a navigation rule and it will cause the displayed URL to match the destination. This costs extra, but is very useful/important in cases where the usual "URL lag" is not desirable, such as when navigating to a secured View.