探索servlet实现机制
2.1 servlet继承家族以及家族成员做了什么事情?
要想拥有一个servlet,需要创建一个类继承HttPServlet,重写方法
2.2 导入源码【Tomcat文档】
在继承的类名【例:HttpServlet】上右击,点击Open Declaration;进入一个类,有一个按钮 attach source–点击弹出一个窗体,有两个选项:
- workspace location–到工作区间下找
- extrenal location–到其他目录下找
选择到其他目录下找,可以导入文件或者文件夹【压缩包即可】。
文档下载(https://tomcat.apache.org/download-80.cgi#8.5.73)【Tomcat V8.5.73】
2.3 HttpServlet
是一个抽象类。
做的事情:
- 定义常量–存储HTTP请求方法
- 定义方法:–方法不被允许的时候,显示的信息
- doget()等每一个请求都定义了对应的处理方法
- service() --根据提交请求的方式调用对应的doXX()方法
- HttpServlet继承了GenericServlet
2.4 HttpServlet的父类——GenericServlet
也是一个抽象类。
做的事情:
- 定义常量获取ServletConfig对象
- 定义方法
- destroy() --servlet销毁的时候
- getInitParameter(String name) --获取初始化参数
- getServletConfig() --获取ServletConfig对象
- getServletContext() --获取上下文对象
- init(getServletConfig config) --获取初始化参数
- abstract void service(HttpServletRequest req, HttpServletResponse resp) --被子类使用
- 实现了三个接口:Servlet、ServletConfig、Serializable
2.5 顶层接口:Servlet、ServletConfig、Serializable
- Servlet
- 定义了servlet相关方法的规范
- init() --初始化
- destory() --销毁
- service() --业务实现过程
- ServletConfig
- getServletName() --获取servlet名字
- getServletContext() --获取上下文对象
- getInitParameter(String name) --获取初始化参数
- Serializable:序列化 --存储Servlet对象
2.6 初始化参数和获取Servlet名字
①获取名字
getServletName();
②获取初始化参数:解决的问题固定化的数据
getInitParamrter(String name);
在web.xml中,当前servlet进行配置。
<servlet> <servlet-name>LoginServlet</servlet-name> <servlet-class>pers.wcs.login1215.servlet.LoginServlet</servlet-class> <init-param> <param-name>mytime</param-name> <param-value>7</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>LoginServlet</servlet-name> <url-pattern>/login</url-pattern> </servlet-mapping>
注意:初始化参数配置给哪个servlet,name只有对应的servlet可以获取(排他性)。
3. servlet生命周期【探索servlet的执行过程】
创建一个新的servlet [CycleLifeServlet]。
准备方法: |
---|
- 构造方法() --创建对象
- init() --初始化
- destory() --销毁
- service() --业务处理
- doXX() --实际处理业务
开始测试<多方位测试>: |
---|
运行过程:
首先调用构造方法 --创建对象
其次调用init方法–初始化一些新信息
再次调用service方法–处理业务
如果没有重写service方法,调用的是和提交请求对应的doXX()方法。
最后服务器正常关闭,调用destory方法–销毁servlet
探索问题: |
---|
重写了service方法 --提交的所有请求–直接调用service方法 --不去调用doXX方法; |
没有重写service方法的时候 --直接调用对应的doXX方法接收请求处理业务。 |
出现以上问题的原因分析:
重写service方法 --直接调用service方法;
没有重写service方法 --其实是调用了HttpServlet中的service方法,然后根据提交请求的方式调用对应的doXX方法。
4. Servlet总结
在我们第一次加载servlet的时候,创建一个servlet对象,整个业务过程中servlet对象只有一个,是一个单例。多线程访问:单实例多线程。