前言:今天看到一篇web服务器和应用服务器的关系,说实话。刚开始看到,我也不清楚这个概念。

所以就打算学习一波 

1.什么是web服务器 应用服务器和web容器

    web服务器可以理解为是以Http为核心,webUI为向导的应用。

    应用服务器 以高负载 企业级特性 事务和队列 多通道通信 HTTP或更多的特性

【java-Web】Web服务器 应用服务器以及web容器 理解_servlet容器

2.什么是web容器

在java方法web容器一般是指servlet容器,servlet容器是与java Servlet交互的web容器的组件,

  web容器负责管理Servlet的声明周期,把URL映射到特定的Servlet 确保URL请求拥有正确的访问权限和更多类似的服务。

  总的来说,servlet容器就是用来运行你的servlet和维护他的生命周期的运行环境

3.什么是servlet,他们有什么作用

  在java中,Servlet使你能够根据请求动态生成内容的服务端组件。

  类加载器通过懒加载lazy-loading eagerloading.每一个请求都拥有一个线程 而一个servlet对象可以同时为多个线程服务,当servlet对象不在被使用时,他就被JVM当做垃圾回收掉

4.什么是ServletContext 他由谁创建

  当Servlet容器启动时,他会部署并加载所有的web应用,当web应用被加载时。Servlet

  会一次性的为每个应用创建Servlet上下文(ServletContext),并把它保存在内存中。

  当Servet容器关闭时,他会卸载所有的web应用和ServlerContext.所有的Servlet Filter和Listenter

  实例都会销毁。【java-Web】Web服务器 应用服务器以及web容器 理解_web应用_02

5.ServletContext 定义了一组方法 Servlet使用这些方法来与他的Servet容器进行通信

在web应用的部署文件(deployment descriptor)标明“分布式”的情况下,web应用的每一个虚拟机都拥有一个上下文实例。在这种情况下,不能把Servlet上下文当做共享全局信息的变量(因为它的信息已经不具有全局性了)。可以使用外部资源来代替,比如数据库。

6.ServletRequest和ServletResponse从哪里进入生命周期

Servlet容器包含在web服务器中,web服务器监听来自特定的端口的Http请求。这个端口通常是80端口

 当客户端发送一个Http请求时 Servlet容器会创建新的HttpSerlvetRequest和httpSerlvetRespons

 对象,并且把他们传递给已经创建的Filter和URL模式与请求URL匹配的Servlet实例的方法,所有的这些

 都使用同一个线程。

 Request对象提供了获取Http请求的所有信息的入口,比如请求头和请求实体,

 Response对象提供了控制和发送Http响应的便利方法,比如设置响应头和响应实体(通常是Jsp生成的HTml),当http响应被提交并结束后,request和response对象都会被销毁【java-Web】Web服务器 应用服务器以及web容器 理解_web应用_03

7.如果管理Session cookie

  当客户端第一次访问web应用或者第一次使用request.getSession()获取HttpSession时。

  Servlet容器会创建session 生成一个Long类型的唯一Id(你可以使用session.getId);

  并把它保存在服务器中的内存中,Servlet容器同样会在Http响应里设置一个cookie cookie的名称

  JSessionID,并且cookie的值是session的唯一ID

8.如何确保多线程

 所有的Http请求都在共享Serlvet和Filter这是java的一个很棒的特性,他是多线程的并且不同的

 多线程可以使用同一个实例.否则为一个请求都重新创建一个实体会消费很多的资源

 你要知道 你不应该使用Servlet或者Filter的实例变量来存放任何的请求或会话范围内的数据

  这些数据会被其他Session的所有请求共享,这是非线程安全的。

代码演示

public class MyServlet extends HttpServlet
{
private Object thisIsNOTThreadSafe; //Don't to this

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
Object thisIsThreadSafe;

thisIsNOTThreadSafe = request.getParameter("foo"); // BAD!! Shared among all requests!
thisIsThreadSafe = request.getParameter("foo"); // OK, this is thread safe.
}
}


如中是因为每一个http请求都会创建一个MyServlet实例。在高并发的情况下,会出现成员变量不安全的因素。


所以为了应该将要操作的变量放到局部方法中。这样就能避免。

大概上就是这样 留个笔记 以后好复习--有什么不争取的 希望大家指正。qq 1137821448