在jsp中输入对INTEGER的类型限制

问题描述

我有一个fill.jsp文件,其中包含以下代码

<div class="user-values">           <!-- for user's monthly gross pay -->
    <label for="grosspay">Monthly gross pay: </label>
    $<input id="grosspay" type="number" name="grosspay" 
            placeholder="0.0 or greater" step="0.01" value="${grosspay}">
    <span class="req">*</span>
</div>

<div class="user-values">           <!-- for error message -->
    <p class="msg">${message2}</p>
</div>
            
<div class="user-values">           <!-- for user's dependents -->
    <label for="noOfDependents">Number of dependents: </label>
    <input id="noOfDependents" type="number" name="dependents" 
           placeholder="0 or greater" step="1" value="${dependents}">
    <span class="req">*</span>
</div>

<div class="user-values">           <!-- for error message -->
    <p class="msg">${message3}</p>
</div>

“每月总薪水”接受双值。 “受抚养人数目”应仅接受整数。

运行此代码时:如果我为“从属人数”填入数字2或2,然后单击“计算”,则计算将由我的servlet成功处理。

但是,如果我填写双精度值2.1或2.2或3.1的数字,依此类推,则在表单中出现以下错误

JSP Form error

我的第一个问题: 输入双精度值2.0或3.0或4.0等的数字时,出现NumberFormatException

Type: class java.lang.NumberFormatException
Message: For input string: "2.0"

为什么我没有收到与上图类似的错误?或者,为什么我的处理在2.0中不成功?请提出一个解决方案,以便我可以避免1.0或2.0或3.0等值的异常?

我的第二个问题: 我的fill.jsp文件中两种输入类型的值部分在NetBeans IDE中向我发出以下警告:

"Bad value " " for attribute "value" on element "input": Expected a minus sign or a digit but saw " " instead."

如何避免这种警告?

请注意:即使出现警告,我的程序也可以正常运行。

解决方法

我想出了答案:

在我的servlet中,我有一部分代码:客户端的“ depends”输入框的值为2.0,在服务器端以String的形式接收。

String dependentNum = request.getParameter("dependents");
user.setDependents(Integer.parseInt(dependentNum));

由于某种原因,第二行代码为我抛出了NumberFormatException。因此,我将Servlet代码中的第二行更改为:

user.setDependents((int) Double.parseDouble(dependentNum));

我不知道为什么整数对象在接受字符串值2.0并将其转换为2时遇到问题。解决方法是将字符串值2.0转换为双精度并将其转换为整数,然后我避免完全获取NumberFormatException。

但是,我仍然无法理解,为什么在显示2.0、3.0等双精度值时,为什么无法显示与图像中相同的验证错误消息,如下:

Validation error

,

输入类型号允许使用2.0,因为从理论上讲它是整数,而2.1是双精度数。

2.0 -> 2

但是,在服务器端,它确实会引发错误,因为整数不能带有零尾或句点。

在这种情况下,您可能应该去除尾随零。

您可以使用子字符串将其剪切,然后将其转换回Integer。

例如:

double number = 2.0;
int newnumber = Integer.parseInt(String.valueOf(number).substring(0,1));

所以servlet应该看起来像这样:

String dependents = req.getParameter("dependents");
double dependentsd = Double.parseDouble(dependents);
int numofDependents = Integer.parseInt(String.valueOf(number).substring(0,1));

您可以通过以下测试案例进行验证:

String dependents = "2.0";
double dependentsd = Double.parseDouble(dependents);
int numofDependents = Integer.parseInt(String.valueOf(dependentsd).substring(0,1));
System.out.println(numofDependents);

或者您也可以将double转换为int,如下所示:

(int) Double.parseDouble(dependentNum)