JSF上的动态字段

时间:2013-04-04 13:30:21

标签: java jsf jsf-2 facelets dynamic-forms

我需要在加载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

2 个答案:

答案 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));
     }

如果使用绑定,则正确答案不使用请求范围使用会话范围,它将与您一起使用,并在检索值时获取非空数据。