0

我有一个<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 调用这些 servlet>

4

2 回答 2

2

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

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

因此,所以

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

要不就

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

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

也可以看看:

于 2013-05-03T12:11:47.050 回答
0

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

当使用并且您正在使用标准 JSF 表单提交时,您可能已经键入了输入。在您的情况下: value 是您的按钮的标签 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 无法使用它进行导航:它不是别名也不是页面。

于 2013-05-03T06:37:49.117 回答