为什么我的JSF的commandButton没有执行并返回错误?

时间:2013-12-18 01:52:55

标签: ajax jsf

我有一个使用ajax提交的表单,通常必须执行removeArticle函数。问题是,当我点击按钮时,函数永远不会被调用,并返回一个漂亮的错误消息(显示警告)告诉我:“serverError:class javax.ejb.NoSuchEJBException CORBA OBJECT_NOT_EXIST 9998也许;嵌套异常是:org .omg.CORBA.OBJECT_NOT_EXIST:vmcid:0x2000次要代码:1806已完成:可能“。我在另一部分使用类似(几乎)形式添加鸡尾酒。当我将我的removeArticle调用放入另一个表单时,它已被执行...

我的代码如下:

<?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">
<ui:composition template="template/common/commonLayout.xhtml"
            xmlns="http://www.w3.org/1999/xhtml"
            xmlns:ui="http://java.sun.com/jsf/facelets"
            xmlns:component="http://java.sun.com/jsf/composite/component"
            xmlns:h="http://java.sun.com/jsf/html"
            xmlns:c="http://java.sun.com/jsp/jstl/core"
            xmlns:f="http://java.sun.com/jsf/core">
<ui:define name="title">Panier</ui:define>
<ui:define name="content">
    <c:if test="#{dataManagedBean.cartLength > 0}">
            <div id="cart-component">
                <h2>Panier</h2>
                <div class="well well-small">
                    <ul class="thumbnails">
                        <ui:repeat value = "#{dataManagedBean.cartContent}" var = "item" varStatus="status">
                            <h:form id="cocktail-panier">
                            <div class="media">
                                <div class="pull-left media-object span2">
                                    <div class="text-center">
                                        <img src="resources/img/#{item.photoURIName}.#{item.photoURIExt}"
                                             alt="Photo du cocktail #{item.name}"/>
                                    </div>
                                </div>
                                <div class="media-body">
                                    <h3 class="media-heading">
                                        #{item.name}
                                    </h3>
                                    <div class="well well-small">
                                        <ul class="thumbnails">
                                            <ui:repeat value="#{dataManagedBean.getCocktailBeverages(dataManagedBean.getCocktailFull(item))}" var="bev" varStatus="status1">
                                                <component:ShowBeverageComponent item="#{bev}"/>
                                            </ui:repeat>
                                            <div class = "span2 right">Quantité : #{dataManagedBean.getQuantityForCocktailInCart(item)}</div><br />
                                            <div class = "span2 right">Prix unitaire : #{item.price} €</div><br />
                                            <div class = "span2 right">Prix total : #{item.price * dataManagedBean.getQuantityForCocktailInCart(item)} €</div>
                                        </ul>                 
                                        <h:commandButton
                                            title=""
                                            value="Supprimer les articles "
                                            type="button"
                                            actionListener="#{dataManagedBean.removeArticle(item)}">
                                            <f:ajax execute="@form" render="@all" />
                                        </h:commandButton>
                                        <h:inputText id="qty"  maxlength="3" value="#{dataManagedBean.qty}" styleClass="input-mini" />

                                    </div>
                                </div>
                            </div>  
                            </h:form>
                        </ui:repeat>
                    </ul>
                </div>
            </div>
    </c:if>
    <li class="thumbnail">
        <div class="totalPanier">
            <div class="total-cart"> Total:  #{dataManagedBean.getCartPrice()}€</div>
            <h:button class="totalPanier-button"
                      image="#{resource['img:btn_valider.png']}"
                      alt="valider" outcome="Form.xhtml" rendered="#{dataManagedBean.cartLength > 0}">
            </h:button>
            <div class="clear"></div>
        </div>
    </li>
</ui:define>
</ui:composition>`

2 个答案:

答案 0 :(得分:1)

HTML元素ID不应与“<h:form id="cocktail-panier"><div id="cart-component">中的” - “相同,这会导致js出现问题。用下划线 cart_component 替换所有这些ID,或使用Java样式,如 cartComponent

像这样使用commandButton:

<h:commandButton
                title=""
                value="Supprimer les articles "
                type="button">
                <f:ajax execute="@form" render="@all" listener="#{dataManagedBean.removeArticle(item)}"/>
</h:commandButton>

Ajax-Listener方法,如:

public final void removeArticle(final YourItemClass item){

你使用jstl组件。 JSTL将在构建时运行,如果你的Bean是requestScoped,那么commandbutton的render / action将不会触发。

将您的bean(如果没有)更改为ViewScope或SessionScope,并使用呈现而不是<c:if...

像:

替换此<c:if test="#{dataManagedBean.cartLength > 0}">

宽度:

<h:panelGroup display="block" rendered="#{dataManagedBean.cartLength > 0}">
.....

ADDITIONALY: 你使用模板。你的模板应该是这样的:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      >
<h:head>
    <meta charset="UTF-8" />
    <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
    <h:outputStylesheet name="stylesheet.css"/>

    <title>${pageTitle}</title>

在您使用此模板的XHTML页面中,您无需声明XML或HTML docType,并直接使用您的模板:

<ui:composition template="template/common/commonLayout.xhtml"
....

在模板中使用<h:head>而不是<head>,否则JSF将不会在文档中包含jsf.js

答案 1 :(得分:0)

问题是嵌套的ui:重复!我取代了我的2 ui:重复2 c:forEach,一切正常!