在工作中每天都在使用各种框架,久而久之你是否已经忘记了当初在web.xml中配置Servlet中的日子,你是否还记得Filter,ServletCointextListener他们的作用都是什么,触发时机是什么?这些组件是一切的基石,我们不应该忘记。正是这些扩展点,让一切成为可能。
java Servlet是和平台无关的服务器组件,它运行在Servlet容器中,Servlet容器负责Servlet和客户的通信以及调用Servelt方法,Servlet和客户的通信采用的是“请求/响应”。Servlet是一组规范,具体化就是两个jar文件,servlet-api.jar 和 jsp-api.jar 规范了Servlet接口,Filter接口,Listener接口,ServletRequest接口,ServletResponse接口等。Serlvet3.1规范
Servlet运行在Servlet容器(如Tomcat,JBoss)中,Serlvet容器为JavaWeb应用提供运行时环境,它负责管理Servlet和JSP的声明周期。
回想一下最“单纯”的日子
一切的开始都是那么的简单直接。Tomcat启动,加载web.xml文件,web.xml文件中配置信息又以节点,节点将请求与具体的处理类关联起来。经过简单的封装就成了之前常j继承扩展的HttpServelt。(经过复杂的封装就是Spring-MVC)
web.xml 中配置
<servlet>
<!--关联servelt-->
<servlet-name>testController</servlet-name>
<!--全类名确定处理Serlet类-->
<servlet-class>com.tttiger.controller.TestController</servlet-class>
<!--其他自定义参数-->
<init-param>
<param-name>param</param-name>
<param-value>world</param-value>
</init-param>
</servlet>
<servlet-mapping>
<!--关联servelt-->
<servlet-name>testController</servlet-name>
<!--匹配请求路径-->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
处理请求Servlet
package com.tttiger.controller;
import javax.servlet.*;
import java.io.IOException;
public class TestController implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("Serlvet初始化");
System.out.println("初始化参数:"+servletConfig.getInitParameter("param"));
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("处理请求");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
System.out.println("Servlet容器销毁");
}
}
Filter
Filter的基本功能是对Servlet容器调用Servlet的过程进行拦截,从而在Servelt相应先后进行一些特殊功能的处理。(之后的各种鉴权框架Shiro,SpringSecurity都已此为基石扩展)
package com.tttiger.controller;
import javax.servlet.*;
import java.io.IOException;
public class TestFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println( filterConfig.getInitParameter("param"));
}
@Override
public void destroy() {
System.out.println("Servlet容器销毁");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("拦截请求前");
// 交给下一下拦截器处理
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("拦截请求后");
}
}
Listener
各种Listener用于监听其他应用相关对象的变化,例如ServletContextListener用于监听Web应用的生命周期。
package com.tttiger.controller;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class TestServletContextListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("容器初始化");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("容器销毁");
}
}
ServletContextAttributeListener:用于监听Request.setAttribute()或Request.removeAttribute()。(请求域设置属性)
HttpSessionListener:用于监听Session的创建与销毁
HttpSessionBindingListener:用于监听Session.setAttribute()或Session.removeAttribute()。
HttpSessionActivationListener:用于监听Sesssoin的钝化与活化。(Session的序列化与反序列化)