JSF上的动态字段



我需要在加载jsf页面之前执行一个web服务(方法)调用。该调用将返回必须在jsf页面上显示的输入字段列表。用户可以填写表单,然后单击下一步,我需要将表单上输入的值发送回另一个web服务(方法)。我的方法是为jsf页面设置一个请求作用域bean(它由一个空白表单和绑定到该bean组成),并在我的表单方法的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被正确打印,但是value总是null。显然都做错了。

请让我知道何时以及在什么时候创建字段以及如何捕获这些值注:我正在使用JSF 2.0、Jdeveloper、Glassfish和/或Weblogic Server

从你的问题中,我不能确定你希望从你的web服务中获得什么样的数据,以及你想用什么样的组件来呈现它。我下面的回答假设您将始终收到一个String列表,并将它们显示在文本框中。

一种可能的方法是调用您的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>

这个问题是因为你的bean的作用域绑定在它上,如果它是@RequestScoped,这意味着每次刷新或调用页面时,你将再次调用post构造器(@ postconstruct)方法,因此再次执行创建工作,对于输入字段的空值,你应该添加到每个输入字段值表达式中以存储值。

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

正确的答案,如果你正在使用绑定不使用请求范围,使用会话范围,它将与你一起工作,并获得数据不空时检索值

相关内容

  • 没有找到相关文章

最新更新