Java面试题(三)


title: Java面试题(三)
date: 2021-6-14
updated: 2021-6-14
tags:

  • Java
    categories:
  • 面试
  • Java面试题(三)

GenericServlet和HttpServlet有什么区别/h2>

GenericServlet

GenericServlet 类实现了Servlet和 ServletConfig 接口。实现了除了service()之外的其他方法,在创建Servlet对象时,可以继承 GenericServlet 类来简化程序的代码,但需要实现 service() 方法。

这是 Java 体系一惯的做法,给接口搭配一个抽象类**,对一些通用的方法做实现,其余方法给出空的实现(必须由子类实现的方法除外)**,这样程序员开发时直接继承该抽象类,可以大大减少代码数量,避免了实现所有接口方法的呆板操作。

HttpServlet

针对 HTTP 请求,再次对 GenericServlet 方法进行简化,在 service 方法中把传入的 ServletReuqest 和 ServletResponse 转为 HttpServletRequest 和 HttpServletResponse,方便处理HTTP请求。

并且 HttpServlet 还提供了 doGet 和 doPost 方法,更加适用与 HTTP 协议,实际开发中,直接继承 HttpServlet,并根据请求方式复写 doXxx() 方法即可。

解释下Servlet的生命周期。

Servlet 程序是由 WEB 服务器调用,web 服务器收到客户端的 Servlet 访问请求后:

  1. Web 服务器首先检查是否已经装载并创建了该 Servlet 的实例对象。如果是,则直接执行第 ④ 步,否则,执行第 ② 步。
  2. 装载并创建该 Servlet 的一个实例对象。
  3. 调用Servlet实例对象的 init() 方法。
  4. 创建一个用于封装 HTTP 请求消息的 HttpServletRequest 对象和一个代表 HTTP 响应消息的HttpServletResponse 对象,然后调用 Servlet 的 service() 方法并将请求和响应对象作为参数传递进去。
  5. WEB 应用程序被停止或重新启动之前,Servlet 引擎将卸载 Servlet,并在卸载之前调用 Servlet 的 destroy() 方法。

  • HTTP请求由状态行、请求头、请求正文三部分组成:
    • 请求行:包括请求方式Method、资源路径URL、协议版本Version;
    • 请求头:包括一些访问的域名、用户信息、Cookie等信息;
    • 请求正文:就是HTTP请求的数据。

Java面试题(三)

什么是cookieession和cookie有什么区别/h2>

cookie 实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户的状态,就使用response 向客户端浏览器颁发一个 cookie 。客户端浏览器会把 cookie 保存起来。当浏览器再次请求该 站时,浏览器就会把请求地址和 cookie 一同给服务器。服务器检查该 cookie,从而判断用户的状态。服务器还可以根据需要修改 cookie 的内容。

session 是另一种记录客户状态的机制。不同的是 cookie 保存在客户端浏览器中,而 session 保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上,这就是 session。客户端浏览器再次访问时只需要从该 session 中查找该客户的状态就可以了。 如果说 cookie 机制是通过检查客户身上的“通信证”,那么 session 机制就是通过检查服务器上的“客户明细表”来确认客户身份。

第一次访问时,服务器会创建一个新的 session,并且把 session 的 Id 以 cookie 的形式发送给客户端浏览器。第二次访问时候,浏览器交出 cookie ,服务器找到对应的 Session 。当浏览器禁用了cookie 后,用URL 重写(后面带上一个类似 cookie 的东西)这种解决方案解决 Session 数据共享问题。

总结:

1、存储位置不同,Cookie在浏览器端存储,Session在服务器端存储;

2、存储容量不同,Cookie存储容量很小,Session存储容量可以很大;

3、安全性不同,Cookie安全性较低,Session安全性很高;

浏览器和Servlet通信使用的是什么协议/h2>

HTTP

什么是HTTP隧道/h2>

什么是HTTP隧道,怎么理解HTTP隧道呢

HTTP隧道是一种利用HTTP或者是HTTPS把多种 络协议封装起来进行通信的技术。因此,HTTP协议扮演了一个打通用于通信的 络协议的管道的包装器的角色。把其他协议的请求掩盖成HTTP的请求就是HTTP隧道。

有时候需要访问服务器除了80端口之外的其他端口,但是服务器上装有的防火墙软件 会阻止客户端访问除了80端口之外的其他端口,这个时候需要将访问其他端口的协议“包装”一下 变成访问80端口的http协议,这个就是http隧道

sendRedirect() 和 forward() 方法有什么区别/h2>

URL重定向的特点:

  • 浏览器地址栏路径发送变化
  • 发送了两个请求
  • 因为是不同的请求,所以不能共享请求中的数据
  • 可以跨域访问资源
  • 不可以访问 WEB-INF 中的资源

请求转发的特点:

  • 浏览器地址栏路径没变
  • 只发送了一个请求
  • 共享同一个请求,在请求内共享数据
  • 只能访问当前应用中的资源,不能跨域跳转
  • 可以访问 WEB-INF 中的资源

请求转发和 URL 重定向的选择/p>

  • 若需要共享请求中的数据,只能使用请求转发
  • 若需要访问 WEB-INF 中的资源,只能使用请求转发
  • 若需要跨域访问,只能使用URL重定向
  • 请求转发可能造成表单的重复提交问题.
  • 其他时候,任选

forward() 是服务器内部的跳转,浏览器的地址栏不会发生变化,同时可以把 request 和 response 传递给后一个请求

sendRedirect() 是浏览器方面的跳转,要发送两次请求地址栏也会发生变化,同时 request 和 response 也会发生变化,重新生成新的对象

什么是URL编码和URL解码/h2>

首先 URL 在 络中传输时使用 ASCII 编码的,也就是说,在浏览器中一个 请求发出去最终是使用 ASCII 编码的,这样子要是我们发出去的请求中包含有非 ASCII 字符(不安全的字符,例如中文)的话,就会被浏览器编码,但是,各个浏览器对于 URL 的编码方式是不一样的!!! 这就会导致很大的问题,同一个 URL 在不同的浏览器中实际发出的 URL 都不一样了,服务器还要 怎么解析这些请求的要解决这个问题效率最最高的方法就是在前端中对要发出的 URL 使用 JS 进行编码,编码后的 URL 就只剩下 ASCII 编码中有的字符了。这就是URL编码。

既然在客户端和已经使用了URL编码了,在服务器端肯定要使用URL解码了。

面向对象软件开发的优点有哪些/h2>

相对于面向过程来说,面向对象大大地实现了降耦,从而提高了代码复用性、灵活性,因此实现了代码的模块化。

面向对象编程有很多重要的特性,比如:封装,继承,多态和抽象。

**封装:**通过关键字将类中的成员变量,成员方法设置访问权限,保证了代码的安全性,提高代码的可复用性,在实际开发时站在使用者的角度封装,当其他人调用该方法时通过方法名就可以明白方法所执行的任务,可简化开发的复杂性。

**继承:**子类对父类有很强的耦合度,一般在开发 web 项目,可以将对数据库操作的 crud 封装成一个公用的父类,供项目中各模块调用,提高代码的复用性。

**多态:**他的本质是由子类的重载和重写实现,在 web 开发中使用面向接口编程提高了项目的可扩展性,接口只需要提供功能,具体的实现让他的子类去做。

封装的定义和好处有哪些/h2>

什么是封装/strong>

利用抽象数据类型将数据和数据有关的操作封装起来,构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,尽可能的隐藏内部细节,只提供一些对外的接口使其与外部发生联系。使用者不需要关心封装内部的细节,但可以调用接口来访问该对象。(封装就是将属性私有化,提供公有的方法访问私有属性。)

做法就是:修改属性的可见性来限制对属性的访问,并为每个属性创建一对取值(getter)方法和赋值(setter)方法,用于对这些属性的访问。

为什么需要封装/strong>

通过封装,可以实现对属性的数据访问限制,同时增加了程序的可维护性。

由于取值方法和赋值方法隐藏了实现的变更,因此并不会影响读取或修改该属性的类,避免了大规模的修改,程序的可维护性增强。

封装的好处:

减小耦合

提高了代码的可用性和可维护性,因为对象的行为可以被单独的改变或者是扩展。

提高可重用性

通过隐藏对象的属性来保护对象内部的状态,提高数据的安全性

多态的定义/h2>

**多态:**相同类型的引用变量,调用同一个方法时呈现出多种不同的行为特征(父类的引用指向子类的实例)。 对象的实例变量不具备多态性。

多态的产生:Java 引用型变量有两个类型:编译时类型,运行时类型 。编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定。如果编译时类型和运行时类型不一致,就可能出现多态(Polymorphism)

继承的定义/h2>

继承是一种类与类之间的关系,利用一个已经存在的类,快速的创建新的类的机制,被继承的类称为父类/超类,继承者称为子类(得到继承的类为子类),子类继承父类,拥有父类所有属性和方法(除私有外)

好处是提高了代码的重用性,可扩展性。

抽象的定义象和封装的不同点/h2>

答案一:

**抽象:**就是把现实生活中的某一类东西提取出来,用程序代码表示,我们通常叫做类或者接口。抽象包括两个方面:一个是数据抽象,一个是过程抽象。数据抽象也就是对象的属性。过程抽象是对象的行为特征。

**封装:**是将通过抽象所得到的数据信息和操作进行结合,使其形成一个有机的整体。对内执行操作,对外隐藏细节和数据信息。封装分为属性的封装和方法的封装。

答案二:

抽象是指从具体事物中概括出它们的共性的思维过程,即把具体事物的属性和行为抽象成字段和方法的过程。

封装是指将抽象得到的数据信息及其功能进行聚合的过程。

通过观察一定数量的狗,发现它们都有嘴、牙齿和舌头,并且它们都能通过以上属性完成吃东西这个动作(个人认为动作的本质是属性发生变化的过程)。其实这个通过观察得到共性特征的过程就是抽象,然后把这些共性特征都联系到狗身上的过程就是封装。平时我们说的抽象出一个狗类,其实是先将狗的共性特征抽象出来并通过封装将这些共性特征聚合起来放到狗身上(如果没有聚合起来,那么那些共性特征就会变得没有意义)的过程。

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年5月10日
下一篇 2022年5月10日

相关推荐