servlet异常处理_Servlet异常和错误处理⽰例教程
servlet和tomcat的关系servlet 异常处理
有时候我写了⼀篇有关但是当涉及到Web应⽤程序时,我们需要的不仅仅是Java中的异常处理。
Servlet异常
如果您注意到,doGet()和doPost()⽅法将抛出ServletException和IOException ,那么让我们看看当从应⽤程序中抛出这些异常时会发⽣什么。 我将编写⼀个简单的Servlet,它将抛出ServletException。
MyExceptionServlet.java
package com.ption;
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.ption;
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 exception
Throwable throwable = (Throwable) request
.getAttribute("exception");
Integer statusCode = (Integer) request
.getAttribute("status_code");
String servletName = (String) request
.getAttribute("servlet_name");
if (servletName == null) {
servletName = "Unknown";
}
String requestUri = (String) request
.getAttribute("request_uri");
if (requestUri == null) {
requestUri = "Unknown";
}
// Set response content type
response.setContentType("text/html");
PrintWriter out = Writer();
out.write("<html><head><title>Exception/Error Details</title></head><body>");
if(statusCode != 500){
out.write("<h3>Error Details</h3>");
out.write("<strong>Status Code</strong>:"+statusCode+"<br>");
out.write("<strong>Requested URI</strong>:"+requestUri);
}else{
out.write("<h3>Exception Details</h3>");
out.write("<ul><li>Servlet Name:"+servletName+"</li>");
out.write("<li>Exception Name:"+Class().getName()+"</li>");
out.write("<li>Requested URI:"+requestUri+"</li>");
out.write("<li>Exception Message:"+Message()+"</li>");
out.write("</ul>");
}
out.write("<br><br>");
out.write("<a href=\"index.html\">Home Page</a>");
out.write("</body></html>");
}
}
让我们看看如何在部署描述符中配置它,然后我们将了解它的实现及其⼯作⽅式。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="/2001/XMLSchema-instance" xmlns="java.sun/xml/ns/javaee" xsi:schemaLocation="java.sun/xml/ns/j <display-name>ServletExceptionHandling</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
<error-page>
<error-code>404</error-code>
<location>/AppExceptionHandler</location>
</error-page>
<error-page>
<exception-type>javax.servlet.ServletException</exception-type>
<location>/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来处理异常之前,它会在请求中设置⼀些属性以获取有关异常的有⽤信息,其中⼀些属性是
exception , status_code , javax.servlet。 error.servlet_name和
request_uri 。
作为例外,状态码始终为500,与“内部服务器错误”相对应,对于其他类型的错误,我们将获得不同的错误代码,例如404、403等。
使⽤状态代码,我们的实现将不同类型HTML响应呈现给⽤户。 它还提供了到应⽤程序主页的超链接。
现在,当我们点击抛出ServletException的servlet时,我们将得到如下图所⽰的响应。
如果我们尝试访问⽆效的URL,这将导致404响应,我们将得到如下图所⽰的响应。
它看起来不是很好,并且可以帮助⽤户轻松地了解发⽣了什么并为他们提供前往正确位置的⽅法。 它还避免了将应⽤程序敏感信息发送给
⽤户。 我们应该始终为我们的Web应⽤程序配备异常处理程序。
如果要在单个异常处理程序中处理运⾏时异常和所有其他异常,则可以将异常类型提供为Throwable。
<error-page>
<exception-type>java.lang.Throwable</exception-type>
<location>/AppExceptionHandler</location>
</error-page>
如果有多个错误页⾯条⽬,例如对于Throwable⼀项,对于IOException⼀项,应⽤程序抛出FileNotFoundException,那么它将由
IOException的错误处理程序处理。
您还可以将JSP页⾯⽤作异常处理程序,仅提供jsp⽂件的位置⽽不是servlet映射。
这就是Web应⽤程序中异常处理的全部,希望您喜欢它。
参考: 博客上的 Pankaj Kumar提供的 。
servlet 异常处理
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论