JSP 是错误的地方。您需要创建一个独立的类来执行 JDBC 作业,并让每个方法在 SQL 失败时抛出异常。
这是一个“DAO”类的示例,它执行User
表上的所有 JDBC 内容:
public class UserDAO {
public User find(String username, String password) throws SQLException {
// ...
}
public void save(User user) throws SQLException {
// ...
}
public void delete(User user) throws SQLException {
// ...
}
}
然后,创建一个使用此类并处理异常的servlet 。这是一个示例LoginServlet
:
@WebServlet(urlPatterns={"/login"})
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
UserDAO userDAO = new UserDAO();
try {
User user = userDAO.find(username, password);
if (user != null) {
request.getSession().setAttribute("user", user); // Login.
response.sendRedirect("userhome");
} else {
request.setAttribute("message", "Unknown login, try again"); // Set error message.
request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response); // Redisplay form with error.
}
} catch (SQLException e) {
throw new ServletException("Fatal database failure", e); // <-- Here
}
}
}
让 JSP 提交给这个 servlet
<form action="login" method="post">
<input type="text" name="username" />
<input type="password" name="password" />
<input type="submit" />
${message}
</form>
您会看到,当 DAO 类抛出一个SQLException
时,servlet 将它重新抛出为ServletException
. 默认情况下,它会出现在容器默认的 HTTP 500 错误页面中。如有必要,您可以使用 JSP 在您自己的外观中自定义它,如下所示
<error-page>
<error-code>500</error-code>
<location>/error.jsp</location>
</error-page>
也可以看看: