首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java Web开发 >

老师说:con值为空,让小弟我再思考一上。但是,小弟我就是坚持小弟我的观点

2013-03-01 
老师说:con值为空,让我再思考一下。但是,我就是坚持我的观点本帖最后由 bonlog 于 2013-01-29 22:56:06 编

老师说: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这个类 
[解决办法]
引用:
引用:构造方法不会自动运行 系统只会检测有没有构成方法 没有就默认创建一个无参的 有的话就不创建了 你想运行构造方法 还是要new这个类

请问,你可以举例吗?谢谢

在doget方法里加上 new AddMessageServlet ();//调用构造方法 

热点排行