我有一个使用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>`
答案 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,一切正常!