Servlet概念
- Servlet是Java语言编写的程序,一个Java类。
- 运行在WEB服务器。
- 用于处理用户的请求
- 对用户请求作出对应的响应,然后将处理的结果封装到HTML代码中返回给客户端
Tomcat服务器访问Servlet步骤
- 客户端发出请求
- 查找该链接对应的servlet-name
- 到servlet标签中查找servlet-name,与2中servlet-name匹配的项
- 查找对应的serlvet-class
- 利用反射机制访问对应的servlet类
Servlet容器与Servlet区别
Tomcat是一个WEB容器,因为Tomcat是J2EE标准的产品,因此需要Tomcat支持Servlet。因此可以认为tomcat是一个Servlet容器。
区别:
- Servlet是一个Java类,初始化时调用init方法,销毁时调用destroy方法,实例化和销毁是由Servlet容器完成。
- Servlet在Servlet容器中运行,Servlet容器负责调度Servlet的生命周期
Servlet生命周期
- init方法
在服务器启动时,不会调用该方法。
当访问Servlet时,将调用该Servlet中的init方法。
但是注意,该方法在服务器运行期间仅仅运行一次。
一般用于初始化工作。 - destroy方法
用于销毁处理,在服务器关闭时将调用,因此一般用于清理工作。
仅仅运行一次。 - doGet和doPost方法
当客户端发出的数据已get方式进行提交,那么将会执行doGet方法。
当客户端发出的数据已post方式进行提交,那么将会执行doPost方法。 - 生命周期
Servlet生命周期由Servlet容器控制,分为初始化阶段、运行阶段、销毁阶段。
① 初始化阶段,Servlet容器开始加载Servlet类,把其Class文件中的数据读取到内存中,然后Servlet容器会读取ServletConfig对象,然后Servlet容器创建Servlet。
② 运行阶段
Servlet接收到一个请求,Servlet容器会针对这个请求创建ServletRequest和ServletResponse对象,然后调用service方法,此时service将会判断发出的请求方式,从而决定调用哪个方法(doGet或者doPost方法)。
③ 销毁阶段
Web应用终止时,Servlet容器会调用Servlet的destroy方法,然后销毁Servlet对象。同时会销毁ServletConfig。因此可以在销毁时关闭数据库连接以及Servlet占用的资源。在整个Web生命周期中只运行一次。
过滤器
Servlet过滤器是Java中非常有用的一种技术,其有用之处在于减少代码量。过滤器是用户请求和处理程序之间的一层处理程序。可以对用户请求和响应的结果进行处理,利用该特征可以实现字符编码处理、权限控制、访问控制等。
- 写过滤器 implements Filter
public class CharacterFilter implements Filter{
public void destroy() {
}
public void doFilter(ServletRequest request,
ServletResponse response,
FilterChain chain) throws IOException, ServletException {
}
public void init(FilterConfig config) throws ServletException {
}
}
Init方法会在服务器启动的时候调用。
Destroy方法会在服务器关闭的时候调用
doFilter会在访问对应的页面的页面时调用。和url-pattern相关
- 配置配置文件 web.xml
<filter>
<filter-name>CharacterFilter</filter-name>
<filter-class>com.xxx.CharacterFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CharacterFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
事件监听器
事件监听器用于监听一些重要事情的发生,监听器对象可以在事件发生前和事件发生后做出相应的处理。
Servlet上下文监听,表现为Servlet容器创建和销毁触发事件。
public class MyServletContextListener implements ServletContextListener {
public void contextDestroyed(ServletContextEvent arg0) {
System.out.println("--------destroy-------------");
}
public void contextInitialized(ServletContextEvent arg0) {
System.out.println("--------init-------------");
}
}