<h:commandlink>不使用嵌套的<f:view>标记,但<h:outputlink>正在运行

时间:2015-12-15 07:00:36

标签: jsp jsf

我正在使用jsf中的web应用程序。 我的问题是关于<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 个答案:

答案 0 :(得分:1)

首先,您使用的是遗留的JSP视图技术,自2009年JSF 2.0以来,Facelets(XHTML)已弃用并取而代之。如果您刚开始使用JSF,请确保您不看年龄 - 学习资源。也就是说,CurrentDb.Execute "UPDATE dbo_RootCause SET Part = '" & Me.cboPart & "', Qty = " & Str(Me.cboQTY) & ", Code = '" & Me.cboCode & "', Reason = '" & Me.txtReason & "', RootCause = '" & Me.txtRootCause & "', CorrectiveAction = '" & Me.txtCorrectiveAction & "', CAdate = #" & Format(Me.txtCAdate, "yyyy\/mm\/dd") & "#, CA_Comp_By = '" & Me.txtCA_Comp_By & "', ReturnInv = '" & Me.cboReturnInv & "', ReturnCust = '" & Me.cboReturnCust & "', CustFollowUp = '" & Me.cboCustFollowUp & "' WHERE ListItems = " & Me.txtListItems & "", dbSeeChanges 在Facelets中的行为有所不同,因此如果您正在研究答案,那么针对Facelets的任何答案都不适用于JSP,最终可能会让您感到困惑。

对于具体问题,在JSP中可以有只有一个 <f:view>,而必须是顶级JSF组件。它代表<f:view>实例。您不能在JSP中嵌套多个UIViewRoot。在JSP的后继Facelets中,它是可选的,不需要是顶级的,并且可以有多个,基本上相互扩展。

您不应在包含文件中包含<f:view>。如果您打算多次重复使用相同的包含文件,则包含文件中最多可以包含<f:view>,否则包含的内容将出现重复的组件ID错误。

另见: