<h:commandLink> 不适用于嵌套 <f:view> 标记,但 <h:outputLink> 正在工作

Posted

技术标签:

【中文标题】<h:commandLink> 不适用于嵌套 <f:view> 标记,但 <h:outputLink> 正在工作【英文标题】:<h:commandLink> not working with nested <f:view> tag but <h:outputLink> is working 【发布时间】:2016-03-20 20:52:17 【问题描述】:

我正在开发一个 jsf 中的网络应用程序。 我的问题是关于&lt;h:commandLink&gt; 的工作。

我尝试使用&lt;h:commandLink&gt; 来做我可以用&lt;h:outputLink&gt; 做的事情,只是为了测试。(我知道使用&lt;h:commandLink&gt; 进行静态导航是个坏主意)。

我的&lt;h:commandLink&gt; 存在于一个名为CustomerRight.jsp 的文件中。

所以在我的文件 CustomerRight.jsp 中,我的代码如下所示:

<f:view>
<h:commandLink action="/pages/accountSettings/ToggleMessageService.jsp" value="Click here"></h:commandLink>
</f:view>

现在这个文件包含在另一个名为 Home.jsp 的 jsp 中,如下所示:

<f:view>
   <h:form>
      <jsp:include page="CustomerRight.jsp"></jsp:include>
   </h:form>
</f:view>

现在我们可以看到,当页面包含在 Home.jsp 中时,它将充当嵌套的&lt;f:view&gt; 标记。 因此,&lt;h:commandLink&gt; 不起作用。它会将我重新定向到同一页面,而如果我使用 &lt;h:outputLink&gt; 代替它,那效果很好。

谁能解释一下为什么&lt;h:commandLink&gt; 不工作但&lt;h:outputLink&gt; 在嵌套&lt;f:view&gt; 标签的情况下工作?

如果我从 CustomerRight.jsp 中删除 &lt;f:view&gt; 标记,commandLink 工作正常(因为现在没有嵌套的 &lt;f:view&gt; 标记)

还有&lt;f:view&gt;标签的意义是什么?如果我在任何 jsps 中根本不使用它,则不会呈现页面。我得到一个例外说"java.lang.IllegalStateException: Component javax.faces.component.UIViewRoot@1226eca not expected type. Expected: javax.faces.component.UIOutput. Perhaps you're missing a tag?"

【问题讨论】:

【参考方案1】:

首先,您使用的是自 2009 年 JSF 2.0 以来已被 Facelets (Xhtml) 弃用并取而代之的遗留 JSP 视图技术。如果您刚开始使用 JSF,请确保您不要查看年龄-旧的学习资源。也就是说,&lt;f:view&gt; 在 Facelets 中的行为有所不同,因此如果您正在研究答案,任何针对 Facelets 的答案都不适用于 JSP,最终可能会让您感到困惑。

至于具体问题,JSP中只有一个&lt;f:view&gt;必须是***JSF组件。它代表UIViewRoot 实例。您不能在 JSP 中嵌套多个 &lt;f:view&gt;。在JSP的后继Facelets中是可选的,不需要是***的,可以有多个,基本上是相互扩展的。

您不应该在包含文件中有&lt;f:view&gt;。如果您打算多次重复使用同一个包含文件,则最多可以在包含文件中包含&lt;f:subview&gt;,否则包含的内容会出现重复的组件ID错误。

另见:

When to use f:view and f:subview Why Facelets is preferred over JSP as the view definition language from JSF2.0 onwards? java.lang.IllegalStateException: Component javax.faces.component.UIViewRoot not expected type

【讨论】:

感谢您的回答和建议!但是我的问题仍然没有完全回答。为什么在嵌套 的情况下 outputLink 工作 因为它生成一个普通的 GET 链接并且不需要嵌套在 h:form 中。使用内部 f:view 你基本上是在破坏它之外的任何东西(因为在 JSP 中只能有一个),所以 h:commandLink 找不到任何父 h:form 来执行 POST 请求。 感谢您的澄清!

以上是关于<h:commandLink> 不适用于嵌套 <f:view> 标记,但 <h:outputLink> 正在工作的主要内容,如果未能解决你的问题,请参考以下文章

如何防止点击 <h:commandLInk> 时页面刷新

如何在执行 JSF <h:commandLink> 操作之前执行 Javascript? [复制]

<h:commandLink> 不适用于嵌套 <f:view> 标记,但 <h:outputLink> 正在工作

a4j:commandLink 和 h:commandLink 的区别

commandButton / commandLink / ajax动作/侦听器方法未调用或输入值未设置/更新

h:commandLink 动作和 f:ajax 监听器的调用顺序