Servlet程序入门

145 阅读3分钟

本文已参与「新人创作礼」活动, 一起开启掘金创作之路。

1 Servlet承担什么角色

在学习Web服务器的时候我们知道,浏览器将HTTP请求发送给服务器后,服务器需要相应这个HTTP请求,其中在建立连接结束以后,由HTTP服务器解析HTTP请求,然后接着是由谁来响应并返回相应的信息呢?就是服务器上的程序,通过一定的业务逻辑进行响应。

而Servlet就是运行在像Tomcat这样的Web服务器上的一段程序。我们知道Web程序有四层结构,Servlet属于中间件层,作为HTTP请求端和HTTP服务器上的数据库 和应用程序的桥梁。它可以响应HTTP协议的请求,而按照怎么样子的业务逻辑来响应这个HTTP请求,那就是由编写Servlet代码的程序员决定的。

1.3-1JavaEE组件.png

2 如何编写一个Servlet

当我们准备好一个Web项目的时候,并导入好相关的war包以后,我们可以看到其中由一个Servlet接口,内容如下

package javax.servlet;
​
import java.io.IOException;
​
public interface Servlet {
    //初始化
    void init(ServletConfig var1) throws ServletException;
    //Servlet配置
    ServletConfig getServletConfig();
    //服务
    void service(package javax.servlet;
​
    //Servlet信息
    String getServletInfo();
    //销毁
    void destroy();
}

看到上面的函数中service中的参数有ServletRequestServletResponse请求和响应,这里应该是我们要实现业务的地方了。

这里我们写第一个Servlet程序,我们打印一句话,其实我们只在service方法里面添加了语句。

import javax.servlet.*;
​
import java.io.IOException;
​
public class MyServlet implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
​
    }
​
    @Override
    public ServletConfig getServletConfig() {
        return null;
    }
​
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        servletResponse.getWriter().write("My First Servlet!");
    }
​
    @Override
    public String getServletInfo() {
        return null;
    }
​
    @Override
    public void destroy() {
​
    }
}

Tomcat如何识别到这个Servlet呢?我们需要在开发目录WEB-INF下的web.xml文件中配置这个Servlet,这样才能被识别:

<servlet>
    <!--为我们编写的Servlet取一个名字-->
    <servlet-name>MyServlet</servlet-name>
    <!--Servlet类所在的位置,我们没有写在包下,所以不用加包名-->
    <servlet-class>MyServlet</servlet-class>
</servlet>
<servlet-mapping>
    <!--是我们上面取的名字-->
    <servlet-name>MyServlet</servlet-name>
    <!--相对的url路径-->
    <url-pattern>/MyServlet</url-pattern>
</servlet-mapping>

在我们在浏览器里输入一个url以后,首先判断的是有没有<url-pattern>这个相对路径,有的话就根据<servlet-name>这个名字找到相应的Servlet编译好的文件的位置并返回到客户端。

上述代码编译以后的结果如下

3.1-1.png

3 Servlet的生命周期

在我们看到Servlet的源码的时候,可以注意到其中的三个函数是:initservicedestroy

init初始化,就像人出生一样,人只能出生一次,init也只会被调用一次,初始化后这个Servlet会一直存在在Web服务器上。在Tomcat实例化完一个Servlet时,会调用init一次

service服务,一个工作、或者业务会重复工作很多次,所以service是可以被反复调用的。

destroy注销,有三种情况会注销:

  1. 自杀:自己手动调用了这个函数,那就会注销,需要再使用就要再调用init
  2. 老死:这个业务太久没有被使用,Tomcat就会将这个自动注销
  3. 世界毁灭:Tomcat关闭了

一个Servlet的生命周期就是围绕着这三个方法展开的。

4 HTTPServlet

一直都说Web服务器是对HTTP协议的实现,但是上面的Servlet接口中,好像也看不到什么和HTTP协议相关的信息,那我们如何处理HTTP请求信息呢?

在Tomcat的war包里,有一个叫HTTPServlet的抽象类。它继承了GenericServlet,而GenericServlet实现了Servlet, ServletConfig, Serializable三个接口。

而我们查看了HTTPServlet类中的代码,可以看到HTTPServlet中有HTTP所有的请求方法,所以如果是编写Web程序的Servlet,就可以直接继承HTTPServlet同时,那接下来就可以尝试去处理一些表单信息了。

3.1-2 HTTPServlet.png