Jetty一些问题

文章目录

      • 1.说说 jetty 与 tomcat 的区别。
      • 2.如何修改 jetty 默认端口?如何修改 tomcat 默认端口?
      • 3.如何启动 jetty 服务器?
      • 4.简述 Servlet 的生命周期。
      • 5.Servlet如何处理用户的请求?
      • 6.说说 get 请求和 post 的请求的区别。
      • 7.说说相对地址与绝对地址的区别。
      • 8.说说请求重定向与请求转发的区别。
      • 9. jsp 有哪九大内置对象?servlet 如何获取 session 和application 对象?
      • 10.什么是单例?单例有哪些设计模式?

1.说说 jetty 与 tomcat 的区别。

  • 先说说 Servlet:Servlet 就是一种用来处理网络请求的一套规范。

  • Jetty 是一个开源的 HTTP 服务器和 Servlet 容器,它可以为 JSP 和 Servlet 提供运行时环境。简单来说,Jetty Server就是由多个Connector(连接器)、多个Handler(处理器),以及一个线程池组成。整体结构请看下面这张图。

Jetty一些问题_第1张图片

  • Tomcat 是 Servlet 容器,同时它也包括了 web 服务器的功能,在 tomcat 上部署应用程序时,我们是把应用程序放在 tomcat 根路径下的 webapps 文件夹下, 而这个文件下可以放置多个应用程序,我们可以通过请求来决定具体访问那个应用。
    Jetty一些问题_第2张图片

  • 相同点:都是一种 Servlet 容器,他们都支持标准的 servlet 规范和 JavaEE 规范;

  • 不同点:

    • 由上边图可以看出,Jetty 的架构比 Tomcat 更为简单,Jetty 是基于 Handler 来实现的,主要的扩展功能都可以用 Handler 来实现,扩展简单;Tomcat 的架构是基于容器设计的,进行扩展时需要了解 Tomcat 的整体设计结构,不易扩展;
    • Jetty 和 Tomcat 性能方面差异不大,Jetty 可以同时处理大量连接而且可以长时间保持连接,适合于 web 聊天应用等,Jetty 的架构简单,可以按需加载组件,减少不需要的组件,减少服务器内存开销,从而提高服务器性能,Jetty 默认采用 NIO 结束在处理 I/O 上更占优势,在处理静态资源时,性能较高;Tomcat适合处理少数非常繁忙的连接,也就是说如果生命周期短的话,Tomcat 性能更高,Tomcat 默认采用 BIO 处理 I/O 请求,在处理静态资源时,性能较差。
    • Jetty 默认使用 utf-8 字符集,不存在中文乱码情况;Tomcat 默认使用 ISO_8859_1 字符集,经常有中文乱码。
    • Jetty 更满足有云的分布式环境需求,而 Tomcat 更符合企业级环境。

2.如何修改 jetty 默认端口?如何修改 tomcat 默认端口?

  • Jetty:首先,下载安装 Jetty 之后,打开其安装文件夹,会看到 start.ini 配置文件,找到jetty.http.port 这一配置项,将其去掉注释修改为自定义的端口,修改完之后,保存并退出,重启 Jetty 后生效;
    在这里插入图片描述

  • Tomcat:首先,下载安装 Tomcat 之后,进入 conf 目录,打开 server.xml 文件,修改port 这项,将 8080 修改为自己想要的端口号, 修改完记得保存重新启动 tomcat 服务器,打开浏览器在最上面的地址栏输入http://localhost:xxxx/ 出现 Tomcat 页面就修改成功;
    在这里插入图片描述

3.如何启动 jetty 服务器?

  • 在 DOS 窗口进入到安装 Jetty 的目录下,输入java -jar start.jar 启动欧冠 Jetty:
    Jetty一些问题_第3张图片

4.简述 Servlet 的生命周期。

  • 生命周期一般分为三个阶段:
    • 初始化阶段:调用 init() 方法;
    • 响应客户请求阶段:调用 service() 方法(doGet() 和doPost() );
    • 终止阶段:调用 destroy() 方法;
  • doGet() 是通过 http 和 header 来传输数据,doPost() 是通过 http 和 body 来传输数据;

5.Servlet如何处理用户的请求?

Jetty一些问题_第4张图片

  • 浏览器向 web 服务器发送了 HTTP 请求;
  • web 服务器(Servlet 容器)接受浏览器的请求;
  • web 服务器创建一个 HttpServletRequest 对象,将浏览器请求的信息封装到这个对象中;
  • web 服务器创建一个 HttpServletResponse 对象;
  • web 服务器调用 Servlet 对象的 service() 方法,把 HttpServletRequest 对象和 HttpServletResponse 作为参数传给 Servlet 对象;
  • Servlet 调用 HttpServletRequest 对象的有关方法,获取 Http 的请求信息;
  • Servlet 调用 HttpServletResponse 对象的有关方法,生成响应数据;
  • web 服务器把 Servlet 响应结果传给浏览器。

6.说说 get 请求和 post 的请求的区别。

  • get 用于获取数据,而 posy 一般用于提交数据;
  • get 参数有长度限制(受限于 url 长度),而 post 无限制;
  • get 产生一个 TCP 数据包,而 post 产生两个数据包;
  • 后退页面时,get 没有影响, post 会再次提交请求;

7.说说相对地址与绝对地址的区别。

  • 相对地址:就是被链接文件相对于当前页面的地址;
  • 绝对地址:就是文件在网络或本地的绝对位置;
  • 一般来说,比较少用绝对地址,绝对地址只针对自己的电脑有用,放到别的设备上就不起作用了,除非在别人的设备上相同路径下有相同的文件。大部分选择使用相对路径,即使换了一台设备,也是可以继续使用的。

8.说说请求重定向与请求转发的区别。

  • 请求重定向:

    客户端行为,response.sendRedirect() 从本质上讲等同于两次请求,前一次请求对象不会保存,地址栏的 URL 会变,客户端请求服务器,服务器返回重定向,客户端再自动请求重定向地址;

  • 请求转发:

    服务器行为,request.getRequestDispather().forward(req,resp) 是一次请求,转发后请求对象会保存,地址栏的 URL 地址不会变,客户端请求服务器,服务器内部请求其他地址。

9. jsp 有哪九大内置对象?servlet 如何获取 session 和application 对象?

  • 九大内置对象:

    Jsp 内置对象 功能
    out 向客户端输出数据
    request 向客户端请求数据
    response 封装了 jsp 产生的响应,然后被发送到客户端以响应客户的请求
    application 从servlet配置对象中获得servlet上下文
    config 表示Servlet的配置,当一个Servlet初始化时,容器把某些信息通过此对象传递给这个Servlet
    page Jsp实现类的实例,它是jsp本身,通过这个可以对它进行访问
    pagecontext 为JSP页面包装页面的上下文。管理对属于JSP中特殊可见部分中己经命名对象的该问
    session 用来保存每个用户的信息,以便跟踪每个用户的操作状态
    exception 反映运行的异常
  • 获取 session 和 application 对象:

    session 可以通过 request.getSession(); 来获取
    application 可以通过 this.getServletContext() 来获取
    

10.什么是单例?单例有哪些设计模式?

  • 单例:就是独一无二的意思,放到生活中比如太阳,进入程序中,就是在这个程序运行中,最多只能有一个实例化对象;

  • 设计模式:

    • 饿汉式:

      public class Hungry{
          private static Hungry hungry = new Hungry();
          
          private Hungry(){
              
          }
          
          public static Hungry instance(){
              return hungry;
          }
      }
      

      这种方式不会产生线程安全问题,因为在 JVM 中,对类的加载和类初始化,由虚拟机保证线程安全;

      优点:没有枷锁,执行效率会提高;

      缺点:浪费内存;

    • 懒汉式:

      public class Lazy {
          private static Lazy lazy;
      
          private Lazy() {
          }
      
          public static Lazy instance() {
              if (lazy == null) {
                  lazy = new Lazy();
              }
              return lazy;
          }
      
      }
      

      可以在 instance() 时再创建对象,所以称为懒汉式。这种实现最大的问题就是不支持多线程,存在线程安全问题。

你可能感兴趣的:(Jetty一些问题)