一、web.xml的配置就是主要包括Java web的三大组件:
servlet、filter、listener
1. servlet
1)servlet标准接口包括: init()/service(request,response)/destroy();不要想得太复杂,servlet就是如下一点点的方法。不管什么spring还是啥,万变不离其宗!!
package javax.servlet;
import java.io.IOException;
public interface Servlet {
void init(ServletConfig var1) throws ServletException;
ServletConfig getServletConfig();
void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
String getServletInfo();
void destroy();
}
2) 所有实现类必须继承于javax.servlet.servlet并实现以上三个方法。因为有这个三个方法才会被容器Tomcat所识别调用!这是约定好的!
3)由service(request,response)处理请求并返回响应。即使httpServlet也是实现了service方法再从这个方法分散为6个请求处理类型:
doPost()/doGET()/doDelete()....对应HTTP几个请求类型!
4)当Tomcat接收到客户端请求的时候,会创建响应的servletRequest和servletResponse对象并传给对应的servlet,调用其service()方法!!
5)把servlet丢进Tomcat咯(配置web.xml,让Tomcat知道它的存在!!!)刷存在感咯~
//定义一个servlet(名称)和指定它的实现类:这里使用的是spring servlet总管(它也是servlet的一个实现类)
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
//对于上面定义的servlet,配置访问它的URL请求路径:这里表示带*.do的方式
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
2. Filter
1)所有的servlet过滤器类都必须要实现javax.servlet.Filter接口
package javax.servlet;
import java.io.IOException;
public interface Filter {
default void init(FilterConfig filterConfig) throws ServletException {
}
void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException;
default void destroy() {
}
}
2)在web.xml中配置好Filter之后(也就是告知Tomcat容器)。当有客户请求过滤器关联的URL时,servlet容器将先调用过滤器的doFilter方法。
3)FilterChain用于抛向下一个过滤器的参数。形成一个过滤器链(多个过滤器连接在一起)。请求必须通过这么多的过滤器链之后才能得到后台处理响应!
4)web.xml中关于filter的配置:
先定义一个filter(名字)和实现类:自己实现的Filter类!!!定义filter必须放在关联URL配置前面!
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
//关联指定的URL请求!这里/*表示拦截所有的请求!!!
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
5)如果有过滤器的存在,请求的时候要经过过滤器,响应的时候也要经过过滤器!!
3. Listener监听器
package java.util;
/**
* A tagging interface that all event listener interfaces must extend.
* @since JDK1.1
*/
public interface EventListener {
}
.....
package javax.servlet;
import java.util.EventListener;
public interface ServletRequestListener extends EventListener {
default void requestDestroyed(ServletRequestEvent sre) {
}
default void requestInitialized(ServletRequestEvent sre) {
}
}
1. 监听器也是一个实现特定接口的普通Java程序!!!这个程序专门用于监听另一个Java对象的方法调用或者属性改变!!!
2. servlet监听器主要分为三大类:上下文事件、会话事件、请求事件(URL请求时候!!)!!
2.1 与servlet相关的listener都最终继承于EventListener!!他们涵盖了servlet声明周期中你感兴趣的每个事件!!
3. 例如:ServletContext变化而触发的监听器的响应具体包括:在服务器启动时,ServletContext被创建的时候,服务器关闭时,ServletContext将被销毁的时候等。
我们在spring中,想要在服务器启动时就加载spring容器完成依赖注入的配置如下:
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
ContextLoaderListener的作用就是启动Web容器时,自动装配ApplicationContext.xml的配置信息。因为它实现了ServletContextListener这个接口,在web.xml配置这个监听器,启动容器时,就会默认执行它实现的方法。
ApplicationContext.xml这个配置文件部一般默认放置在。applicationContext的默认的路径是”/WEB-INF/applicationContext.xml。也可以在web.xml中配置该文件的其他位置,配置如下:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:applicationContext.xml
classpath:applicationContext-security.xml;
</param-value>
</context-param>
以下详解
org.springframework.web.context.ContextLoaderListener类实现了javax.servlet.ServletContextListener接口。ServletContextListener接口能够监听ServletContext对象的生命周期,因为每个web应用仅有一个ServletContext对象,故实际上该接口监听的是整个web应用。
实现该接口的类在web.xml中作为监听器配置后,当web应用启动后,会触发ServletContextEvent事件,调用ContextLoaderListener的contextInitialized(ServletContextEvent sce)方法。
ContextLoaderListener通过一个ContextLoader对象来初始化Spring容器。在contextInitialized方法中调用contextLoader.initWebApplicationContext(event.getServletContext())。
ContextLoader类的initWebApplicationContext方法即可返回一个WebApplicationContext对象context。并通过 servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, context)将WebApplicationContext对象放置在ServletContext对象中。initWebApplicationContext方法通过调用以下方法实例化并设置WebApplicationContext对象。