首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >菜单怪异呈现行为

菜单怪异呈现行为
EN

Stack Overflow用户
提问于 2012-01-19 11:03:38
回答 2查看 1.9K关注 0票数 1

很抱歉,这篇文章太长了,但是目前我们还不清楚,所以我想尽可能多的发布一些细节。

我们在internet 9上遇到了PrimeFaces2.2菜单的问题。我们使用eclipse开发web应用程序,服务器是tomcat版本6.0.18,由于客户需求无法升级。我们在war中包含了所有必需的库,这也是客户的需求。下面是我们在应用程序web/lib文件夹中包含的(详尽的)库列表:

  • 原始面2.2.1
  • 安特尔2.7.6
  • 共用-集合3.1
  • 共用-fileupload 1.2.1
  • 公域-io 1.4
  • dom4j 1.6.1
  • hibernate JPA2.0API 1.0.0最终
  • 冬眠3
  • 图文-xtra 5.1.3
  • itextpdf 5.1.3
  • javassist 3.12.0 ga
  • 实现2.1.1 (20110408-FCS)
  • jsf(如上所述,验证了读取清单)
  • jstl 1.2
  • jta 1.1
  • log4j 1.2.15
  • 雷德蒙德1.0.1
  • slf4j-api 1.6.1
  • slf4j-log4j12-1.6.4
  • xmlworker - 1.1.1
  • 共用-电子邮件1.2

到目前为止,我们已经在三个不同的地区进行了测试:

  1. 开发环境: localhost tomcat 6.0.18,eclipse,ie9,http
  2. 部署的应用程序: tomcat 6.0.18,https - TAM (一个ibm系统),ie9
  3. 部署的应用程序: tomcat 6.0.18,https - TAM (一个ibm系统),firefox 9

该菜单包含三个根菜单“新请求”、“工作正在进行”和“管理”。

对于1.和2. (涉及ie9),第二个菜单“工作正在进行”消失,并在导航过程中恢复(单击其他菜单,单击重定向按钮,.),其他两个菜单仍然可见。我们无法找到一条规则,也无法系统地复制这种行为。正如您从下面的代码中看到的,我们对子菜单设置器进行了注释,以检查没有什么编程错误将其设置为不同的东西。

对于Firefox,它永远不会发生,它可以很好地工作。最后,只有在案例2 (ie9 + https in )中,我们有时会遇到servlet呈现异常,到目前为止,我们已经得到了以下内容:

  • javax.servlet.ServletException: javax.servlet.jsp.JspException: java.lang.IllegalStateException: Parent不是null,但是这个组件没有关联
  • javax.servlet.ServletException: Menubar必须在一个表单元素中
  • ArrayIndexOutOfBounds

行为怪异的素数面菜单是由代码生成的,它的后台bean有一个会话范围,相关代码如下所示。

这是图书馆的问题吗?浏览器问题?我们的应用程序的错误?有人能建议一些测试来缩小问题,或者一个工具来获得一些提示吗?

主要的容器页面是:

代码语言:javascript
复制
<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>

菜单页是:

代码语言:javascript
复制
<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:

代码语言:javascript
复制
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);
    }
}

}

子菜单工厂方法:

代码语言:javascript
复制
    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);
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-20 11:46:36

我找到了这个Primefaces论坛帖子

他们(optimus.prime -- PrimeFaces的创建者和论坛的一位非常高级的用户)声称,您应该将菜单项的构建器放在请求范围内,以避免奇怪的行为。

票数 0
EN

Stack Overflow用户

发布于 2013-03-29 18:20:36

这篇文章有点旧,但是,如果您有这样的用法,则更喜欢这些属性;

下面的使用可能只适用于客户端操作中非常特殊的java脚本需要:

代码语言:javascript
复制
    <p:menuitem value="new requests" onclick="navigateTo('Richieste/ListaRichieste.xhtml?canale=0');" />

更喜欢以下选项:

代码语言:javascript
复制
    <p:menuitem value="new requests" url="Richieste/ListaRichieste.xhtml?canale=0"/>

代码语言:javascript
复制
    <p:menuitem value="new requests" outcome="Richieste/ListaRichieste?canale=0" />
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8924955

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档