1

我创建了一个登录表单,其中包含每个字段的验证。当我单击提交按钮时,将调用函数 validation() 来验证所有字段,并在成功验证后重定向到另一个 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>

插入.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>
4

4 回答 4

1

您正在重定向浏览器以执行GETon insert.jsp,但您没有向该新 URL 提供请求参数。因此,您的 JSP 获取mobile请求参数,即null,然后尝试将其解析为整数,从而产生NumberFormatException.

您可以做的是将请求参数附加到 URL,如下所示:

window.location = "insert.jsp?mobile=" + document.frm.mobile.value + "&username=" + document.frm.username.value;

但最好在POST请求中提交这些值,而不是在GET. 我认为您可以通过向标签添加action="insert.jsp"属性、将属性更改为并删除formonClickonSubmit

 else {
    window.location = "insert.jsp";
 }

因为这将允许浏览器恢复其正常的表单提交。return false;如果您在关注空字段后将其与语句结合起来,您将阻止浏览器提交表单。

于 2013-03-28T10:32:23.753 回答
1

那么,如果您的手机号码为空,会发生什么?

   int mobile=Integer.parseInt(request.getParameter("mobile"));

您要求Integer.parseInt()解析一个空字符串或空字符串,这导致了您的问题。

文档

抛出: NumberFormatException - 如果字符串不包含可解析的整数。

您需要检查是否mobile已填充并且/或者在未填充时处理该场景。

顺便说一句,我不会使用 anInteger来存储手机号码。位数可能会导致溢出和/或您可能想要维护结构(例如国家代码和数字)等。

于 2013-03-28T10:31:05.450 回答
0

首先,您的代码非常危险。您应该在服务器端检查 null 或空!使用 PreparedStatement 而不是 Statement。

其次,代码window.location = "insert.jsp";不会像您期望的那样工作。使用 action="insert.jsp" 将数据发送到该页面。然后,在你的 js 函数上,如果它不通过条件,则返回 false,否则,返回 true;

使用 onSubmit="return validate()" 而不是 onClick 事件。

于 2013-03-28T10:35:05.510 回答
0

如果您正在使用parseInt(),则应该在某处捕获异常:

int mobile;
try {
  mobile = Integer.parseInt(request.getParameter("mobile"));
} catch (NumberFormatException e) {
  // do something
}

在您的情况下,request.getParameter("mobile")可能返回 null。

编辑:正如其他已经指出的那样 - 将电话号码存储在整数中可能不是一个好主意。试试Long吧。

于 2013-03-28T10:30:26.900 回答