本文已参与「新人创作礼」活动, 一起开启掘金创作之路。
1 Servlet承担什么角色
在学习Web服务器的时候我们知道,浏览器将HTTP请求发送给服务器后,服务器需要相应这个HTTP请求,其中在建立连接结束以后,由HTTP服务器解析HTTP请求,然后接着是由谁来响应并返回相应的信息呢?就是服务器上的程序,通过一定的业务逻辑进行响应。
而Servlet就是运行在像Tomcat这样的Web服务器上的一段程序。我们知道Web程序有四层结构,Servlet属于中间件层,作为HTTP请求端和HTTP服务器上的数据库 和应用程序的桥梁。它可以响应HTTP协议的请求,而按照怎么样子的业务逻辑来响应这个HTTP请求,那就是由编写Servlet代码的程序员决定的。
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中的参数有ServletRequest和ServletResponse请求和响应,这里应该是我们要实现业务的地方了。
这里我们写第一个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 Servlet的生命周期
在我们看到Servlet的源码的时候,可以注意到其中的三个函数是:init、service、destroy
init初始化,就像人出生一样,人只能出生一次,init也只会被调用一次,初始化后这个Servlet会一直存在在Web服务器上。在Tomcat实例化完一个Servlet时,会调用init一次
service服务,一个工作、或者业务会重复工作很多次,所以service是可以被反复调用的。
destroy注销,有三种情况会注销:
- 自杀:自己手动调用了这个函数,那就会注销,需要再使用就要再调用
init - 老死:这个业务太久没有被使用,Tomcat就会将这个自动注销
- 世界毁灭:Tomcat关闭了
一个Servlet的生命周期就是围绕着这三个方法展开的。
4 HTTPServlet
一直都说Web服务器是对HTTP协议的实现,但是上面的Servlet接口中,好像也看不到什么和HTTP协议相关的信息,那我们如何处理HTTP请求信息呢?
在Tomcat的war包里,有一个叫HTTPServlet的抽象类。它继承了GenericServlet,而GenericServlet实现了Servlet, ServletConfig, Serializable三个接口。
而我们查看了HTTPServlet类中的代码,可以看到HTTPServlet中有HTTP所有的请求方法,所以如果是编写Web程序的Servlet,就可以直接继承HTTPServlet同时,那接下来就可以尝试去处理一些表单信息了。