先把出現的異常情況貼出來吧:
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" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://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 class="div1">
<div class="div2"><h2>輸入用戶信息</h2></div>
<form action="DataBaseOperation.jsp" method="post" name="form">
<table align="center">
<tr >
<td class="div3">用戶名</td>
<td><input type="text" name="username" /></td>
</tr>
<tr >
<td class="div3">密碼</td>
<td><input type="password" name="password" /></td>
</tr>
<tr>
<td class="div3">年齡</td>
<td><input type="text" name="age" /></td>
</tr>
<tr>
<td class="div3">出生地</td>
<td><input type="text" name="address" /></td>
</tr>
<tr>
<td class="div3">民族</td>
<td><input type="text" name="nation" /></td>
</tr>
<tr>
<td class="div3">性別</td>
<td><input type="radio" name="sex" value="男" />男
<input type="radio" name="sex" value="女" />女</td>
</tr>
<tr>
<td class="div3">頭像</td>
<td align="left">
<select name="photo" id="photo" οnchange="change();">
<option value="images/01.gif" selected="selected">頭像一</option>
<option value="images/02.gif">頭像二</option>
</select>
<img id="photoImg" 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" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://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數據庫中,圖像的存放時什麼類型,或者怎麼處理。
,