Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JSF2.1-动态UIC组件和链接_Jsf_Jsf 2_Uicomponents - Fatal编程技术网

JSF2.1-动态UIC组件和链接

JSF2.1-动态UIC组件和链接,jsf,jsf-2,uicomponents,Jsf,Jsf 2,Uicomponents,我在Tomcat6上使用JSF2.1和el2.2库 我已经创建了一个模板布局,所有页面都有一个页眉、菜单栏和页脚,只有内容在变化。每个部分都有自己的div标记。一切正常,菜单栏链接使用faces配置导航规则正确导航到新页面 我现在创建了一个内容页,其中包含动态创建的UIC组件。当视图渲染时,带有一个项目的panelgrid将正确显示,但所有菜单项不再工作 如果我从xhtml中删除panelgrid标记并刷新,那么菜单项将再次正常工作。在本例中,生成的HTML的唯一区别是panelgrid的tab

我在Tomcat6上使用JSF2.1和el2.2库

我已经创建了一个模板布局,所有页面都有一个页眉、菜单栏和页脚,只有内容在变化。每个部分都有自己的div标记。一切正常,菜单栏链接使用faces配置导航规则正确导航到新页面

我现在创建了一个内容页,其中包含动态创建的UIC组件。当视图渲染时,带有一个项目的panelgrid将正确显示,但所有菜单项不再工作

如果我从xhtml中删除panelgrid标记并刷新,那么菜单项将再次正常工作。在本例中,生成的HTML的唯一区别是panelgrid的table标记的存在/不存在

在下面的示例中,我将其拆分为一个HtmlPanelGrid和一个孩子

MyBean:(BaseBean所做的就是实现可序列化)

我的内容xhtml

<?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>