web.xml加载顺序

1 顺序

1、启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取两个结点。 

2、创建一个ServletContext(servlet上下文),这个web项目的所有部分都将共享这个上下文。 

3、容器将转换为键值对,并交给servletContext。 

4、容器创建中的类实例,创建监听器。 

context-param,它用于向 ServletContext提供键值对,即应用程序上下文信息

context-param -> listener -> filter -> servlet

2 Load-on-startup

在servlet的配置当中,5的含义是: 标记容器是否在启动的时候就加载这个servlet。 

当值为0或者大于0时,表示容器在应用启动时就加载这个servlet; 当是一个负数时或者没有指定时,则指示容器在该servlet被选择时才加载。 正数的值越小,启动该servlet的优先级越高。 

3 java web的三大组件

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);
    }

}

 

 

你可能感兴趣的:(java基础)