前言
在微人事的项目中,我们看到了很多HttpServletRequest request, HttpServletResponse response作为参数传入到某个方法中,它通常作为HttpServlet中的service()方法传入参数;serveice()方法,它起源于Servlet接口,属于其中非常重要的一部分。
1.Servlet接口
1.1 Tomcat的工作机制(重要)
- 客户端向Servlet容器(如Tomcat)发起Http请求,此时Servlet还未初始化
- Tomcat从磁盘中加载servlet,servlet加载成功
- Tomcat将Http请求封装为request对象,转发request给对应的Servlet处理
- Servlet将request处理为response返回给Tomcat,Tomcat将request转换成Http响应
- Tomcat将Http响应给客户端
1.2 Servlet定义:
- 定义:java编写的应用成簇
- 功能:交互式地浏览和修改数据,生成动态web内容
- 狭义Servlet:实现了Servlet的接口
- 任何实现了Servlet接口的一个实现类
1.3 Servlet的结构组成:
Servlet接口、ServletRequest接口、ServletResponse接口、GenericServlet抽象类(实现了Servlet接口)、ServletContext接口、ServletConfig接口、ServletDispatcher接口、Filter接口
1.4 Servlet的工作原理:
- Servlet容器将servlet加载到内存中,并产生servlet以及它能够调用的方法;在一个应用程序中,每个Servlet类型只能有一个Servlet对象
- 用户请求致使Servlet调用Servlet的service()方法,并传入一个ServletRequest和ServletResponse对象
- ServletRequest中封装了Http请求,无需技术人员解析原始Http数据,ServletResponse表示当前用户响应,程序员直接操作该对象返回响应给客户端用户
- 对任何一个应用程序,Servlet容器还会创建一个ServletConfig对象,该对象封装了应用程序的上下文环境,每个应用程序只有一个ServletConfig,每个Servlet对象只有一个Servlet配置的ServletConfig对象
1.5 Servlet中的定义方法:
public interface Servlet{ void init(SerlvetConfig var1) throws ServletException; //返回Servlet容器传给init()方法的ServletConfig对象 Servlet getServletConfig(); void service(ServletRequest req, ServletResponse resp) throws ServletException{ } String getServletInfo(); void destroy(); }
1.6 Servlet的生命周期:
- 在上面的方法中,init()、sevice()、destroy()方法表示了Servlet对象出生到死亡的过程
- init()方法:当Servlet第一次被请求是,Servlet就会调用该方法,并传入一个ServletConfig对象初始化一个Servlet对象,在后续请求中,它不会再被调用
- service()方法:每当Servlet被请求是,Servlet就会调用该方法,init()只会被调用一次,而service像人生中的工作一样,一直工作知道去世
- destroy()方法:当要销毁Servlet时会调用该方法(卸载应用程序或关闭Serlvet容器),就会调用该方法,它也只会被调用一次
1.7 GenericServlet抽象类:
在实现Servlet的实现类中,我们都需要实现Servlet接口中的所有方法,及时不使用这些方法,而且还需要手动维护init()方法中ServletConfig对象的应用,这样显得很麻烦,GenericServlet抽象类应需而生,它实现了Servlet以及ServletConfig接口
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public abstract class GenericServlet implements Servlet, ServletConfig, Serializable { private static final String LSTRING_FILE = "javax.servlet.LocalStrings"; private static ResourceBundle lStrings = ResourceBundle.getBundle("javax.servlet.LocalStrings"); private transient ServletConfig config; public GenericServlet() { } public void destroy() { } public String getInitParameter(String name) { ServletConfig sc = this.getServletConfig(); if (sc == null) { throw new IllegalStateException(lStrings.getString("err.servlet_config_not_initialized")); } else { return sc.getInitParameter(name); } } public Enumeration<String> getInitParameterNames() { ServletConfig sc = this.getServletConfig(); if (sc == null) { throw new IllegalStateException(lStrings.getString("err.servlet_config_not_initialized")); } else { return sc.getInitParameterNames(); } } public ServletConfig getServletConfig() { return this.config; } public ServletContext getServletContext() { ServletConfig sc = this.getServletConfig(); if (sc == null) { throw new IllegalStateException(lStrings.getString("err.servlet_config_not_initialized")); } else { return sc.getServletContext(); } } public String getServletInfo() { return ""; } public void init(ServletConfig config) throws ServletException { this.config = config; this.init(); } public void init() throws ServletException { } public void log(String msg) { this.getServletContext().log(this.getServletName() + ": " + msg); } public void log(String message, Throwable t) { this.getServletContext().log(this.getServletName() + ": " + message, t); } public abstract void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException; public String getServletName() { ServletConfig sc = this.getServletConfig(); if (sc == null) { throw new IllegalStateException(lStrings.getString("err.servlet_config_not_initialized")); } else { return sc.getServletName(); } } }GenericServlet抽象类
GenericServlet中两个init()方法的作用:
public void init(ServletConfig var1) throws ServletException{ } public void init(ServletConfig config) throws ServletException{ this.config = config; this.init(); }
GenericServlet是一个抽象类无法产生实例,所以需要一个类继承它,就会出现覆盖的问题,如果实现该类就会覆盖该类的init()方法,那么程序员需要手动维护ServletConfig对象,这个不带参数的init()方法就是解决实现类覆盖问题的
2.javax.servlet.http
3.ServletContextListener
标签:Servlet,config,init,sc,ServletConfig,public From: https://www.cnblogs.com/kzf-99/p/17019501.html