JSP頁麵中出現的一個異常:org.apache.jasper.JasperException: java.lang.NullPointerException
先把出現的異常情況貼出來吧:
type Exception report
messagejava.lang.NullPointerException
descriptionThe server encountered an internal error that prevented it from fulfilling this request.
exception
org.apache.jasper.JasperException: java.lang.NullPointerException org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:177) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:369) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:403) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:347) javax.servlet.http.HttpServlet.service(HttpServlet.java:728) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:91)
root cause
java.lang.NullPointerException org.apache.jsp.shiyan4.DataBaseOperation_jsp.<init>(DataBaseOperation_jsp.java:31) sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) java.lang.reflect.Constructor.newInstance(Unknown Source) java.lang.Class.newInstance(Unknown Source) org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:172) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:369) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:403) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:347) javax.servlet.http.HttpServlet.service(HttpServlet.java:728) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:91)
noteThe full stack trace of the root cause is available in the Apache Tomcat/8.0.0-RC1 logs.
為什麼會出現這種錯誤呢?一遍又一遍的檢查自己的代碼,發現需要一個javax.servlet.http.HttpServletRequest request;的聲明,request的請求不能獲取值。加上之後,得到這上麵這樣的異常:NullPointerException.
在幾小時的掙紮中,想放棄了。。。但是,發現一個很隱秘的問題,這個潛伏在代碼中的隱患,這是不容易查看到的。那就是將request獲取值設置成全局變量。先看代碼:
<body> <%! String DBDRIVER = "sun.jdbc.odbc.JdbcOdbcDriver" ; String DBURL = "jdbc:odbc:user" ; Connection conn = null ; //Statement stmt = null ; PreparedStatement stmt; String sql = null ; //ResultSet rs = null ; javax.servlet.http.HttpServletRequest request; //request.setCharacterEncoding("gb2312"); String username=request.getParameter("username"); //byte b[]=username.getBytes("ISO-8859-1"); //username=new String(b); String password=request.getParameter("password"); String address=request.getParameter("address"); String nation=request.getParameter("nation"); String sex=request.getParameter("sex"); //byte bb[]=sex.getBytes("ISO-8859-1"); //sex=new String(bb); String photo=request.getParameter("photo"); String temp=request.getParameter("age"); %>
隨後,修改後嚐試,發現問題解決了。
於是得出結論:在JSP中,獲取表單提交的值時,不能將獲取語句放在全局變量裏麵,即不能放在<%! %>之間。(注意感歎號!),而是放在<% %>中。
為了同大家交流,遂貼上所有源碼,望各位指點:
//regedit.jsp
<%@ page contentType="text/html; charset=gb2312" language="java" import="java.util.*" errorPage="" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="https://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>用戶注冊</title> <script language="JavaScript"> function change() { var photo = document.getElementById("photo"); var photoImg = document.getElementById("photoImg"); photoImg.src = photo.value; } </script> </head> <link rel="stylesheet" href="style.css" type="text/css" /> <body> <div > <div ><h2>輸入用戶信息</h2></div> <form action="DataBaseOperation.jsp" method="post" name="form"> <table align="center"> <tr > <td >用戶名</td> <td><input type="text" name="username" /></td> </tr> <tr > <td >密碼</td> <td><input type="password" name="password" /></td> </tr> <tr> <td >年齡</td> <td><input type="text" name="age" /></td> </tr> <tr> <td >出生地</td> <td><input type="text" name="address" /></td> </tr> <tr> <td >民族</td> <td><input type="text" name="nation" /></td> </tr> <tr> <td >性別</td> <td><input type="radio" name="sex" value="男" />男 <input type="radio" name="sex" value="女" />女</td> </tr> <tr> <td >頭像</td> <td align="left"> <select name="photo" onchange="change();"> <option value="images/01.gif" selected="selected">頭像一</option> <option value="images/02.gif">頭像二</option> </select> <img src="images/01.gif"> </td> </tr> <tr> <td></td> <td align="left"><input type="submit" name="submit" value="注冊" /> <input type="reset" name="reset" value="重置" /> </td> </tr> </table> </form> </div> </body> </html>
//style.css
@charset "utf-8"; /* CSS Document */ body { border:0px; margin-top:0px; margin-left:0px; background:url(images/bg4.jpg); } table { padding-top:5px; left:340px; padding:20px 0px 3px 20px; } .div1 { background:url(images/bg3.jpg); width:900px; height:760px; text-align:center; margin-top:0px; margin-left:225px; } .div2 { margin-top:0px; } .div1 table tr { /*line-height:30px;*/ height:30px;} .div3 { text-align:right; }
//DataBaseOperation.jsp
<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %> <%@page import="java.util.*"%> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="https://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>注冊信息</title> </head> <body> <%! String DBDRIVER = "sun.jdbc.odbc.JdbcOdbcDriver" ; String DBURL = "jdbc:odbc:user1" ; Connection conn = null ; //Statement stmt = null ; PreparedStatement stmt; String sql = null ; //ResultSet rs = null ; %> <% //javax.servlet.http.HttpServletRequest request; request.setCharacterEncoding("gb2312"); String username=request.getParameter("username"); //byte b[]=username.getBytes("ISO-8859-1"); //username=new String(b); String password=request.getParameter("password"); String address=request.getParameter("address"); String nation=request.getParameter("nation"); String sex=request.getParameter("sex"); //byte bb[]=sex.getBytes("ISO-8859-1"); //sex=new String(bb); //String photo=request.getParameter("photo"); String temp=request.getParameter("age"); if(temp==null) { temp=""; } Integer age=Integer.parseInt(temp); try { Class.forName(DBDRIVER) ; } catch(Exception e) { } try { conn = DriverManager.getConnection(DBURL) ; } catch(Exception e) { } try { sql="Insert into user(name,password,age,address,nation,sex) values(?,?,?,?,?,?)"; stmt=conn.prepareStatement(sql); stmt.setString(1,username); stmt.setString(2,password); stmt.setInt(3,age); stmt.setString(4,address); stmt.setString(5,nation); stmt.setString(6,sex); //stmt.setString(7,photo); stmt.executeUpdate(); //stmt = conn.createStatement() ; // sql="Insert into user(name,password,age,address,nation,sex,images) values('"+username+"','"+password+"','"+sex+"')"; //stmt.executeUpdate(sql); } catch(Exception e) { } try { stmt.close() ; conn.close() ; out.println("注冊成功!"); %> 請記住您的注冊信息:<br /> 用戶名:<%=username%><br /> 密碼:<%=password%> <br /> <% } catch(Exception e) { out.println("數據庫關閉失敗!!!") ; } %> </body> </html>
//數據庫
(這個我上傳到百度雲後,給鏈接。)
功能不太完善,當時我創建的數據庫中頭像的類型是文本(Varchar)的,表單獲取的頭像的值是頭像的src,但是不知道為什麼,存放不進去。於是,上麵SQL語句中沒有插入頭像。希望大俠指點一下,在mysql數據庫中,圖像的存放時什麼類型,或者怎麼處理。
,
最後更新:2017-04-03 14:54:08