jsf以编程方式调用ajax函数

时间:2013-07-15 15:22:57

标签: ajax jsf-2

我正在寻找在每个元素上以编程方式编写ajax调用的可能性。

我必须采用各种方法来构建UI组件

first - panelGroup binding-)

    HtmlSelectOneMenu HSOM = new HtmlSelectOneMenu();       
    UISelectItems items = new UISelectItems();   

    List<SelectItem> comboList = new ArrayList<SelectItem>();         
    comboList.add(new SelectItem(" "));   
    comboList.add(new SelectItem("1"));   
    comboList.add(new SelectItem("2"));   
    comboList.add(new SelectItem("3"));   

    items.setValue(comboList);   
    HSOM.getChildren().add(items);                      
    HSOM.setValueExpression("value", buildValueExpression("#{productDetails.productOptionValue}"));

    AjaxBehavior ajax = new AjaxBehavior();
    ajax.setValueExpression("value", buildValueExpression("#{productDetails.updateProduct()}"));
    HSOM.addClientBehavior("valueChange", ajax);
    HSOM.addValidator(new BeanValidator());
    productOptions.getChildren().add(HSOM);

    private ValueExpression buildValueExpression(String exp) {
    FacesContext facesInstance = FacesContext.getCurrentInstance();
    Application application = facesInstance.getApplication();
    ExpressionFactory expressionFactory = application.getExpressionFactory();
    String expression = exp;
    return expressionFactory.createValueExpression(facesInstance.getELContext(), expression, String.class);
}

我可以看到,Ajax Call链接到组件,但是没有调用updateProduct()函数。

创建动态组件的另一种可能性是)

  public void encodeEnd(FacesContext context) throws IOException {
            System.out.println("Start encoding");    
     ResponseWriter responseWriter = context.getResponseWriter();
     responseWriter.startElement("span", null);
     responseWriter.writeAttribute("id",getClientId(context),"id");
     responseWriter.writeAttribute("name", getClientId(context),"clientId");
     responseWriter.write("Farbe");
     responseWriter.endElement("span");

     responseWriter.startElement("select", null);
     responseWriter.writeAttribute("id",getClientId(context),"id");
     responseWriter.writeAttribute("name", getClientId(context),"clientId");
     responseWriter.writeAttribute("value", "#{artikelDetails.productOptionValue}", "value");
        responseWriter.startElement("option", null);
        responseWriter.write("Gelb");
        responseWriter.endElement("option");     
        responseWriter.startElement("option", null);
        responseWriter.write("Blau");
        responseWriter.endElement("option");
     responseWriter.endElement("select");        
     System.out.println("End encoding");
     }

如何在每个选择元素上添加ajax调用? 您更喜欢哪种方法?

这是一个非常简单的例子,我没有通过循环构建很多选择元素 首先,我需要做这项工作......

1 个答案:

答案 0 :(得分:0)

您需要为所有以编程方式创建的输入和命令组件提供固定ID,以便JSF可以在请求参数映射中找到所需的已提交信息。否则他们最终会得到一个自动生成的ID,这在回发期间是不同的。

在你的情况下,那就是:

HSOM.setId("someId");

  

您更喜欢哪种方法?

两者都不是。我确信Java是用于在视图中声明组件的错误工具。 JSF已经附带了Facelets,它允许通过XML方式以更简单,更清晰的方式声明组件。如果您打算基于某些前提条件动态构建视图,请查看JSTL。另请参阅其他How to make a grid of JSF composite component?JSTL in JSF2 Facelets... makes sense?