老师说:con值为空,让我再思考一下。但是,我就是坚持我的观点
本帖最后由 bonlog 于 2013-01-29 22:56:06 编辑 下代码,有错误,原因是con的值在构造函数中(其他没有错误),生成后,不能在 doGet中使用?为什么呢?哪里出现错误啊?谢谢了,我从晚上8点一直改到10点,
是什么原因,
package message;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class for Servlet: AddMessageServlet
*
*/
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
public class AddMessageServlet extends HttpServlet {
private Connection con;
public void doGet(HttpServletRequest request ,HttpServletResponse response)
throws IOException,ServletException{
response.setContentType("text/html;charset=gb2312");
request.setCharacterEncoding("gb2312");
String name = request.getParameter("name");
String title = request.getParameter("title");
String email=request.getParameter("email");
String content = request.getParameter("content");
if(name==null)
name = "";
if(title==null)
title = "";
if(content==null)
content = "";
if(email==null)
email="";
try
{
//此处有错误?请分析其产生的原因及,如何修改,注意要用构造函数
PreparedStatement stm=con.prepareStatement("insert into message values(?,?,?,?,?)");//此处的con值为空,我找到了,但是,要如何修改呢?及产生的原因???????????
stm.setString(1,title);
stm.setString(2,name);
stm.setDate(3,new java.sql.Date(new java.util.Date().getTime()));
if((email).length()==0)
stm.setString(5,null);
else stm.setString(5,email);
stm.setString(4,content);
try
{
stm.executeUpdate();
}catch(Exception e){}
//关闭数据库库连接
//con.close();
RequestDispatcher dispatcher =
request.getRequestDispatcher("/ViewMessageServlet");
dispatcher.forward(request, response);
}
catch(Exception e)
{
e.printStackTrace();
}
}
public void doPost(HttpServletRequest request,HttpServletResponse response)
throws IOException ,ServletException{
doGet(request,response);
}
public AddMessageServlet()
{
String url = "jdbc:mysql://localhost/liuyan";
String userName = "root";
String password = "root";
String sql = null;
con = null;
Statement stmt = null;
try {
Class.forName("com.mysql.jdbc.Driver");
} catch(ClassNotFoundException e) {
System.out.println("加载驱动器类时出现异常");
}
try {
con = DriverManager.getConnection(url, userName, password);
} catch(SQLException e) {
System.out.println("出现SQLException异常");
}
}
}
[解决办法]
楼主,servlet 是单实例的,也就是说,所有的对同一个 servlet 的访问,服务端只会产生一个 servlet 对象,这样,每个 servlet 类最多只会调用一次构造方法,如果你在构造器里创建connection,则这个servlet 都会共享这个connection。而在WEB环境下,是多线程运行的,这样你的一个连接被多个线程共享。如果你在某个地方关闭连接,则其它的线程都不可以使用连接了。
[解决办法]
把你的构造函数贴出来
[解决办法]
构造函数最后一个catch外加上一个 this.con=con;
在使用con的方法最上面 new一下这个类运行构造方法
[解决办法]
构造方法不会自动运行 系统只会检测有没有构成方法 没有就默认创建一个无参的 有的话就不创建了 你想运行构造方法 还是要new这个类
[解决办法]
在doget方法里加上 new AddMessageServlet ();//调用构造方法