servlet 异常处理_Servlet异常和错误处理示例教程

servlet 异常处理

有时候我写了一篇有关Java异常处理的文章,但是当涉及到Web应用程序时,我们需要的不仅仅是Java中的异常处理。

Servlet异常

如果您注意到,doGet()和doPost()方法将抛出ServletExceptionIOException ,那么让我们看看当从应用程序中抛出这些异常时会发生什么。 我将编写一个简单的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时,将得到如下图所示的响应。

Servlet异常用户

由于浏览器仅了解HTML,因此当我们的应用程序引发异常时,servlet容器将处理该异常并生成HTML响应。 此逻辑特定于servlet容器,我正在使用tomcat并获取此错误页面,但是如果您将使用其他服务器(如JBoss或Glassfish),则可能会收到不同的错误HTML响应。

此响应的问题在于它对用户没有任何价值。 它还向用户显示了我们的应用程序类和服务器详细信息,这对用户没有意义,并且从安全角度来看也不是一件好事。

Servlet错误

我敢肯定,当您尝试访问不存在的URL时,您一定已经看到404错误。 让我们看看我们的servlet容器如何响应404错误。 如果我们发送无效URL的请求,则会得到响应HTML,如下图所示。

Servlet-404错误

同样,它是服务器代表我们生成的通用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("<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:"+throwable.getClass().getName()+"</li>");out.write("<li>Requested URI:"+requestUri+"</li>");out.write("<li>Exception Message:"+throwable.getMessage()+"</li>");out.write("</ul>");}out.write("<br><br>");out.write("<a href=\"index.html\">Home Page</a>");out.write("</body></html>");}
}

让我们看看如何在部署描述符中配置它,然后我们将了解它的实现及其工作方式。

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"><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来处理异常之前,它会在请求中设置一些属性以获取有关异常的有用信息,其中一些属性是javax.servlet.error.exceptionjavax.servlet.error.status_codejavax.servlet。 error.servlet_namejavax.servlet.error.request_uri

作为例外,状态码始终为500,与“内部服务器错误”相对应,对于其他类型的错误,我们将获得不同的错误代码,例如404、403等。

使用状态代码,我们的实现将不同类型HTML响应呈现给用户。 它还提供了到应用程序主页的超链接。

现在,当我们点击抛出ServletException的servlet时,我们将得到如下图所示的响应。

Servlet异常处理500代码

如果我们尝试访问无效的URL,这将导致404响应,我们将得到如下图所示的响应。

Servlet错误处理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应用程序中异常处理的全部,希望您喜欢它。

  • 下载ServletExceptionHandling项目

参考: 开发者食谱博客上的JCG合作伙伴 Pankaj Kumar提供的Servlet异常和错误处理示例教程 。

翻译自: https://www.javacodegeeks.com/2013/08/servlet-exception-and-error-handling-example-tutorial.html

servlet 异常处理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/347241.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于51单片机直流电机PWM控制器设计

前些天发现了十分不错的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;没有广告&#xff0c;分享给大家&#xff0c;大家可以自行看看。&#xff08;点击跳转人工智能学习资料&#xff09; 由STC89C52单片机、LCD1602液晶显示屏、霍尔测速传感器、3V直…

C语言实用算法系列之学生管理系统_单向链表内操作_选择排序

单向链表实现 #include <stdio.h> #include <malloc.h>typedef int DATA;struct SNode {DATA data;SNode* pNext; }; SNode* g_pHead NULL;void AddHead(DATA data) {SNode* p (SNode*)malloc(sizeof(SNode));p->data data;p->pNext g_pHead;g_pHead p…

如何从过滤器中排除URL

默认情况下&#xff0c;过滤器不支持排除特定的URL模式&#xff0c;每当您为过滤器定义URL模式时&#xff0c;任何与该模式匹配的请求都将由过滤器无例外处理。 从过滤器中排除URL的最简单方法是将过滤器映射到非常特定的模式。 在早期开发阶段完成此操作是可行的&#xff0c;…

大林算法控制仿真实验(计控实验六simulink)

前些天发现了十分不错的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;没有广告&#xff0c;分享给大家&#xff0c;大家可以自行看看。&#xff08;点击跳转人工智能学习资料&#xff09; 微信公众号&#xff1a;创享日记 发送关键词&#xff1a;计控…

C语言实用算法系列之学生管理系统_单向链表内操作_提取排序规则

代码 后续文章的排序均采用速度较快的选择排序算法。 #define _CRT_SECURE_NO_WARNINGS#include <stdio.h> #include <string.h> #include <stdlib.h>enum {READ_ONLY,HIDE,SYSTEM 55,TEST };typedef struct SUser {int nNumb;char sName[20];float fMath…

振铃的消除仿真实验(计控实验七simulink)

前些天发现了十分不错的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;没有广告&#xff0c;分享给大家&#xff0c;大家可以自行看看。&#xff08;点击跳转人工智能学习资料&#xff09; 微信公众号&#xff1a;创享日记 发送关键词&#xff1a;计控…

C语言实用算法系列之学生管理系统_单向链表外排序_栈内数组存储链表节点指针

代码 #define _CRT_SECURE_NO_WARNINGS#include <stdio.h> #include <string.h> #include <stdlib.h>enum {READ_ONLY,HIDE,SYSTEM 55,TEST };typedef struct SUser {int nNumb;char sName[20];float fMath; }DATA;typedef struct SNode {DATA data;SNode*…

基于触摸屏PLC的温度采集及简单控制

微信公众号&#xff1a;创享日记 发送关键词&#xff1a;plc4 免费获取完整无水印实验报告及源文件 一、实验目的 1、掌握模拟量输入输出的编写方法&#xff1b; 2、了解触摸屏画面编辑及组态的方法。 二、实验设备 三、实验步骤 1、如图所示&#xff0c;编辑触摸屏画面并定义…

OSI模型七层

OSI将计算机网络体系结构(architecture&#xff09;划分为以下七层&#xff1a; 一、应用层&#xff08;快递物品本身&#xff09; 网络服务接口&#xff0c;定义程序间通信标准&#xff0c;应用层协议&#xff08;HTTP…&#xff09; 二、表示层&#xff08;打包&#xff09…

内存heap_哪个内存更快?Heap或ByteBuffer或Direct?

内存heapJava正在成为新的C / C &#xff0c;它被广泛用于开发高性能系统。 对像我这样的数百万Java开发人员来说非常好&#xff01; 在这个博客中&#xff0c;我将分享我可以用Java完成的不同类型的内存分配的实验&#xff0c;以及从中获得什么好处。 Java中的内存分配 Java…

同网段PC通讯的过程

第一步&#xff1a;判断对方是否在同一个网段 如何判断&#xff1f; ①IP地址包括网络号和主机号&#xff0c;网络号相同就在同一个网段。 ②IP地址和子网掩码进行与运算可以得到网络号。 ③子网掩码与IP地址成对出现&#xff0c;就是用来指明IP地址哪些位是网络号。 第二步&a…

C语言实用算法系列之学生管理系统_单向链表外排序_堆内数组存储链表节点指针

代码 #define _CRT_SECURE_NO_WARNINGS#include <stdio.h> #include <string.h> #include <stdlib.h>enum {READ_ONLY,HIDE,SYSTEM 55,TEST };typedef struct SUser {int nNumb;char sName[20];float fMath; }DATA;typedef struct SNode {DATA data;SNode*…

Java EE 8的前5个新功能

备受期待的Java Enterprise Edition 8版本拥有两个激动人心的新API&#xff08;JSON绑定1.0和Java EE Security 1.0&#xff09;以及对当前API的改进&#xff08;JAX-RS 2.1&#xff0c;Bean Validation 2.0&#xff0c;JSF 2.3&#xff0c;CDI 2.0&#xff0c;JSON-P&#xff…

ARP广播寻址风险,ARP欺骗

ARP协议的缺陷&#xff1f; ①请求与应答不需要配对&#xff0c;可以主动向任何主机发送虚假的ARP应答。 ②不校验目的端IP和MAC地址&#xff0c;收到ARP应答包就会动态更新本地ARP缓存表。 ③ARP应答包也可以广播&#xff0c;同一广播域的主机ARP缓存表都会被更改。 ARP欺骗&…

C语言实用算法系列之二级指针用法简介

一、几个知识点 内存四区&#xff1a;栈、全局&#xff08;静态&#xff09;&#xff0c;常量区&#xff0c;除此以外剩余的空间暂时不能随意使用&#xff1b;除此以外剩余的空间只要通过malloc函数申请一下&#xff0c;就可以使用了&#xff1b;申请一个堆上的单个int变量的方…

二层交换机的工作原理和风险

1、先学习&#xff0c;建立MAC地址和交换机接口号的映射关系。 2、后转发&#xff0c;查询MAC地址表&#xff0c;找到目的MAC与接口号的映射&#xff0c;单播转发。 3、如果是广播包&#xff08;目的MAC是全F&#xff09;&#xff0c;除入接口以外的所有其它接口进行转发。 …

C语言实用算法系列之行指针

代码 #include <stdio.h>void Test(double (*a)[3]) {printf("sizeof(a)%d\n", sizeof(a));printf("sizeof(*a)%d\n", sizeof(*a));printf("sizeof(a[1])%d\n", sizeof(a[1])); }void main() {double ar[2][3] { {1.0,2.1,3.2},{4.3,5.4…

解决二层单点故障及链路聚合

什么是二层单点故障&#xff1f; 交换机接口级的故障 如何解决&#xff1f; ①在交换机中间接2根线&#xff0c;线路冗余>形成环路&#xff0c;导致广播风暴、MAC地址表振荡。 ②通过STP生成树协议破坏环路&#xff0c;逻辑隔断某一个接口。 链路聚合 应用场景&#xff1…

cassandra生产监控_碎玻璃:诊断生产Cassandra问题

cassandra生产监控我刚刚在健康市场科学&#xff08;HMS&#xff09;成立二周年之际&#xff0c;我们几乎一直在这里与Cassandra一起工作。 那时&#xff0c;我们遇到的问题很少。 就像我曾经使用过的其他几种技术一样&#xff0c;Cassandra“行之有效”。 但是&#xff0c;就…

C语言实用算法系列之DOS传参“加减乘除计算器”

简介 主要采用str族函数实现字符检测&#xff0c;只能用DOS传参进行计算&#xff0c;详见运行结果。 代码 #include <stdio.h> #include <string.h> #include <stdlib.h>/* int main(int argc, char** argv) { int i0; printf("总共有%d条有效字符串…