Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 数据库servlet中的连接出错_Java_Servlets_Jdbc - Fatal编程技术网

Java 数据库servlet中的连接出错

Java 数据库servlet中的连接出错,java,servlets,jdbc,Java,Servlets,Jdbc,我正在编写一个数据库servlet,除了我的连接中似乎有一个错误之外,一切似乎都很好 import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; i

我正在编写一个数据库servlet,除了我的连接中似乎有一个错误之外,一切似乎都很好

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class DBServlet3 extends HttpServlet
{
    private static final long serialVersionUID = 1L;

    @Override
    public void init() throws ServletException
    {
        super.init();
        try
        {
            String jdbcDriverClass= 
                getServletContext().getInitParameter( "jdbcDriverClass" );
            if (jdbcDriverClass == null)
                throw new ServletException( "Could not find jdbcDriverClass initialization parameter" );
            Class.forName( jdbcDriverClass );
        }
        catch (ClassNotFoundException e)
        {
            throw new ServletException( "Could not load JDBC driver class", e );
        }
    }

    @Override
    protected void doGet( HttpServletRequest request, HttpServletResponse response )
        throws ServletException, IOException
    {
        RequestDispatcher dispatcher=
            request.getRequestDispatcher( "/db.jsp" );

        ServletContext application= getServletContext();

        ArrayList<String> names= new ArrayList<String>();

        try
        {

            Connection connection= null;
            Statement statement= null;
            ResultSet results= null;

            try
            {
                String jdbcUrl= application.getInitParameter( "jdbcUrl" );
                String jdbcUser= application.getInitParameter( "jdbcUser" );
                String jdbcPassword= application.getInitParameter( "jdbcPassword" );

                connection=
                    DriverManager.getConnection( jdbcUrl, jdbcUser, jdbcPassword );

                statement= connection.createStatement();

                results= statement.executeQuery( "SELECT * FROM students" );

                while (results.next())
                {
                    String name= results.getString( "name" );
                    names.add( name );
                }
            }
            finally
            {
                if (results != null)
                    results.close();
                if (statement != null)
                    statement.close();
                if (connection != null)
                    connection.close();
            }
        }
        catch (SQLException e)
        {
            throw new ServletException( e );
        }

        request.setAttribute( "names", names );

        dispatcher.forward( request, response );
    }

    @Override
    protected void doPost( HttpServletRequest request, HttpServletResponse response )
        throws ServletException, IOException
    {
        String sql= "INSERT INTO students VALUES (" +
            request.getParameter( "id" ) + ", '" + request.getParameter( "name" ) + "')";

        sql= "INSERT INTO students VALUES (?, ?, ?, ?)";

        PreparedStatement statement= connection.prepareStatement( sql ); //error on this line

        statement.setString( 1, request.getParameter( "id" ) );
        statement.setString( 2, request.getParameter( "name" ) );
    }

}
import java.io.IOException;
导入java.sql.Connection;
导入java.sql.DriverManager;
导入java.sql.PreparedStatement;
导入java.sql.ResultSet;
导入java.sql.SQLException;
导入java.sql.Statement;
导入java.util.ArrayList;
导入javax.servlet.RequestDispatcher;
导入javax.servlet.ServletContext;
导入javax.servlet.ServletException;
导入javax.servlet.http.HttpServlet;
导入javax.servlet.http.HttpServletRequest;
导入javax.servlet.http.HttpServletResponse;
公共类DBServlet3扩展了HttpServlet
{
私有静态最终长serialVersionUID=1L;
@凌驾
public void init()引发ServletException
{
super.init();
尝试
{
字符串jdbcDriverClass=
getServletContext().getInitParameter(“jdbcDriverClass”);
if(jdbcDriverClass==null)
抛出新的ServletException(“找不到jdbcDriverClass初始化参数”);
类forName(jdbcDriverClass);
}
catch(classnotfounde异常)
{
抛出新的ServletException(“无法加载JDBC驱动程序类”,e);
}
}
@凌驾
受保护的void doGet(HttpServletRequest请求、HttpServletResponse响应)
抛出ServletException、IOException
{
请求调度程序=
getRequestDispatcher(“/db.jsp”);
ServletContext应用程序=getServletContext();
ArrayList name=新的ArrayList();
尝试
{
连接=空;
Statement=null;
ResultSet results=null;
尝试
{
字符串jdbcUrl=application.getInitParameter(“jdbcUrl”);
字符串jdbcUser=application.getInitParameter(“jdbcUser”);
字符串jdbcPassword=application.getInitParameter(“jdbcPassword”);
联系=
getConnection(jdbcUrl、jdbcUser、jdbcPassword);
statement=connection.createStatement();
结果=语句。执行(“从学生中选择*);
while(results.next())
{
字符串名称=results.getString(“名称”);
名称。添加(名称);
}
}
最后
{
如果(结果!=null)
结果:关闭();
if(语句!=null)
语句。close();
if(连接!=null)
connection.close();
}
}
捕获(SQLE异常)
{
抛出新的ServletException(e);
}
setAttribute(“名称”,名称);
转发(请求、响应);
}
@凌驾
受保护的void doPost(HttpServletRequest请求、HttpServletResponse响应)
抛出ServletException、IOException
{
String sql=“插入学生值(”+
request.getParameter(“id”)+,“+request.getParameter(“name”)+”)”;
sql=“插入学生值(?,?,?)”;
PreparedStatement语句=connection.prepareStatement(sql);//此行出错
语句.setString(1,request.getParameter(“id”);
语句.setString(2,request.getParameter(“name”);
}
}

我根本不清楚具体的问题是什么,我会编辑以添加stacktrace。然而,一些观察结果表明

  • 您正在
    doGet()
    方法中获取并关闭一个连接,但是
    doPost()方法中没有连接。因此,这将导致一个错误。您应该按照每个请求以一致的方式获得连接,并且可能(进一步)检查连接池框架,例如或
  • 请检查
    PreparedStatements
    ,而不是通过构建字符串来形成SQL。它们将减少易出错的代码,并保护您免受SQL注入攻击
  • 您的servlet中有一个
    serialVersionUid
    。您真的需要序列化您的servlet吗(我想不需要)
  • 将为你做很多繁重的工作。普通的JDBC(例如,它将处理结果集/语句/连接关闭序列)
    你能告诉我们错误是什么吗?这段代码输出了什么?您希望它是什么?如果您将SerialVersionID放在避免警告的位置,那么将它放在@SuppressWarnings(“serial”)的前面,放在您的类定义的前面实际上他没有重用doPost()中的连接,他根本没有连接,