我需要在加载jsf页面之前执行Web服务(方法)调用。该调用将返回必须在我的jsf页面上显示的输入字段列表。用户可以填写表单,然后单击下一步我需要在表单上输入的值发送回另一个Web服务(方法)。
我的方法是为jsf页面(包含空白表单和绑定到bean)创建一个请求范围的bean,并在我的form方法的setter方法中执行web服务调用,并动态创建UIInput字段
//call web service
//Loop
UIInput input = new HtmlInputText();
//set unique Id
form.getChildren().add(input);
//End Loop
它确实创建了输入字段,但如果我执行浏览器或刷新它会继续添加输入字段。显然我的方法是错误的。
我还发现,当我尝试在提交操作上获取这些动态创建的输入字段的值时,如
List<UIComponent> dynamicFields = form.getChildren();
for(int i=0;i<form.getChildCount();i++){
if("javax.faces.Input".equals(componentFamily)){
UIInput input = (UIInput)dynamicFields.get(i);
System.out.println("Input Field: ID = "+input.getId() + " , Value="+ input.getValue());
}
}
正确打印字段的ID,但值始终为null。显然做错了。
请告诉我何时以及何时创建字段以及如何捕获这些值
P.S Am使用JSF 2.0,Jdeveloper,Glassfish和/或Weblogic Server
答案 0 :(得分:0)
根据您的问题,我无法确定您希望从您的网络服务获得什么类型的数据,以及您希望将其呈现在哪种组件中。我的答案假设您将始终收到一份字符串,您将在文本框中显示它们。
一种可能的方法是调用您的Web服务并在@PostConstruct方法中获取数据,将此数据放入列表中,然后在数据表中呈现数据。代码如下。
豆:
@ManagedBean(name="bean")
@ViewScoped
public class YourBean implements Serializable {
private static final long serialVersionUID = 1L;
private List<String> values = new ArrayList<String>();
//The method below @PostConstruct is called after the bean is instantiated
@PostConstruct
public void init(){
//fetch data from source webservice, save it to this.values
}
public void save(){
for(String s: this.values)
// send s to destination webservice
}
public List<String> getValues(){
return this.values;
}
public void setValues(List<String> values){
this.values = values;
}
}
XHTML摘录:
<h:form>
<h:dataTable value="#{bean.values}" var="s">
<h:column>
<h:inputText value="#{s}" />
</h:column>
</h:dataTable>
<h:commandButton value="Save" action="#{bean.save}" />
</h:form>
答案 1 :(得分:-1)
这个问题是因为你绑定它的bean的范围是@RequestScoped这意味着每次刷新或调用页面时你都要再次调用post constuctor(@PostConstuct)方法,所以这个工作再次创建,对于输入字段的空值,您应该添加到每个输入字段值表达式以将值存储在其中。
private String inputValue; //setter() getter()
UIInput input = new HtmlInputText();
@PostCostruct
public void addInput()
{
// your previos create and add input fields to the form + setting value expression
Application app = FacesContext.getCurrentInstance().getApplication();
input.setValueExpression("value",app.getExpressionFactory().createValueExpression(
FacesContext.getCurrentInstance().getELContext(), "#{bean.inputValue}", String.class));
}
如果使用绑定,则正确答案不使用请求范围使用会话范围,它将与您一起使用,并在检索值时获取非空数据。