Java 数据库servlet中的连接出错
我正在编写一个数据库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
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注入攻击serialVersionUid
。您真的需要序列化您的servlet吗(我想不需要)你能告诉我们错误是什么吗?这段代码输出了什么?您希望它是什么?如果您将SerialVersionID放在避免警告的位置,那么将它放在@SuppressWarnings(“serial”)的前面,放在您的类定义的前面实际上他没有重用doPost()中的连接,他根本没有连接,