Servlet是什么
当HTTP服务器在接收到请求就需要调用服务端的应用程序去处理,一般来说,不同请求对应不同Java类。
如果我们将处理不同请求去调用不同处理程序的逻辑写在HTTP服务器中,那么HTTP服务器的代码中就会加入许多if else语句,而且这一逻辑就相当于业务逻辑代码和HTTP服务器代码耦合在了一起,当我们新增删除我们的业务方法的时候还需要改动HTTP服务器的代码。
但是HTTP服务器就应该独立于业务逻辑,所以Servlet就出现了。首先我们可以把Servlet划分为Servlet容器和Servlet类,简单理解的话Servlet容器就是用来解决HTTP服务器和业务代码之间的耦合问题的,而Servlet类有很多中,它分别对应不同的业务代码。

对于Servlet,它是一个接口,即它是一个规范,它本身独立于HTTP服务器。但是因为我们日常开发中经常在HTTP的环境中,所以Servlet为我们实现了HttpServlet实现类,我们只需要重写doGet和doPost方法就行了。
浅析Servlet
Servlet
首先我们来看一下Servlet接口的定义
1 | public interface Servlet { |
ServletConfig
我们来看一下ServletConfig接口的定义
1 | public interface ServletConfig { |
ServletContext
ServletContext接口源码
ServletContext中定义了很多方法,我们可以将它分类几类并且做功能说明
多个Servlet通过ServletContext对象实现数据共享。通过setAttribute等属性设置获取删除方法等
实现Servlet的请求转发。 获取分发器getRequestDispatcher方法
这里就不得不提一下重定向和请求转发的区别了。我们知道ServletContext拥有着所有Servlet实例,所以我们可以通过ServletContext对象来实现服务器内部的请求转发,比如将这个请求交给其他Servlet去处理,这个是服务器的内部行为,所以URL是不变的。还有就是重定向,即两次request请求,所以URL是会变的。
1
getServletConfig().getServletContext().getRequestDispatcher("xx").forward(request,response);
获取Web应用的初始化参数,或者设置获取全局参数。 例如getInitParameter方法等
利用ServletContext对象读取资源文件(比如properties文件)
过滤器和监听器
1 | public interface ServletContext { |
GenericServlet
1 | public abstract class GenericServlet implements Servlet, ServletConfig, Serializable { |
总结一下GenericServlet的作用
提升servletConfig对象的作用域,方便其他方法使用
init方法中还调用了空的init方法,如果我们需要servlet创建后做一些初始化操作,我们可以继承GenericServlet并且重写init无参方法。
还是保留了service方法 未实现它。
HttpServlet
HttpServlet实现了对HTTP协议的封装
1 | public abstract class HttpServlet extends GenericServlet { |