我有基于JSP / Servlet的Web应用程序。数据库是MySQL。在Web应用程序中,insertForm.jsp
调用Servlet,它在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:复制条目''for ...
这完全没问题。不好的是我没有HTTP状态500因此我不知道如何获得此异常并在我的errorPage.jsp
上显示
Delete
Idea的另一种情况完全相同:用户单击删除按钮,jsp调用负责删除的servlet,使用delete方法调用类。但是如果用户单击“删除而没有选择对象”,则会出现异常:
java.lang.NumberFormatException:null
这也没关系。但现在我也有Throwable
例外或error-code 500
因此,快乐的用户会看到errorPage.jsp
对应的文字。
问题:
ins
方法传递到我的errorPage.jsp
?答案 0 :(得分:0)
我仍然不确定这是否是一个好方法,但我在throw
块中添加了catch
。现在代码是:
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
和{{1 }}
<exception-type>java.lang.Throwable</exception-type>
导致java.lang.IllegalArgumentException:类DBInsertRows捕获了SQLException - &gt; com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:服务器上的密钥'TankName_UNIQUE'的重复条目''。