2014-11-24 64 views
-1

爲什麼JSF不會將空值設置回列表(或數組)?如何使JSF將空值設置爲列表

一個例子:

import java.io.Serializable; 
import java.util.ArrayList; 
import java.util.List; 

import javax.annotation.PostConstruct; 

import org.springframework.context.annotation.Scope; 
import org.springframework.stereotype.Component; 


@Component("testMB") 
@Scope("view") 
public class TestMB implements Serializable { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 2463416120592801345L; 

    private List<Double> doublesList; 

    private List<Integer> integersList; 

    private Double d = 123.456; 

    private Integer i = 987; 

    @PostConstruct 
    public void init() { 
     setDoublesList(new ArrayList<Double>()); 
     setIntegersList(new ArrayList<Integer>()); 
     for (int i = 0; i < 7; i++) { 
      getDoublesList().add(i + 0.123); 
      getIntegersList().add(i); 
     } 
    } 

    public List<Double> getDoublesList() { 
     return doublesList; 
    } 

    public void setDoublesList(List<Double> doublesList) { 
     this.doublesList = doublesList; 
    } 

    public List<Integer> getIntegersList() { 
     return integersList; 
    } 

    public void setIntegersList(List<Integer> integersList) { 
     this.integersList = integersList; 
    } 

    public Double getD() { 
     return d; 
    } 

    public void setD(Double d) { 
     this.d = d; 
    } 

    public Integer getI() { 
     return i; 
    } 

    public void setI(Integer i) { 
     this.i = i; 
    } 

    public void doSomething() { 
     System.out.println(getDoublesList()); 
     System.out.println(getIntegersList()); 
     System.out.println(d); 
     System.out.println(i); 
    } 

} 

和視圖...

<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:p="http://primefaces.org/ui"> 

<f:view contentType="text/html"> 
    <h:head> 
     <f:facet name="first"> 
      <meta content='text/html; charset=UTF-8' http-equiv="Content-Type" /> 
     </f:facet> 
    </h:head> 

    <h:body> 
     <h:form id="form"> 

      <p:fieldset legend="Doubles List"> 
       <ui:repeat varStatus="vs1" value="#{testMB.doublesList}"> 
        #{v.index} 
        <p:inputText value="#{testMB.doublesList[vs1.index]}"> 
         <f:convertNumber /> 
        </p:inputText> 
        <br /> 
       </ui:repeat> 
      </p:fieldset> 

      <p:fieldset legend="Integers List"> 
       <ui:repeat varStatus="vs2" value="#{testMB.integersList}"> 
        <p:inputText value="#{testMB.integersList[vs2.index]}"> 
         <f:convertNumber integerOnly="true" /> 
        </p:inputText> 
        <br /> 
       </ui:repeat> 
      </p:fieldset> 


      Double: 
      <p:inputText value="#{testMB.d}"> 
       <f:convertNumber /> 
      </p:inputText> 
      <br /> 
      <br /> 

      Integer: 
      <p:inputText value="#{testMB.i}"> 
       <f:convertNumber integerOnly="true" /> 
      </p:inputText> 

      <br /><br /><br /><br /> 

      <p:commandButton actionListener="#{testMB.doSomething}" update="form" /> 
     </h:form> 
    </h:body> 

</f:view> 

</html> 

如果列表中的字段設置爲空字符串,則列表不會更新與空值,就像預期的那樣。它仍然與以前一樣。

在web.xml中我有:

<context-param> 
    <param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name> 
    <param-value>true</param-value> 
</context-param> 

<context-param> 
    <param-name>org.apache.el.parser.COERCE_TO_ZERO</param-name> 
    <param-value>false</param-value> 
</context-param> 

但如果我的testMB.dtestMB.i輸入文本值設置爲空字符串,那麼它的正確的託管bean設置爲null。

那麼,JSF,列表和空值有什麼問題?如何正確實施?

謝謝。

回答

0

試着這樣做:

<p:commandButton action="#{testMB.doSomething}" update="form" /> 

我想的ActionListener不會改變變量的值。

+0

謝謝,但它發生的確如此。如果我將任何值更改爲與空字符串不同的值,它會更新列表中的值。問題是隻有列表忽略更新的空值。 – chuckedw 2014-11-24 18:21:38

+0

啊好的。現在我明白你了! – Gaspar 2014-11-24 18:40:44

+0

我已經做到了。但我用p:datalist代替ui:重複並且對我很好:
Gaspar 2014-11-24 18:47:03

0

問題解決了。

JSF升級。從2.1.102.2.0

<dependency> 
     <groupId>org.glassfish</groupId> 
     <artifactId>javax.faces</artifactId> 
     <version>2.2.0</version>    
</dependency>