0

我又遇到了 JSF 的问题。我仍在学习,非常感谢您的帮助。

<h:form>
    <h:selectOneMenu value="#{productBean.productName}">
        <f:selectItems value="#{productBean.pizza}" var="pizza" itemValue="#{pizza}" itemLabel="#{pizza.name}" />
        <f:ajax listener="#{productBean.valueChanged(pizza)}" render="pizzaResult" />
    </h:selectOneMenu>
    <h:commandButton value ="Dodaj do zamówienia"/>
    <h:outputText id="pizzaResult" value="#{productBean.message}" />
</h:form>

我只想用自定义对象的参数调用方法 valueChanged:Product。这是方法:

public void valueChanged(Product prod)
{
    if(prod.getIs_available() == 1)
        message = "yes";
    else
        message = "no";
}

我希望它验证产品是否可用。并将其打印在 outputText 标记中。我认为问题出在 HTML 中,因为所需的所有数据都是字符串,我无法以这种方式发送产品。我应该使用转换器吗?它应该是什么样子?我对转换器知之甚少,ProductConverter 的工作示例会让我头脑清醒。提前致谢。

4

3 回答 3

0

listener属性的文档中:

签名必须匹配 public void processAjaxBehavior(javax.faces.event.AjaxBehaviorEvent event) throws javax.faces.event.AbortProcessingException

所以你需要valueChanged像这样改变你的方法:

public void valueChanged(AjaxBehaviorEvent ev)
{
    if(this.getIs_available() == 1)
        message = "yes";
    else
        message = "no";
}

但是,更清洁的方法是使用自定义Validator.

于 2013-05-12T10:22:43.053 回答
0

您不需要在侦听器中传递额外的参数,因为转换和验证的值将存在于您的 bean 中。因此,您可以直接在该对象上调用您的方法。您需要的是实现Converter并将<h:selectOneMenu>'s绑定value到您的模型类。

因此,假设您pizza是类型,Pizza您的设置将如下所示。

风景:

<h:form>
    <h:selectOneMenu value="#{productBean.product}" converter="#{pizzaConverter}">
        <f:selectItems value="#{productBean.pizza}" var="pizza" itemValue="#{pizza}" itemLabel="#{pizza.name}" />
        <f:ajax listener="#{productBean.valueChanged}" render="pizzaResult" />
    </h:selectOneMenu>
    <h:commandButton value ="Dodaj do zamówienia"/>
    <h:outputText id="pizzaResult" value="#{productBean.message}" />
</h:form>

豆子:

@ManagedBean
@ViewScoped
public class ProductBean implements Serializable {
    private Pizza product;//getter+setter
    private String message;//getter
    public void valueChanged(AjaxBehaviorEvent abe) {
        message = ((product == null) || product.isAvailable()) ? "" : "Product temporarily unavailable";
    }
}

并且您需要正确实施转换器。我在这里举个例子,还有很多关于 Stack Overflow 上转换器使用的例子。

于 2013-05-12T11:17:21.047 回答
0

(我还有一个问题。请阅读)我想我自己可以像这样解决它:(产品是一个带有产品的数组列表。每个产品都有像 name 或 is_available 这样的字段,它是从 productBean 的构造函数中的数据库中获取的。我遍历列表以查找正确的名称,然后检查其是否可用。如果没有,我设置正确的消息)

    <h:selectOneMenu value="#{productBean.productName}">
        <f:selectItems value="#{productBean.drink}" var="drink" itemValue="#{drink.name}" itemLabel="#{drink.name}" />
        <f:ajax listener="#{productBean.valueChanged(productBean.productName)}" render="drinkResult" />
    </h:selectOneMenu>

public void valueChanged(String name)
{ 
    Iterator<Product> ie = products.iterator();
    while(ie.hasNext()) 
    {
        Product actualProd = ie.next();
        String prodName =actualProd.getName();
        int available =actualProd.getIs_available();
        if(prodName.equals(name) && available == 0)
        {
            System.out.println(prodName + available);
            message = " No rpoduct in store, sorry";
            break;
        }
        else
            message = "";
    }
}

但我不确定这是做这些事情的正确方法。你认为呢?我想学习用 Java EE 编写 Web 应用程序,因为它们应该被编写。“好吧,它有效” - 这对我来说还不够。

于 2013-05-12T11:05:27.977 回答