用户在前端界面的进行添加用户,表单中所有的字段都填了1,但是点击确认后控制台输出以下错误:
java.lang.NumberFormatException: For input string: ""
初步判断是表单中的数据和对象中的不一致,但是我检查后发现没有不一致,下面是前端表单的源码:
<div class="formbody">
<div class="formtitle"><span>基本信息span>div>
<form action="/userServlet" method="post">
<ul class="forminfo">
<input type="hidden" name="type" value="save">
<c:if test="${not empty user}">c:if>
<input type="hidden" name="id" value="${user.id}">
<li>
<label>账号label>
<input name="username" type="text" class="dfinput" value = "${user.username}" onkeyup="this.value=this.value.replace(/[\u4e00-\u9fa5]+/g,'')" />
<i>账号必须是英文或者数字,禁止输入中文字符,输入中文字符会被移除i>
li>
<li>
<label>密码label>
<input name="password" type="text" class="dfinput" value = "${user.password}"/>
<i>nulli>
li>
<li>
<label>手机label>
<input name="phoneNum" type="text" class="dfinput" value = "${user.phoneNum}" onkeyup="this.value=this.value.replace(/\D/g,'')" maxlength="15"/>
<i>不能超过15个字符i>
li>
<li>
<label>邮箱label>
<input name="email" type="text" class="dfinput" value = "${user.email}"/>
<i>nulli>
li>
<li>
<label> label>
<input name="" type="submit" class="btn" value="确认保存"/>
li>
ul>
form>
实体类中的:
```java
public class User {
private Integer id;//用户id
private String username;//定义用户账号
private String password;// 用户密码
private String phoneNum;// 用户手机
private String email;// 用户邮箱
private Integer isDelet;//用户状态是否删除 del=0 undel=1
private String salt;//加密盐值(测试)
private String userident;//用户属性,管理员和一般查看用户。
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", phoneNum='" + phoneNum + '\'' +
", email='" + email + '\'' +
", isDelet=" + isDelet +
", salt='" + salt + '\'' +
", userident='" + userident + '\'' +
'}';
}
原先的想法是使用反射器获取所有字段到类中,报错位置在下边的代码中已经标注
```java
private T getRequestParameterForReflect(HttpServletRequest req, Class cls ) throws Exception {
T t = cls.newInstance();
Map[]> parameterMap = req.getParameterMap();
Field[] declaredFields = cls.getDeclaredFields();
if(declaredFields != null && declaredFields.length > 0){
for (Field declaredField : declaredFields) {
String[] values = parameterMap.get(declaredField.getName());
if(values == null || values.length == 0){
System.out.println(values + "Extar");
continue;
}
if(declaredField.getType() == String[].class){
//判断是否是数组
declaredField.setAccessible(true);//放开访问权限
try {
declaredField.set(t, values);
}catch (IllegalAccessException e){
e.printStackTrace();
}
declaredField.setAccessible(false);
continue;
}
//对id进行数值转换,转换为String
//报错位置
if(declaredField.getType() == Integer.class){
try {
declaredField.set(t, Integer.parseInt(values[0]));//报错位置
}catch (IllegalAccessException e){
e.printStackTrace();
}
declaredField.setAccessible(false);
continue;
}
//报错位置
//普通数据
declaredField.setAccessible(true);//放开访问权限
try {
declaredField.set(t, values[0]);
}catch (IllegalAccessException e){
e.printStackTrace();
}
declaredField.setAccessible(false);
continue;
}
}
return t;
}
如果不进行类型转换那么id就没法转换成string,也试过用values[0].toString,但是没有效果。
我是跟着网上的教程做的,两天了还没解决问题。第一次搞这个,也找过很多方法都无法解决,或许是有些地方有问题我看不出来
不是数值就会转换出错
解决了,靠。。。原来是前端的if逻辑写错导致id没有传出来。。。。。