JSF用<h:commandlink> </h:commandlink> </p:button>替换<p:button>

时间:2013-05-03 00:24:04

标签: servlets jsf-2 primefaces

我有一个工作<p:button>,它调用托管bean中的方法,如下所示:

        <h:form id="loginForm">
                <p:button value="Facebook Connect"
                    href="#{loginPageCode.facebookUrlAuth}" />
                <br />
                <h:outputText value="#{loginPageCode.userFromSession}"/>
        </h:form>

我决定用链接替换它,所以我做了以下几点:

      <h:form id="loginForm">

        <h:commandLink action="#{loginPageCode.getFacebookUrlAuth}"
            value="#{loginPageCode.userFromSession}" />
    </h:form>

但不幸的是<h:commandLink>没有调用该方法,但我不知道为什么?

注意:托管bean内部的方法返回一个servlet的URL,因此commandLink必须在使用返回的URL&gt;

单击它时调用这些servlet。

2 个答案:

答案 0 :(得分:2)

这里有一个重大的误解。 <p:button>根本不会在托管bean中调用操作方法。按下按钮时,不评估href属性中的EL表达式。在要呈现按钮的HTML表示时进行评估。如果你在facebookUrlAuth的getter上设置一个断点,那么你会看到当显示带有按钮的页面而不是按下按钮时调用它。如果您通过右键单击查看源来检查JSF生成的HTML输出,那么您将看到该按钮在onclick中通过JavaScript导航。这是一个纯粹的导航按钮,而不是提交按钮。

<h:commandLink>生成一个使用JavaScript提交父表单的链接。它不是为执行纯导航而设计的。为此,您应该使用<h:outputLink><h:link>甚至<a>。由于它显然是外部网址,因此<h:link>是不可或缺的。

因此,所以

<h:outputLink value="#{loginPageCode.facebookUrlAuth}">Facebook Connect</h:outputLink>

或只是

<a href="#{loginPageCode.facebookUrlAuth}">Facebook Connect</a>

如果您理解 JSF仅仅是一个HTML代码生成器并且您熟悉基本HTML,那么这一切都会更加直截了当。

另见:

答案 1 :(得分:0)

使用时,您只需在页面上创建一个简单的HTML链接。 当您单击它时,将从浏览器执行HTTP GET。 使用此语法,您根本不需要任何语法。没有表格提交

使用时,您正在使用标准的JSF表单提交 使用您可以键入的输入。 在你的情况下: value是yout按钮的标签 execute是bean上的java方法。

public String execute()
{
  return "nextPage";
}

JSF使用此mececute方法的返回来导航“内部”JSF, 因此“nextPage”可以是faces-config.xml中导航规则的别名 或者用JSF2命名JSF页面:nextPage.xhtml。

在你的情况下,#{loginPageCode.getFacebookUrlAuth}会返回一个字符串,如:“http://www.facebook.com/help/usernames

并且JSF无法导航:它不是别名也不是页面。