Servlet原理和简单的案例编写

2023年 7月 18日 64.5k 0

 Servlet

​  Servlet Servlet(Server Applet),即服务程序。Servlet是一种用Java技术构建的动态Web应用服务程序,运行在容器中(如Tomcat、Jetty服务器等),容器提供了执行Servlet的运行时环境和支持,负责接收HTTP请求,根据请求路径将其分配给对应的Servlet进行处理,并将响应发送回客户端。这样就实现了动态的页面内容。

以下从请求到响应来梳理整个Servlet执行流程和生命周期。

1.Servlet执行流程

1.1 客户端发送Http请求

客户端发送Http请求消息,如用户可以在浏览器地址栏输入URL,按下回车发送GET请求(从服务端获取资源),或者以提交表单的方式发送POST请求(服务端发送数据)。

1.2 加载和初始化

当Servlet容器收到请求,会根据请求的URL找到对应的Servlet对象(由容器创建),并调用servlet中的init()方法进行初始化操作,如数据连接创建、加载配置文件等。其实初始化操作可以在开启服务器时,在请求到来之前进行,这样可以降低响应的时间。

1.3 请求处理

初始化后容器可以调用对象中的service()方法进行http请求的处理了。每次请求Servlet时,容器都会调用Servlet中的service()方法对请求进行处理,在service()方法中再根据请求的类型(GET、POST、PUT等)调用doGet()、doPost()等方法接收请求对象,这些方法是就是我们用来处理具体的业务逻辑。我们可以从HttpServletRequest请求对象中获取请求的参数、Cookie、会话(Session)等信息,并在方法中通过HttpServletResponse对象生成响应内容传出给客户端。

1.4 服务终止,结束流程

当该连接下所有的请求和响应都处理之后,关闭容器时,Servlet容器就会调用servlet对象中的destroy()方法进行清理操作(destroy()也可以显式调用),释放资源,如关闭数据库连接、删除文件并销毁Servlet实例等,实例随后被垃圾收集器回收。

需要注意的一点是,Servlet容器会在第一次请求时加载Servlet对象,并在以后的请求中复用已加载的Servlet对象,以提高性能和效率。其次是每个请求都由一个独立的线程来处理,多个请求可能是同一个对象来处理,所以Servlet开发必须注意线程安全的。

2.Servlet生命周期

根据执行流程就可以知道Servlet的生命周期,包括由容器加载和实例化,初始化配置信息,处理客户端的请求,销毁。所有可以知道每个Servlet实例通常只有一个init()方法调用,一个destroy()方法调用,但service()方法可能会被多次调用处理不同的请求(service()再根据请求的类型内部调用GET、POST或者PUT等请求)。

3.编写一个Servlet

讲完大概的流程后,如何写一个Servlet,可以发送请求得到想要的响应呢?

要编写一个Servlet,可以按照以下步骤进行:

3.1 项目创建和基础的修改和配置

这里我用IDEA创建Maven项目的方式构建web应用程序。

image.png
这里设置项目的名称以及项目坐标的GAV(保证项目唯一性),测试用坐标不配也行。

image.png
这里我已经在本地下载了maven并创建了本地仓库,用IDEA上自带的也行。
image.png
在main目录下创建以下两个资源目录
image.png
将pom.xml文件删改为以下模板
image.png
修改WEB-IN文件下的web.xml配置为最新版






3.2 导入依赖

在maven仓库中搜索Servlet依赖,选择使用最多的版本,复制对应的坐标到pom.xml文件中的依赖

image.png

然后点击右上角的刷新,将依赖导入到maven中

3.3 编写Servlet

在Java源文件下编写一个普通类,实现Servlet接口,这里我们直接继承HttpServlet。因为Sun公司有两个默认的实现类HttpServlet,GenericServletSerlvet实现了Servlet接口。实现和继承关系为Servlet

image.png

public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //一般在Servlet中,习惯性的会首先设置请求以及响应的内容类型以及编码方式:
        resp.setContentType("text/html;");
        req.setCharacterEncoding("UTF-8");
        //用打印流简单的响应一个信息
        PrintWriter writer = resp.getWriter();
        writer.println("Hello Servlet!");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

3.4 在web.xml中添加Servlet配置信息

当启动一个WEB项目时,容器首先会读取项目web.xml配置文件里的配置,包括servlet,mapping,pattern,过滤器等,其实就是配置后台Servlet信息,以及一些参数初始化配置,便于服务器读取配置参数对应的信息数据,当这一步骤没有出错并且完成之后,项目才能正常地被启动起来。因为只有一个Servlet,所有以下简单注册写好的Servlet类,以及对应请求路径。



    
    
        helloServlet
        HelloServlet
    
    
        helloServlet
        /hello
    


3.5 配置Tomcat部署项目

在IDEA中配置Tomcat服务器,这里我已经在本地下好了Tomcat,因为Tomcat是Java写的,运行Tomcat需要Java环境,注意配置好Java环境变量,否则Tomcat启动失败。

image.png
点击Configure配置好Tomcat路径

image.png

然后点击部署项目,我们选择已经创建好的ServletDemo项目的wa包r。

image.png

注意更改项目发布的上下文路径,tomcat服务器在接收到请求后就会从http:localhost:8080/s1/对应的docBase路径去调用资源或者调用某个class用来处理请求。不改也行,访问的时候url不要忘了加上就行。本项目Servlet访问路径为http:localhost:8080/s1/hello。

image.png

3.6 项目启动

然后就可以启动测试了!如下成功响应我们想要的内容。

image.png

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论