网站首页 > 技术文章 正文
前面几个小节内容,介绍了如何创建一个Servlet程序以及Servlet的生命周期,并且还介绍了创建Servlet程序的三种方式,这一小节再继续介绍一下Servlet的运行原理,进一步理解Servlet程序是如何运行起来的。
1.1、运行原理图
我们知道,Servlet程序是没有办法单独运行的,因为Servlet程序不包含可运行的main方法,它必须依赖于Servlet容器才能够运行起来,这是因为,Servlet容器中有main方法,程序入口是从main方法开始执行的,最终也是在main方法结束执行的。
当Servlet容器启动之后,浏览器访问对应的路径地址的时候,此时Servlet容器会从web.xml配置文件中,找到当前浏览器访问的地址所对应的Servlet类名称,然后通过反射机制,将这个Servlet类进行实例化操作,之后就进入了这个Servlet的生命周期。
这里你可能会有一个疑问,如果我们访问的地址在web.xml配置文件里面,没有找到对应的Servlet处理程序,那么会怎么样呢???
针对这种情况,Servlet容器都会有一个默认的Servlet处理程序,当我们访问的路径地址找不到的时候,此时Servlet容器就会将这个请求地址交给默认的Servlet程序处理。
Servlet运行原理图大致如下所示:
大概总结一下,Servlet程序运行原理就是下面几个步骤:
- 客户端向Servlet容器发起请求。
- Servlet容器接收到客户端的请求。
- 接着Servlet容器,根据web.xml配置文件中的路径映射关系,寻找能够处理当前请求的Servlet程序。
- 如果能够寻找到对应的Servlet程序,那么就会通过反射机制,实例化对应Servlet程序。
- 紧接着进入Servlet的生命周期阶段。
- 如果没有找到对应的Servlet程序,此时Servlet容器会将请求交给默认的Servlet进行处理。
- 默认的Servlet程序处理请求之后,会将结果响应给客户端。
- 到此,一次客户端请求就执行完啦。
1.2、默认的Servlet
就以Tomcat容器为案例,Tomcat容器中就有一个默认的Servlet处理程序,通过查看它的【conf/web.xml】配置文件,就可以看到一个DefaultServlet类,它默认的Servlet映射关系如下所示:
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- The mapping for the default servlet -->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
从上面配置中,可以看出,Tomcat提供的默认Servlet程序名称叫做default,处理的请求路径是【/】斜杆,并且默认的Servlet是在程序启动时候就会进行实例化的(配置了load-on-startup标签)。
1.3、404报错界面
你有没有见过下面这个错误界面:
上面出现404报错的原因就是,Tomcat容器没有找到能够处理当前请求的Servlet程序,所以就将当前请求交给了默认的Servlet进行处理,默认的Servlet程序会直接返回404界面信息。
你可能会觉得这个默认的404界面太难看了,能不能自定义一个404的错误界面呢???答案是可以的,下面就介绍一下如何自定义默认的Servlet程序。
1.4、自定义默认的Servlet
自定义默认的Servlet程序,本质上就是写一个Servlet覆盖Tomcat容器默认提供的Servlet程序,要如何覆盖默认的Servlet呢???
覆盖默认的Servlet只需要在项目中创建一个Servlet,然后在web.xml配置文件中,将对应Servlet映射路径修改成【/】斜杠即可。
package com.gitcode.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @Date: 2024/3/3 21:17
* @Copyright (C) ZhuYouBin
* @version 1.0.0
* @Description: 自定义默认的Servlet
*/
public class CustomDefaultServlet extends HttpServlet {
/**
* 对外提供服务阶段
*/
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html");
response.getWriter().println("<h3>Sorry,404,你访问的界面找不到啦!</h3>");
}
}
在web.xml配置文件中,添加如下配置信息:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1"
metadata-complete="true">
<display-name>工程名称</display-name>
<description>
工程描述
</description>
<servlet>
<servlet-name>CustomDefaultServlet</servlet-name>
<servlet-class>com.gitcode.servlet.CustomDefaultServlet</servlet-class>
<!-- 告诉Servlet容器,当前这个 CustomDefaultServlet 在程序启动时候,就要实例化对象 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>CustomDefaultServlet</servlet-name>
<!-- 自定义默认的Servlet进行处理 -->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
重新启动工程,浏览器再次访问任意路径,此时就会进入到自定义的404界面啦,效果如下所示:
今天就到这里,未完待续~~
猜你喜欢
- 2024-10-10 SpringBoot整合Grpc实现跨语言RPC通讯
- 2024-10-10 RequestMapping属性详解 - SpringMVC高手进阶
- 2024-10-10 《Servlet》第22节:获取ServletContext上下文对象的四种方式
- 2024-10-10 阿里Java二面:说说Spring MVC执行流程及原理?这样聊能吊打面试官
- 2024-10-10 Springboot——用更优雅的方式发HTTP请求(RestTemplate详解)
- 2024-10-10 JavaServlet生命周期、HttpServletRequest和HttpServletResponse
- 2024-10-10 关于RESTful一些注意事项和自己整理的接口开发规范
- 2024-10-10 java版gRPC实战之二:服务发布和调用
- 2024-10-10 Servlet 点击计数器 点击计数在线
- 2024-10-10 Java开发架构篇:初识领域驱动设计DDD落地
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)