【发布时间】:2011-10-07 04:59:46
【问题描述】:
这是我的代码
import java.io.*;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.sql.*;
@WebServlet(name = "Scores", urlPatterns = {"/Scores"})
public class Scores extends HttpServlet{
private Connection conn;
private PreparedStatement psmt;
private ResultSet rs;
private String tableName;
private String ssnNum;
@Override
public void init() throws ServletException {
connect();
}
@Override
public void doGet(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
try{
tableName = request.getParameter("tableName");
ssnNum = request.getParameter("ssnNum");
rs = psmt.executeQuery();
out.print("\t\t\t");
out.print(rs.getString("Student") + " " + rs.getString("Score"));
out.print("<br>");
out.close();
}catch(Exception e){
System.err.println(e);
}
}
public void connect(){
try{
//Loads Driver
Class.forName("com.mysql.jdbc.Driver");
//Establishes a connection to DataBase Javabook
conn = DriverManager.getConnection(
"jdbc:mysql://localhost/javabook", "root", "password");
psmt = conn.prepareStatement("select Student, Score from " + tableName +
" where ssn = " + ssnNum);
} catch (Exception e){
System.err.println(e);
}//End Try/Catch Block
}
}
这里是html
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>TravisMeyersP3</title>
</head>
<body>
Find Your Current Score
<form method = "get" action = "Scores">
<p>Social Security Number <font color = "#FF0000">*</font>
<input type = "text" name = "ssnNum">
</p>
<p>Course Id
<select size = "1" name = "tableName">
<option value = "Cpp">C++</option>
<option value = "AdvJava">Advanced Java</option>
</select>
</p>
<p><input type = "submit" name = "Submit" value = "Submit">
</p>
</body>
</html>
我在 netbeans 中使用 apache tomcat 7.0.21 和 java jdk 7。 servlet 应该访问我在 mysql 中创建的两个表之一并显示用户参数的值。我没有收到任何编译或运行时错误。由于某种原因,servlet 在用户提交表单后没有访问 mysql 并显示结果。
首先,我要感谢瑞恩斯图尔特、精英绅士和 CodeBuzz 抽出时间来帮助我。除了上述问题,我还遇到了 sql 语法问题。当我将变量 tableName 和 ssnNum 设置到我的新 PreparedStatement 中时 (PreparedStatement psmt = conn.prepareStatement("select Student, Score from ? where SSN = ?;");) 使用 psmt.setString(1, tableName) 等,出于某种原因,在准备好的语句中的字符串周围加上了单引号. MySQL 不喜欢这样,唯一显示错误的地方是在 tomcat 命令窗口中。解决上述问题后,一切都很好。再次感谢大家帮助我解决这个问题。
【问题讨论】:
-
在 servlet init 上打开连接并保持打开状态是个坏主意。
-
哦。你是对的。我会解决的。谢谢。
-
Servlet 不是线程安全的,所以不应该有任何状态。所以例如您的 tablename 字段可能会被另一个正在处理不同 HTTP 请求的线程覆盖,导致意外结果。