JavaEE课后作业0213-jetty基础设置、servlet基础、get与post区别详解、请求转发与重定向区别、单例的六种设计模式

文章目录

    • 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的区别。

  1. jetty相对于Tomcat更轻量级。Tomcat除了遵守Java Servlet规范之外,还扩展了大量的JavaEE特性,用来满足企业级别的需求,因此Tomcat更重量级
  2. jetty灵活。节省资源。相对于普通的互联网应用,不需要用到Tomcat的其他高级特性,在此情况下,Tomcat更加浪费资源。尤其是放在分布式的情况下,更加明显,让jetty在处理高并发细粒度请求的场景下更加的快速高效。
  3. jetty的灵活性还体现在可拔插性和可扩展性上,易于对jetty的二次开发,而Tomcat过于笨重。
  4. 在面对大规模的企业级应用时,Tomcat更加的符合企业的需求。也就是Jetty更满足公有云的分布式环境的需求,而Tomcat更符合企业级环境。
  5. jetty的默认编码是UTF-8,所以不会有乱码问题;而Tomcat采用的编码方式是ISO_8859_1,也就是LATIN1编码,会产生乱码问题

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

  1. 修改jetty默认端口:使用记事本打开jetty安装目录下的start.ini文件,找到下面代码位置,设置端口,默认的是8080

    ##Connector port to listen on  
    jetty.http.port=8888
    
  2. 修改Tomcat默认端口:使用记事本打开Tomcat安装目录下的conf目录下的server.xml文件,找到下面代码,设置端口,默认的是8080

    <Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8443" />
    

3.如何启动jetty服务器

  1. 打开jetty的安装路径,有一个start.jar文件,使用cmd命令行,先进入start.jar的目录,使用命令java -jar start.jar运行

4.简述Servlet的生命周期。

  1. 第一次请求(service()方法调用doGet()方法和doPost()方法)

                                doGet()方法
    构造方法-->初始化init()方法-->service()方法-->销毁destroy()方法doPost()方法
    
  2. 非第一次请求(Servlet已经驻留内存了)

            doGet()方法service()方法-->销毁destroy()方法doPost()方法
    

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

  1. 单例多线程处理,每一个Servlet只有一份存在,因为是多线程处理,所以会有线程安全问题,在设计程序的时候要考虑进去。

6.get请求和post的请求的详细区别

  1. 产生数据包个数:get请求产生一个TCP数据包;post请求产生两个TCP数据包

    对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。但是并不是所有的浏览器post请求都会发送两次数据包(Firefox一次)

  2. 参数位置:get请求的参数在url中可以看到,而post请求不会,所以post请求更安全

  3. 参数数据类型:get请求只接受ASCII字符,而post请求没有限制

  4. 参数长度:get请求在URL中的传参长度是有限制的,而post没有

  5. 浏览器历史记录:get亲贵的参数会被完整的保存在浏览器的历史记录里面,而post中的参数不会被保留

  6. 回退时:get请求回退时是无害的,而post请求会再次提交请求

  7. 参数传递:get参数通过URL传递,post放在Request body中

  8. 参数长度限制:浏览器通常都会限制url长度在2K个字节,(大多数)服务器最多处理64K大小的url,所以get请求的参数长度有限制。

  9. get请求也可以在request body偷藏数据,但是不同服务器的处理方式不同,有些服务器会帮你读出数据,有些服务器直接忽略,所以,虽然GET可以带request body,也不能保证一定能被接收到

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

  1. 举例:对于西安人来说,你给一个西安人说去大雁塔玩,他就知道是哪儿。但是对于一个外国游客,你就要说中国陕西西安大雁塔,这就是相对地址与绝对地址
  2. 相对地址是根据一个基准点去找的(比如从当前项目下找),而绝对路径是从磁盘根目录开始找的
  3. 相对路径在拷贝文件时比较好用,拷过去的文件在原来的项目底下,相对路径不变,拷贝过去直接使用,而绝对路径因为每个人磁盘存储路径不一致,很可能报错
  4. 绝对路径不容易出错,但是麻烦

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

  1. 请求重定向:本质上是两次请求,两个Servlet对象,所以地址栏的url会变化,Servlet属性不保存

    客户端—>服务器—>重定向—>客户端请求其他地址

    多使用在需要身份权限验证的使用,在权限不明确的时候要求重新登录

  2. 请求转发:本质是一次请求,一个Servlet,所以地址栏的url不变,Servlet属性保存

    客户端—>服务器—>服务器内部请求其他的地址

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

  1. jsp9大内置对象

    out、page、request、response、session、application、exception、pageContext、config

  2. 常用的4个

    request、response、session、application

  3. 获取session和application对象

    request.getSession()

    request.getServletContext()

10.什么是单例?单例的设计模式

  1. 单例:最多只有一份,不会有多余的。单例模式的目的是使得类的一个对象成为系统中的唯一实例,“阻止”所有想要生成对象的访问
  2. 单例设计模式
    1. 懒汉式—线程不安全:最基础的实现方式,线程上下文单例,不需要共享给所有线程,也不需要加synchronize之类的锁,以提高性能
    2. 懒汉式—线程安全:加上synchronize之类保证线程安全的基础上的懒汉模式,相对性能很低,大部分时间并不需要同步
    3. 饿汉方式。指全局的单例实例在类装载时构建。
    4. 双检锁式。在懒汉式基础上利用synchronize关键字和volatile关键字确保第一次创建时没有线程间竞争而产生多个实例,仅第一次创建时同步,性能相对较高
    5. 登记式。作为创建类的全局属性存在,创建类被装载时创建
    6. 枚举。java中枚举类本身也是一种单例模式
  3. 实现要点
    1. 某个类只能有一个实例(单例模式的类只提供私有的构造函数)
    2. 该类必须自行创建这个实例(类定义中含有一个该类的静态私有对象)
    3. 该类必须自行向整个系统提供这个实例(提供了一个静态的公有的函数用于创建或获取它本身的静态私有对象)
  4. 优缺点
    1. 实例控制,确保所有对象都访问唯一实例
    2. 类可以灵活更改实例化过程
    3. 每次对象请求引用时都要检查是否存在类的实例,需要一些开销(通过使用静态初始化解决)
    4. 不能解决删除单个对象的问题,在提供内存管理的语言中,只有该单例类能够导致实例被删除;而在一些语言中,其他类可以删除对象实例,会导致单例类中出现悬浮引用。