zoukankan      html  css  js  c++  java
  • 【java-Web】Web服务器 应用服务器以及web容器 理解

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

    所以就打算学习一波 

    1.什么是web服务器 应用服务器和web容器
        web服务器可以理解为是以Http为核心,webUI为向导的应用。

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

    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
      实例都会销毁。
    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对象都会被销毁
    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

  • 相关阅读:
    变量和基本数据类型,深浅拷贝问题
    计算机系统与编程语言分类
    关于计算机硬件的基本知识
    Python学习之路——函数
    Python学习之路——Day06 元组
    day--07
    数据类型——可变不可变类型
    数字类型
    流程控制——while循环
    流程控制——if判断
  • 原文地址:https://www.cnblogs.com/qxlxi/p/12860949.html
Copyright © 2011-2022 走看看