Servlet是什么:
Servlet是Server+Applet的缩写,表示一个服务器应用。Servlet是一套规范,按照这个规范编写代码就可以直接在Java服务器上运行。
Servlet接口:
public interface Servlet {
public void init(ServletConfig config) throws ServletException;
public ServletConfig getServletConfig();
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException;
public String getServletInfo();
public void destroy();
}
1、init方法在容器启动时被容器调用(当load-on-startup设置为负数或者不设置时,会在第一次Servlet用到时才被调用)只会调用一次。init方法调用回接受一个ServletConfig类型的参数,是容器传进去的。Servlet-Config指的是Servlet的配置。在web.xml中定义Servlet时通过init-param标签配置的参数就是通过ServletConfig保存的。
2、getServletConfig用于获取ServletConfig。
3、service方法用于处理一个请求。
4、getServletInfo获取一些Servlet相关信息,如作者、版权信息等,这个方法需要自己实现,该接口默认返回空字符串;
5、destroy用于在Servlet销毁(关闭服务器)时释放一些资源,只会被调用一次。
ServletConfig接口:
public interface ServletConfig {
public String getServletName();
public ServletContext getServletContext();
public String getInitParameter(String name);
public Enumeration<String> getInitParameterNames();
}
1、getServletName方法用于获取Servlet的名字,也就是在web.xml中定义的servlet-name;
2、getInitParameter方法获取init-param配置的参数。
3、getInitParameterNames方法用于获取所有的init-param的名字集合。
4、getServletContext返回值是ServletContext代表是应用本身,既然代表应用本身,那么ServletContext中的设置的参数,可以被当前应用的所有Servlet共享。我们经常把参数保存在Session作用域里,或者Application作用域里(保存在了ServletContext中)getServletContext().setAttribute("name","value");。ServletConfig是Servlet级的,而ServletContext是Context级别的。ServletContext功能很强大,并不仅仅保存参数。在web.xml使用context-param配置的参数配置到了ServletContext,使用init-param配置到了ServletConfig。
5、同时使用context-param标签和setAttribute配置了同名参数并不会覆盖和影响。它们是两套数据,是互不干扰的。
GenericServlet类
GenericServlet是Servlet的默认实现,主要做了三件事。实现了ServletConfig接口,可以直接调用ServletConfig里的方法、提供了无参的init方法、提供了log方法。
GenericServlet实现了ServletConfig接口,为方便调用,并做了部分封装。如获取ServletContext可以直接调用GenericServlet的getServletContext方法,不需要getServletConfig().getServletContext();
HttpServlet类
1、HttpServlet是用Http协议实现的Servlet的基类,写Servlet时直接继承HttpServlet即可,无需从头实现Servlet接口。SpringMVC中的Dispather就是继承了HttpServlet。HttpServlet是跟协议相关的。主要关心是如何处理请求的。所以HttpServlet类主要重写了service方法。具体逻辑是:先将Servlet中的Request和Response转化为了HttpServletRequest和HttpServletResponse然后根据Http请求的类型不同将请求路由到不同的处理方法。
2、方法主要包含:doXXX的结构,doGet、doPost、doPut、doDelete
3、HttpServlet主要将不同的请求方式,路由到不同的处理方法,但SpringMVC中底层由将所有请求合并到统一的一个方法中进行处理。