JSF2.1-动态UIC组件和链接
我在Tomcat6上使用JSF2.1和el2.2库 我已经创建了一个模板布局,所有页面都有一个页眉、菜单栏和页脚,只有内容在变化。每个部分都有自己的div标记。一切正常,菜单栏链接使用faces配置导航规则正确导航到新页面 我现在创建了一个内容页,其中包含动态创建的UIC组件。当视图渲染时,带有一个项目的panelgrid将正确显示,但所有菜单项不再工作 如果我从xhtml中删除panelgrid标记并刷新,那么菜单项将再次正常工作。在本例中,生成的HTML的唯一区别是panelgrid的table标记的存在/不存在 在下面的示例中,我将其拆分为一个HtmlPanelGrid和一个孩子 MyBean:(BaseBean所做的就是实现可序列化) 我的内容xhtmlJSF2.1-动态UIC组件和链接,jsf,jsf-2,uicomponents,Jsf,Jsf 2,Uicomponents,我在Tomcat6上使用JSF2.1和el2.2库 我已经创建了一个模板布局,所有页面都有一个页眉、菜单栏和页脚,只有内容在变化。每个部分都有自己的div标记。一切正常,菜单栏链接使用faces配置导航规则正确导航到新页面 我现在创建了一个内容页,其中包含动态创建的UIC组件。当视图渲染时,带有一个项目的panelgrid将正确显示,但所有菜单项不再工作 如果我从xhtml中删除panelgrid标记并刷新,那么菜单项将再次正常工作。在本例中,生成的HTML的唯一区别是panelgrid的tab
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.org/ui"
xmlns:iims-chart="http://java.sun.com/jsf/composite/components/chart">
<ui:composition>
<h:outputText styleClass="h1" value="#{msgs_dash.heading}"/>
<h:messages errorClass="errorMessage" infoClass="infoMessage" warnClass="warnMessage"/>
<h:panelGrid binding="#{dashBacker.dash}" />
</ui:composition>
</html>
我的菜单栏xhtml
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.org/ui">
<ui:composition>
<h:form id="menuBarFrm" styleClass="my-menubar">
<p:menubar>
<p:menuitem rendered="#{request.isUserInRole('user')}" value="Home" action="home"/>
<p:submenu rendered="#{request.isUserInRole('user')}" label="Help">
<p:menuitem rendered="#{request.isUserInRole('user')}" value="About" action="about"/>
</p:submenu>
</p:menubar>
</h:form>
</ui:composition>
</html>
最后是我的布局模板
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html">
<h:head>
<title><ui:insert name="windowTitle">DEFAULT_TITLE</ui:insert></title>
</h:head>
<h:body>
<div id="layout-header">
<ui:insert name="header">No define for "header"!</ui:insert>
</div>
<div id="layout-menubar">
<ui:insert name="menubar">No define for "menu"!</ui:insert>
</div>
<div id="layout-content">
<div id="layout-scrollable">
<div id="layout-margin">
<ui:insert name="content">No define for "content"!</ui:insert>
</div>
</div>
</div>
<h:messages/>
<div id="layout-footer">
<ui:insert name="footer">No define for "content"!</ui:insert>
</div>
</h:body>
</html>
默认标题
“标题”没有定义!
没有定义“菜单”!
“内容”没有定义!
“内容”没有定义!
您不能将组件存储在高于请求范围的任何位置。当您单击“主页”时,它是否正确重定向它,并且在加载菜单项后菜单项是否工作如果我要通过显式URL浏览到“帮助/关于”页面,则菜单项工作,我可以重新浏览到那里或浏览到主页。仅当主菜单被渲染时,菜单才会停止工作。(它会对鼠标盖和弹出的子菜单做出反应,但没有链接起作用)我只移动到SessionScoped,因为我原来的ViewScoped导致HtmlPanelGrid出现了一个非序列化的异常。我从来没有考虑过向下移动。请求范围的工作。对于它影响菜单栏链接的奇怪行为,特别是当生成的HTML相同时,有什么解释吗?这需要很多解释。只需说它是规范禁止的(至少在2.2中),因此是未记录的行为。通过在会话中存储对JSF视图树中任何内容的引用,还可以隐式地在会话中存储对ViewRoot的引用(该引用在每个请求的基础上重新创建),从而导致内存泄漏和许多意外的副作用。为什么会有这种奇怪的行为?因为JSF无法在回发时正确地恢复视图(正因为如此),所以在没有调试的情况下很难判断到底出了什么问题。然而,错误的原因是明确的。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html">
<h:head>
<title><ui:insert name="windowTitle">DEFAULT_TITLE</ui:insert></title>
</h:head>
<h:body>
<div id="layout-header">
<ui:insert name="header">No define for "header"!</ui:insert>
</div>
<div id="layout-menubar">
<ui:insert name="menubar">No define for "menu"!</ui:insert>
</div>
<div id="layout-content">
<div id="layout-scrollable">
<div id="layout-margin">
<ui:insert name="content">No define for "content"!</ui:insert>
</div>
</div>
</div>
<h:messages/>
<div id="layout-footer">
<ui:insert name="footer">No define for "content"!</ui:insert>
</div>
</h:body>
</html>