Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在JSP中捕获和抛出错误_Java_Jsp_Servlets_Error Handling - Fatal编程技术网

Java 如何在JSP中捕获和抛出错误

Java 如何在JSP中捕获和抛出错误,java,jsp,servlets,error-handling,Java,Jsp,Servlets,Error Handling,我昨天也问了一个类似的问题。在这个问题上,有人建议我有一个全局过滤器(我已经有了) 因此,我有一个如下所示的JSP ....code...code ..tags...html...code Object [] res = iBatisDAO.getReport_pging(null,null,0,null); //call to DB ...more code... ...tags...end 在上面的代码中,我故意传递null,因为我希望它失败,当它失败时,我希望它转到我们的集中错误页面。我

我昨天也问了一个类似的问题。在这个问题上,有人建议我有一个全局过滤器(我已经有了)

因此,我有一个如下所示的JSP

....code...code
..tags...html...code
Object [] res = iBatisDAO.getReport_pging(null,null,0,null); //call to DB
...more code...
...tags...end
在上面的代码中,我故意传递null,因为我希望它失败,当它失败时,我希望它转到我们的集中错误页面。我的web.xml中有以下内容

  <error-page>
    <exception-type>com.ibatis.common.jdbc.exception.NestedSQLException</exception-type>
    <location>/errorpages/Error.jsp</location>
  </error-page> 
  <error-page>
    <exception-type>org.springframework.dao.DataAccessException</exception-type>
    <location>/errorpages/Error.jsp</location>
  </error-page>
  <error-page>
    <exception-type>javax.servlet.ServletException</exception-type>
    <location>/errorpages/Error.jsp</location>
  </error-page>
  <error-page>
    <exception-type>java.sql.SQLException</exception-type>
    <location>/errorpages/Error.jsp</location>
  </error-page>
  <error-page>
    <exception-type>org.springframework.jdbc.UncategorizedSQLException</exception-type>
    <location>/errorpages/Error.jsp</location>
  </error-page>

com.ibatis.common.jdbc.exception.NestedSQLException
/errorpages/Error.jsp
org.springframework.dao.DataAccessException
/errorpages/Error.jsp
javax.servlet.ServletException
/errorpages/Error.jsp
java.sql.SQLException
/errorpages/Error.jsp
org.springframework.jdbc.UncategorizedSQLException
/errorpages/Error.jsp
“控件”通过我使用的全局过滤器到达上面的JSP。它有
chain.doFilter()
包装在
try/catch
块中。当发生异常时,它会重定向到Error.jsp

当错误发生时,集中式错误页面不会捕获到它,筛选器也不会捕获到它。我认为筛选器没有捕获它,因为当筛选器“调用”jsp时……还没有出现错误

我知道在JSP中调用DB是不好的,但我正在处理很多遗留代码


在这种情况下,如何让错误转到集中式错误页面?此外,JSP没有导入错误页面。我不希望选择将错误页面导入所有JSP,我希望有一个更通用的解决方案

你采取了错误的方法。JSP文件中不能有任何逻辑处理代码(业务逻辑)。JSP是一种视图技术。使用servlet或一些操作/组件框架(Struts2/springmvc/JSF/etc)来处理业务逻辑

至于过滤器方法-这是一个很好的解决方案,但过滤器必须映射到
/*
(使用
):


例外过滤器
com.yourpackage.YourFilter
例外过滤器
/*

JSP中的异常无法很好地处理,因为更改响应为时已晚。JSP作为一种视图技术,它自己负责整个响应。它发送响应头和响应内容。当发送响应头时,则为无返回点。即使是一个过滤器也帮不上忙

每当异常在JSP中发生时,响应将突然中止,客户机将面对一个空白或半烘焙的页面,异常最多只能记录到服务器日志中。可能是沿着
IllegalStateException:response ready committed
尝试重定向/转发/显示错误页面,而这是不可能的,因为响应已经提交

简而言之:不要在JSP文件中编写原始Java代码。将它们放在Java类中,例如Servlet中的(in)direct。它在显示JSP之前被处理。这样就有足够的空间来更改响应的目的地


如果您坚持将JSP用于业务逻辑(我不建议这样做),那么另一种选择是在将任何模板文本(HTML等)发送到响应之前,将所有业务逻辑放在JSP文件的顶部。如果幸运的话,每当抛出异常时,servletcontainer将能够更改对错误页面的响应。

它将映射到该页面。但由于异常发生在JSP内部……过滤器将如何捕获该异常?…@drake JSP被转换为Servlet。因此,它发生在servlet中,在
chain.doFilter()之后处理。请给出从exception.exception消息生成的stacktrace为:
org.springframework.jdbc.UncategorizedSQLException:SqlMapClient操作;SQL[]的未分类SQLException;SQL状态[null];错误代码[17004]我正在web.xml中捕获它。我现在注意到,chain.doFilter的代码将进入catch块,但是,当我尝试执行
response.sendRedirect时,在该catch块中,它失败了,因为已经设置了响应。有办法吗?谢谢你的解释。我明白。但我正在处理100多个遗留JSP,现在无法将它们全部更改为删除业务逻辑。我注意到,
chain.doFilter
的代码将进入catch块,但是,如果我尝试执行
response.sendRedirect
,它将失败,因为已经设置了响应。有办法吗?没有,这是一个不归路的点。一个请求不能发送多个响应。这是胡说八道。我注意到,正如您所说,如果对DB的调用是JSP中的第一件事,而不是处于中间位置,那么它就会通过web.xml中的错误页面声明被捕获。然而,如果它在中间的某个地方,它就不会被他们抓住。这背后有什么原因吗?因为响应已经提交。客户端已检索到响应的(部分)。您无法重置它。这是一个无法返回的点。请注意,这不是JSP限制,而是HTTP限制。HTTP不允许“吸”回响应。
<filter>
   <filter-name>exceptionFilter</filter-name>
   <filter-class>com.yourpackage.YourFilter</filter-class>
</filter>
<filter-mapping>
   <filter-name>exceptionFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>