温州网站建设方案书,宜昌市建设局网站,营销推广方法,小学网站模板免费下载有时我写了一篇有关Java异常处理的文章#xff0c;但是当涉及到Web应用程序时#xff0c;我们需要的不仅仅是Java中的异常处理。 Servlet异常 如果您注意到#xff0c;doGet#xff08;#xff09;和doPost#xff08;#xff09;方法将抛出ServletException和IOExcept… 有时我写了一篇有关Java异常处理的文章但是当涉及到Web应用程序时我们需要的不仅仅是Java中的异常处理。 Servlet异常 如果您注意到doGet和doPost方法将抛出ServletException和IOException 那么让我们看看从应用程序中抛出这些异常时会发生什么。 我将编写一个简单的Servlet它将抛出ServletException。 MyExceptionServlet.java package com.journaldev.servlet.exception;import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;WebServlet(/MyExceptionServlet)
public class MyExceptionServlet extends HttpServlet {private static final long serialVersionUID 1L;protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {throw new ServletException(GET method is not supported.);}} 现在当我们使用GET方法通过浏览器调用此servlet时将得到如下图所示的响应。 由于浏览器仅了解HTML因此当我们的应用程序引发异常时servlet容器将处理该异常并生成HTML响应。 此逻辑特定于Servlet容器我正在使用tomcat并获取此错误页面但是如果您将使用其他服务器如JBoss或Glassfish则可能会收到不同的错误HTML响应。 此响应的问题在于它对用户没有任何价值。 它还向用户显示我们的应用程序类和服务器详细信息这对用户没有意义并且从安全角度来看也不是一件好事。 Servlet错误 我确定当您尝试访问不存在的URL时您肯定已经看到404错误。 让我们看看我们的servlet容器如何响应404错误。 如果我们发送无效URL的请求则会得到响应HTML如下图所示。 同样它是服务器代表我们生成的通用HTML对用户几乎没有价值。 Servlet异常和错误处理 Servlet API支持可在部署描述符中配置的自定义Exception和Error Handler servlet这些servlet的全部目的是处理应用程序引发的Exception或Error并发送对用户有用HTML响应。 我们可以提供指向应用程序主页的链接或一些详细信息以使用户知道出了什么问题。 因此首先我们需要创建一个自定义的Exception and Error Handler servlet。 我们可以为应用程序提供多个异常和错误处理程序servlet但为简单起见我将创建一个servlet并将其用于异常和错误。 AppExceptionHandler.java package com.journaldev.servlet.exception;import java.io.IOException;
import java.io.PrintWriter;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;WebServlet(/AppExceptionHandler)
public class AppExceptionHandler extends HttpServlet {private static final long serialVersionUID 1L;protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {processError(request, response);}protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {processError(request, response);}private void processError(HttpServletRequest request,HttpServletResponse response) throws IOException {// Analyze the servlet exceptionThrowable throwable (Throwable) request.getAttribute(javax.servlet.error.exception);Integer statusCode (Integer) request.getAttribute(javax.servlet.error.status_code);String servletName (String) request.getAttribute(javax.servlet.error.servlet_name);if (servletName null) {servletName Unknown;}String requestUri (String) request.getAttribute(javax.servlet.error.request_uri);if (requestUri null) {requestUri Unknown;}// Set response content typeresponse.setContentType(text/html);PrintWriter out response.getWriter();out.write(htmlheadtitleException/Error Details/title/headbody);if(statusCode ! 500){out.write(h3Error Details/h3);out.write(strongStatus Code/strong:statusCodebr);out.write(strongRequested URI/strong:requestUri);}else{out.write(h3Exception Details/h3);out.write(ulliServlet Name:servletName/li);out.write(liException Name:throwable.getClass().getName()/li);out.write(liRequested URI:requestUri/li);out.write(liException Message:throwable.getMessage()/li);out.write(/ul);}out.write(brbr);out.write(a href\index.html\Home Page/a);out.write(/body/html);}
} 让我们看看如何在部署描述符中配置它然后我们将了解它的实现及其工作方式。 web.xml ?xml version1.0 encodingUTF-8?
web-app xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xmlnshttp://java.sun.com/xml/ns/javaee xsi:schemaLocationhttp://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd version3.0display-nameServletExceptionHandling/display-namewelcome-file-listwelcome-fileindex.html/welcome-file/welcome-file-listerror-pageerror-code404/error-codelocation/AppExceptionHandler/location/error-pageerror-pageexception-typejavax.servlet.ServletException/exception-typelocation/AppExceptionHandler/location/error-page
/web-app 如您所见使用error-page元素为应用程序指定异常处理程序servlet非常容易。 每个错误页面元素应具有错误代码或异常类型元素。 我们在location元素中定义异常处理程序servlet。 基于上面的配置如果应用程序抛出404错误或ServletException它将由AppExceptionHandler servlet处理。 当出现此类异常和错误情况时servlet容器将调用Exception Handler servlet的相应HTTP方法并传递请求和响应对象。 请注意我已经提供了doGet和doPost方法的实现以便它可以处理GET和POST请求并使用通用方法来处理它们。 在servlet容器调用servlet来处理异常之前它会在请求中设置一些属性以获取有关异常的有用信息其中一些是javax.servlet.error.exception javax.servlet.error.status_code javax.servlet。 error.servlet_name和javax.servlet.error.request_uri 。 作为例外状态代码始终为500与“内部服务器错误”相对应对于其他类型的错误我们将获得不同的错误代码例如404、403等。 使用状态代码我们的实现将不同类型HTML响应呈现给用户。 它还提供了到应用程序主页的超链接。 现在当我们点击抛出ServletException的servlet时我们将得到如下图所示的响应。 如果我们尝试访问一个无效的URL这将导致404响应我们将得到如下图所示的响应。 它看起来不是很好并且可以帮助用户轻松地了解发生了什么并为他们提供前往正确位置的方法。 它还避免将应用程序敏感信息发送给用户。 我们应该始终为我们的Web应用程序配备适当的异常处理程序。 如果要在单个异常处理程序中处理运行时异常和所有其他异常则可以将异常类型提供为Throwable。 error-pageexception-typejava.lang.Throwable/exception-typelocation/AppExceptionHandler/location
/error-page 如果有多个错误页面条目那么假设一个用于Throwable一个用于IOException并且应用程序抛出FileNotFoundException则它将由IOException的错误处理程序处理。 您还可以将JSP页面用作异常处理程序仅提供jsp文件的位置而不是servlet映射。 这就是Web应用程序中异常处理的全部希望您喜欢它。 下载ServletExceptionHandling项目 参考我们的JCG合作伙伴 Pankaj Kumar在Developer Recipes博客上的Servlet异常和错误处理示例教程 。 翻译自: https://www.javacodegeeks.com/2013/08/servlet-exception-and-error-handling-example-tutorial.html