我正在尝试访问netbeans中的数据库,这是我第一次这样做。当我到达finally
语句时,我遇到了问题。 Connection
和PrintWriter
似乎没有注册,我不确定我做错了什么。问题在于使用con
中的变量try/catch
,然后使用变量out
。
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
@WebServlet(name = "DBServlet1", urlPatterns = {"/db1"})
public class DBServlet1 extends HttpServlet {
/**
* Processes requests for both HTTP <code>GET</code> and <code>POST</code>
* methods.
*
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
//Connection con = null;
//PrintWriter out = response.getWriter();
try (PrintWriter out = response.getWriter()) {
Connection con = null;
// Load the Driver class file
Class.forName("org.apache.derby.jdbc.ClientDriver");
// Make a connection to the ODBC datasource Movie Catalog
// In this example we are opening a connection to the
// database with every request.
con = DriverManager.getConnection("jdbc:derby://localhost:1527/movies","user1", "password");
if ( con != null ) {
out.println("<html>\n<body>\n<table border=\"1\" width=\"100%\">");
// Create the statement
Statement statement = con.createStatement();
ResultSet rs = statement.executeQuery("SELECT * FROM USER1.TMovie");
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();
out.println("<tr>");
for(int i=1; i<=columnCount; i++) {
out.println("<td><h3>" +rsmd.getColumnName(i) + "</td>");
}
out.println("</tr>");
while ( rs.next() ) {
out.println("<tr>");
// get the id, which is an int
out.println("<td>" + rs.getInt("id") + "</td>");
// get the name, which is a String
out.println("<td>" + rs.getString("title") + "</td>");
// get the rating, which is a String
out.println("<td>" + rs.getString("rating") + "</td>");
// get the price, which is a Float
out.println("<td>" + rs.getFloat("price") + "</td>");
// get the Quantity, which is a Integer
out.println("<td>" + rs.getInt("quantity") + "</td>");
// get the Category, which is a Integer
out.println("<td>" + rs.getString("category") + "</td>");
out.println("</tr>");
}// end while
// Close the ResultSet
rs.close();
out.println("</table>");
}// end if
else {
out.println("Data Not Found");
}
}catch (Exception e) {
System.err.println(e.getMessage());
}// end try-catch
finally {
try{
if ( con != null ) {
// Close the connection no matter what
con.close();
}// end if
}
catch (SQLException sqle) {
System.err.println(sqle.getMessage());
}// end try-catch
}// end finally
out.close();
答案 0 :(得分:2)
Connection和PrintWriter似乎没有注册,我不确定我做错了什么。
他们都在 try
块中声明。因此,就像任何其他块范围的变量一样,它们在该块之外是不可访问的。如果您需要在catch
或finally
中访问它们,则需要在try
之外声明它们。
旁注:如果您对所有自动关闭项(而不仅仅是PrintWriter
)使用了try-with-resources语句,则代码会更简单,例如:与连接和声明;如果你正确使用它(你没有关闭你在try-with-resources中打开的东西,它确实如此); tutorial
以下是一个示例,请注意***
评论:
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
// Load the Driver class file
try {
Class.forName("org.apache.derby.jdbc.ClientDriver");
} catch (Exception e) {
// *** Ideally, do something more useful with the exception or *don't* catch it
System.err.println(e.getMessage());
return;
}
try (
// *** Note all auto-closeables are created here
PrintWriter out = response.getWriter();
// Make a connection to the ODBC datasource Movie Catalog
// In this example we are opening a connection to the
// database with every request.
Connection con = DriverManager.getConnection("jdbc:derby://localhost:1527/movies","user1", "password");
// Create the statement
Statement statement = con.createStatement();
ResultSet rs = statement.executeQuery("SELECT * FROM USER1.TMovie");
) {
out.println("<html>\n<body>\n<table border=\"1\" width=\"100%\">");
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();
out.println("<tr>");
for(int i=1; i<=columnCount; i++) {
out.println("<td><h3>" +rsmd.getColumnName(i) + "</td>");
}
out.println("</tr>");
while ( rs.next() ) {
out.println("<tr>");
// get the id, which is an int
out.println("<td>" + rs.getInt("id") + "</td>");
// get the name, which is a String
out.println("<td>" + rs.getString("title") + "</td>");
// get the rating, which is a String
out.println("<td>" + rs.getString("rating") + "</td>");
// get the price, which is a Float
out.println("<td>" + rs.getFloat("price") + "</td>");
// get the Quantity, which is a Integer
out.println("<td>" + rs.getInt("quantity") + "</td>");
// get the Category, which is a Integer
out.println("<td>" + rs.getString("category") + "</td>");
out.println("</tr>");
}// end while
// *** Don't close auto-closeables like the result set
out.println("</table>");
/* *** This else was connected to an if (con != null), so the message doesn't really make sense
else {
out.println("Data Not Found");
}
*/
} catch (Exception e) {
// *** Ideally, do something more useful here or don't catch the exception
System.err.println(e.getMessage());
}
// *** No `finally` at all
}
我没有完成完整的代码审核或其他任何事情,我刚刚查看了资源的使用情况,并指出了与正确处理资源相关的更改。
答案 1 :(得分:1)
变量con和out的范围不正确。你需要在try / catch / finally块之前声明它们。
答案 2 :(得分:0)
在try-with-resource块之前声明变量: -
Connection con = null;
PrintWriter out =null,
然后像这样编写try-with-resource块: -
try ( out = response.getWriter()) {
//here is your code