文章目录
一,什么是Servlet
Servlet字面意思即服务端小程序
Servlet是一组接口、一组规范、一个协议;用于开发Web项目
一个工程的搭建通常由各模块组成;各个模块分工协作、相互配合可以高效率地构建大型项目。各个模块之间需要一组规范来连接,Servlet就是这样一组规范
B/S架构中涉及到的协议、标准、规范:
- 浏览器和Web服务器之间的请求和响应遵循HTTP协议
- WEB服务器和web项目的开发者(我们)之间有一些规范,例如:Servlet、JSP规范
- Web项目的开发者(我们)和数据库服务器之间有一个规范,叫做JDBC规范
二,Servlet
1,Servlet是如何起作用的
每一个url都对应着互联网中的一个资源,分为静态资源和动态资源,例如:
- http://202.108.251.34:8080/egov/login.html请求路径对应着一个html网页资源
- http://202.108.251.34:8080/oa/delete?empno=7369请求路径对应着一个动态资源、一段程序
这段程序就是Servlet程序,当浏览器发送某个请求时,服务器找到该请求对应的servlet程序并执行servlet对象的service()方法。请求路径与servlet程序的对应信息配置在web.xml文件中,如图:
2,Servlet接口中的方法
javax.servlet.Servlet接口
public interface Servlet {
/**
初始化方法,servlet对象创建之后会执行该方法;servlet对象为单例对象,故该方法只执行一次
*/
void init(ServletConfig config) throws ServletException;
/**
获取servletConfig对象,该对象由服务器创建并传入
*/
ServletConfig getServletConfig();
/**
主体方法,用于处理业务逻辑,服务器通过请求路径找到对应的servlet对象并执行该方法;由服务器传入请求和响应对象
*/
void service(ServletRequest request, ServletResponse response) throws ServletException, IOException;
/**
返回有关servlet的信息,例如作者,版本和版权
*/
String getServletInfo();
/**
销毁前的准备,servlet对象销毁前会执行该方法
*/
void destroy();
}
3,Servlet对象的生命周期
Servlet对象从最初的创建,方法的调用,到最后被销毁,都是由web容器来管理的,javaweb程序员无权干涉
具体过程:
- Web容器启动,解析web.xml文件,将请求路径与对应的servlet类名放到一个map集合中,如图:
大多数web容器还会维护一个请求路径与对应的servlet对象的集合,如图:
默认情况 下,servlet对象在Web容器启动阶段不会被实例化,而是在接收到第一次请求之后实例化;若想要在web容器启动时实例化,可进行如下配置: - 浏览器发送请求,web容器截取请求路径,通过请求路径在Map<String, Servlet>中查找对应的servlet对象;
如果没有找到对应的servlet对象,则:
1,通过请求路径在Map<String, String>找到对应的servlet全类名
2,通过反射机制加载该类并调用无参构造方法完成servlet对象实例化
3,调用servlet对象的init()方法完成初始化
4,调用servlet对象的service()方法提供服务
若找到了对应的servlet对象,则调用该对象的service()方法提供服务 - servlet对象销毁:web容器关闭的时候、webApp重新部署的时候、该servlet对象长时间没有用户访问的时候,web容器会将servlet对象销毁,在销毁servlet对象前,会调用对象的destroy()方法进行销毁前的准备
注意:servlet对象是单例,web容器为每个Servlet类只创建一个servlet对象
三,ServletConfig
1,什么是ServletConfig
- ServletConfig指javax.servlet.ServletConfig接口
- 【了解】Apache Tomcat服务器实现了Servlet规范,Tomcat服务器写了一个ServletConfig接口的实现类,实现类的完整类名是
org.apache.catalina.core.StandardWrapperFacade
- ServletConfig对象封装了Servlet对象的配置信息,每个Servlet对象对应着一个ServletConfig对象;在web.xml中,ServletConfig对象对应着
<servlet>
标签中的所有内容,例如:
- ServletConfig对象由服务器创建并在servlet对象初始化时传入:
void init(ServletConfig servletConfig) throws ServletException;
- 在service()方法体中,可以通过getServletConfig()方法获取ServletConfig对象:
2,ServletConfig中的方法
public interface ServletConfig {
//获取servletName: <servlet-name>servletName</servlet-name>
String getServletName();
//获取ServletContext对象,ServletContext为Servlet的上下文环境,下章节讲
ServletContext getServletContext();
/**
获取初始化参数name对应的value
<init-param>
<param-name>driver</param-name>
<param-value>com.mysql.jdbc.driver</param-value>
</init-param>
*/
String getInitParameter(String paranmae);
/**
获取初始化参数的name集合的枚举(类似迭代器):
Enumeration<String> initParameterNames = servletConfig.getInitParameterNames();
通过name集合循环遍历拿出name,通过name获取value
while (initParameterNames.hasMoreElements()) {
String name = initParameterNames.nextElement();
String value = servletConfig.getInitParameter(name);
}
*/
Enumeration<String> getInitParameterNames();
}
三,ServletContext
1,什么是ServletContext
-
ServletContext指javax.servlet.ServletConfig接口
-
ServletContext对象由服务器创建,Tomcat服务器对ServletContext接口的实现类完整类名是:
org.apache.catalina.core.ApplicationContextFacade
-
ServletContext意为servlet的上下文环境,servletContext对象对应着整个项目,该对象只有一个且被所有servlet共享,servletContext对象对应着web.xml文件,例如:
-
web.xml文件服务器启动阶段被解析,servletContext对象在服务器启动阶段被创建,在服务器关闭时被销毁
2 ,ServletContext中的常用方法
/**
根据参数的名称获取value,均为字符串
<context-param>
<param-name>driver</param-name>
<param-value>com.mysql.jdbc.driver</param-value>
</context-param>
*/
String getInitParameter(String paraname);
//与ServletConfig中的方法作用相同
Enumeration<String> getInitParameterNames();
//向ServletContext对象中添加数据
void setAttribute(String name, Object obj);
//根据name从ServletContext对象中获取数据
Object getAttribute(String name);