导航使用号码:selectOneMenu用于(Navigate using p:selectOneM

2019-08-17 02:26发布

我使用的是选择一个菜单做导航到我的网站的不同部分:

<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的链接将不会得到遵守。

Answer 1:

使用具有自定义内容<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> (式中, EntityPage在上面的例子)。

这产生了<table>与fullworthy和检索(和可点击!) <a>元件。

也可以看看:

  • 是什么重定向和导航/前进,什么时候使用什么区别?
  • 如何在JSF导航? 如何使URL反映当前页面(而不是以前的一个)


Answer 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");
}


Answer 3:

有很多方法可以ahieve你想要什么。 首先,我将描述替代你的方法,然后将张贴在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
}

导航上一个有意义的客户端点击按钮

您可以使用您的Dropbox让用户选择的选择范围,有一个按钮来进行导航:

<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>小号

你导航的工作与简单<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评论

SEO是越来越重要的今天,所以下面的规则是必不可少的。 使用另外一个URL重写解决方案来命名对网页链接用(基本)是很重要的Page如上类,让用户看到www.site.com/contact-us在他的浏览器,而不是www.site.com/contact.xhtml

恕我直言,以遵循最简单的方法是使用Prettyfaces ,这是一个很好的解决方案,我的口味。 它可以让你设置你的URL重写很容易(和重写JSF组件的所有内部URL)。

为了提高您的网站搜索引擎优化组件,你可以引入现场seoUrlPage模型类,然后有一个Prettyfaces映射,它会显示搜索引擎友好的URL(即www.site.com/contact-us ),而不是JSF视图ID(即www.site.com/contact.xhtml )在Web浏览器的地址栏中。

编辑 -在需要的URL重写争议

的搜索引擎友好的规则有些背景,提出了由谷歌,其中有参考网址结构如下:

  1. 改善网址结构-这也可能导致搜索引擎文档(更好的抓取谷歌搜索引擎优化指南 );
  2. 花时间做你的URL尽可能简单为用户和搜索引擎。 有些网站管理员试图通过重写他们的动态URL为静态的 (实现这一相同的参考 ,我加的);
  3. 用文字的网址(未来的所有引用来自谷歌引导为好);
  4. 创建一个简单的目录结构;
  5. 允许URL的一部分的可能性被删除。

而现在一些从SEO专家的一般准则:

  1. 创建优化的网址( 了解SEO友好的URL语法规范 );
  2. 静态就是道路&的光( 针对URL 11和最佳实践 );
  3. 选择描述性网址尽可能( URL有章可循创建搜索引擎和用户友好的URL ),等等。

我的问题的检查:

  1. 如果您使用的是静态类型的网页,其URL可以是www.site.com/contact-us.xhtml ,但为什么会有6级过度人物- www.site.com/contact-us会更好;
  2. 你的facelet页面可以位于一个深嵌套的内部结构,如/pages/articles/general/how-to-do-jsf.xhtml ,但它会更好,有和URL一样www.site.com/articles/how-to-do-jsf与路径体现在页面上,如果必要的;
  3. 有些developpers倾向于使用Facelets的短文件名( jsf-bp.xhtml ),或unmeaningful者( article23.xhtml ),但它会更好地展示的网址www.site.com/article/jsf-best-practices-for-beginners ;
  4. 扩展的使用,无论是.xhtml.jsf等可能导致用户(也许搜索引擎),以为内容是动态的 (意思是内容从一个模板渲染),就像在www.site.com/product.xhtml?id=12345 ,但静态内容应该是首选,因为用户(也可能搜索引擎)会认为这样的URL描述compeletely无状态的页面,就像在www.site.com/products/jsf-book-for-advanced-users 。 此外,greately提高网站可用性,这是非常重要的也;
  5. 人们倾向于使用查询参数标识( ?id=12345和路径参数名称() /jsf-book-for-advanced-users );
  6. URL重写提供了一个清晰的方式来浏览您的网站。 想象一下,一个路径www.site.com/products/jsf-book-for-advanced-users :这种类型的URL结构将呈现一个独特的产品页面,清除/jsf-book-for-advanced-users可能使一个完整的目录。 但如果你有要发生什么www.site.com/product.xhtml?name=jsf-book-for-advanced-users产品和www.site.com/catalogue.xhtml的目录? 其中的逻辑是不明确的用户,重写使您的URL结构;
  7. 最后,大多数与SEO处理不要使用文件扩展名(且很少利用查询参数)的网站,以及网站,我们都在,stackoverflow.com的。

我并不认为源提到了我是不争的,或者是非常权威的,或者它们的输入需要被应用到每个Web应用程序等,但我相信,存在很长时间,结构合理,界面友好的网站时间在生产中往往遵循这些规则。



文章来源: Navigate using p:selectOneMenu