虽然目前servlet可能看起来和jsp一样过时,但是很多框架的底层,服务端和客户端通信都是用的这个
servlet
servlet是用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。简单的理解就是服务器端,接受客户端过来的数据,通过解析request,返回respond的工具,可以理解为一个有5个方法的接口,一般来说实现了servlet的类都可以叫做servlet。
但是如果一个单独的servlet是不能跟客户端通信的,实际通信的是tomcat,tomcat监听端口(一般是8080),请求过来后,根据url等信息,确定要将请求交给哪个去处理,然后调用那个servlet的service方法,service方法返回一个response对象,tomcat再把这个response返回给客户端。
基本实现
servlet是具有5个方法的类,一般都是直接采用继承的方式重写就行,5个方法包括3个周期方法和2个其他方法
- init(ServletConfig config)
- destroy
- service
- getServletInfo
- getServletConfig
其中对于init 和destroy周期方法只调用一次,而对于service方法,只要请求进来就会调用一次,所以我们的业务逻辑都是写在service方法里面的,查看源码,servlet不会直接实现service方法,需要自己实现get post操作,这样肯定很麻烦,所以大多数操作都是直接继承HttpServlet方法实现其中的service方法,对于HttpServlet类,这是一个抽象类,不允许被实例化,也就就是不能被new,继续查看httpServlet的源码会发现,这个类继承了一个GernericServlet类,这类也是个抽象类,但是这里直接实现了servlet,对于Servlet,没有直接实现其中的service方法。
那么为什么这么麻烦,我们直接实现HttpServlet,并且HttpServlet直接继承Servlet就行了,为什么要隔一层GenericServlet,查看GenericServlet可以看到基本方法都没有什么用,只是周期函数init中,加了两行
public void init(ServletConfig config) throws ServletException{
this.config=config;
this.init();
}
这里作用
- 提升了init方法里面的形参ServletConfig的作用域,提供其他方法调用
- init中还调用servlet的init方法,这里如果希望在创建的时候,进行操作,可以在这里进行
对于HttpServlet中,是需要实现doPost doGet请求的,如果没有实现,是会返回405错误的
reference :
https://www.zhihu.com/question/21416727
https://www.cnblogs.com/panjun-Donet/archive/2010/02/22/1671290.html