response.setContentType("text/html;charset=utf-8"); response.setCharacterEncoding("UTF-8"); PrintWriter out = null; try { out = response.getWriter(); } catch (IOException e) { e.printStackTrace(); } try { if(userId==""||userId==null){ ....//增加操作 }else { ....//修改操作 } } catch (DataIntegrityViolationException e) {// 唯一约束 e.printStackTrace(); out.print("<script>" + "alert('编码已存在,请重新输入。');" + "history.go(-1);" + "</script>"); return null; }
DataIntegrityViolationException代表"唯一性约束","不能插入空值","完整性约束失败"抛出的异常。
当然,上面代码虽然从思路上说是方便了,但代码还是相当的复杂,每个控制器几乎都要写很多重复的代码,就算通过继续能解决部分问题,那也得费不少的力气,而且用起来还是不太方便,后来想想,何不通过将抛出的异常进行统一的处理呢?于是就有了更简单的方法了:
在spring mvc的XXX-servlet.xml中加入以下处理异常的代码:
<bean id="exceptionResolver" class="com.adtech.e2qframe.core.define.BaseMappingExceptionResolver"> <property name="defaultErrorView" value="/error/error.jsp" /> <property name="exceptionMappings"> <props> <prop key="java.lang.Exception">/error/error.jsp</prop> <prop key="org.springframework.dao.DataIntegrityViolationException">/error/unique.jsp</prop> </props> </property> </bean>
unique.jsp代码:
<%@ page contentType="text/html;charset=UTF-8" isErrorPage="true" %> <script> alert('编码已存在,请重新输入。'); history.go(-1); </script>
在控制器中只需要把异常抛出来即可:
public ModelAndView save(HttpServletRequest request, HttpServletResponse response) throws DataIntegrityViolationException,Exception { ........... if(userId==""||userId==null){ ....//增加操作 }else { ....//修改操作 } ......
这种方式更简洁,没有多余的代码,非常不错了。
这种方式不用先单独建立查询语句判断数据是否存在,用起来确实简便不少。