0

我需要在加载 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 打印正确,但值始终为空。显然做错了。

请让我知道我何时何地创建字段以及如何捕获这些值 PS Am 使用 JSF 2.0、Jdeveloper、Glassfish 和/或 Weblogic Server

4

2 回答 2

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>
于 2014-02-06T00:18:02.967 回答
-1

这个问题是因为你绑定的bean的范围如果它是@RequestScoped这意味着每次你刷新或调用页面时你将再次调用post constructor(@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));
     }

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

于 2013-04-24T07:02:26.957 回答