我正在寻找在每个元素上以编程方式编写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调用? 您更喜欢哪种方法?
这是一个非常简单的例子,我没有通过循环构建很多选择元素 首先,我需要做这项工作......
答案 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?