У меня есть место ввода, которое должно получить число. Я хочу, чтобы он отображался как пустой. Однако, когда я запускаю свою программу, я получаю 0 или 0,00 по умолчанию. Как я могу сделать его пустым?
Как сделать область ввода чисел изначально пустой вместо 0 или 0.00?
Ответы (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
Смотрите также:
- Безумие пустой строки
- h: inputText, который привязан to Integer отправляет значение 0 вместо null
- h:inputText, который привязан к String свойство отправляет пустую строку вместо null
- javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL делает больше не работает с Java EE 7/EL 3.0
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+
Вы можете использовать inputNumber в расширении Primefaces вместо inputText. Нравится
<pe:inputNumber />
В вашем коде 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 в качестве значения по умолчанию в полях ввода.