Как сделать область ввода чисел изначально пустой вместо 0 или 0.00?

У меня есть место ввода, которое должно получить число. Я хочу, чтобы он отображался как пустой. Однако, когда я запускаю свою программу, я получаю 0 или 0,00 по умолчанию. Как я могу сделать его пустым?


person Gary Leather    schedule 15.01.2013    source источник
comment
Должно работать, если вы сопоставляете тип объекта (Integer, Long, Double) и делаете его нулевым по умолчанию.   -  person Gimby    schedule 15.01.2013
comment
Они сопоставлены и нулевые, но все еще продолжаются.   -  person Gary Leather    schedule 15.01.2013


Ответы (4)


Это произойдет, если вы привяжете значение к примитиву, а не к его представлению-оболочке. Примитив int по умолчанию всегда имеет значение 0, а примитив double всегда имеет значение по умолчанию 0.0. Вместо этого вы хотите использовать Integer или Double (или BigDecimal).

E.g.:

public class Bean {

    private Integer number;

    // ...
}

Затем есть еще две вещи, которые следует учитывать при обработке отправки формы. Во-первых, вам нужно указать JSF интерпретировать представленные значения пустой строки как null, иначе EL все равно принудит пустую строку к 0 или 0.0. Это можно сделать с помощью следующего параметра контекста в web.xml:

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

Во-вторых, если вы используете Tomcat/JBoss или любой сервер, который использует синтаксический анализатор Apache EL под прикрытием, вам нужно указать ему не приводить null к 0 или 0.0 в случае типов Number с помощью следующего аргумента VM (это неинтуитивно работает с типами Number, как если бы они были примитивами):

-Dorg.apache.el.parser.COERCE_TO_ZERO=false

Смотрите также:

person BalusC    schedule 15.01.2013
comment
Привет @BalusC, в какой файл мне нужно добавить аргумент виртуальной машины и где он находится? - person Erick; 20.10.2018
comment
@Erick: Это нужно сделать в команде запуска java сервера. Это не обязательно в файле и зависит от того, как вы запускаете сервер. - person BalusC; 21.10.2018

Я не согласен с предыдущими ответами, но я думаю, что вы, возможно, ищете

<h:inputText id="number" binding="#{controller.inputBox}" value="#{controller.number}" >
     <f:event type="preRenderComponent" listener="#{controller.preRenderInput}" />
</h:inputText>

и внутри контроллера

private double number; // getters and setters
private UIInput inputBox; // getters and setters
public void preRenderInput() {
        // if it is the first request
        if(!FacesContext.getCurrentInstance().isPostback()) {
            inputBox.setValue("");
        }
}

JSF 2.0+

person MAPF    schedule 27.11.2016

Вы можете использовать inputNumber в расширении Primefaces вместо inputText. Нравится

<pe:inputNumber  />
person DuongLV    schedule 15.02.2017

В вашем коде XHTML предположим, что у вас есть поле ввода как:

<h:inputText id="newname" value="#{youAction.newName}"
        style="width:130px" styleClass="form">
</h:inputText>

В своем классе действий управляемого компонента сопоставьте это поле как:

@ManagedBean(name="yourAction")
public class YourAction {

   private String newName;
   ...

   // Add Getter & Setter Methods
   ... 
}

Поступая таким образом, вы не получите 0 или 0,00 в качестве значения по умолчанию в полях ввода.

person Venkat    schedule 15.01.2013
comment
мой вопрос о числовых значениях, у меня нет проблем со строками. Но у меня все еще есть проблема с целыми и двойными числами. - person Gary Leather; 15.01.2013
comment
@GaryLeather - Если вы хотите использовать значение, почему бы вам не преобразовать значение в нужный вам тип. - person Venkat; 15.01.2013