一死生为虚诞,齐彭殇为妄作
昨天看到servlet的异步的返回数据,就想到了一个问题: > spring mvc 是怎么实现异步的返回数据的 > 并且servlet的规范中说:Dispatching from a synchronous servlet to an asynchronous servlet would be illegal. 是怎么的做到一个DispatchServlet 技能兼容同步的数据返回和异步的数据返回的?
请求:最常见的GET,POST的方法。如果cookie被禁用了,我们还可以把数据放到请求的Header中,利用HttpServletRequest 接口方法,servlet 可以访问 HTTP 请求的头信息。
servlet的上下文:ServletContext 接口定义了 servlet 运行在的 Web 应用的视图。容器供应商负责提供 servlet 容器的 ServletContext 接口的实现。servlet 可以使用 ServletContext 对象记录事件,获取 URL 引用的资源,存取当前上下文的其他 servlet 可以访问的属性。
每一个部署到容器的WEB应用,都会有一个ServletContext 实例与之关联起来。在容器分布在多台的虚拟机的情况下,每一个JVM的每一个Web应用都会有一个ServletContext实例。
servletContext 和 spring的beanFactory是通过什么关联起来的
~~~
~~~
public ContextLoaderListener(WebApplicationContext context) {
super(context);
}
/**
* Initialize the root web application context.
*/
public void contextInitialized(ServletContextEvent event) {
this.contextLoader = createContextLoader();
if (this.contextLoader == null) {
this.contextLoader = this;
}
this.contextLoader.initWebApplicationContext(event.getServletContext());
}
这一部分也可以说明一下,记录一遍下一次的寻找。Mark。
过滤器: 当容器接收到传入的请求时,它将获取列表中的第一个过滤器并调用doFilter 方法,传入 ServletRequest 和 ServletResponse,和一个它将使用的 FilterChain 对象的引用。 过滤器的 doFilter 方法通常会被实现为如下或如下形式的子集:
1.该方法检查请求的头。
2.该方法可以用自定义的 ServletRequest 或 HttpServletRequest 实现包装请求对象为了修改请求的头或数据。
3.该方法可以用自定义的 ServletResponse 或 HttpServletResponse实现包装传入 doFilter 方法的响应对象用于修改响应的头或数据。
4.该过滤器可以调用过滤器链中的下一个实体。下一个实体可能是另一个过滤器,或者如果当前调用的过滤器是该过滤器链配置在部署描述符中的最后一个过滤器,下一个实体是目标Web资源。调用FilterChain对象的doFilter方法将影响下一个实体的调用,且传入的它被调用时请求和响应,或传入它可能已经创建的包装版本。 由容器提供的过滤器链的doFilter方法的实现,必须找出过滤器链中的下一个实体并调用它的doFilter方法,传入适当的请求和响应对象。另外,过滤器链可以通过不调用下一个实体来阻止请求,离开过滤器负责填充响应对象。 service 方法必须和应用到 servlet 的所有过滤器运行在同一个线程中。
5.过滤器链中的下一个过滤器调用之后,过滤器可能检查响应的头。
6.另外,过滤器可能抛出一个异常以表示处理过程中出错了。如果过滤器在 doFilter 处理过程中抛出 UnavailableException,容器必须停止处理剩下的过滤器链。 如果异常没有标识为永久的,它或许选择稍候重试整个链。
7.当链中的最后的过滤器被调用,下一个实体访问的是链最后的目标servlet 或资源。
8.在容器能把服务中的过滤器实例移除之前,容器必须先调用过滤器的destroy 方法以便过滤器释放资源并执行其他的清理工作。
Filter的基本的代码:
boolean preHandle(ServletRequest request, ServletResponse response) throws Exception
void postHandle(ServletRequest request, ServletResponse response) throws Exception
void afterCompletion(ServletRequest request, ServletResponse response, Exception exception) throws Exception;
回话:这个和cookie在上面说过,是为了保存每次请求的状态的,具体的创建的代码在:
/**
* The default behavior of this method is to return getSession(boolean create)
* on the wrapped request object.
*/
public HttpSession getSession(boolean create) {
return this._getHttpServletRequest().getSession(create);
}
tomcat或者说servlet的容器是如何保存Session的? mark
事件监听器:Servlet 事件监听器支持在 ServletContext、HttpSession 和ServletRequest 状态改变时进行事件通知。Servlet 上下文监听器是用来管理应用的资源或 JVM 级别持有的状态。HTTP 会话监听器是用来管理从相同客户端或用户进入 web 应用的一系列请求关联的状态或资源。Servlet 请求监听器是用来管理整个 Servlet 请求生命周期的状态。异步监听器是用来管理异步事件,例如超时和完成异步处理。
下面标记的这个ServletContextListener,也可以说明spring是如何把beanFactory和http的Servlet结合起来的。
这种监听的机制,就能够保证spring监听到servlet的加载的过程,然后使用spring的容器的配置和初始化成为可能。
安全: URL映射到servlet:在收到客户端请求时,web 容器确定转发到哪一个 Web 应用。选择的 Web 应用必须具有最长的上下文路径匹配请求 URL 的开始。当映射到Servlet 时,URL 匹配的一部分是上下文。
附上spring中URL的请求的路径: