菜单奇怪的渲染行为

时间:2012-01-19 11:03:39

标签: internet-explorer jsf-2 primefaces tomcat6

对于这篇文章的篇幅感到抱歉,但目前我们一无所知,所以我希望发布尽可能多的细节。
我们在Internet Explorer 9 上遇到 primefaces 2.2菜单的问题。 我们使用eclipse开发Web应用程序,服务器是tomcat,版本6.0.18 ,并且由于客户要求而无法升级。我们在战争中包含了所有必需的库,这也是客户的要求。下面是我们在应用程序web-inf / lib文件夹中包含的(详尽的)库列表:

  • Primefaces 2.2.1
  • antlr 2.7.6
  • commons-collections 3.1
  • commons-fileupload 1.2.1
  • commons-io 1.4
  • dom4j 1.6.1
  • hibernate jpa 2.0 api 1.0.0 final
  • hibernate 3
  • itext-xtra 5.1.3
  • itextpdf 5.1.3
  • javassist 3.12.0 ga
  • jsf-api Mojarra JSF API实施2.1.1(20110408-​​FCS)
  • jsf-impl(如上所述,经过验证阅读清单)
  • jstl 1.2
  • jta 1.1
  • log4j 1.2.15
  • redmond 1.0.1
  • slf4j-api 1.6.1
  • SLF4J-log4j12-1.6.4
  • xmlworker - 1.1.1
  • commons-email 1.2

到目前为止,我们已经在三个不同的方案中测试了该应用程序:

  1. 开发环境:localhost tomcat 6.0.18,eclipse,ie9,http
  2. 已部署的应用程序:tomcat 6.0.18,https - TAM(ibm tivoli sso系统),ie9
  3. 部署的应用程序:tomcat 6.0.18,https - TAM(ibm tivoli sso系统),firefox 9
  4. 菜单包含三个根菜单“新请求”,“正在进行中”和“管理” 对于情况1.和2.(涉及ie9),第二个菜单“正在进行中”消失并在导航期间重新开始(单击其他菜单,单击重定向按钮,......),另外两个仍然可见。我们无法找到规则,也无法系统地复制行为。 从下面的代码中可以看出,我们已经对子菜单设置器进行了评论,以检查是否存在一些将其设置为不同的编程错误。
    使用Firefox它永远不会发生,它工作正常。 最后,仅在情况2(ie9 + https over tam)中,我们有时会得到servlet呈现异常,到目前为止我们已经得到以下内容:

    • javax.servlet.ServletException:javax.servlet.jsp.JspException:java.lang.IllegalStateException:Parent不为null,但此组件不相关
    • javax.servlet.ServletException:菜单栏必须位于表单元素
    • 的ArrayIndexOutOfBounds

    表面奇怪的primefaces菜单由代码构建,其支持bean具有会话范围,相关代码如下所示。
    那么这是一个库问题吗?浏览器问题?我们申请的错误? 有人可以建议一些测试来缩小问题范围或提供一些工具来获得一些提示吗? 主容器页面是:

    <h:body>
    <h:form id="masterForm">
        <p:growl id="msg" life="10000" showDetail="true" sticky="false" />
    </h:form>
    <p:layout fullPage="true">
        <p:layoutUnit position="top" height="90" id="layUnitNorth"
            resizable="false" closable="false" collapsible="false"  
            scrollable="null" zindex="199">
            <ui:insert name="header">
                <div id="userInfoPanel">
                    <ui:include src="userinfo.xhtml" />
                </div>              
                <ui:include src="menu.xhtml" /> 
            </ui:insert>
        </p:layoutUnit>
    
        <p:layoutUnit position="center" scrollable="true">
            <ui:insert name="content">
                <p:layoutUnit position="center">
                </p:layoutUnit>
            </ui:insert>
        </p:layoutUnit>
    </p:layout>
    

    菜单页面是:

    <ui:composition>
    <h:form id="menuForm">
        <p:menubar effect="slide" styleClass="menuCustom">
            <p:submenu label="New" >
                <p:menuitem value="new requests" onclick="navigateTo('Richieste/ListaRichieste.xhtml?canale=0');" />
                <p:menuitem value="channel 1" onclick="navigateTo('Richieste/ListaRichieste.xhtml?canale=1');" />
                <p:menuitem value="channel 2" onclick="navigateTo('Richieste/ListaRichieste.xhtml?canale=2');" />
                <p:menuitem value="channel 3" onclick="navigateTo('Richieste/ListaRichieste.xhtml?canale=3');" />
            </p:submenu>
            <p:submenu label="work in progress"
                binding="#{menuCtrl.boxSubMenu}">
            </p:submenu>
            <p:submenu label="administration" rendered="#{userInfo.admin}">
                <p:menuitem value="Customers" url="#" />
                <p:menuitem value="Templates" url="#" />
                <p:menuitem value="Digital signature" url="#" />
            </p:submenu>
        </p:menubar>
    </h:form>
    

    menuCtrl是一个会话bean:

    public class MenuCtrl {
    
    final static Logger log = Logger.getLogger(MenuCtrl.class);
    
    private Submenu boxSubMenu;
    
    public void setBoxSubMenu(Submenu boxSubMenu) {
        //this.boxSubMenu = boxSubMenu;
    }
    
    public Submenu getBoxSubMenu() {
        return boxSubMenu;
    }
    
    public MenuCtrl() {
        try {
            boxSubMenu = BoxMenuHelper.getBoxSubMenu();
        } catch (Exception ex) {            
            String msg = "Impossibile creare il menu di navigazione nei box";
            log.error(msg, ex);
            showMessage(FacesMessage.SEVERITY_ERROR, msg);
        }
    }
    

    }

    子菜单工厂方法:

        public static Submenu getBoxSubMenu() throws Exception{
        CatalogazioneRepository br = new CatalogazioneRepository();
        Submenu sm = new Submenu();
        try {
            for (Catalogazione box : br.getOnlyBoxes()) {
                MenuItem item = new MenuItem();
                item.setId("boxMenuItem" + box.getId());
                item.setValue(box.getNome());
                item.setOnclick("navigateTo('Box/ListaRichieste.xhtml?box="+ box.getId() +"');");
                sm.getChildren().add(item);
            }
            return sm;
        } catch (Exception ex) {
            String msg = "Errore durante la creazione del menu di navigazione nei box";
            log.error(msg, ex);
            throw new Exception(msg, ex);
        }
    }
    

2 个答案:

答案 0 :(得分:0)

我发现了Primefaces forum post

他们(optimus.prime-- PrimeFaces的创建者,Oleg是论坛的高级用户)声称你应该将menuitem的构建器放在请求范围内,以避免出现奇怪的行为。

答案 1 :(得分:0)

这篇文章有点陈旧但是,如果你有这样的用法,那就更喜欢这些属性; - 结果 - 网址

以下用法可能仅适用于客户端操作的非常特殊的java脚本需求:

    <p:menuitem value="new requests" onclick="navigateTo('Richieste/ListaRichieste.xhtml?canale=0');" />

首选以下选项:

    <p:menuitem value="new requests" url="Richieste/ListaRichieste.xhtml?canale=0"/>

    <p:menuitem value="new requests" outcome="Richieste/ListaRichieste?canale=0" />