我创建了一个登录表单,其中包含每个字段的验证。当我点击提交按钮时,将调用validate()来验证所有字段,并在成功验证后,它将重定向到另一个jsp页面,其中所有细节都将插入到Oracle数据库中。
但是我得到“org.apache.jasper.JasperException:java.lang.NumberFormatException:null”异常。另外“服务器遇到内部错误(),导致无法完成此请求”错误。我希望你能帮助我。
以下是代码:
<html>
<head>
<script type="text/javascript">
function validate()
{
if(document.frm.username.value=="")
{
alert("Please enter Username");
document.frm.username.focus();
}
else if(document.frm.mobile.value=="")
{
alert("Please Enter your contact number");
document.frm.mobile.focus();
}
else
{
window.location = "insert.jsp";
}
}
</script>
</head>
<body>
<form name="frm">
<table>
<tr><td>User Name:</td><td><input type="text" name="username"></td></tr>
<tr><td>Contact Number:</td><td><input type="text" name="mobile"></td></tr>
<tr><td><input type="submit" value="Submit" onclick="validate()"></td><td></td></tr>
</table>
</form>
</body>
insert.jsp:
<body>
<%@page import="java.sql.*"%>
<%@page import="java.util.*"%>
<%
Connection con=null;
int mobile=Integer.parseInt(request.getParameter("mobile"));
String username=request.getParameter("username");
try{
Class.forName("oracle.jdbc.driver.OracleDriver");
con=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe","system","manager");
Statement st=con.createStatement();
st.executeUpdate("insert into stud values("+mobile+",'"+username+"')");
out.println("Data is successfully inserted!");
}
catch(Exception e)
{
System.out.print(e);
}
%>
</body>
答案 0 :(得分:1)
那么如果你的手机号码是空白会怎么样?
int mobile=Integer.parseInt(request.getParameter("mobile"));
您要求Integer.parseInt()
解析空字符串或空字符串,这会导致您的问题。
来自the doc:
抛出: NumberFormatException - 如果字符串不包含可解析的整数。
您需要检查是否已填充mobile
并在未填写时处理该方案。
我不会使用Integer
存储手机号码,顺便说一句。位数可能导致溢出和/或您可能希望维护结构(例如国家代码和数字)等。
答案 1 :(得分:1)
您正在重定向浏览器以在GET
上执行insert.jsp
,但您并未向该新网址提供请求参数。因此,您的JSP获取mobile
请求参数,即null
,然后尝试将其解析为整数,从而产生NumberFormatException
。
您可以做的是将请求参数附加到URL,如下所示:
window.location = "insert.jsp?mobile=" + document.frm.mobile.value + "&username=" + document.frm.username.value;
但是,在POST
请求中提交这些值会更好,而不是GET
。我认为您可以通过向action="insert.jsp"
标记添加form
属性,将onClick
属性更改为onSubmit
并删除
else {
window.location = "insert.jsp";
}
因为这将允许浏览器恢复其正常的表单提交。如果您在关注空字段后将其与return false;
语句结合使用,则会阻止浏览器提交表单。
答案 2 :(得分:0)
如果您使用parseInt()
,则应该在某处捕获异常:
int mobile;
try {
mobile = Integer.parseInt(request.getParameter("mobile"));
} catch (NumberFormatException e) {
// do something
}
在您的情况下,request.getParameter("mobile")
可能返回null。
编辑,如前所述 - 将电话号码存储为整数可能不是一个好主意。请改为Long
。
答案 3 :(得分:0)
首先,您的代码非常危险。你应该检查服务器端的null或空!使用PreparedStatement而不是Statement。
其次,代码window.location = "insert.jsp";
将无法满足您的期望。
使用action =“insert.jsp”将数据发送到该页面。然后,在你的js函数中,如果它没有通过条件则返回false,否则返回true;
使用onSubmit =“return validate()”而不是onClick事件。