我正在使用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?"
答案 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错误。