1、启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取
2、创建一个ServletContext(servlet上下文),这个web项目的所有部分都将共享这个上下文。
3、容器将
4、容器创建
context-param,它用于向 ServletContext提供键值对,即应用程序上下文信息
context-param -> listener -> filter -> servlet
在servlet的配置当中,
当值为0或者大于0时,表示容器在应用启动时就加载这个servlet; 当是一个负数时或者没有指定时,则指示容器在该servlet被选择时才加载。 正数的值越小,启动该servlet的优先级越高。
1 servlet
1 接收请求数据:我们都知道客户端请求会被封装成HttpServletRequest对象,里面包含了请求头、参数等各种信息。
2 处理请求:通常我们会在service、doPost或者doGet方法进行接收参数,并且调用业务层(service)的方法来处理请求。
3 完成响应:处理完请求后,我们一般会转发(forward)或者重定向(redirect)到某个页面,转发是HttpServletRequest中的方法,重定向是HttpServletResponse中的方法,两者是有很大区别的。
servlet生命周期:
Servlet的生命周期方法:
> void init(ServletConfig)
servlet的初始化方法,只在创建servlet实例时候调用一次,Servlet是单例的,整个服务器就只创建一个同类型Servlet
> void service(ServletRequest,ServletResponse)
servlet的处理请求方法,在servle被请求时,会被马上调用,每处理一次请求,就会被调用一次。ServletRequest类为请求类,ServletResponse类为响应类
> void destory()
servlet销毁之前执行的方法,只执行一次,用于释放servlet占有的资源,通常Servlet是没什么可要释放的,所以该方法一般都是空的
Servlet的其他重要方法:
> ServletConfig getServletConfig()
获取servlet的配置信息的方法,所谓的配置信息就是WEB-INF目录下的web.xml中的servlet标签里面的信息
> String getServletInfo()
获取servlet的信息方法
Servlet的配置:
Dispatcher
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:dispatcher.xml
1
Dispatcher
*.do
2 filter
(1)生命周期:init(),filter();destory();
(2)语法
Filter的别名
Filter的全类名
别名
需要Filter拦截的资源地址
(3)url-pattern匹配语法
1.精确匹配:只有当目标资源的地址和url-pattern的地址一模一样时,Filter才会拦截资源
例子:/2.jsp , 只有当浏览器访问项目根目录下的2.jsp时,才会调用Filter
2.路径匹配:当访问的资源在url-pattern配置的路径下时,Filter就会拦截资源。
例子1:/hello/* , 只要访问项目根目录下hello下的资源,就会调用Filter。
例子2:/* , 会拦截项目根目录下所有资源
3.后缀匹配:只要访问的资源地址和url-pattern的后缀一样就会调用Filter
例子:*.jsp 只要是以jsp结尾的请求都会拦截
(4)主要作用
//依赖于servlet容器,基于filter接口中的doFilter回调函数,interceptor则基于Java本身的反射机制;
比如编码过滤;
3 listener
可以监听Application、Session、Request对象,当这些对象发生变化就会调用对应的监听方法。
(1)生命周期监听:ServletContextListener,它有两个方法,一个在出生时调用,一个在死亡时调用;
void contextInitialized(ServletContextEvent sce):创建Servletcontext时
void contextDestroyed(ServletContextEvent sce):销毁Servletcontext时
(2)属性监听:ServletContextAttributeListener,它有三个方法,一个在添加属性时调用,一个在替换属性时调用,最后一个是在移除属性时调用。
void attributeAdded(ServletContextAttributeEvent event):添加属性时;
void attributeReplaced(ServletContextAttributeEvent event):替换属性时;
void attributeRemoved(ServletContextAttributeEvent event):移除属性时;
(3) HttpSession(Session监听)
生命周期监听:HttpSessionListener,它有两个方法,一个在出生时调用,一个在死亡时调用;
voidsessionCreated(HttpSessionEvent se):创建session时
void sessionDestroyed(HttpSessionEvent se):销毁session时
(4)属性监听:HttpSessioniAttributeListener,它有三个方法,一个在添加属性时调用,一个在替换属性时调用,最后一个是在移除属性时调用。
(5)ServletRequest(监听Request)
生命周期监听:ServletRequestListener,它有两个方法,一个在出生时调用,一个在死亡时调用;
voidrequestInitialized(ServletRequestEvent sre):创建request时
void requestDestroyed(ServletRequestEvent sre):销毁request时
(6) 属性监听:ServletRequestAttributeListener,它有三个方法,一个在添加属性时调用,一个在替换属性时调用,最后一个是在移除属性时调用。
voidattributeAdded(ServletRequestAttributeEvent srae):添加属性时
void attributeReplaced(ServletRequestAttributeEvent srae):替换属性时
void attributeRemoved(ServletRequestAttributeEvent srae):移除属性时
监听实例:可以监听在线用户数
/**
* HttpSessionListener 监听器
*/
@WebListener
public class MyHttpSessionListener implements HttpSessionListener{
//当前用户数
private int userCounts=0;
@Autowired
CustomUserDetailService customUserDetailService;
@Autowired
SessionRegistry sessionRegistry;
@Override
public void sessionCreated(HttpSessionEvent se) {
//sessionCreated 用户数+1
userCounts++;
//重新在servletContext中保存userCounts
se.getSession().getServletContext().setAttribute("userCounts", userCounts);
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
//sessionDestroyed 用户数-1
userCounts--;
//重新在servletContext中保存userCounts
se.getSession().getServletContext().setAttribute("userCounts", userCounts);
ArrayList userList=(ArrayList) se.getSession().getServletContext().getAttribute("userList");
String sessionId=se.getSession().getId();
//如果当前用户在userList中 在session销毁时 将当前用户移出userList
User remove = SessionUtil.getUserBySessionId(userList, sessionId);
if(remove!=null){
userList.remove(remove);
}
// 将userList集合 重新保存到servletContext
se.getSession().getServletContext().setAttribute("userList", userList);
sessionDestroyed(se);
}
}