我有一个基于JSP/Servlet的web应用程序。数据库是MySQL。在web应用程序中,有一个调用Servlet的insertForm.jsp
,它调用java类中的ins
方法。
imports ...
public class DBaddData extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
...
some code
...
//create an instanse of a class responsible for insert
DBInsertRows dbir = new DBInsertRows();
try {
//call the inssert method
dbir.ins(dbObj);
} catch (ClassNotFoundException ex) {
Logger.getLogger(DBaddData.class.getName()).log(Level.SEVERE, null, ex);
}
...
RequestDispatcher ...
}
}
使用ins
方法的类:
public class DBInsertRows {
public void ins(DBObjBaseStd dbObject) throws ClassNotFoundException
{
Connection con = null;
Statement stmt = null;
String query = "INSERT INTO bla-bla-bla ...";
try {
...
create con object
...
stmt = con.createStatement();
stmt.executeUpdate(query);
} catch (SQLException sqlEx) {
sqlEx.printStackTrace();
}
}
}
插入过程运行良好,但是!当我试图插入相同的对象(行),使ID已经存在于表中时,我得到了一个异常:
MySQL文本
。。。错误代码:1062。重复条目。。。
Apache Tomcat8文本
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:的条目"重复。。。
这完全没问题。不好的是,我没有HTTP状态500,因此我不知道如何获得此异常并在我的errorPage.jsp
上显示Delete
Idea的另一种情况完全相同:用户点击删除按钮,jsp调用负责删除的servlet,用delete方法调用类。但如果用户在没有选择对象的情况下点击删除,我会得到异常:
java.lang.NumberFormatException:空
这也很好。但现在我也有Throwable
异常或error-code 500
,因此快乐的用户看到errorPage.jsp
和相应的文本。问题:
- 为什么会有不同类型的错误
- 如何将错误文本从
ins
方法传递到我的errorPage.jsp
我仍然不确定这是否是一个好方法,但我在catch
块中添加了throw
。现在的代码是:
try {
Class.forName(...driver...);
con = DriverManager.getConnection(... connection info...);
stmt = con.createStatement();
stmt.executeUpdate(query);
} catch (SQLException sqlEx) {
throw new IllegalArgumentException("class DBInsertRows caught SQLException -> "+sqlEx);
}
现在,如果用户试图复制信息,或者,例如,变量比表中的字段长,他将得到errorPage.jsp
,因为sqlEx
现在是Throwable
和<exception-type>java.lang.Throwable</exception-type>
errorPage.jsp
中的结果
您导致java.lang.IollegalArgumentException:类DBInsertRows捕获SQLException->com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:服务器上键"TankName_UNIQUE"的条目"重复。