<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 中的网络应用程序。
我的问题是关于<h:commandLink>
的工作。
我尝试使用<h:commandLink>
来做我可以用<h:outputLink>
做的事情,只是为了测试。(我知道使用<h:commandLink>
进行静态导航是个坏主意)。
我的<h:commandLink>
存在于一个名为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 中时,它将充当嵌套的<f:view>
标记。
因此,<h:commandLink>
不起作用。它会将我重新定向到同一页面,而如果我使用 <h:outputLink>
代替它,那效果很好。
谁能解释一下为什么<h:commandLink>
不工作但<h:outputLink>
在嵌套<f:view>
标签的情况下工作?
如果我从 CustomerRight.jsp 中删除 <f:view>
标记,commandLink 工作正常(因为现在没有嵌套的 <f:view>
标记)
还有<f:view>
标签的意义是什么?如果我在任何 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,请确保您不要查看年龄-旧的学习资源。也就是说,<f:view>
在 Facelets 中的行为有所不同,因此如果您正在研究答案,任何针对 Facelets 的答案都不适用于 JSP,最终可能会让您感到困惑。
至于具体问题,JSP中只有一个<f:view>
,必须是***JSF组件。它代表UIViewRoot
实例。您不能在 JSP 中嵌套多个 <f:view>
。在JSP的后继Facelets中是可选的,不需要是***的,可以有多个,基本上是相互扩展的。
您不应该在包含文件中有<f:view>
。如果您打算多次重复使用同一个包含文件,则最多可以在包含文件中包含<f:subview>
,否则包含的内容会出现重复的组件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【讨论】:
感谢您的回答和建议!但是我的问题仍然没有完全回答。为什么在嵌套以上是关于<h:commandLink> 不适用于嵌套 <f:view> 标记,但 <h:outputLink> 正在工作的主要内容,如果未能解决你的问题,请参考以下文章
如何在执行 JSF <h:commandLink> 操作之前执行 Javascript? [复制]
<h:commandLink> 不适用于嵌套 <f:view> 标记,但 <h:outputLink> 正在工作
a4j:commandLink 和 h:commandLink 的区别