我正在使用选择一个菜单导航到我网站的不同部分:
<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>
是否有更多的SEO友好的方式这样做?我担心JavaScript链接不会被跟踪。
答案 0 :(得分:7)
使用<p:column>
的自定义内容,其中<h:link>
。
豆:
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"));
}
查看:
<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>
请注意,这不适用于List<SelectItem>
或单个<f:selectItem>
条目。您确实需要在上面的示例中提供List<Entity>
(其中Entity
为Page
。
这会生成<table>
,其中包含值得信赖且可抓取(且可点击!)<a>
元素。
答案 1 :(得分:2)
只需创建功能导航为:
<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");
}
答案 2 :(得分:1)
有很多方法可以满足你的需求。首先,我将描述您的方法的替代方案,然后将发表一些关于SEO的评论。
首先,当用户在更改事件中隐式提交表单时,您可以通过普通表单提交来处理导航:
<h:form>
<h:selectOneMenu value="#{bean.currentPage}" converter="pageConverter" onchange="submit()">
<f:selectItems value="#{bean.pages}" var="page" itemLabel="#{page.name}" />
</h:selectOneMenu>
<h:commandButton value="submit" action="#{bean.handleNavigation}" style="display:none"/>
</h:form>
与
@FacesConverter("pageConverter")
和托管bean(@ManagedBean Bean
)与
private List<Page> pages;
private Page selectedPage;
public String handleNavigation(){
//do some job before navigation
return (selectedPage == null) ? null : selectedPage.getUrl();
}
和模型类
class Page {
private String name;//title in links
private String url;//JSF view-id
}
您可以使用您的保管箱来保留用户选择的选择,并有一个按钮来执行导航:
<h:form>
<h:selectOneMenu value="#{bean.currentPage}" converter="pageConverter">
<f:selectItems value="#{bean.pages}" var="page" itemLabel="#{page.name}" />
</h:selectOneMenu>
<h:commandButton value="Navigate" action="#{bean.performNavigation}"}/>
</h:form>
与上述模型相同。
<h:link>
s 您是否使用简单的<h:link>
s导航作业:
<ul>
<ui:repeat var="page" value="#{bean.pages}>
<li>
<h:link value="#{page.name}" outcome="#{page.url}" />
</li>
</ui:repeat>
</ul>
并相应地设置此菜单的样式。
SEO现在越来越重要,因此遵循其规则至关重要。除了使用上面的(基本)Page
类命名页面链接之外,使用网址重写解决方案也很重要,这样用户才能在浏览器中看到www.site.com/contact-us
而不是www.site.com/contact.xhtml
}。
遵循恕我直言的最简单方法是使用Prettyfaces,这是一个很好的解决方案,符合我的口味。它允许您非常轻松地设置重写的URL(并在JSF组件中重写所有内部URL)。
要增强您的网站搜索引擎优化组件,您可以在seoUrl
模型类中引入字段Page
,然后使用Prettyfaces映射来显示搜索引擎优化的网址(即www.site.com/contact-us
)在Web浏览器的地址栏中显示JSF view-id(即www.site.com/contact.xhtml
)。
www.site.com/contact-us.xhtml
,但为什么会有6个过多的字符 - www.site.com/contact-us
会更好; /pages/articles/general/how-to-do-jsf.xhtml
,但如果必要的话,最好像页面中反映路径一样的www.site.com/articles/how-to-do-jsf
和url; jsf-bp.xhtml
)或无意义的(article23.xhtml
),但最好显示www.site.com/article/jsf-best-practices-for-beginners
的网址; .xhtml
,.jsf
等,都可能导致用户(可能还有搜索引擎)认为内容是动态(意味着该内容)是从模板中呈现的,就像在www.site.com/product.xhtml?id=12345
中一样,但静态内容应该是首选的,因为用户(可能还有搜索引擎)会认为这样的URL描述了一个完全无状态的页面,比如在www.site.com/products/jsf-book-for-advanced-users
。此外,它还大大增强了网站的可用性,这也非常重要; ?id=12345
)和路径参数的名称(/jsf-book-for-advanced-users
); www.site.com/products/jsf-book-for-advanced-users
:这种类型的网址结构将呈现唯一的产品页面,删除/jsf-book-for-advanced-users
可能会呈现完整的目录。但是,如果您对产品www.site.com/product.xhtml?name=jsf-book-for-advanced-users
和目录有www.site.com/catalogue.xhtml
会怎样?用户不清楚逻辑,重写可以构建您的URL; 我并不认为我提到的来源是无可争辩的,或者是非常具有说服力的,或者他们的输入需要应用于每个网络应用程序等等。但我确实认为存在结构良好,用户友好的网站在生产中很长一段时间倾向于遵循这些规则。